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()
|
|
{ ;}
|
|
}
|
|
}
|