External/Aga.Controls/Tree/NodeControls/NodeIcon.cs
author sl
Thu, 01 Jan 2015 23:35:49 +0100
changeset 405 5715aefd2bcc
permissions -rw-r--r--
SharpDisplay: Migrating to new robust client scheme.
moel@345
     1
using System;
moel@345
     2
using System.Collections.Generic;
moel@345
     3
using System.Text;
moel@345
     4
using System.Drawing;
moel@345
     5
using System.Windows.Forms;
moel@345
     6
using Aga.Controls.Properties;
moel@345
     7
using System.ComponentModel;
moel@345
     8
moel@345
     9
namespace Aga.Controls.Tree.NodeControls
moel@345
    10
{
moel@345
    11
	public class NodeIcon : BindableControl
moel@345
    12
	{
moel@345
    13
		public NodeIcon()
moel@345
    14
		{
moel@345
    15
			LeftMargin = 1;
moel@345
    16
		}
moel@345
    17
moel@345
    18
		public override Size MeasureSize(TreeNodeAdv node, DrawContext context)
moel@345
    19
		{
moel@345
    20
			Image image = GetIcon(node);
moel@345
    21
			if (image != null)
moel@345
    22
				return image.Size;
moel@345
    23
			else
moel@345
    24
				return Size.Empty;
moel@345
    25
		}
moel@345
    26
moel@345
    27
moel@345
    28
		public override void Draw(TreeNodeAdv node, DrawContext context)
moel@345
    29
		{
moel@345
    30
			Image image = GetIcon(node);
moel@345
    31
			if (image != null)
moel@345
    32
			{
moel@345
    33
				Rectangle r = GetBounds(node, context);
moel@345
    34
				if ( image.Width > 0 && image.Height > 0 )
moel@345
    35
				{
moel@345
    36
					switch (_scaleMode)
moel@345
    37
					{
moel@345
    38
						case ImageScaleMode.Fit:
moel@345
    39
							context.Graphics.DrawImage(image, r);
moel@345
    40
							break;
moel@345
    41
						case ImageScaleMode.ScaleDown:
moel@345
    42
							{
moel@345
    43
								float factor = Math.Min((float)r.Width / (float)image.Width, (float)r.Height / (float)image.Height);
moel@345
    44
								if (factor < 1)
moel@345
    45
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width * factor, image.Height * factor);
moel@345
    46
								else
moel@345
    47
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width, image.Height);
moel@345
    48
							} break;
moel@345
    49
						case ImageScaleMode.ScaleUp:
moel@345
    50
							{
moel@345
    51
								float factor = Math.Max((float)r.Width / (float)image.Width, (float)r.Height / (float)image.Height);
moel@345
    52
								if (factor > 1)
moel@345
    53
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width * factor, image.Height * factor);
moel@345
    54
								else
moel@345
    55
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width, image.Height);
moel@345
    56
							} break;
moel@345
    57
						case ImageScaleMode.AlwaysScale:
moel@345
    58
							{
moel@345
    59
								float fx = (float)r.Width / (float)image.Width;
moel@345
    60
								float fy = (float)r.Height / (float)image.Height;
moel@345
    61
								if (Math.Min(fx, fy) < 1)
moel@345
    62
								{ //scale down
moel@345
    63
									float factor = Math.Min(fx, fy);
moel@345
    64
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width * factor, image.Height * factor);
moel@345
    65
								}
moel@345
    66
								else if (Math.Max(fx, fy) > 1)
moel@345
    67
								{
moel@345
    68
									float factor = Math.Max(fx, fy);
moel@345
    69
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width * factor, image.Height * factor);
moel@345
    70
								}
moel@345
    71
								else
moel@345
    72
									context.Graphics.DrawImage(image, r.X, r.Y, image.Width, image.Height);
moel@345
    73
							} break;
moel@345
    74
						case ImageScaleMode.Clip:
moel@345
    75
						default: 
moel@345
    76
							context.Graphics.DrawImage(image, r.X, r.Y, image.Width, image.Height);
moel@345
    77
							break;
moel@345
    78
					}
moel@345
    79
				}
moel@345
    80
moel@345
    81
			}
moel@345
    82
		}
moel@345
    83
moel@345
    84
		protected virtual Image GetIcon(TreeNodeAdv node)
moel@345
    85
		{
moel@345
    86
			return GetValue(node) as Image;
moel@345
    87
		}
moel@345
    88
moel@345
    89
        private ImageScaleMode _scaleMode = ImageScaleMode.Clip;
moel@345
    90
        [DefaultValue("Clip"), Category("Appearance")]
moel@345
    91
        public ImageScaleMode ScaleMode
moel@345
    92
        {
moel@345
    93
            get { return _scaleMode; }
moel@345
    94
            set { _scaleMode = value; }
moel@345
    95
        }
moel@345
    96
moel@345
    97
moel@345
    98
	}
moel@345
    99
}