source: trunk/doc/swt007.html@ 24

Last change on this file since 24 was 9, checked in by lpino, 18 years ago
  • Initial commit
File size: 6.5 KB
Line 
1<?xml version="1.0" encoding="UTF-8"?>
2<?xml-stylesheet type="text/css"
3href="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>SWT Step 7. Buttons</h1>
16
17 <h2>Objective</h2>
18
19 <p>Complete the implementation of the <code>o.e.swt.widgets.Button</code>
20 widget. The test example should demonstrate all types of buttons that
21 exist in SWT.</p>
22
23 <h2>Task notes</h2>
24
25 <p>Button text and icon alignment styles (<code>SWT.LEFT</code>,
26 <code>SWT.RIGHT</code>, <code>SWT.CENTER</code>) are not currently
27 supported. I personally see no need in these styles at all. Besides this,
28 supporting them will make it impossible to keep the system look and feel
29 for <code>SWT.PUSH</code> buttons (for example, provided by eStyler).</p>
30
31 <p>However, <code>SWT.TOGGLE</code> buttons currently lose the pushbutton
32 L&amp;F provided by eStyler in any case, since they are completely drawn
33 by hand due to lack of this type of buttons in OS/2. We're in contact with
34 the eStyler author and hope this will be worked around later.</p>
35
36 <p>When implementing this step, it turned out that some other
37 functionality has to be implemented within it, and something needs to be
38 changed. In particular, the following has been additionally
39 implemented:</p>
40
41 <ul>
42 <li>keyboard handling (<code>SWT.KeyDown</code>/<code>KeyUp</code>
43 events)</li>
44
45 <li>focus traversal (<code>SWT.FocusIn</code>/<code>FocusOut</code>)
46 using the keyboard (<kbd>TAB</kbd>/<kbd>Shift-TAB</kbd>, arrows,
47 mnemonic keys [with and w/o the <kbd>Alt</kbd> key])</li>
48
49 <li>shell activation/deactivation
50 (<code>SWT.Activate</code>/<code>Deactivate</code>)</li>
51 </ul>
52
53 <p>Also, it became necessary to change the <code>Decorations</code>
54 implementation.</p>
55
56 <p>The following subsections provide some further details.</p>
57
58 <h4>keyboard handling</h4>
59
60 <p>The current implementation of keyboard events is very simple: OS/2
61 virtual keys supported by Eclipse are reported as Eclipse virtual keys
62 (<code>KeyEvent::keyCode</code>) with <code>KeyEvent::character</code> set
63 to zero. All other events have <code>keyCode</code> set to zero and
64 <code>character</code> equal to what OS/2 reports in the <code>usch</code>
65 parameter of the <code>WM_CHAR</code> message (converted to unicode
66 according to the curent locale), except the situation when both
67 <code>keyCode</code> and <code>character</code> are zero (no
68 <code>KeyEvent</code> is generated in this case).</p>
69
70 <p>This differs a bit from how Eclipse/Win32 generates key events. For
71 example, when we press <kbd>Ctrl</kbd> and then press and release the
72 <kbd>A</kbd> key, Eclipse/OS2 reports <kbd>a</kbd> (<code>0x71</code>) in
73 the <code>character</code> field of the key press event and the control
74 code <code>0x11</code> in the same field of the key release event (i.e.
75 key press character doesn't match key release character); Win32 reports
76 <code>0x11</code> in both cases. Another example is <kbd>Alt</kbd> plus
77 letter. Eclipse/OS2 doesn't generate the key release event for the letter
78 at all, since <code>usch</code> in <code>WM_CHAR</code> is zero in this
79 case (Win32 reports both).</p>
80
81 <p>The reason why I left the OS/2 behavior as is for now (i.e. not fully
82 compatible with Win32) is simple: currently, I don't get the logic how
83 keyboard messages are handled in Win32. For example, if you press
84 <kbd>Alt</kbd> there, then press some letter, then release <kbd>Alt</kbd>
85 and finally release the letter you get three events: a press event with
86 <code>keyCode=SWT.ALT</code> and <code>character=0</code>, a press event
87 with <code>keyCode=0</code> and <code>character=&lt;letter&gt;</code>, and
88 a combined release event with <code>keyCode=SWT.ALT</code> and
89 <code>character=&lt;letter&gt;</code> (i.e. we also get press/release pair
90 mismatch) -- that seems strage to me. But all this is related to the
91 pretty outdated SWT version 2.01, and I think things have changed in
92 recent SWT/Win32 releases, so the keyboard handling in Eclipse/OS2 will be
93 improved later, when we move the whole project to one of current Eclipse
94 releases.</p>
95
96 <h4>Decorations reimplementation</h4>
97
98 <p>The previous <code>Decorations</code> <a
99 href="swt003.html#FrameClientWindow">implementation</a> involved a special
100 internal SWT widget (<code>ClientArea</code>) to represent the client area
101 of any top-level window. This caused lots of problems related (not only)
102 to focus traversal because of the explicitly expressed parent-child
103 relationship (on SWT level) between the frame and client window
104 (<code>ClientArea</code> was created as a child of
105 <code>Decorations</code>, both in OS/2 and in SWT terms). This broke the
106 children-related functionality in SWT and led to some other issues.</p>
107
108 <p>So, I chose a bit different solution. Instead of having a special SWT
109 class for the client area, <code>Decorations</code> now maintains two
110 window handles directly -- one is a regular <code>Control::handle</code>
111 field that now holds a handle to the client window (not a frame window
112 handle as before), and another one is a separate field,
113 <code>Decorations::frameHandle</code>, to hold the frame window
114 (<code>WC_FRAME</code>) handle. Both windows are created by
115 <code>Decorations::createHandle()</code>. The majority of new or overriden
116 <code>Decorations</code> methods use the <code>frameHandle</code> field,
117 while methods derived from <code>Composite</code>, <code>Control</code>
118 etc. continue to use the <code>handle</code> field. Also, PM message
119 handling was explicitely separated: <code>Decorations</code> has an
120 additional window procedure, <code>windowFrameProc()</code>, that delivers
121 messages addressed to the <code>WC_FRAME</code> window to
122 <code>Decoration</code>'s methods. These methods are named
123 <code>FRAME_WM_*</code> to differ from regular <code>WM_*</code> messages
124 processed by <code>windowProc()</code> as usual.</p>
125
126 <p>The <code>ClientArea</code> class has been completely removed.</p>
127 </body>
128</html>
Note: See TracBrowser for help on using the repository browser.