-
-
Notifications
You must be signed in to change notification settings - Fork 325
/
Dialog.cs
273 lines (249 loc) · 7.72 KB
/
Dialog.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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
using System;
using System.Threading.Tasks;
namespace Eto.Forms
{
/// <summary>
/// Hint to tell the platform how to display the dialog
/// </summary>
/// <remarks>
/// This tells the platform how you prefer to display the dialog. Each platform
/// may support only certain modes and will choose the appropriate mode based on the hint
/// given.
/// </remarks>
[Flags]
public enum DialogDisplayMode
{
/// <summary>
/// The default display mode for modal dialogs in the platform
/// </summary>
/// <remarks>
/// This uses the ideal display mode given the state of the application and the owner window that is passed in
/// </remarks>
Default = 0,
/// <summary>
/// Display the dialog attached to the owner window, if supported (e.g. OS X)
/// </summary>
Attached = 0x01,
/// <summary>
/// Display the dialog as a separate window (e.g. Windows/Linux only supports this mode)
/// </summary>
Separate = 0x02,
/// <summary>
/// Display in navigation if available
/// </summary>
Navigation = 0x04
}
/// <summary>
/// Custom modal dialog with a specified result type
/// </summary>
/// <remarks>
/// This provides a way to show a modal dialog with custom contents to the user.
/// A dialog will block user input from the owner form until the dialog is closed.
/// </remarks>
/// <seealso cref="Dialog"/>
/// <typeparam name="T">Type result type of the dialog</typeparam>
public class Dialog<T> : Dialog
{
/// <summary>
/// Gets or sets the result of the dialog
/// </summary>
/// <value>The result.</value>
public T Result { get; set; }
/// <summary>
/// Shows the dialog and blocks until the user closes the dialog
/// </summary>
/// <returns>The result of the modal dialog</returns>
public new T ShowModal()
{
base.ShowModal();
return Result;
}
/// <summary>
/// Shows the dialog modally asynchronously
/// </summary>
/// <returns>The result of the modal dialog</returns>
public new Task<T> ShowModalAsync()
{
return base.ShowModalAsync()
.ContinueWith(t => Result, TaskContinuationOptions.OnlyOnRanToCompletion);
}
/// <summary>
/// Shows the dialog and blocks until the user closes the dialog
/// </summary>
/// <remarks>
/// The <paramref name="owner"/> specifies the control on the window that will be blocked from user input until
/// the dialog is closed.
/// </remarks>
/// <returns>The result of the modal dialog</returns>
/// <param name="owner">The owner control that is showing the form</param>
public new T ShowModal(Control owner)
{
base.ShowModal(owner);
return Result;
}
/// <summary>
/// Shows the dialog modally asynchronously
/// </summary>
/// <remarks>
/// The <paramref name="owner"/> specifies the control on the window that will be blocked from user input until
/// the dialog is closed.
/// </remarks>
/// <param name="owner">The owner control that is showing the form</param>
public new Task<T> ShowModalAsync(Control owner)
{
return base.ShowModalAsync(owner)
.ContinueWith(t => Result, TaskContinuationOptions.OnlyOnRanToCompletion);
}
/// <summary>
/// Close the dialog with the specified result
/// </summary>
/// <param name="result">Result to return to the caller</param>
public void Close(T result)
{
Result = result;
Close();
}
}
/// <summary>
/// Custom modal dialog
/// </summary>
/// <remarks>
/// This provides a way to show a modal dialog with custom contents to the user.
/// A dialog will block user input from the owner form until the dialog is closed.
/// </remarks>
/// <seealso cref="Form"/>
/// <seealso cref="Dialog{T}"/>
[Handler(typeof(Dialog.IHandler))]
public class Dialog : Window
{
new IHandler Handler { get { return (IHandler)base.Handler; } }
/// <summary>
/// Gets or sets the display mode hint
/// </summary>
/// <value>The display mode.</value>
public DialogDisplayMode DisplayMode
{
get { return Handler.DisplayMode; }
set { Handler.DisplayMode = value; }
}
/// <summary>
/// Gets or sets the abort button.
/// </summary>
/// <remarks>
/// On some platforms, the abort button would be called automatically if the user presses the escape key
/// </remarks>
/// <value>The abort button.</value>
public Button AbortButton
{
get { return Handler.AbortButton; }
set { Handler.AbortButton = value; }
}
/// <summary>
/// Gets or sets the default button.
/// </summary>
/// <remarks>
/// On some platforms, the abort button would be called automatically if the user presses the return key
/// on the form
/// </remarks>
/// <value>The default button.</value>
public Button DefaultButton
{
get { return Handler.DefaultButton; }
set { Handler.DefaultButton = value; }
}
/// <summary>
/// Shows the dialog modally, blocking the current thread until it is closed.
/// </summary>
/// <remarks>
/// The <paramref name="owner"/> specifies the control on the window that will be blocked from user input until
/// the dialog is closed.
/// Calling this method is identical to setting the <see cref="Window.Owner"/> property and calling <see cref="ShowModal()"/>.
/// </remarks>
/// <param name="owner">The owner control that is showing the form</param>
public void ShowModal(Control owner)
{
Owner = owner != null ? owner.ParentWindow : null;
ShowModal();
}
/// <summary>
/// Shows the dialog modally, blocking the current thread until it is closed.
/// </summary>
public void ShowModal()
{
bool loaded = Loaded;
if (!loaded)
{
OnPreLoad(EventArgs.Empty);
OnLoad(EventArgs.Empty);
OnLoadComplete(EventArgs.Empty);
}
Application.Instance.AddWindow(this);
Handler.ShowModal();
}
/// <summary>
/// Shows the dialog modally asynchronously
/// </summary>
/// <remarks>
/// The <paramref name="owner"/> specifies the control on the window that will be blocked from user input until
/// the dialog is closed.
/// Calling this method is identical to setting the <see cref="Window.Owner"/> property and calling <see cref="ShowModalAsync()"/>.
/// </remarks>
/// <param name="owner">The owner control that is showing the form</param>
public Task ShowModalAsync(Control owner)
{
Owner = owner != null ? owner.ParentWindow : null;
return ShowModalAsync();
}
/// <summary>
/// Shows the dialog modally asynchronously
/// </summary>
public Task ShowModalAsync()
{
bool loaded = Loaded;
if (!loaded)
{
OnPreLoad(EventArgs.Empty);
OnLoad(EventArgs.Empty);
OnLoadComplete(EventArgs.Empty);
}
Application.Instance.AddWindow(this);
return Handler.ShowModalAsync();
}
/// <summary>
/// Handler interface for the <see cref="Dialog"/> class
/// </summary>
public new interface IHandler : Window.IHandler
{
/// <summary>
/// Gets or sets the display mode hint
/// </summary>
/// <value>The display mode.</value>
DialogDisplayMode DisplayMode { get; set; }
/// <summary>
/// Shows the dialog modally, blocking the current thread until it is closed.
/// </summary>
void ShowModal();
/// <summary>
/// Shows the dialog modally asynchronously
/// </summary>
Task ShowModalAsync();
/// <summary>
/// Gets or sets the default button.
/// </summary>
/// <remarks>
/// On some platforms, the abort button would be called automatically if the user presses the return key
/// on the form
/// </remarks>
/// <value>The default button.</value>
Button DefaultButton { get; set; }
/// <summary>
/// Gets or sets the abort button.
/// </summary>
/// <remarks>
/// On some platforms, the abort button would be called automatically if the user presses the escape key
/// </remarks>
/// <value>The abort button.</value>
Button AbortButton { get; set; }
}
}
}