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 href="eclipseos2.css" rel="stylesheet" type="text/css" />
|
---|
10 |
|
---|
11 | <title>Eclipse for OS/2 Transitional Project Notes</title>
|
---|
12 | </head>
|
---|
13 |
|
---|
14 | <body>
|
---|
15 | <h1>Standard Widget Toolkit</h1>
|
---|
16 |
|
---|
17 | <p>The main idea of the SWT library is such that its internal
|
---|
18 | implementation on the certain platform is made in the terms of that
|
---|
19 | platform, directly using its native API through the JNI interface, so the
|
---|
20 | look'n'feel comes close to the regular platform applications (i.e.
|
---|
21 | usability; other important benefits of such approach are: easiness,
|
---|
22 | stability, performance). This means that there is a different
|
---|
23 | implementation of the basics of SWT for each supported platform; only the
|
---|
24 | public interface of SWT classes is, of course, the same. So the term
|
---|
25 | "porting" in this case means rewriting the most part of the internal logic
|
---|
26 | from scratch (sometimes including the whole classes) rather than just
|
---|
27 | correcting it for the specific OS. Therefore we have chosen to start from
|
---|
28 | the very beginning and go possibly like original Eclipse developers did,
|
---|
29 | from the basics (the top of the class hierarchy) to details, creating the
|
---|
30 | java and the native code in parallel. The best way to do it is to divide
|
---|
31 | our work into little steps (tasks): every of them is the next level of the
|
---|
32 | implementation and can be tested regardless of other parts that are to be
|
---|
33 | implemented on the next levels.</p>
|
---|
34 |
|
---|
35 | <h2>Brief description of SWT parts</h2>
|
---|
36 |
|
---|
37 | <p>Technically, SWT sources consist of two parts: one is written in Java,
|
---|
38 | another is written in C and contains native methods that communicate with
|
---|
39 | Java code through JNI.</p>
|
---|
40 |
|
---|
41 | <p>The table below represents basic subcomponents of SWT as they were
|
---|
42 | defined by the original developers. There's a separate directory for each
|
---|
43 | subcomponent in the structure of the Eclipse sources. Packages with names
|
---|
44 | in <b>bold</b> are platform specific (i.e. have their own implementation
|
---|
45 | on each platform), other are common for all platforms (but may require
|
---|
46 | some adaptation for a certain OS). <code>o.e.swt</code> here and further
|
---|
47 | is a short form of <code>org.eclipse.swt</code>, for convenience.</p>
|
---|
48 |
|
---|
49 | <table>
|
---|
50 | <thead>
|
---|
51 | <tr>
|
---|
52 | <th>Name</th>
|
---|
53 |
|
---|
54 | <th>Description</th>
|
---|
55 |
|
---|
56 | <th>Packages</th>
|
---|
57 |
|
---|
58 | <th>Prognosis</th>
|
---|
59 | </tr>
|
---|
60 | </thead>
|
---|
61 |
|
---|
62 | <tr>
|
---|
63 | <td>SWT Base</td>
|
---|
64 |
|
---|
65 | <td>SWT Base. Contains the major part of all public classes and
|
---|
66 | interfaces. Implementations of many basic classes (Display, Widget
|
---|
67 | etc.) are individual for each supported platform.</td>
|
---|
68 |
|
---|
69 | <td>o.e.swt.events<br />o.e.swt.graphics<br />o.e.swt.internal<br />o.e.swt.internal.image<br />o.e.swt.layout<br />o.e.swt.widgetsefwef<br /><b>o.e.swt.graphics</b><br /><b>o.e.swt.internal</b><br /><b>o.e.swt.widgets</b></td>
|
---|
70 |
|
---|
71 | <td>Platform dependent parts need to be almost fully rewritten for
|
---|
72 | OS/2</td>
|
---|
73 | </tr>
|
---|
74 |
|
---|
75 | <tr>
|
---|
76 | <td>SWT PI</td>
|
---|
77 |
|
---|
78 | <td>SWT Platform Implementation. Contains platform dependent internal
|
---|
79 | implementations of SWT interface, including Java wrappers for platform
|
---|
80 | native API data structures.</td>
|
---|
81 |
|
---|
82 | <td>o.e.swt.internal<br /><b>o.e.swt.internal.<xxx></b></td>
|
---|
83 |
|
---|
84 | <td>Needs to be almost fully rewritten for OS/2</td>
|
---|
85 | </tr>
|
---|
86 |
|
---|
87 | <tr>
|
---|
88 | <td>SWT AWT</td>
|
---|
89 |
|
---|
90 | <td>It's an experimental class (works currently only on Win32 and has
|
---|
91 | some limitations) to make it possible to embed AWT widgets to SWT
|
---|
92 | layout.</td>
|
---|
93 |
|
---|
94 | <td><b>o.e.s.internal.awt.<xxx></b></td>
|
---|
95 |
|
---|
96 | <td>Can be implemented in the future?</td>
|
---|
97 | </tr>
|
---|
98 |
|
---|
99 | <tr>
|
---|
100 | <td>SWT Accessibility</td>
|
---|
101 |
|
---|
102 | <td>Accessibility support.</td>
|
---|
103 |
|
---|
104 | <td>o.s.swt.accessibility<br /><b>o.s.swt.accessibility</b></td>
|
---|
105 |
|
---|
106 | <td>Is it supported natively by OS/2 or should be emulated?</td>
|
---|
107 | </tr>
|
---|
108 |
|
---|
109 | <tr>
|
---|
110 | <td>SWT Custom Widgets</td>
|
---|
111 |
|
---|
112 | <td>Standard custom widgets library</td>
|
---|
113 |
|
---|
114 | <td>o.e.swt.custom</td>
|
---|
115 |
|
---|
116 | <td>Does not contain any platform dependent code?</td>
|
---|
117 | </tr>
|
---|
118 |
|
---|
119 | <tr>
|
---|
120 | <td>SWT Drag and Drop</td>
|
---|
121 |
|
---|
122 | <td>Public interface for D'n'D support</td>
|
---|
123 |
|
---|
124 | <td>o.e.swt.dnd<br /><b>o.e.swt.dnd</b></td>
|
---|
125 |
|
---|
126 | <td>Platform dependent implementations need to be rewritten (partially
|
---|
127 | ported from Win32?) for OS/2</td>
|
---|
128 | </tr>
|
---|
129 |
|
---|
130 | <tr>
|
---|
131 | <td>SWT Printing</td>
|
---|
132 |
|
---|
133 | <td>SWT printing capabilities</td>
|
---|
134 |
|
---|
135 | <td><b>o.e.swt.printing</b><br />o.e.swt.printing</td>
|
---|
136 |
|
---|
137 | <td>Needs to be almost fully rewritten for OS/2 (not a lot of work to
|
---|
138 | do)</td>
|
---|
139 | </tr>
|
---|
140 |
|
---|
141 | <tr>
|
---|
142 | <td>SWT Program</td>
|
---|
143 |
|
---|
144 | <td>OS specific program launching aspects</td>
|
---|
145 |
|
---|
146 | <td><b>o.e.swt.program</b></td>
|
---|
147 |
|
---|
148 | <td>Just one single class <)</td>
|
---|
149 | </tr>
|
---|
150 |
|
---|
151 | <tr>
|
---|
152 | <td>SWT OLE</td>
|
---|
153 |
|
---|
154 | <td>OLE support</td>
|
---|
155 |
|
---|
156 | <td><b>o.e.swt.ole.win32</b><br /><b>o.e.swt.internal.ole.win32</b></td>
|
---|
157 |
|
---|
158 | <td>Can the similar one be implemented for OS/2 in the future?</td>
|
---|
159 | </tr>
|
---|
160 | </table>
|
---|
161 |
|
---|
162 | <h3><a name="native.methods">Native methods [uncomplete]</a></h3>
|
---|
163 |
|
---|
164 | <p>C sources of native methods are organized in the following way:</p>
|
---|
165 |
|
---|
166 | <ul>
|
---|
167 | <li><kbd>swt.h</kbd> -- contains some definitions common for all C
|
---|
168 | code.</li>
|
---|
169 |
|
---|
170 | <li><kbd>callback.h</kbd>, <kbd>callback.c</kbd> -- contain native
|
---|
171 | methods and helpers for <code>org.eclipse.swt.internal.Callback</code>
|
---|
172 | class, that allows using regular Java methods as callback functions by
|
---|
173 | the platform native API.</li>
|
---|
174 |
|
---|
175 | <li><kbd>structs.h</kbd>, <kbd>structs.c</kbd> -- contain getter/setter
|
---|
176 | functions to convert data from platform native API structures to their
|
---|
177 | Java wrappers and back. These functions are used by native methods.</li>
|
---|
178 |
|
---|
179 | <li><kbd>swt.c</kbd> -- contains definitions of native methods.</li>
|
---|
180 | </ul>
|
---|
181 |
|
---|
182 | <p>Native methods serve as a bridge between SWT and underlying platform
|
---|
183 | API. One of Eclipse principles is that such mapping should be transparent
|
---|
184 | as much as it possible. It means that Java methods have exactly the same
|
---|
185 | name and behavior as their native counterparts, including the type and the
|
---|
186 | list of arguments and the return value. For that purposes there are Java
|
---|
187 | wrappers exist for native structures used by platform API functions to
|
---|
188 | exchange information with the application. These wrapper classes are
|
---|
189 | defined in the SWT PI part as well as the <code>o.e.swt.internal.OS</code>
|
---|
190 | class containing (almost?) all of native API-to-Java mappers. But due to
|
---|
191 | the fact that Java semantics differ from C there cannot be the full
|
---|
192 | equivalence between C and Java types, so some considerations about mapping
|
---|
193 | should be taken into account.</p>
|
---|
194 |
|
---|
195 | <h4>Primitive types</h4>
|
---|
196 |
|
---|
197 | <ul>
|
---|
198 | <li>C 32-bit integer types (<code>[unsigned] int</code>,
|
---|
199 | <code>[unsigned] long</code> and derived) are mapped to Java
|
---|
200 | <code>int</code> type.</li>
|
---|
201 |
|
---|
202 | <li>In some cases 32-bit types that logically are boolean, can be mapped
|
---|
203 | to Java <code>boolean</code> type.</li>
|
---|
204 |
|
---|
205 | <li>C 16-bit integer type <code>[unsigned] short</code> (and derived) is
|
---|
206 | mapped to Java <code>short</code> type.</li>
|
---|
207 |
|
---|
208 | <li>C 8-bit integer type <code>[unsigned] char</code> (and derived) is
|
---|
209 | mapped to Java <code>byte</code> type.</li>
|
---|
210 | </ul>
|
---|
211 |
|
---|
212 | <h4>Arrays</h4>
|
---|
213 |
|
---|
214 | <p>...</p>
|
---|
215 |
|
---|
216 | <h4>Pointers</h4>
|
---|
217 |
|
---|
218 | <ul>
|
---|
219 | <li>Pointer to an array of primitive type is mapped to a Java reference
|
---|
220 | to an array of the corresponding primitive type (i.e., <code>int*</code>
|
---|
221 | is mapped to <code>int[]</code>). There's one exception with ASCIIZ
|
---|
222 | strings (see below).</li>
|
---|
223 |
|
---|
224 | <li>Pointer to a C structure that have the corresponding Java wrapper is
|
---|
225 | mapped to a Java reference to that wrapper class (see below about
|
---|
226 | structures).</li>
|
---|
227 |
|
---|
228 | <li>Pointer to a function and pointers to other types that are not
|
---|
229 | directly used by the Java code (and therefore do not have wrappers) are
|
---|
230 | mapped to Java <code>int</code> type.</li>
|
---|
231 |
|
---|
232 | <li>Pointer to an array of C structures is mapped to Java
|
---|
233 | <code>int</code> array (see below).</li>
|
---|
234 | </ul>
|
---|
235 |
|
---|
236 | <p>There's a special case with pointers to arrays and ASCIIZ strings,
|
---|
237 | which are <i>returned</i> by some platform API calls to represent some
|
---|
238 | data of variable length. There are few situations when such data is not
|
---|
239 | copied to the storage area provided by the caller, but the pointer to the
|
---|
240 | internal storage area is returned. In these situations we cannot allocate
|
---|
241 | the storage for that data in Java before a call to a native method,
|
---|
242 | because we don't know its size. The solution can be to create the
|
---|
243 | corresponding Java array object inside of the C implementation of the
|
---|
244 | native method after an API call (when we already know the size of the data
|
---|
245 | returned) fill it and return the reference to this object to the Java
|
---|
246 | caller.</p>
|
---|
247 |
|
---|
248 | <p>Also there are sutiations when an API call returns a pointer to a
|
---|
249 | structure from its internal storage and the user should be able to access
|
---|
250 | this data directly to change some value (the good example is
|
---|
251 | <code>DosGetInfoBlocks()</code>). Since a Java structure wrapper class
|
---|
252 | contains a copy of the original data it doesn't make sence to use it as a
|
---|
253 | parameter to call such API -- it's better to return a pointer to the
|
---|
254 | caller "as is" using a reference to one-element array of <code>int</code>
|
---|
255 | type to use it for the direct access. But Java cannot read/write directly
|
---|
256 | to the specified memory address, so we need some helper functions to copy
|
---|
257 | data from a wrapper class directly to a given memory location and back.
|
---|
258 | These functions are overloaded versions of
|
---|
259 | <code>o.e.swt.internal.pm.OS.objcpy()</code>. They take two arguments: the
|
---|
260 | destination (the first one) and the source (the second one) of data to be
|
---|
261 | copied. One of them is a reference to a wrapper class and another is an
|
---|
262 | <code>int</code> value containing the address of (the pointer to) the
|
---|
263 | corresponding C structure. So, to the sequence of operations to get the
|
---|
264 | required result can be:</p>
|
---|
265 |
|
---|
266 | <ol>
|
---|
267 | <li>Call API function to get the "real" pointer through an one-element
|
---|
268 | <code>int</code> array</li>
|
---|
269 |
|
---|
270 | <li>Use it in <code>OS.objcpy()</code> to copy data to the object of the
|
---|
271 | wrapper class</li>
|
---|
272 |
|
---|
273 | <li>Change object's nesessary fields</li>
|
---|
274 |
|
---|
275 | <li>Use <code>OS.objcpy()</code> to copy data back from the object to
|
---|
276 | the memory</li>
|
---|
277 | </ol>
|
---|
278 |
|
---|
279 | <p><b>Note.</b> These helper functions are potentionally dangerous and
|
---|
280 | should be used very carefully since there's no way to check whether a
|
---|
281 | given pointer really points to the structure of the appropriate type or
|
---|
282 | not. However, if zero or <code>null</code> is passed as one of arguments,
|
---|
283 | an <code>SWTError</code> exception will be thrown (this behavior depends
|
---|
284 | on the <code>DEBUG_CHECK_NULL_EXCEPTIONS</code> macro definition during
|
---|
285 | compilation of the SWT DLL).</p>
|
---|
286 |
|
---|
287 | <h4>ASCIIZ strings</h4>
|
---|
288 |
|
---|
289 | <p>ASCIIZ strings are mapped using references to the special Java wrapper
|
---|
290 | class: <code>o.e.swt.internal.pm.PSZ</code>. String data is actually
|
---|
291 | stored in its <code>bytes</code> field which is of <code>byte[]</code>
|
---|
292 | type. This class provides automatic appending of zero byte to the array
|
---|
293 | when constructed from Java <code>String</code> type and removing that byte
|
---|
294 | when converted back to <code>String</code>. Convertion between Unicode and
|
---|
295 | 8-byte ASCII characters is done using the default system codepage. There
|
---|
296 | are helper functions to handle this wrapper in C:
|
---|
297 | <code>getPSZArray()</code>, <code>getPSZBytes()</code> and
|
---|
298 | <code>releasePSZBytes()</code>, see their description at the top of
|
---|
299 | <kbd>structs.h</kbd>.</p>
|
---|
300 |
|
---|
301 | <h4>Structures</h4>
|
---|
302 |
|
---|
303 | <p>C structures are mapped to Java classes (wrappers) with the same name
|
---|
304 | and fields (their order and names). Primitive fields' types are mapped
|
---|
305 | according to the rules above. For every structure the following C helper
|
---|
306 | functions are defined: <code>cacheXXXFids()</code> (and the correspondig
|
---|
307 | <code>XXX_FID_CACHE</code> structure) to cache Java field IDs,
|
---|
308 | <code>getXXXFields()</code> to fill the native C structure with values
|
---|
309 | from the Java wrapper structure before a call to platform API routine and
|
---|
310 | <code>setXXXFields()</code> for backward operation after a call.</p>
|
---|
311 |
|
---|
312 | <p>If some field of the structure is itself a structure or a pointer to a
|
---|
313 | structure, there are two ways to handle this situation:</p>
|
---|
314 |
|
---|
315 | <ul>
|
---|
316 | <li>The first way is to "unfold" such nested structure into regular
|
---|
317 | fields of the parent structure with names constructed according to the
|
---|
318 | following scheme: <code>xxx_yyy</code>, where <code>xxx</code> is the
|
---|
319 | name of the field representing the nested structure and <code>yyy</code>
|
---|
320 | is substituted with field names of that nested structure. It's useful
|
---|
321 | when the structure has few fields. As an example, see the
|
---|
322 | <code>o.e.swt.internal.pm.QMSG</code> wrapper class.</li>
|
---|
323 |
|
---|
324 | <li>The second way can be used when there's a need to operate the nested
|
---|
325 | structure whth many fields as a whole (using a reference to it) rather
|
---|
326 | than accessing its fields directly. Such nested structure must have its
|
---|
327 | own Java wrapper (as descrbed above) and be mapped to a reference to
|
---|
328 | that type, and <code>getXXXFields()</code> and
|
---|
329 | <code>setXXXFields()</code> must correctly handle this case. For
|
---|
330 | example, see <code>TIB</code> and <code>TIB2</code> wrappers and their
|
---|
331 | getters/setters (though <code>TIB2</code> does not actually need to be
|
---|
332 | used as a whole, it was done so for clarity). Note that such nested
|
---|
333 | wrapper is newed (via the initializer expression) in the parent
|
---|
334 | wrapper's implicit constructor.</li>
|
---|
335 | </ul>
|
---|
336 |
|
---|
337 | <p>Some structures have the special field (<code>cb</code> or
|
---|
338 | <code>cbFix</code>) that should be set to the length of the structure
|
---|
339 | before passing it to a function. In Win32 version this is achieved by
|
---|
340 | adding an extra field (<code>sizeof</code>) to Java wrapper of every
|
---|
341 | structure and then assigning its value to the length field when using the
|
---|
342 | structure from Java code. In OS/2, this is done not at the Java level, but
|
---|
343 | in the code of the structure's getter function. Therefore, the need in the
|
---|
344 | <code>sizeof</code> field is eliminated (tough,some strucrures will have
|
---|
345 | this field because there are some cases when arrays of that structures are
|
---|
346 | given us as a pointer from the C code and we need to know the address of
|
---|
347 | the particular structure in the array). Also, Java wrappers in OS/2 do not
|
---|
348 | contain the <code>cb</code> or <code>cbFix</code> field since it's useless
|
---|
349 | from the point of view of data the structure represents.</p>
|
---|
350 |
|
---|
351 | <h4>Pointers to structures</h4>
|
---|
352 |
|
---|
353 | <p>Since it's too complicated (in particular, requires two transformations
|
---|
354 | and two times more memory) to convert arrays of C structures to arrays of
|
---|
355 | their Java wrappers and back, such arrays are mapped to arrays of Java
|
---|
356 | <code>int</code> type, where every one or more elements of that array
|
---|
357 | correspond to a field from the structure, consequtively. Of course, it's
|
---|
358 | suitable only for structure types where all fields have the size which is
|
---|
359 | multiple of 32-bit <code>int</code> type, such as <code>POINTL</code> and
|
---|
360 | <code>RECTL</code>. This is primarily used in <code>Gpi*</code> API calls.
|
---|
361 | Hopefully, at the present time there is no need to work with other types
|
---|
362 | of structures.</p>
|
---|
363 |
|
---|
364 | <p>For convenience, parameter names in the declaration (in Java) and in
|
---|
365 | the definition (in C) of native methods should be the same as in the
|
---|
366 | toolkit documentation.</p>
|
---|
367 |
|
---|
368 | <h2>SWT compilation notes</h2>
|
---|
369 |
|
---|
370 | <p>SWT compilation is driven by the <kbd>build.xml</kbd> located in the
|
---|
371 | <kbd>src\plugins\org.eclipse.swt.pm</kbd> directory of the repository. It
|
---|
372 | should not be used directly since there are some prerequisites that are
|
---|
373 | set up from the main build file.</p>
|
---|
374 |
|
---|
375 | <p>Ant includes in compilation every <kbd>.java</kbd> file it finds in the
|
---|
376 | specified source directory. Since we go class by class, but use complete
|
---|
377 | common source directories from the original distribution, we need a way to
|
---|
378 | narrow a list of files to compile. Otherwise we will get many errors
|
---|
379 | because of missing platform dependent classes (which are not yet ready)
|
---|
380 | referenced from common sources during compilation. To exclude temporarily
|
---|
381 | the whole common directory is not a good idea because we might need some
|
---|
382 | classes from there. So, there is a special file called
|
---|
383 | <kbd>classes.inc</kbd> in the same directory as the SWT build file that
|
---|
384 | contains a list of all files to be compiled. Paths there are relative to
|
---|
385 | the source directories, so every entry there is just a full name of a
|
---|
386 | class but with dots replaced by slashes in the package name. Although file
|
---|
387 | masks can be used there it should be done carefully because file mask will
|
---|
388 | apply to every source directory (we cannot change this behavior in Ant)
|
---|
389 | and unnecessary files can be included.</p>
|
---|
390 |
|
---|
391 | <h2>SWT porting roadmap</h2>
|
---|
392 |
|
---|
393 | <p>Below is the plan and the progress of the SWT porting process. Each
|
---|
394 | step number and objective is a link to the corresponding step description.
|
---|
395 | The names of classes here, in the step descriptions and in some other
|
---|
396 | places follow the rule: the text in [square brackets] after the class name
|
---|
397 | shows the name of the SWT part the class belongs to (according to the
|
---|
398 | table above) and the sharp (#) sign before it means that the class is
|
---|
399 | platform specific, otherwise it is common.</p>
|
---|
400 |
|
---|
401 | <table>
|
---|
402 | <thead>
|
---|
403 | <tr>
|
---|
404 | <th>#</th>
|
---|
405 |
|
---|
406 | <th>Objective</th>
|
---|
407 |
|
---|
408 | <th>Started</th>
|
---|
409 |
|
---|
410 | <th>To be done</th>
|
---|
411 |
|
---|
412 | <th>Actually done</th>
|
---|
413 | </tr>
|
---|
414 | </thead>
|
---|
415 |
|
---|
416 | <tr>
|
---|
417 | <td><a href="swt001.html">1</a></td>
|
---|
418 |
|
---|
419 | <td><a href="swt001.html">Initial moves</a>. CVS setup, dummy
|
---|
420 | <code>Device</code> [#Base] implementation.</td>
|
---|
421 |
|
---|
422 | <td>2002-10-21</td>
|
---|
423 |
|
---|
424 | <td>2003-01-15</td>
|
---|
425 |
|
---|
426 | <td>2003-01-21</td>
|
---|
427 | </tr>
|
---|
428 |
|
---|
429 | <tr>
|
---|
430 | <td><a href="swt002.html">2</a></td>
|
---|
431 |
|
---|
432 | <td><a href="swt002.html">Basics of GUI, part 1</a>. Partially
|
---|
433 | implement the basic hierarchy from the <code>Widget</code> to
|
---|
434 | <code>Shell</code>.</td>
|
---|
435 |
|
---|
436 | <td>2003-01-24</td>
|
---|
437 |
|
---|
438 | <td>2003-02-24</td>
|
---|
439 |
|
---|
440 | <td>2003-03-11</td>
|
---|
441 | </tr>
|
---|
442 |
|
---|
443 | <tr>
|
---|
444 | <td><a href="swt003.html">3</a></td>
|
---|
445 |
|
---|
446 | <td><a href="swt003.html">Basics of GUI, part 2</a>. Implement drawing
|
---|
447 | facilities</td>
|
---|
448 |
|
---|
449 | <td>2003-03-12</td>
|
---|
450 |
|
---|
451 | <td>2003-04-15</td>
|
---|
452 |
|
---|
453 | <td>2003-07-11</td>
|
---|
454 | </tr>
|
---|
455 |
|
---|
456 | <tr>
|
---|
457 | <td><a href="swt004.html">4</a></td>
|
---|
458 |
|
---|
459 | <td><a href="swt004.html">Layout basics</a>. Implement the basics of
|
---|
460 | the layout management.</td>
|
---|
461 |
|
---|
462 | <td>2003-03-12</td>
|
---|
463 |
|
---|
464 | <td>2003-04-15</td>
|
---|
465 |
|
---|
466 | <td>2003-07-11</td>
|
---|
467 | </tr>
|
---|
468 |
|
---|
469 | <tr>
|
---|
470 | <td><a href="swt005.html">5</a></td>
|
---|
471 |
|
---|
472 | <td><a href="swt005.html">Font handling</a>. Implement font
|
---|
473 | handling.</td>
|
---|
474 |
|
---|
475 | <td>2003-07-12</td>
|
---|
476 |
|
---|
477 | <td>2003-08-01</td>
|
---|
478 |
|
---|
479 | <td>2004-02-29</td>
|
---|
480 | </tr>
|
---|
481 |
|
---|
482 | <tr>
|
---|
483 | <td><a href="swt006.html">6</a></td>
|
---|
484 |
|
---|
485 | <td><a href="swt006.html">Image handling</a>. Implement Image
|
---|
486 | handling</td>
|
---|
487 |
|
---|
488 | <td>2003-07-22</td>
|
---|
489 |
|
---|
490 | <td>2003-08-15</td>
|
---|
491 |
|
---|
492 | <td>2003-11-24</td>
|
---|
493 | </tr>
|
---|
494 |
|
---|
495 | <tr>
|
---|
496 | <td><a href="swt007.html">7</a></td>
|
---|
497 |
|
---|
498 | <td><a href="swt007.html">Buttons</a>. Finish the implementation of
|
---|
499 | the <code>Button</code> widget</td>
|
---|
500 |
|
---|
501 | <td>2004-03-01</td>
|
---|
502 |
|
---|
503 | <td>2004-03-10</td>
|
---|
504 |
|
---|
505 | <td>2004-10-31</td>
|
---|
506 | </tr>
|
---|
507 |
|
---|
508 | <tr>
|
---|
509 | <td><a href="swt008.html">8</a></td>
|
---|
510 |
|
---|
511 | <td><a href="swt008.html">Standard dialogs</a>. Implement standard
|
---|
512 | dialogs (<code>Dialog</code> derivants).</td>
|
---|
513 |
|
---|
514 | <td>2004-12-09</td>
|
---|
515 |
|
---|
516 | <td>??</td>
|
---|
517 |
|
---|
518 | <td></td>
|
---|
519 | </tr>
|
---|
520 |
|
---|
521 | <tr>
|
---|
522 | <td><a href="swt009.html">9</a></td>
|
---|
523 |
|
---|
524 | <td><a href="swt009.html">Labels</a>. Implement the <code>Label</code>
|
---|
525 | class.</td>
|
---|
526 |
|
---|
527 | <td>2004-12-09</td>
|
---|
528 |
|
---|
529 | <td>??</td>
|
---|
530 |
|
---|
531 | <td></td>
|
---|
532 | </tr>
|
---|
533 | </table>
|
---|
534 | </body>
|
---|
535 | </html>
|
---|