[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>
|
---|