Grasshopper project system now uses csproj extension
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / NativeWindow.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-2006 Novell, Inc.
21 //
22 // Authors:
23 //      Peter Dennis Bartok     pbartok@novell.com
24 //
25
26
27 // COMPLETE
28
29 //#define ExternalExceptionHandler
30
31 using System.Runtime.Remoting;
32 using System.Runtime.InteropServices;
33 using System.Runtime.CompilerServices;
34 using System.Collections;
35 using System.Diagnostics;
36
37 namespace System.Windows.Forms
38 {
39         public class NativeWindow : MarshalByRefObject {
40                 internal IntPtr                 window_handle;
41                 static internal Hashtable       window_collection = new Hashtable();
42
43                 #region Public Constructors
44                 public NativeWindow()
45                 {
46                         window_handle=IntPtr.Zero;
47                 }
48                 #endregion      // Public Constructors
49
50                 #region Public Instance Properties
51                 public IntPtr Handle {
52                         get {
53                                 return window_handle;
54                         }
55                 }
56                 #endregion      // Public Instance Properties
57
58                 #region Public Static Methods
59                 public static NativeWindow FromHandle(IntPtr handle)
60                 {
61                         NativeWindow window=new NativeWindow();
62
63                         window.AssignHandle(handle);
64                         return window;
65                 }
66                 #endregion      // Public Static Methods
67
68                 #region Private and Internal Methods
69                 internal static NativeWindow FindWindow(IntPtr handle)
70                 {
71                         NativeWindow rv;
72                         lock (window_collection) {
73                                 rv = (NativeWindow)window_collection[handle];
74                         }
75                         return rv;
76                 }
77
78                 internal void InvalidateHandle()
79                 {
80                         lock (window_collection) {
81                                 window_collection.Remove(window_handle);
82                         }
83                         window_handle = IntPtr.Zero;
84                 }
85                 #endregion
86
87                 #region Public Instance Methods
88                 public void AssignHandle(IntPtr handle)
89                 {
90                         lock (window_collection) {
91                                 if (window_handle != IntPtr.Zero) {
92                                         window_collection.Remove(window_handle);
93                                 }
94                                 window_handle=handle;
95                                 window_collection.Add(window_handle, this);
96                         }
97                         OnHandleChange();
98                 }
99
100                 public virtual void CreateHandle(CreateParams create_params)
101                 {
102                         if (create_params != null) {
103                                 window_handle=XplatUI.CreateWindow(create_params);
104
105                                 if (window_handle != IntPtr.Zero) {
106                                         lock (window_collection) {
107                                                 window_collection.Add(window_handle, this);
108                                         }
109                                 }
110                         }
111                 }
112
113                 public void DefWndProc(ref Message m)
114                 {
115                         m.Result=XplatUI.DefWndProc(ref m);
116                 }
117
118                 public virtual void DestroyHandle()
119                 {
120                         if (window_handle != IntPtr.Zero) {
121                                 XplatUI.DestroyWindow(window_handle);
122                         }
123                 }
124
125                 public virtual void ReleaseHandle()
126                 {
127                         lock (window_collection) {
128                                 window_collection.Remove(window_handle);
129                         }
130                         window_handle=IntPtr.Zero;
131                         OnHandleChange();
132                 }
133
134                 #endregion      // Public Instance Methods
135
136                 #region Protected Instance Methods
137                 ~NativeWindow()
138                 {
139                 }
140
141                 protected virtual void OnHandleChange()
142                 {
143                 }
144
145                 protected virtual void OnThreadException(Exception e)
146                 {
147                         Application.OnThreadException(e);
148                 }
149
150                 protected virtual void WndProc(ref Message m)
151                 {
152                         DefWndProc(ref m);
153                 }
154
155                 internal static IntPtr WndProc(IntPtr hWnd, Msg msg, IntPtr wParam, IntPtr lParam)
156                 {
157                         Message         m = new Message();
158                         NativeWindow    window = null;
159
160                         try {
161                                 lock (window_collection) {
162                                         window = (NativeWindow)window_collection[hWnd];
163                                 }
164                                 m.HWnd=hWnd;
165                                 m.Msg=(int)msg;
166                                 m.WParam=wParam;
167                                 m.LParam=lParam;
168                                 m.Result=IntPtr.Zero;
169
170                                 if (window != null)
171                                         window.WndProc(ref m);
172                                 else
173                                         m.Result=XplatUI.DefWndProc(ref m);
174                         }
175                         catch (Exception ex) {
176 #if !ExternalExceptionHandler                           
177                                 if (window != null)
178                                         window.OnThreadException(ex);
179 #else
180                                 throw;
181 #endif
182                         }
183
184                         #if debug
185                                 Console.WriteLine("NativeWindow.cs: Message {0}, result {1}", msg, m.Result);
186                         #endif
187
188                         return m.Result;
189                 }
190                 #endregion      // Protected Instance Methods
191         }
192 }