KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > jemacs > swt > SwtWindow


1 //This is free software; for terms and warranty disclaimer see ./COPYING.
2

3 package gnu.jemacs.swt;
4
5 import gnu.jemacs.buffer.Buffer;
6 import gnu.jemacs.buffer.EKeymap;
7 import gnu.jemacs.buffer.EWindow;
8
9 import org.eclipse.swt.SWT;
10 import org.eclipse.swt.custom.SashForm;
11 import org.eclipse.swt.custom.VerifyKeyListener;
12 import org.eclipse.swt.events.FocusEvent;
13 import org.eclipse.swt.events.FocusListener;
14 import org.eclipse.swt.events.KeyEvent;
15 import org.eclipse.swt.events.KeyListener;
16 import org.eclipse.swt.events.MouseEvent;
17 import org.eclipse.swt.events.MouseListener;
18 import org.eclipse.swt.events.VerifyEvent;
19 import org.eclipse.swt.widgets.Composite;
20
21 /**
22  * @author Christian Surlykke
23  * 11-07-2004
24  */

25 public class SwtWindow extends EWindow implements VerifyKeyListener, FocusListener, KeyListener, MouseListener
26 {
27   private SwtWindowWidget swtWindowWidget;
28   private SwtBuffer swtBuffer;
29   
30   public SwtWindow(Buffer buffer) {
31     this(buffer, true);
32   }
33
34   public SwtWindow(Buffer buffer, boolean wantModeLine) {
35     super(buffer);
36     this.swtBuffer = (SwtBuffer) buffer;
37     updateModeline();
38   }
39   
40   /**
41    *
42    */

43   public void getReadyToShow(final Composite parent, final int firstVisibleLine)
44   {
45     SwtHelper.getDisplay().syncExec(
46       new Runnable JavaDoc() {
47         public void run() {
48           swtWindowWidget = new SwtWindowWidget(parent, swtBuffer.getBufferContent(), firstVisibleLine);
49           swtWindowWidget.getStyledText().addVerifyKeyListener(SwtWindow.this);
50           swtWindowWidget.getStyledText().addKeyListener(SwtWindow.this);
51           swtWindowWidget.getStyledText().addFocusListener(SwtWindow.this);
52           swtWindowWidget.getStyledText().addMouseListener(SwtWindow.this);
53           swtWindowWidget.getStyledText().forceFocus();
54           swtWindowWidget.getStyledText().setCaretOffset(swtBuffer.getDot());
55         }
56       }
57     );
58     updateModeline();
59   }
60
61   
62   /**
63    * @see gnu.jemacs.buffer.EWindow#setBuffer(gnu.jemacs.buffer.Buffer)
64    */

65   public void setBuffer(Buffer buffer)
66   {
67     super.setBuffer(buffer);
68     this.swtBuffer = (SwtBuffer) buffer;
69     if (swtWindowWidget != null) {
70       SwtHelper.setContent(swtWindowWidget.getStyledText(), swtBuffer.getBufferContent());
71       updateModeline();
72     }
73   }
74
75   
76   /**
77    * The purpose of this method is to emulate the 'toInt' method of SwingWindow
78    * so as to transform Swt KeyEvents into the same int's as equivalent awt KeyEvents.
79    *
80    * TODO: Elaborate this method so that all KeyEvents work (e.g. enter (!))
81    *
82    * I've been thinkin it perhaps would be better to make EKeymap abstract with implementors
83    * for each toolkit, and then lookup commands by Swt events directly when running
84    * Swt and Swing events when running swing. Must be considered more...
85    *
86    *
87    * @param swtKeyCode
88    * @param stateMask
89    * @param additionalFlags
90    * @return
91    */

92   private int transFormKeyKode(int swtKeyCode, int stateMask, int additionalFlags)
93   {
94     int characterPart = Character.toUpperCase((char) (swtKeyCode & 0xFFFF));
95     int modifierPart = (stateMask & swtModifiers) >> 1; // awt modifiers seem to be displaced
96
// one bit to the left relative to
97
// swt modifiers.
98
return characterPart | modifierPart | (additionalFlags << 16);
99   }
100
101   private final static int swtModifiers = SWT.SHIFT | SWT.CTRL | SWT.ALT;
102
103   public void handleKey (int code)
104   {
105     Object JavaDoc command = lookupKey(code);
106     if (command == null )
107     {
108       return;
109     }
110     pushPrefix(code);
111     pendingLength--;
112     handleCommand (command);
113   }
114
115
116   
117   public void handleCommand(Object JavaDoc command)
118   {
119     int oldDot = getBuffer().getDot();
120     super.handleCommand(command);
121     updateModeline();
122     if (oldDot != getBuffer().getDot())
123     {
124       swtWindowWidget.getStyledText().showSelection();
125     }
126   }
127   
128   /**
129    * @see gnu.jemacs.buffer.EWindow#setSelected()
130    */

131   public void setSelected()
132   {
133     super.setSelected();
134     buffer.pointMarker.sequence = null;
135   }
136
137   /**
138    * @see gnu.jemacs.buffer.EWindow#unselect()
139    */

140   public void unselect()
141   {
142   }
143
144   /**
145    * @see gnu.jemacs.buffer.EWindow#getPoint()
146    */

147   public int getPoint()
148   {
149     return SwtHelper.getCaretOffset(swtWindowWidget.getStyledText());
150   }
151
152   /**
153    * @see gnu.jemacs.buffer.EWindow#setDot(int)
154    */

155   public void setDot(int offset)
156   {
157     SwtHelper.setCaretOffset(swtWindowWidget.getStyledText(), offset);
158   }
159   
160   public EWindow split(Buffer buffer, int lines, boolean horizontal)
161   {
162     SwtWindow newWindow = new SwtWindow(buffer);
163     newWindow.frame = this.frame;
164     linkSibling(newWindow, horizontal);
165     
166     int firstVisibleLine = buffer == this.buffer ?
167         SwtHelper.getTopIndex(swtWindowWidget.getStyledText()) : 0;
168     int visibleLines = SwtHelper.getArea(swtWindowWidget.getStyledText()).height /
169                        SwtHelper.getLineHeight(swtWindowWidget.getStyledText());
170     
171     int[] weights = null;
172     if (!horizontal && lines > 0 && visibleLines > 1)
173     {
174       weights = new int[2];
175       lines = Math.min(lines, visibleLines - 1);
176       weights[0] = lines;
177       weights[1] = visibleLines - lines;
178     }
179     
180     SwtHelper.injectSashFormAsParent(swtWindowWidget, horizontal ? SWT.HORIZONTAL : SWT.VERTICAL);
181     newWindow.getReadyToShow(SwtHelper.getParent(swtWindowWidget), firstVisibleLine);
182     if (weights != null)
183       SwtHelper.setWeights(((SashForm) SwtHelper.getParent(swtWindowWidget)), weights);
184     SwtHelper.layout(SwtHelper.getParent(SwtHelper.getParent(swtWindowWidget)));
185     
186     
187     return newWindow;
188   }
189
190   /**
191    * @see gnu.jemacs.buffer.EWindow#getCharSize()
192    */

193   protected void getCharSize()
194   {
195     // TODO
196
}
197
198   /**
199    * @see gnu.jemacs.buffer.EWindow#getWidth()
200    */

201   public int getWidth()
202   {
203     return SwtHelper.getArea(swtWindowWidget.getStyledText()).width;
204   }
205
206   /**
207    * @see gnu.jemacs.buffer.EWindow#getHeight()
208    */

209   public int getHeight()
210   {
211     return SwtHelper.getArea(swtWindowWidget.getStyledText()).height;
212   }
213
214   /**
215    * @see gnu.jemacs.buffer.EWindow#tooLong(int)
216    */

217   public Object JavaDoc tooLong(int pendingLength)
218   {
219     // TODO Something more subtle here
220
return null;
221   }
222   
223   // ---------------------------- Listener methods ------------------------------------
224

225   // --- VerifyKeyListener
226
public void verifyKey(VerifyEvent event)
227   {
228     event.doit = false;
229   }
230
231   // --- FocusListener ---
232
public void focusGained(FocusEvent e)
233   {
234     setSelected();
235   }
236   
237   public void focusLost(FocusEvent e)
238   {
239     unselect();
240   }
241   
242   // --- KeyListener ---
243
public void keyPressed(KeyEvent e)
244   {
245     handleKey(SwtKeyMapper.swtKey2EKey(e));
246     SwtHelper.setCaretOffset(swtWindowWidget.getStyledText(), buffer.getDot());
247   }
248   
249   public void keyReleased(KeyEvent e)
250   {
251   }
252   
253   // --- MouseListener ---
254
public void mouseDoubleClick(MouseEvent e)
255   {
256   }
257
258   public void mouseDown(MouseEvent e)
259   {
260     if (EWindow.getSelected() == this) // Is this nessecary - aren't we always selected when this event arrives?
261
{
262       buffer.setDot(SwtHelper.getCaretOffset(swtWindowWidget.getStyledText()));
263       SwtHelper.showSelection(swtWindowWidget.getStyledText());
264     }
265   }
266
267   public void mouseUp(MouseEvent e)
268   {
269   }
270   
271   /**
272    * @param e
273    */

274   public static void show(KeyEvent e)
275   {
276     System.out.println("keyCode: " + EKeymap.show(e.keyCode));
277     System.out.println("character: " + EKeymap.show(e.character));
278     System.out.println("stateMask: " + EKeymap.show(e.stateMask));
279   }
280
281   public void updateModeline()
282   {
283     if (swtWindowWidget != null)
284     {
285       SwtHelper.getDisplay().asyncExec(
286         new Runnable JavaDoc() {
287           public void run() {
288             swtWindowWidget.getModeline().setText(swtBuffer.getModelineFormat().toString());
289           }
290         }
291       );
292     }
293   }
294
295 }
296
Popular Tags