-
Notifications
You must be signed in to change notification settings - Fork 27
/
ParsePatternEditor.cs
125 lines (110 loc) · 4.02 KB
/
ParsePatternEditor.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
using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Linq.Expressions;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace Bonsai.Design
{
/// <summary>
/// Provides a drop-down user interface for selecting available format specifiers
/// which can be passed to the <see cref="ExpressionHelper.Parse(Expression, string)"/> method.
/// </summary>
public class ParsePatternEditor : UITypeEditor
{
/// <inheritdoc/>
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.DropDown;
}
/// <inheritdoc/>
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
var pattern = (string)value;
var editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
if (editorService != null)
{
using (var control = new ParsePatternControl())
{
control.Commit += (sender, e) =>
{
pattern += ((ParsePattern)control.SelectedItem).Pattern;
editorService.CloseDropDown();
};
editorService.DropDownControl(control);
}
}
return pattern;
}
class ParsePatternControl : ListBox
{
bool allowCommit;
public event EventHandler Commit;
private void OnCommit(EventArgs e)
{
Commit?.Invoke(this, e);
}
protected override void OnCreateControl()
{
base.OnCreateControl();
Items.AddRange(new[]
{
new ParsePattern("%B", typeof(byte)),
new ParsePattern("%h", typeof(short)),
new ParsePattern("%H", typeof(ushort)),
new ParsePattern("%i", typeof(int)),
new ParsePattern("%I", typeof(uint)),
new ParsePattern("%l", typeof(long)),
new ParsePattern("%L", typeof(ulong)),
new ParsePattern("%f", typeof(float)),
new ParsePattern("%d", typeof(double)),
new ParsePattern("%b", typeof(bool)),
new ParsePattern("%c", typeof(char)),
new ParsePattern("%s", typeof(string)),
new ParsePattern("%t", typeof(DateTimeOffset)),
new ParsePattern("%T", typeof(TimeSpan)),
});
Height = ItemHeight * (Items.Count + 1);
}
private void SubmitSelection()
{
if (allowCommit && SelectedItem != null)
{
OnCommit(EventArgs.Empty);
}
}
protected override void OnSelectedValueChanged(EventArgs e)
{
allowCommit = true;
base.OnSelectedValueChanged(e);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Return)
{
SubmitSelection();
}
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void OnMouseUp(MouseEventArgs e)
{
SubmitSelection();
base.OnMouseUp(e);
}
}
class ParsePattern
{
public ParsePattern(string pattern, Type type)
{
Pattern = pattern;
Type = type;
}
public string Pattern { get; set; }
public Type Type { get; set; }
public override string ToString()
{
return string.Format("{0}: {1}", Pattern, Type.Name);
}
}
}
}