1 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 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 43 public void getReadyToShow(final Composite parent, final int firstVisibleLine) 44 { 45 SwtHelper.getDisplay().syncExec( 46 new Runnable () { 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 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 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; 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 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 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 131 public void setSelected() 132 { 133 super.setSelected(); 134 buffer.pointMarker.sequence = null; 135 } 136 137 140 public void unselect() 141 { 142 } 143 144 147 public int getPoint() 148 { 149 return SwtHelper.getCaretOffset(swtWindowWidget.getStyledText()); 150 } 151 152 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 193 protected void getCharSize() 194 { 195 } 197 198 201 public int getWidth() 202 { 203 return SwtHelper.getArea(swtWindowWidget.getStyledText()).width; 204 } 205 206 209 public int getHeight() 210 { 211 return SwtHelper.getArea(swtWindowWidget.getStyledText()).height; 212 } 213 214 217 public Object tooLong(int pendingLength) 218 { 219 return null; 221 } 222 223 225 public void verifyKey(VerifyEvent event) 227 { 228 event.doit = false; 229 } 230 231 public void focusGained(FocusEvent e) 233 { 234 setSelected(); 235 } 236 237 public void focusLost(FocusEvent e) 238 { 239 unselect(); 240 } 241 242 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 public void mouseDoubleClick(MouseEvent e) 255 { 256 } 257 258 public void mouseDown(MouseEvent e) 259 { 260 if (EWindow.getSelected() == this) { 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 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 () { 287 public void run() { 288 swtWindowWidget.getModeline().setText(swtBuffer.getModelineFormat().toString()); 289 } 290 } 291 ); 292 } 293 } 294 295 } 296 | Popular Tags |