| [9] | 1 | <?xml version='1.0' encoding='UTF-8'?> | 
|---|
|  | 2 | <?xml-stylesheet type="text/css" | 
|---|
|  | 3 | href="eclipseos2-xxe.css" | 
|---|
|  | 4 | ?> | 
|---|
|  | 5 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | 
|---|
|  | 6 | "xhtml1-strict.dtd"> | 
|---|
|  | 7 | <html> | 
|---|
|  | 8 | <head> | 
|---|
|  | 9 | <link type="text/css" | 
|---|
|  | 10 | href="eclipseos2.css" | 
|---|
|  | 11 | rel="stylesheet" /> | 
|---|
|  | 12 |  | 
|---|
|  | 13 | <title>Eclipse for OS/2 Transitional Project Notes</title> | 
|---|
|  | 14 | </head> | 
|---|
|  | 15 |  | 
|---|
|  | 16 | <body> | 
|---|
|  | 17 | <h1>SWT Step 2. Basics of GUI, part 1</h1> | 
|---|
|  | 18 |  | 
|---|
|  | 19 | <h2>Objective</h2> | 
|---|
|  | 20 |  | 
|---|
|  | 21 | <p>Implement the basic SWT class hierarchy: from <code>o.e.swt.widgets.Widget</code> | 
|---|
|  | 22 | to <code>o.e.swt.widgets.Shell</code> to be able to create windows in the | 
|---|
|  | 23 | context of SWT. This will allow to do many other things just as they | 
|---|
|  | 24 | should be done. The test example should create and show two SWT windows: | 
|---|
|  | 25 | the top shell (filled with the default SWT background color, without any | 
|---|
|  | 26 | content) and the secondary shell (also empty) which is always above the | 
|---|
|  | 27 | top shell. Also it should handle the event queue in minimal, i.e. react to | 
|---|
|  | 28 | the close action, clean up correctly and exit.</p> | 
|---|
|  | 29 |  | 
|---|
|  | 30 | <h2>Task notes</h2> | 
|---|
|  | 31 |  | 
|---|
|  | 32 | <h3>Device contexts</h3> | 
|---|
|  | 33 |  | 
|---|
|  | 34 | <p>In fact, that there are two different layers of output device | 
|---|
|  | 35 | abstraction in OS/2: device contexts and presentation spaces, as opposed | 
|---|
|  | 36 | to Windows where the device context plays the role of both -- and handle | 
|---|
|  | 37 | to it is just allocated and returned by <code>Drawable.internal_new_GC()</code> | 
|---|
|  | 38 | method which is overriden for different types of devices. In OS/2 we use | 
|---|
|  | 39 | the presentation space handle as a return value of the <code>internal_new_GC()</code>. | 
|---|
|  | 40 | The handle to the device context is stored in the <code>GCData.hdc</code> | 
|---|
|  | 41 | field if non-null GCData object is passed to the <code>internal_new_GC()</code>.</p> | 
|---|
|  | 42 |  | 
|---|
|  | 43 | <p>For windows, the device context is not really opened by the | 
|---|
|  | 44 | <code>internal_new_GC()</code>, the handle to it is just obtained via | 
|---|
|  | 45 | <code>OS.GpiQueryDevice()</code> call with the presentation space handle | 
|---|
|  | 46 | of the window passed as an argument. Correspondingly, it is not closed by | 
|---|
|  | 47 | the <code>internal_dispose_GC()</code>.</p> | 
|---|
|  | 48 |  | 
|---|
|  | 49 | <p>For other devices, that require the real creation of the device context | 
|---|
|  | 50 | (which, together with the creation of the presentation space and | 
|---|
|  | 51 | associating the latter with the former, is made inside the <code>internal_new_GC()</code>), | 
|---|
|  | 52 | the GCData object passed in should not be <code>null</code>, because the | 
|---|
|  | 53 | handle of the device context will be necessary to correctly close this | 
|---|
|  | 54 | context by the <code>internal_dispose_GC()</code>.</p> | 
|---|
|  | 55 |  | 
|---|
|  | 56 | <h4>Win32 API to OS/2 PM API mappings relative to device contexts</h4> | 
|---|
|  | 57 |  | 
|---|
|  | 58 | <p>Below is the approximate correspondence between Windows device context | 
|---|
|  | 59 | functions and OS/2 ones:</p> | 
|---|
|  | 60 |  | 
|---|
|  | 61 | <table> | 
|---|
|  | 62 | <tr> | 
|---|
|  | 63 | <td><b>Windows GUI API</b></td> | 
|---|
|  | 64 |  | 
|---|
|  | 65 | <td><b>OS/2 PM API</b></td> | 
|---|
|  | 66 |  | 
|---|
|  | 67 | <td><b>Remarks</b></td> | 
|---|
|  | 68 | </tr> | 
|---|
|  | 69 |  | 
|---|
|  | 70 | <tr> | 
|---|
|  | 71 | <td>hDC = BeginPaint(hwnd...)</td> | 
|---|
|  | 72 |  | 
|---|
|  | 73 | <td>hps = WinBeginPaint(hwnd, NULL...) [Cached PS]</td> | 
|---|
|  | 74 |  | 
|---|
|  | 75 | <td>To draw during WM_PAINT message</td> | 
|---|
|  | 76 | </tr> | 
|---|
|  | 77 |  | 
|---|
|  | 78 | <tr> | 
|---|
|  | 79 | <td>EndPaint(hwnd...)</td> | 
|---|
|  | 80 |  | 
|---|
|  | 81 | <td>WinEndPaint(hps)</td> | 
|---|
|  | 82 |  | 
|---|
|  | 83 | <td></td> | 
|---|
|  | 84 | </tr> | 
|---|
|  | 85 |  | 
|---|
|  | 86 | <tr> | 
|---|
|  | 87 | <td>hDC = GetDC(hwnd) or hDC = GetWindowDC(hwnd)</td> | 
|---|
|  | 88 |  | 
|---|
|  | 89 | <td>hps = WinGetPS(hwnd), hps = WinGetScreenPS(hwndDesktop) [Cached | 
|---|
|  | 90 | PS]</td> | 
|---|
|  | 91 |  | 
|---|
|  | 92 | <td>To draw during any message</td> | 
|---|
|  | 93 | </tr> | 
|---|
|  | 94 |  | 
|---|
|  | 95 | <tr> | 
|---|
|  | 96 | <td>ReleaseDC(hwnd, hDC)</td> | 
|---|
|  | 97 |  | 
|---|
|  | 98 | <td>WinReleasePS(hps)</td> | 
|---|
|  | 99 |  | 
|---|
|  | 100 | <td></td> | 
|---|
|  | 101 | </tr> | 
|---|
|  | 102 |  | 
|---|
|  | 103 | <tr> | 
|---|
|  | 104 | <td>hDC = CreateDC(...)</td> | 
|---|
|  | 105 |  | 
|---|
|  | 106 | <td>hdc = WinOpenWindowDC(hwnd) or DevOpenDC(...), hps = | 
|---|
|  | 107 | GpiCreatePS(hab, hdc...) [Micro/Normal PS]</td> | 
|---|
|  | 108 |  | 
|---|
|  | 109 | <td>To dtaw on any device (usually display or printer)</td> | 
|---|
|  | 110 | </tr> | 
|---|
|  | 111 |  | 
|---|
|  | 112 | <tr> | 
|---|
|  | 113 | <td>DeleteDC(hDC)</td> | 
|---|
|  | 114 |  | 
|---|
|  | 115 | <td>GpiDestroyPS(hps), DevCloseDC(hdc)</td> | 
|---|
|  | 116 |  | 
|---|
|  | 117 | <td></td> | 
|---|
|  | 118 | </tr> | 
|---|
|  | 119 |  | 
|---|
|  | 120 | <tr> | 
|---|
|  | 121 | <td>CreateCompatibleDC(hDC)</td> | 
|---|
|  | 122 |  | 
|---|
|  | 123 | <td>hdcCompat = DevOpenDC(...hDC)</td> | 
|---|
|  | 124 |  | 
|---|
|  | 125 | <td>DC compatible with given</td> | 
|---|
|  | 126 | </tr> | 
|---|
|  | 127 | </table> | 
|---|
|  | 128 |  | 
|---|
|  | 129 | <h3><a name="ScreenCoordinates">Screen coordinates</a></h3> | 
|---|
|  | 130 |  | 
|---|
|  | 131 | <p>The coordinate space in OS/2 is flipped horizontally when compared to | 
|---|
|  | 132 | its traditional orientation in the context of windows. That is, the origin | 
|---|
|  | 133 | of the coordinate space is located in the lower left corner but not in the | 
|---|
|  | 134 | upper left, as it considered to be in SWT or in Windows, in particular. | 
|---|
|  | 135 | This should be always kept in mind. The formula to recalculate the | 
|---|
|  | 136 | <kbd>y</kbd> coordinate of the rectangle from one system to another is | 
|---|
|  | 137 | very simple: <code>y = parentHeight - (y + height)</code>, where | 
|---|
|  | 138 | <code>parentHeight</code> is the height of the parent's space, | 
|---|
|  | 139 | coordinates of the rectangle are relative to.</p> | 
|---|
|  | 140 |  | 
|---|
|  | 141 | <p>[<i><b>Note</b>: the following information is partially outdated, see | 
|---|
|  | 142 | <a href="swt004.html#WidgetHeight">here</a></i>] The package method | 
|---|
|  | 143 | <code>Control.getHeight()</code> can be used by classes within the | 
|---|
|  | 144 | <code>o.e.swt.widgets</code> package to easily obtain the height of the | 
|---|
|  | 145 | control itself and/or the height of its parent using <code>parent.getHeight()</code> | 
|---|
|  | 146 | call (note, that if the parent is <code>null</code> or when the control is | 
|---|
|  | 147 | a <code>Shell</code> instance, the <code>Display.getHeight()</code> must | 
|---|
|  | 148 | be used to obtain the parent's height). Also, the <code>Control.getBounds(SWP) | 
|---|
|  | 149 | </code>package method returns the height of the control's parent | 
|---|
|  | 150 | (respecting the situation when the parent is <code>null</code> or the | 
|---|
|  | 151 | control is a <code>Shell</code>) as the side effect of its invocation, | 
|---|
|  | 152 | which is used, for example by the <code>setBounds()</code> method. But for | 
|---|
|  | 153 | simple calculations the <code>getHeight()</code> method is more preferable | 
|---|
|  | 154 | since it does less calculations.</p> | 
|---|
|  | 155 |  | 
|---|
|  | 156 | <p>The above applies to all <code>Win*</code> API calls relative to | 
|---|
|  | 157 | sizing/positioning (such as <code>WinQueryWindowRect()</code>, | 
|---|
|  | 158 | <code>WinSetWindowPos()</code> and so on). Hopefully, for <code>Gpi*</code> | 
|---|
|  | 159 | calls we can setup the automatic horizontal flipping of the coordinate | 
|---|
|  | 160 | space to be done by changing the default view transformation matrix of the | 
|---|
|  | 161 | window's presentation space, so there's no need to do any | 
|---|
|  | 162 | coordinate conversion when using <code>Gpi*</code> functions (see also | 
|---|
|  | 163 | task notes in the <a href="swt003.html">SWT Step 003</a>).</p> | 
|---|
|  | 164 |  | 
|---|
|  | 165 | <h3>Windows</h3> | 
|---|
|  | 166 |  | 
|---|
|  | 167 | <p>In OS/2 every window has two types of relationship: parent-child and | 
|---|
|  | 168 | ownership. In both SWT and Windows there is only the parentship. Although | 
|---|
|  | 169 | the code for OS/2 related to these things will be a bit more complicated, | 
|---|
|  | 170 | the situation is very simple: in most cases (window controls) the parent | 
|---|
|  | 171 | and the owner is be the same. For shells the parent is the Desktop and the | 
|---|
|  | 172 | owner is null (for top shells) or another shell (for secondary ones). Also | 
|---|
|  | 173 | for some other windows (such as popup menus) the Desktop willbe the | 
|---|
|  | 174 | parent. In SWT the term (and the field) <i>parent</i> references to the | 
|---|
|  | 175 | real parent (the window which confines a child visually) except (not | 
|---|
|  | 176 | embedded) shells, for which the <i>parent</i> is their owner (the window | 
|---|
|  | 177 | which receives messages from them).</p> | 
|---|
|  | 178 |  | 
|---|
|  | 179 | <p>In OS/2 the frame window is the composite window of the special class | 
|---|
|  | 180 | containing the decorative elements such as a titlebar, min/max buttons, | 
|---|
|  | 181 | scroll bars (which are all windows themselves) as its children and ownees, | 
|---|
|  | 182 | as opposed to Windows where this decoration is defined just by window | 
|---|
|  | 183 | style flags in a call to the window creation function. So, the work with | 
|---|
|  | 184 | frame windows (starting with the Decorations class in the widget | 
|---|
|  | 185 | hierarchy) in OS/2 is slightly different -- in particular, the | 
|---|
|  | 186 | <code>Decorations.createHandle()</code> (see below) does some additional | 
|---|
|  | 187 | calls to create various frame controls (decorative elements) for the frame | 
|---|
|  | 188 | window being created.</p> | 
|---|
|  | 189 |  | 
|---|
|  | 190 | <p>Dialog windows in OS/2 are just extensions of frame windows, they | 
|---|
|  | 191 | subclass them and do some additional work (for example, handle the focus | 
|---|
|  | 192 | traversal over dialog controls and maintain the result code of the dialog | 
|---|
|  | 193 | window). Possibly, in SWT these windows will not be used at all and their | 
|---|
|  | 194 | behavior will be just emulated on the basis of the ordinary <code>Shell</code> | 
|---|
|  | 195 | widget.</p> | 
|---|
|  | 196 |  | 
|---|
|  | 197 | <h4>SWT window creation</h4> | 
|---|
|  | 198 |  | 
|---|
|  | 199 | <p>The common point of the native window creation is the <code>Control.createHandle()</code> | 
|---|
|  | 200 | method, which is used almost by all subclasses. The logic of its work is | 
|---|
|  | 201 | as follows:</p> | 
|---|
|  | 202 |  | 
|---|
|  | 203 | <ul> | 
|---|
|  | 204 | <li>If the <code>Control</code>'s parent is not <code>null</code> | 
|---|
|  | 205 | the <code>hwndOwner</code> of the window being created is the | 
|---|
|  | 206 | <code>parent.handle</code>, otherwise <code>null</code>.</li> | 
|---|
|  | 207 |  | 
|---|
|  | 208 | <li>If the <code>Control</code> supplies some nonzero handle value | 
|---|
|  | 209 | before making a call to its <code>createHandle()</code>method (i.e. in | 
|---|
|  | 210 | the constructor, before calling the <code>createWidget()</code>) it is | 
|---|
|  | 211 | used as the window's <code>hwndParent</code>. Otherwise the | 
|---|
|  | 212 | <code>parent.handle</code> is used as the <code>hwndParent</code> or | 
|---|
|  | 213 | <code>HWND_DESKTOP</code> if the parent is <code>null</code>.</li> | 
|---|
|  | 214 |  | 
|---|
|  | 215 | <li>Window class and window style bits are obtained via the | 
|---|
|  | 216 | <code>windowClass()</code>and <code>widgetStyle()</code>methods, | 
|---|
|  | 217 | respectively. These methods are usually overrided by subclasses.</li> | 
|---|
|  | 218 |  | 
|---|
|  | 219 | <li>Window is then subclassed in the following way: the <code>Display.windowProc()</code> | 
|---|
|  | 220 | becomes the new window procedure, which calls the <code>Control.windowProc()</code>, | 
|---|
|  | 221 | which usually calls the old window procedure via the <code>Control.callWindowProc()</code>.</li> | 
|---|
|  | 222 | </ul> | 
|---|
|  | 223 |  | 
|---|
|  | 224 | <h2>Step checklist</h2> | 
|---|
|  | 225 |  | 
|---|
|  | 226 | <table> | 
|---|
|  | 227 | <col width="40%" /> | 
|---|
|  | 228 |  | 
|---|
|  | 229 | <col /> | 
|---|
|  | 230 |  | 
|---|
|  | 231 | <col width="50%" /> | 
|---|
|  | 232 |  | 
|---|
|  | 233 | <thead> | 
|---|
|  | 234 | <tr> | 
|---|
|  | 235 | <th>Operation</th> | 
|---|
|  | 236 |  | 
|---|
|  | 237 | <th>Status</th> | 
|---|
|  | 238 |  | 
|---|
|  | 239 | <th>Remarks</th> | 
|---|
|  | 240 | </tr> | 
|---|
|  | 241 | </thead> | 
|---|
|  | 242 |  | 
|---|
|  | 243 | <tr> | 
|---|
|  | 244 | <td>Partially implement the <code>Widget</code> class</td> | 
|---|
|  | 245 |  | 
|---|
|  | 246 | <td>Done [dmik]</td> | 
|---|
|  | 247 |  | 
|---|
|  | 248 | <td>Only the character translation is not implemented.</td> | 
|---|
|  | 249 | </tr> | 
|---|
|  | 250 |  | 
|---|
|  | 251 | <tr> | 
|---|
|  | 252 | <td>Partially Implement the <code>GC</code> class</td> | 
|---|
|  | 253 |  | 
|---|
|  | 254 | <td>Delayed</td> | 
|---|
|  | 255 |  | 
|---|
|  | 256 | <td>Almost completely commented. The major work will be done on the | 
|---|
|  | 257 | step 3.</td> | 
|---|
|  | 258 | </tr> | 
|---|
|  | 259 |  | 
|---|
|  | 260 | <tr> | 
|---|
|  | 261 | <td>Add <code>EventTable</code>, <code>Listener</code>, <code>Event</code>, | 
|---|
|  | 262 | <code>TypedListener</code> to compilation</td> | 
|---|
|  | 263 |  | 
|---|
|  | 264 | <td>Done [dmik]</td> | 
|---|
|  | 265 |  | 
|---|
|  | 266 | <td></td> | 
|---|
|  | 267 | </tr> | 
|---|
|  | 268 |  | 
|---|
|  | 269 | <tr> | 
|---|
|  | 270 | <td>Implement <code>Display.internal_new_GC()</code> and <code>Display.internal_dispose_GC()</code></td> | 
|---|
|  | 271 |  | 
|---|
|  | 272 | <td>Done [dmik]</td> | 
|---|
|  | 273 |  | 
|---|
|  | 274 | <td>See Task notes above.</td> | 
|---|
|  | 275 | </tr> | 
|---|
|  | 276 |  | 
|---|
|  | 277 | <tr> | 
|---|
|  | 278 | <td>Add <code>o.e.swt.events.*Listener</code>, <code>*Event</code> and | 
|---|
|  | 279 | <code>*Adapter</code> classes to compilation</td> | 
|---|
|  | 280 |  | 
|---|
|  | 281 | <td>Done [dmik]</td> | 
|---|
|  | 282 |  | 
|---|
|  | 283 | <td></td> | 
|---|
|  | 284 | </tr> | 
|---|
|  | 285 |  | 
|---|
|  | 286 | <tr> | 
|---|
|  | 287 | <td>Add <code>o.e.swt.accessibility.*</code> (common and emulated) to | 
|---|
|  | 288 | compilation</td> | 
|---|
|  | 289 |  | 
|---|
|  | 290 | <td>Done [dmik]</td> | 
|---|
|  | 291 |  | 
|---|
|  | 292 | <td></td> | 
|---|
|  | 293 | </tr> | 
|---|
|  | 294 |  | 
|---|
|  | 295 | <tr> | 
|---|
|  | 296 | <td>Add message time obtaining to <code>Widget.sendEvent()</code> and | 
|---|
|  | 297 | <code>Widget.postEvent()</code></td> | 
|---|
|  | 298 |  | 
|---|
|  | 299 | <td>Done [dmik]</td> | 
|---|
|  | 300 |  | 
|---|
|  | 301 | <td></td> | 
|---|
|  | 302 | </tr> | 
|---|
|  | 303 |  | 
|---|
|  | 304 | <tr> | 
|---|
|  | 305 | <td>Implement <code>OS.WinSendMsg</code>, <code>OS.WinPostMsg()</code>, | 
|---|
|  | 306 | <code>OS.WinQueryMsgTime()</code></td> | 
|---|
|  | 307 |  | 
|---|
|  | 308 | <td>Done [dmik]</td> | 
|---|
|  | 309 |  | 
|---|
|  | 310 | <td></td> | 
|---|
|  | 311 | </tr> | 
|---|
|  | 312 |  | 
|---|
|  | 313 | <tr> | 
|---|
|  | 314 | <td>Add standard <code>WM_*</code> constants</td> | 
|---|
|  | 315 |  | 
|---|
|  | 316 | <td>Done [dmik]</td> | 
|---|
|  | 317 |  | 
|---|
|  | 318 | <td>Most of them are commented and will be uncommented on demand</td> | 
|---|
|  | 319 | </tr> | 
|---|
|  | 320 |  | 
|---|
|  | 321 | <tr> | 
|---|
|  | 322 | <td>Add standard <code>WC_*</code> constants</td> | 
|---|
|  | 323 |  | 
|---|
|  | 324 | <td>Done [dmik]</td> | 
|---|
|  | 325 |  | 
|---|
|  | 326 | <td>Most of them are commented and will be uncommented on demand. | 
|---|
|  | 327 | Since they actually are integer values (integer atoms) but natives | 
|---|
|  | 328 | that use them require PSZ as a class name, a special static method | 
|---|
|  | 329 | getAtom() is added to PSZ class that returns a string representation | 
|---|
|  | 330 | of an atom.</td> | 
|---|
|  | 331 | </tr> | 
|---|
|  | 332 |  | 
|---|
|  | 333 | <tr> | 
|---|
|  | 334 | <td>Implement the <code>WidgetTable</code> class, <code>OS.Win[Set|Query]Window[ULong|UShort]()</code> | 
|---|
|  | 335 | and add <code>QW[L|S]_*</code> constants</td> | 
|---|
|  | 336 |  | 
|---|
|  | 337 | <td>Done [dmik]</td> | 
|---|
|  | 338 |  | 
|---|
|  | 339 | <td></td> | 
|---|
|  | 340 | </tr> | 
|---|
|  | 341 |  | 
|---|
|  | 342 | <tr> | 
|---|
|  | 343 | <td>Implement the <code>OS.WinQueryClassInfo()</code> and add | 
|---|
|  | 344 | <code>CLASSINFO</code> class</td> | 
|---|
|  | 345 |  | 
|---|
|  | 346 | <td>Done [dmik]</td> | 
|---|
|  | 347 |  | 
|---|
|  | 348 | <td></td> | 
|---|
|  | 349 | </tr> | 
|---|
|  | 350 |  | 
|---|
|  | 351 | <tr> | 
|---|
|  | 352 | <td>Implement <code>OS.WinQueryWindowRect()</code>, <code>OS.WinMapWindowPoints()</code>, | 
|---|
|  | 353 | <code>RECTL</code> class</td> | 
|---|
|  | 354 |  | 
|---|
|  | 355 | <td>Done [dmik]</td> | 
|---|
|  | 356 |  | 
|---|
|  | 357 | <td></td> | 
|---|
|  | 358 | </tr> | 
|---|
|  | 359 |  | 
|---|
|  | 360 | <tr> | 
|---|
|  | 361 | <td>Implement <code>OS.WinIsWindowEnabled()</code>, <code>WinIsWindowVisible()</code>, | 
|---|
|  | 362 | <code>WinQueryFocus()</code>, <code>WinQueryWindow()</code>, | 
|---|
|  | 363 | <code>WinShowWindow()</code></td> | 
|---|
|  | 364 |  | 
|---|
|  | 365 | <td>Done [dmik]</td> | 
|---|
|  | 366 |  | 
|---|
|  | 367 | <td></td> | 
|---|
|  | 368 | </tr> | 
|---|
|  | 369 |  | 
|---|
|  | 370 | <tr> | 
|---|
|  | 371 | <td>Implement <code>OS.WinGetPS()</code>, <code>WinReleasePS()</code>, | 
|---|
|  | 372 | <code>WinBeginPaint()</code>, <code>WinEndPaint()</code>, | 
|---|
|  | 373 | <code>WinInvalidateRect()</code>, <code>WinUpdateWindow()</code></td> | 
|---|
|  | 374 |  | 
|---|
|  | 375 | <td>Done [dmik]</td> | 
|---|
|  | 376 |  | 
|---|
|  | 377 | <td></td> | 
|---|
|  | 378 | </tr> | 
|---|
|  | 379 |  | 
|---|
|  | 380 | <tr> | 
|---|
|  | 381 | <td>Implement the <code>OS.WinQuerySysValue()</code> and <code>SV_*</code> | 
|---|
|  | 382 | constants</td> | 
|---|
|  | 383 |  | 
|---|
|  | 384 | <td>Done [dmik]</td> | 
|---|
|  | 385 |  | 
|---|
|  | 386 | <td></td> | 
|---|
|  | 387 | </tr> | 
|---|
|  | 388 |  | 
|---|
|  | 389 | <tr> | 
|---|
|  | 390 | <td>Add the static <code>Display.height</code> field</td> | 
|---|
|  | 391 |  | 
|---|
|  | 392 | <td>Done [dmik]</td> | 
|---|
|  | 393 |  | 
|---|
|  | 394 | <td>This field is used to flip the window coordinate space vertically</td> | 
|---|
|  | 395 | </tr> | 
|---|
|  | 396 |  | 
|---|
|  | 397 | <tr> | 
|---|
|  | 398 | <td>Add <code>o.e.swt.internal.pm.MRESULT</code> class</td> | 
|---|
|  | 399 |  | 
|---|
|  | 400 | <td>Done [dmik]</td> | 
|---|
|  | 401 |  | 
|---|
|  | 402 | <td>The reason it was added is that, as opposed to the simple int | 
|---|
|  | 403 | type, <code>null</code> can be returned by individual message handlers | 
|---|
|  | 404 | indicating that the message hasn't been processed and therefore | 
|---|
|  | 405 | should be passed to the default window procedure.</td> | 
|---|
|  | 406 | </tr> | 
|---|
|  | 407 |  | 
|---|
|  | 408 | <tr> | 
|---|
|  | 409 | <td>Implement the helper function <code>OS.WinCallWindowProc()</code></td> | 
|---|
|  | 410 |  | 
|---|
|  | 411 | <td>Done [dmik]</td> | 
|---|
|  | 412 |  | 
|---|
|  | 413 | <td>To get the ability to call the window procedure given as the int | 
|---|
|  | 414 | value (actually the C pointer to a function)</td> | 
|---|
|  | 415 | </tr> | 
|---|
|  | 416 |  | 
|---|
|  | 417 | <tr> | 
|---|
|  | 418 | <td>implement the <code>OS.WinSetWindowPos()</code> and <code>SWP_*</code> | 
|---|
|  | 419 | constants</td> | 
|---|
|  | 420 |  | 
|---|
|  | 421 | <td>Done [dmik]</td> | 
|---|
|  | 422 |  | 
|---|
|  | 423 | <td></td> | 
|---|
|  | 424 | </tr> | 
|---|
|  | 425 |  | 
|---|
|  | 426 | <tr> | 
|---|
|  | 427 | <td>implement the <code>OS.WinCreateFrameControls()</code> and | 
|---|
|  | 428 | <code>FCF_*</code>, <code>FS_*</code>, <code>FF_*</code> constants</td> | 
|---|
|  | 429 |  | 
|---|
|  | 430 | <td>Done [dmik]</td> | 
|---|
|  | 431 |  | 
|---|
|  | 432 | <td></td> | 
|---|
|  | 433 | </tr> | 
|---|
|  | 434 |  | 
|---|
|  | 435 | <tr> | 
|---|
|  | 436 | <td>Implement the <code>OS.WinGetScreenPC()</code> and <code>OS.GpiQueryDevice()</code></td> | 
|---|
|  | 437 |  | 
|---|
|  | 438 | <td>Done [dmik]</td> | 
|---|
|  | 439 |  | 
|---|
|  | 440 | <td></td> | 
|---|
|  | 441 | </tr> | 
|---|
|  | 442 |  | 
|---|
|  | 443 | <tr> | 
|---|
|  | 444 | <td>Implement <code>OS.WinQueryWindowTextLength()</code>, | 
|---|
|  | 445 | <code>WinQueryWindowText()</code>, <code>WinSetWindowText()</code>, | 
|---|
|  | 446 | add a new constructor to the <code>PSZ</code> class taking an integer | 
|---|
|  | 447 | as the length of an empty string to create</td> | 
|---|
|  | 448 |  | 
|---|
|  | 449 | <td>Done [dmik]</td> | 
|---|
|  | 450 |  | 
|---|
|  | 451 | <td>Used to get/set shell titles</td> | 
|---|
|  | 452 | </tr> | 
|---|
|  | 453 |  | 
|---|
|  | 454 | <tr> | 
|---|
|  | 455 | <td>Implement the <code>OS.WinFillRect()</code> and <code>OS.objcpy()</code> | 
|---|
|  | 456 | for the <code>RECTL</code> structure</td> | 
|---|
|  | 457 |  | 
|---|
|  | 458 | <td>Done [dmik]</td> | 
|---|
|  | 459 |  | 
|---|
|  | 460 | <td>Needed to handle <code>WM_ERASEBACKGROUND</code> message.</td> | 
|---|
|  | 461 | </tr> | 
|---|
|  | 462 |  | 
|---|
|  | 463 | <tr> | 
|---|
|  | 464 | <td>Partially implement the following classes to reach the step | 
|---|
|  | 465 | objective: <code>o.e.swt.widgets.Control</code>, <code>Scrollable</code>, | 
|---|
|  | 466 | <code>Composite</code>, <code>Canvas</code>, <code>Decorations</code>, | 
|---|
|  | 467 | <code>Shell</code> and some others (<code>WidgetTable</code> etc) they | 
|---|
|  | 468 | depend on</td> | 
|---|
|  | 469 |  | 
|---|
|  | 470 | <td>Done [dmik]</td> | 
|---|
|  | 471 |  | 
|---|
|  | 472 | <td>The majority of work has been done in the Control, Decorations and | 
|---|
|  | 473 | Shell classes, others are almost fully commented.</td> | 
|---|
|  | 474 | </tr> | 
|---|
|  | 475 |  | 
|---|
|  | 476 | <tr> | 
|---|
|  | 477 | <td>Add the <code>SWT002</code> testcase</td> | 
|---|
|  | 478 |  | 
|---|
|  | 479 | <td>Done [dmik]</td> | 
|---|
|  | 480 |  | 
|---|
|  | 481 | <td>Note: <code>WinDestroyWindow()</code> is not called for secondary | 
|---|
|  | 482 | shells explicitly. It's a planned behavior of SWT (see the | 
|---|
|  | 483 | description of the <code>Widget.destroyWidget()</code>). It is | 
|---|
|  | 484 | suitable for OS/2 when the window's owner is a <code>WC_FRAME</code> | 
|---|
|  | 485 | window. See remarks inside the <code>Control.createHandle()</code>.</td> | 
|---|
|  | 486 | </tr> | 
|---|
|  | 487 | </table> | 
|---|
|  | 488 | </body> | 
|---|
|  | 489 | </html> | 
|---|