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>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&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=<letter></code>, and
|
---|
88 | a combined release event with <code>keyCode=SWT.ALT</code> and
|
---|
89 | <code>character=<letter></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>
|
---|