-
Notifications
You must be signed in to change notification settings - Fork 191
/
PanelHeader.cs
167 lines (145 loc) · 4.38 KB
/
PanelHeader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace TaskSchedulerMockup
{
[DefaultProperty("Text"), DefaultEvent("CheckChanged")]
internal partial class PanelHeader : Control
{
private const int lPad = 4, tbPad = 2;
private const string panelHeaderArrowsImageResName = "PanelHeaderArrows";
private static readonly Color topBorderColor = Color.FromArgb(238, 238, 238);
private static readonly Color topBorderColorHot = Color.FromArgb(0, 122, 204);
private bool hoverImage = false, check = false, selected = false, hot = false;
private ImageList imageList;
public PanelHeader()
{
SetStyle(ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.StandardClick, true);
SetStyle(ControlStyles.StandardDoubleClick, false);
imageList = new ImageList { ImageSize = new Size(7, 11), ColorDepth = ColorDepth.Depth32Bit };
imageList.Images.AddStrip(Properties.Resources.PanelHeaderArrows);
}
public event EventHandler CheckChanged;
protected enum State
{
Normal = 0,
Hot = 1,
Checked = 2,
HotChecked = 3,
Selected = 4,
HotSelected = 5,
CheckedSelected = 6,
HotCheckedSelected = 7,
Disabled = 8,
DisabledChecked = 9,
}
[DefaultValue(false)]
public bool Checked
{
get { return check; }
set
{
if (check != value)
{
check = value;
InvalidateImage();
CheckChanged?.Invoke(this, EventArgs.Empty);
}
}
}
private void InvalidateImage()
{
Invalidate(new Rectangle(0, 0, imageList.ImageSize.Width + (lPad * 2), Height));
}
[DefaultValue(null)]
public ImageList CustomImageList { get; set; }
[DefaultValue(false)]
public bool Selected
{
get { return selected; }
set
{
if (selected != value)
{
selected = value;
}
}
}
private ImageList ImageList => CustomImageList ?? (imageList.Images.Count > 0 ? imageList : null);
protected bool MouseOverImage => hoverImage;
protected State CurrentState => (State)(Enabled ? (hot && hoverImage ? 0x1 : 0) | (check ? 0x2 : 0) | (selected ? 0x4 : 0) : (check ? 9 : 8));
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (CanSelect && !hoverImage)
Selected = !Selected;
}
protected override void OnMouseHover(EventArgs e)
{
base.OnMouseHover(e);
hot = true;
Invalidate();
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
hot = hoverImage = false;
Invalidate();
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
bool overImg = imageList != null && e.X <= (imageList.ImageSize.Width + (lPad * 2));
if (overImg != hoverImage)
{
hoverImage = overImg;
InvalidateImage();
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
if (hoverImage || !CanSelect)
Checked = !Checked;
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
// Paint background
pe.Graphics.Clear(BackColor);
using (Pen p = new Pen(hot ? topBorderColorHot : topBorderColor))
pe.Graphics.DrawLine(p, 0, 0, Width, 0);
// Get bold font
Font bf = new Font(Font, FontStyle.Bold);
// Get text height
Size tsz = TextRenderer.MeasureText(Text, bf);
// Center image on near side
Size isz = ImageList?.ImageSize ?? Size.Empty;
// Paint image
int x = lPad;
if (isz.Width > 0)
{
// Get state image
int iidx = (int)CurrentState;
var il = ImageList;
if (il != null && il.Images.Count > iidx)
{
// Get image draw rectangle
var ir = new Rectangle(x, (Height - isz.Height) / 2, isz.Width, isz.Height);
il.Draw(pe.Graphics, ir.Location, iidx);
x += (lPad + isz.Width);
}
}
// Draw truncated text
TextRenderer.DrawText(pe.Graphics, Text, bf, new Rectangle(x, 0, Width - x, Height), ForeColor, BackColor, TextFormatFlags.SingleLine | TextFormatFlags.VerticalCenter | TextFormatFlags.WordEllipsis);
// Draw focus border
if (Focused)
ControlPaint.DrawFocusRectangle(pe.Graphics, Bounds);
}
protected override void OnPaintBackground(PaintEventArgs pevent)
{
}
}
}