231 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing;
 | |
| using System.Data;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| 
 | |
| namespace Volian.Controls.Library
 | |
| {
 | |
| 	public enum ExpanderStyle : int
 | |
| 	{
 | |
| 		Square, Round
 | |
| 	}
 | |
| 	public delegate void vlnExpanderEvent(object sender, vlnExpanderEventArgs args);
 | |
| 	public partial class vlnExpander : UserControl
 | |
| 	{
 | |
| 		#region Events
 | |
| 		public event vlnExpanderEvent BeforeExpand;
 | |
| 		private void OnBeforeExpand(object sender, vlnExpanderEventArgs args)
 | |
| 		{
 | |
| 			if (BeforeExpand != null) BeforeExpand(sender, args);
 | |
| 		}
 | |
| 		public event vlnExpanderEvent BeforeColapse;
 | |
| 		private void OnBeforeColapse(object sender, vlnExpanderEventArgs args)
 | |
| 		{
 | |
| 			if (BeforeColapse != null) BeforeColapse(sender, args);
 | |
| 		}
 | |
| 		public event vlnExpanderEvent AttachmentClick;
 | |
| 		private void OnAttachmentClick(object sender, vlnExpanderEventArgs args)
 | |
| 		{
 | |
| 			if (AttachmentClick != null) AttachmentClick(sender, args);
 | |
| 		}
 | |
| 		#endregion
 | |
| 		public vlnExpander()
 | |
| 		{
 | |
| 			InitializeComponent();
 | |
| 		}
 | |
| 		private bool _Expanded;
 | |
| 		public bool Expanded
 | |
| 		{
 | |
| 			get { return _Expanded; }
 | |
| 			set
 | |
| 			{
 | |
| 				if (value) OnBeforeExpand(this, new vlnExpanderEventArgs());
 | |
| 				else OnBeforeColapse(this, new vlnExpanderEventArgs());
 | |
| 				_Expanded = value;
 | |
| 				this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 		public void ShowExpanded()
 | |
| 		{
 | |
| 			_Expanded = true;
 | |
| 			this.Refresh();
 | |
| 		}
 | |
| 		private int _Trans1 = 128;
 | |
| 		public int Trans1
 | |
| 		{
 | |
| 			get { return _Trans1; }
 | |
| 			set
 | |
| 			{
 | |
| 				_Trans1 = value;
 | |
| 				this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 		private int _Trans2 = 128;
 | |
| 		public int Trans2
 | |
| 		{
 | |
| 			get { return _Trans2; }
 | |
| 			set
 | |
| 			{
 | |
| 				_Trans2 = value; this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 		private Color _Color1 = Color.Aquamarine;
 | |
| 		public Color Color1
 | |
| 		{
 | |
| 			get { return _Color1; }
 | |
| 			set
 | |
| 			{
 | |
| 				_Color1 = value; this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 		private Color _Color2 = Color.Violet;
 | |
| 		public Color Color2
 | |
| 		{
 | |
| 			get { return _Color2; }
 | |
| 			set
 | |
| 			{
 | |
| 				_Color2 = value; this.Refresh();
 | |
| 			}
 | |
| 		}
 | |
| 		private int _PenWidth = 0;
 | |
| 		public int PenWidth
 | |
| 		{
 | |
| 			get { return _PenWidth; }
 | |
| 			set {	_PenWidth = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private int _WidthFactor=7;
 | |
| 		public int WidthFactor
 | |
| 		{
 | |
| 			get { return _WidthFactor; }
 | |
| 			set { _WidthFactor = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private Color _BorderColor=Color.Silver;
 | |
| 		public Color BorderColor
 | |
| 		{
 | |
| 			get { return _BorderColor; }
 | |
| 			set { _BorderColor = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private int _GradientAngle=45;
 | |
| 		public int GradientAngle
 | |
| 		{
 | |
| 			get { return _GradientAngle; }
 | |
| 			set { _GradientAngle = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private bool _Attachment = false;
 | |
| 		public bool Attachment
 | |
| 		{
 | |
| 			get { return _Attachment; }
 | |
| 			set { _Attachment = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private bool _AutoTOC = false;
 | |
| 		public bool AutoTOC
 | |
| 		{
 | |
| 			get { return _AutoTOC; }
 | |
| 			set { _AutoTOC = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private ExpanderStyle _MyExpanderStyle = ExpanderStyle.Square;
 | |
| 		public ExpanderStyle MyExpanderStyle
 | |
| 		{
 | |
| 			get { return _MyExpanderStyle; }
 | |
| 			set { _MyExpanderStyle = value; this.Refresh(); }
 | |
| 		}
 | |
| 		private void vlnExpander_Paint(object sender, PaintEventArgs e)
 | |
| 		{
 | |
| 			Color c1 = Color.FromArgb(_Trans1, _Color1);
 | |
| 			Color c2 = Color.FromArgb(_Trans2, _Color2);
 | |
| 			Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, _GradientAngle);
 | |
| 			//Brush b2 = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c2, c2, _GradientAngle);
 | |
| 			Pen p = new Pen(ForeColor);
 | |
| 			Brush b2 = p.Brush;
 | |
| 			float smallest = this.Width;
 | |
| 			if (this.Height < this.Width) smallest = this.Height;
 | |
| 			float weight = (smallest - 1) / 12;
 | |
| 			float radius = (smallest - 1) / 2;
 | |
| 			float diameter = 2 * radius;
 | |
| 			if (this.Height <= diameter) diameter = this.Height - 1;
 | |
| 			e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 | |
| 			p = new Pen(_BorderColor, _PenWidth);
 | |
| 			int penWidth = ClientRectangle.Width / _WidthFactor;
 | |
| 			switch (_MyExpanderStyle)
 | |
| 			{
 | |
| 				case ExpanderStyle.Round:
 | |
| 					//e.Graphics.FillEllipse(Brushes.Gray, 0F, 0F, diameter, diameter);
 | |
| 					//e.Graphics.DrawRectangle(p, new Rectangle(0, 0, leg * 2 + penWidth * 3, leg * 2 + penWidth * 3));
 | |
| 					// Draw a white cross-hair
 | |
| 					//e.Graphics.FillRectangle(Brushes.White, 2 * weight , radius - weight, diameter - 4 * weight, weight * 2);
 | |
| 					//e.Graphics.FillRectangle(Brushes.White, radius - weight, 2 * weight, weight * 2,  diameter - 4 * weight);
 | |
| 					if(!Attachment) e.Graphics.FillEllipse(b, 0F, 0F, diameter, diameter);
 | |
| 					DrawInterior(e, b, b2, weight, radius, diameter);
 | |
| 					e.Graphics.DrawEllipse(p, 0, 0, diameter, diameter);
 | |
| 					p.Dispose();
 | |
| 					b.Dispose();
 | |
| 					b2.Dispose();
 | |
| 					break;
 | |
| 				case ExpanderStyle.Square:
 | |
| 					//c1 = Color.FromArgb(_Trans1, _Color1);
 | |
| 					//c2 = Color.FromArgb(_Trans2, _Color2);
 | |
| 					//b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, _GradientAngle);
 | |
| 					int leg = ((ClientRectangle.Width - 3 * penWidth) / 2) - 1;
 | |
| 					if (!Attachment) e.Graphics.FillRectangle(b, new Rectangle(0, 0, leg * 2 + penWidth * 3, leg * 2 + penWidth * 3));
 | |
| 					int center = leg + penWidth;
 | |
| 					int limit = 2 * (penWidth + leg);
 | |
| 					p = new Pen(_BorderColor, _PenWidth);
 | |
| 					e.Graphics.DrawRectangle(p, new Rectangle(0, 0, leg * 2 + penWidth * 3, leg * 2 + penWidth * 3));
 | |
| 					//b = new SolidBrush(this.ForeColor);
 | |
| 					DrawInterior(e, b, b2, weight, radius, diameter);
 | |
| 					//e.Graphics.FillRectangle(b, new Rectangle(penWidth, center, leg * 2 + penWidth, penWidth));
 | |
| 					//if (!_Expanded) e.Graphics.FillRectangle(b, new Rectangle(center, penWidth, penWidth, leg * 2 + penWidth));
 | |
| 					////pe.Graphics.DrawLine(p, new Point(penWidth, center), new Point(limit, center));
 | |
| 					////if (!Expanded) pe.Graphics.DrawLine(p, new Point(center, penWidth), new Point(center, limit));
 | |
| 					p.Dispose();
 | |
| 					b.Dispose();
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private void DrawInterior(PaintEventArgs e, Brush bBackground, Brush bForeground, float weight, float radius, float diameter)
 | |
| 		{
 | |
| 			if (Attachment)
 | |
| 			{
 | |
| 				if (!AutoTOC)
 | |
| 				{
 | |
| 					PointF[] myArrow = new PointF[7];
 | |
| 					myArrow[0] = new PointF(7 * weight, 3 * weight);
 | |
| 					myArrow[1] = new PointF(11 * weight, 6 * weight);
 | |
| 					myArrow[2] = new PointF(7 * weight, 9 * weight);
 | |
| 					myArrow[3] = new PointF(7 * weight, 7 * weight);
 | |
| 					myArrow[4] = new PointF(2 * weight, 7 * weight);
 | |
| 					myArrow[5] = new PointF(2 * weight, 5 * weight);
 | |
| 					myArrow[6] = new PointF(7 * weight, 5 * weight);
 | |
| 					e.Graphics.FillPolygon(bBackground, myArrow);
 | |
| 				}
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				e.Graphics.FillRectangle(bForeground, 2 * weight, radius - weight, diameter - 4 * weight, weight * 2);
 | |
| 				if (!_Expanded) e.Graphics.FillRectangle(bForeground, radius - weight, 2 * weight, weight * 2, diameter - 4 * weight);
 | |
| 			}
 | |
| 		}
 | |
| 		private void vlnExpander_Resize(object sender, EventArgs e)
 | |
| 		{
 | |
| 			this.Width = this.Height;
 | |
| 			this.Refresh();
 | |
| 		}
 | |
| 		private void vlnExpander_MouseDown(object sender, MouseEventArgs e)
 | |
| 		{
 | |
| 			if (Attachment)
 | |
| 				OnAttachmentClick(sender, new vlnExpanderEventArgs());
 | |
| 			else
 | |
| 				Expanded = !Expanded;
 | |
| 		}
 | |
| 	}
 | |
| 	public partial class vlnExpanderEventArgs : EventArgs
 | |
| 	{
 | |
| 		public vlnExpanderEventArgs()
 | |
| 		{ ;}
 | |
| 	}
 | |
| }
 |