/
ColumnHeaderExtender.cs
148 lines (127 loc) · 5.54 KB
/
ColumnHeaderExtender.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
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using DevExpress.Skins;
using DevExpress.XtraGrid.Views.Grid;
using System.Drawing;
using DevExpress.XtraEditors.Drawing;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraGrid.Drawing;
using DevExpress.Utils.Drawing;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Columns;
using DevExpress.Utils;
namespace DXSample {
public class ColumnHeaderExtender {
GridView view;
SkinEditorButtonPainter customButtonPainter;
EditorButtonObjectInfoArgs args;
Size buttonSize;
public ColumnHeaderExtender(GridView view) {
this.view = view;
buttonSize = new Size(14, 14);
}
public void AddCustomButton() {
CreateButtonPainter();
CreateButtonInfoArgs();
SubscribeToEvents();
}
private void CreateButtonInfoArgs() {
EditorButton btn = new EditorButton(ButtonPredefines.Glyph);
args = new EditorButtonObjectInfoArgs(btn, new DevExpress.Utils.AppearanceObject());
}
private void CreateButtonPainter() {
customButtonPainter = new SkinEditorButtonPainter(DevExpress.LookAndFeel.UserLookAndFeel.Default.ActiveLookAndFeel);
}
private void SubscribeToEvents() {
view.CustomDrawColumnHeader += OnCustomDrawColumnHeader;
view.MouseDown += OnMouseDown;
view.MouseUp += OnMouseUp;
view.MouseMove += OnMouseMove;
}
void OnMouseUp(object sender, MouseEventArgs e) {
GridHitInfo hitInfo = view.CalcHitInfo(e.Location);
if(hitInfo.HitTest != GridHitTest.Column) return;
GridColumn column = hitInfo.Column;
if(IsButtonRect(e.Location, column)) {
SetButtonState(column, ObjectState.Normal);
XtraMessageBox.Show(string.Format("Custom Button in {0}", column.FieldName));
// your code here
DXMouseEventArgs.GetMouseArgs(e).Handled = true;
}
}
void OnMouseMove(object sender, MouseEventArgs e) {
GridHitInfo hitInfo = view.CalcHitInfo(e.Location);
if(hitInfo.HitTest != GridHitTest.Column) return;
GridColumn column = hitInfo.Column;
if(IsButtonRect(e.Location, column))
SetButtonState(column, ObjectState.Hot);
else
SetButtonState(column, ObjectState.Normal);
}
void OnMouseDown(object sender, MouseEventArgs e) {
GridHitInfo hitInfo = view.CalcHitInfo(e.Location);
if(hitInfo.HitTest != GridHitTest.Column) return;
GridColumn column = hitInfo.Column;
if(IsButtonRect(e.Location, column)) {
SetButtonState(column, ObjectState.Pressed);
DXMouseEventArgs.GetMouseArgs(e).Handled = true;
}
}
private void SetButtonState(GridColumn column, ObjectState state) {
column.Tag = state;
view.InvalidateColumnHeader(column);
}
private bool IsButtonRect(Point point, GridColumn column) {
GraphicsInfo info = new GraphicsInfo();
info.AddGraphics(null);
GridViewInfo viewInfo = view.GetViewInfo() as GridViewInfo;
GridColumnInfoArgs columnArgs = viewInfo.ColumnsInfo[column];
Rectangle buttonRect = CalcButtonRect(columnArgs, info.Graphics);
info.ReleaseGraphics();
return buttonRect.Contains(point);
}
private Rectangle CalcButtonRect(GridColumnInfoArgs columnArgs, Graphics gr) {
Rectangle columnRect = columnArgs.Bounds;
int innerElementsWidth = CalcInnerElementsMinWidth(columnArgs, gr);
Rectangle buttonRect = new Rectangle(columnRect.Right - innerElementsWidth - buttonSize.Width - 2,
columnRect.Y + columnRect.Height / 2 - buttonSize.Height / 2, buttonSize.Width, buttonSize.Height);
return buttonRect;
}
private int CalcInnerElementsMinWidth(GridColumnInfoArgs columnArgs, Graphics gr) {
bool canDrawMode = true;
return columnArgs.InnerElements.CalcMinSize(gr, ref canDrawMode).Width;
}
void OnCustomDrawColumnHeader(object sender, ColumnHeaderCustomDrawEventArgs e) {
if(e.Column == null) return;
DefaultDrawColumnHeader(e);
DrawCustomButton(e);
e.Handled = true;
}
private void DrawCustomButton(ColumnHeaderCustomDrawEventArgs e) {
SetUpButtonInfoArgs(e);
customButtonPainter.DrawObject(args);
}
private void SetUpButtonInfoArgs(ColumnHeaderCustomDrawEventArgs e) {
args.Cache = e.Cache;
args.Bounds = CalcButtonRect(e.Info, e.Cache.Graphics);
ObjectState state = ObjectState.Normal;
if(e.Column.Tag is ObjectState)
state = (ObjectState)e.Column.Tag;
args.State = state;
}
private static void DefaultDrawColumnHeader(ColumnHeaderCustomDrawEventArgs e) {
e.Painter.DrawObject(e.Info);
}
private void UnsubscribeFromEvents() {
view.CustomDrawColumnHeader -= OnCustomDrawColumnHeader;
view.MouseDown -= OnMouseDown;
view.MouseUp -= OnMouseUp;
view.MouseMove -= OnMouseMove;
}
public void RemoveCustomButton() {
UnsubscribeFromEvents();
}
}
}