* TreeView.cs: Don't draw the selected node when we lose
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XplatUIDriver.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2004-2005 Novell, Inc.
21 //
22 // Authors:
23 //      Peter Bartok            pbartok@novell.com
24 //      Sebastien Pouliot       sebastien@ximian.com
25 //
26
27 // COMPLETE
28
29 using System.Drawing;
30 using System.Threading;
31 using System.Runtime.InteropServices;
32
33 namespace System.Windows.Forms {
34         internal abstract class XplatUIDriver {
35                 internal abstract IntPtr        InitializeDriver();
36                 internal abstract void          ShutdownDriver(IntPtr token);
37                 internal delegate IntPtr        WndProc(IntPtr hwnd, Msg msg, IntPtr wParam, IntPtr lParam);
38
39
40                 #region XplatUI Driver Properties
41                 internal virtual Color ForeColor {
42                         get {
43                                 return ThemeEngine.Current.DefaultWindowForeColor;
44                         }
45                 }
46
47                 internal virtual  Color BackColor { 
48                         get {
49                                 return ThemeEngine.Current.DefaultWindowBackColor;
50                         }
51                 }
52
53                 internal virtual Font Font {
54                         get {
55                                 return ThemeEngine.Current.DefaultFont;
56                         }
57                 }
58
59                 internal virtual Keys ModifierKeys {
60                         get {
61                                 return Keys.None;
62                         }
63                 }
64
65                 internal virtual MouseButtons MouseButtons {
66                         get {
67                                 return MouseButtons.None;
68                         }
69                 }
70
71                 internal virtual Point MousePosition {
72                         get {
73                                 return Point.Empty;
74                         }
75                 }
76
77                 internal virtual bool DropTarget {
78                         get {
79                                 return false;
80                         }
81
82                         set {
83                         }
84                 }
85
86                 internal abstract int Caption { get; }
87                 internal abstract Size CursorSize { get; }
88                 internal abstract bool DragFullWindows { get; }
89                 internal abstract Size DragSize { get; }
90                 internal abstract Size FrameBorderSize { get; }
91                 internal abstract Size IconSize { get; }
92                 internal abstract Size MaxWindowTrackSize { get; }
93                 internal abstract Size MinimizedWindowSize { get; }
94                 internal abstract Size MinimizedWindowSpacingSize { get; }
95                 internal abstract Size MinimumWindowSize { get; }
96                 internal abstract Size MinWindowTrackSize { get; }
97                 internal abstract Size SmallIconSize { get; }
98                 internal abstract int MouseButtonCount { get; }
99                 internal abstract bool MouseButtonsSwapped { get; }
100                 internal abstract bool MouseWheelPresent { get; }
101                 internal abstract Rectangle VirtualScreen { get; }
102                 internal abstract Rectangle WorkingArea { get; }
103                 #endregion      // XplatUI Driver Properties
104
105                 internal abstract event EventHandler Idle;
106
107                 #region XplatUI Driver Methods
108                 internal abstract void Exit();
109
110                 internal abstract void EnableThemes();
111
112                 internal abstract void GetDisplaySize(out Size size);
113
114                 internal abstract IntPtr CreateWindow(CreateParams cp);
115                 internal abstract IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height);
116                 internal abstract void DestroyWindow(IntPtr handle);
117
118                 internal abstract FormWindowState GetWindowState(IntPtr handle);
119                 internal abstract void SetWindowState(IntPtr handle, FormWindowState state);
120
121                 internal abstract void SetWindowStyle(IntPtr handle, CreateParams cp);
122
123                 internal virtual void SetAllowDrop (IntPtr handle, bool value)
124                 {
125                         Console.Error.WriteLine ("Drag and Drop is currently " +
126                                         "not supported on this platform");
127                 }
128
129                 internal virtual DragDropEffects StartDrag(IntPtr handle, object data, DragDropEffects allowedEffects) {
130                         Console.Error.WriteLine ("Drag and Drop is currently " +
131                                         "not supported on this platform");
132                         return DragDropEffects.None;
133                 }
134
135                 internal abstract void SetBorderStyle(IntPtr handle, FormBorderStyle border_style);
136                 internal abstract void SetMenu(IntPtr handle, IntPtr menu_handle);
137
138                 internal abstract bool GetText(IntPtr handle, out string text);
139                 internal abstract bool Text(IntPtr handle, string text);
140                 internal abstract bool SetVisible(IntPtr handle, bool visible);
141                 internal abstract bool IsVisible(IntPtr handle);
142                 internal abstract IntPtr SetParent(IntPtr handle, IntPtr parent);
143                 internal abstract IntPtr GetParent(IntPtr handle);
144
145                 internal abstract void UpdateWindow(IntPtr handle);
146                 internal abstract PaintEventArgs PaintEventStart(IntPtr handle, bool client);
147                 internal abstract void PaintEventEnd(IntPtr handle, bool client);
148
149                 internal abstract void SetWindowPos(IntPtr handle, int x, int y, int width, int height);
150                 internal abstract void GetWindowPos(IntPtr handle, bool is_toplevel, out int x, out int y, out int width, out int height, out int client_width, out int client_height);
151                 internal abstract void Activate(IntPtr handle);
152                 internal abstract void EnableWindow(IntPtr handle, bool Enable);
153                 internal abstract void SetModal(IntPtr handle, bool Modal);
154                 internal abstract void Invalidate(IntPtr handle, Rectangle rc, bool clear);
155                 internal abstract IntPtr DefWndProc(ref Message msg);
156                 internal abstract void HandleException(Exception e);
157                 internal abstract void DoEvents();
158                 internal abstract bool PeekMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags);
159                 internal abstract bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax);
160                 internal abstract bool TranslateMessage(ref MSG msg);
161                 internal abstract IntPtr DispatchMessage(ref MSG msg);
162
163                 internal abstract bool SetZOrder(IntPtr hWnd, IntPtr AfterhWnd, bool Top, bool Bottom);
164                 internal abstract bool SetTopmost(IntPtr hWnd, IntPtr hWndOwner, bool Enabled);
165
166                 internal abstract bool CalculateWindowRect(IntPtr hWnd, ref Rectangle ClientRect, int Style, int ExStyle, IntPtr MenuHandle, out Rectangle WindowRect);
167
168                 internal abstract void SetCursor(IntPtr hwnd, IntPtr cursor);
169                 internal abstract void ShowCursor(bool show);
170                 internal abstract void OverrideCursor(IntPtr cursor);
171                 internal abstract IntPtr DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot);
172                 internal abstract IntPtr DefineStdCursor(StdCursor id);
173                 internal abstract void DestroyCursor(IntPtr cursor);
174                 internal abstract void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y);
175
176                 internal abstract void GetCursorPos(IntPtr hwnd, out int x, out int y);
177                 internal abstract void SetCursorPos(IntPtr hwnd, int x, int y);
178
179                 internal abstract void ScreenToClient(IntPtr hwnd, ref int x, ref int y);
180                 internal abstract void ClientToScreen(IntPtr hwnd, ref int x, ref int y);
181
182                 internal abstract void GrabWindow(IntPtr hwnd, IntPtr ConfineToHwnd);
183                 internal abstract void GrabInfo(out IntPtr hwnd, out bool GrabConfined, out Rectangle GrabArea);
184                 internal abstract void UngrabWindow(IntPtr hwnd);
185
186                 internal abstract void SendAsyncMethod (AsyncMethodData method);
187                 internal abstract void SetTimer (Timer timer);
188                 internal abstract void KillTimer (Timer timer);
189
190                 internal abstract void CreateCaret(IntPtr hwnd, int width, int height);
191                 internal abstract void DestroyCaret(IntPtr hwnd);
192                 internal abstract void SetCaretPos(IntPtr hwnd, int x, int y);
193                 internal abstract void CaretVisible(IntPtr hwnd, bool visible);
194
195                 internal abstract void SetFocus(IntPtr hwnd);
196                 internal abstract IntPtr GetActive();
197
198                 internal abstract void ScrollWindow(IntPtr hwnd, Rectangle rectangle, int XAmount, int YAmount, bool with_children);
199                 internal abstract void ScrollWindow(IntPtr hwnd, int XAmount, int YAmount, bool with_children);
200
201                 internal abstract bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent);
202
203                 internal abstract bool SystrayAdd(IntPtr hwnd, string tip, Icon icon, out ToolTip tt);
204                 internal abstract bool SystrayChange(IntPtr hwnd, string tip, Icon icon, ref ToolTip tt);
205                 internal abstract void SystrayRemove(IntPtr hwnd, ref ToolTip tt);
206
207                 internal abstract Graphics GetMenuDC(IntPtr hwnd, IntPtr ncpaint_region);
208                 internal abstract Point GetMenuOrigin(IntPtr hwnd);
209                 internal abstract void ReleaseMenuDC(IntPtr hwnd, Graphics dc);
210                 internal abstract void MenuToScreen(IntPtr hwnd, ref int x, ref int y);
211                 internal abstract void ScreenToMenu(IntPtr hwnd, ref int x, ref int y);
212
213                 internal abstract void SetIcon(IntPtr handle, Icon icon);
214
215                 internal abstract void ClipboardClose(IntPtr handle);
216                 internal abstract IntPtr ClipboardOpen();
217                 internal abstract int ClipboardGetID(IntPtr handle, string format);
218                 internal abstract void ClipboardStore(IntPtr handle, object obj, int id, XplatUI.ObjectToClipboard converter);
219                 internal abstract int[] ClipboardAvailableFormats(IntPtr handle);
220                 internal abstract object ClipboardRetrieve(IntPtr handle, int id, XplatUI.ClipboardToObject converter);
221
222                 internal abstract void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width);
223
224                 internal abstract SizeF GetAutoScaleSize(Font font);
225
226                 // System information
227                 internal abstract int KeyboardSpeed { get; } 
228                 internal abstract int KeyboardDelay { get; } 
229
230 #endregion      // XplatUI Driver Methods
231         }
232
233         internal class XplatUIDriverSupport {
234                 #region XplatUI Driver Support Methods
235 #if NET_2_0
236                 internal static void ExecutionCallback (object state)
237                 {
238                         AsyncMethodData data = (AsyncMethodData) state;
239                         AsyncMethodResult result = data.Result.Target as AsyncMethodResult;
240                         object ret = data.Method.DynamicInvoke (data.Args);
241                         if (result != null) {
242                                 result.Complete (ret);
243                         }
244                 }
245
246                 internal static void ExecuteClientMessage (GCHandle gchandle)
247                 {
248                         AsyncMethodData data = (AsyncMethodData) gchandle.Target;
249                         try {
250                                 if (data.Context == null) {
251                                         ExecutionCallback (data);
252                                 } else {
253                                         ExecutionContext.Run (data.Context, new ContextCallback (ExecutionCallback), data);
254                                 }
255                         }
256                         finally {
257                                 gchandle.Free ();
258                         }
259                 }
260 #else
261                 // for NET_1_0 and NET_1_1 no (public) ExecutionContext exists 
262                 // so we must use the System.Threading.CompressedStack class
263                 internal static void ExecuteClientMessage (GCHandle gchandle) {
264                         AsyncMethodData data = (AsyncMethodData) gchandle.Target;
265                         CompressedStack original = null;
266 #if !MWF_ON_MSRUNTIME
267                         // Stack is non-null only if the security manager is active
268                         if (data.Stack != null) {
269                                 original = Thread.CurrentThread.GetCompressedStack ();
270                                 Thread.CurrentThread.SetCompressedStack (data.Stack);
271                         }
272 #endif
273
274                         try {
275                                 AsyncMethodResult result = data.Result.Target as AsyncMethodResult;
276                                 object ret = data.Method.DynamicInvoke (data.Args);
277
278                                 if (result != null) {
279                                         result.Complete (ret);
280                                 }
281                         }
282                         finally {
283 #if !MWF_ON_MSRUNTIME
284                                 if (data.Stack != null) {
285                                         // whatever occurs we must revert to the original compressed
286                                         // stack (null being a valid, empty, value in this case).
287                                         Thread.CurrentThread.SetCompressedStack (original);
288                                 }
289 #endif
290                                 gchandle.Free ();
291                         }
292                 }
293 #endif
294                 
295                 #endregion      // XplatUI Driver Support Methods
296         }
297 }