Lines 19-24
Link Here
|
19 |
import org.eclipse.swt.custom.ST; |
19 |
import org.eclipse.swt.custom.ST; |
20 |
import org.eclipse.swt.events.KeyEvent; |
20 |
import org.eclipse.swt.events.KeyEvent; |
21 |
import org.eclipse.swt.events.TraverseEvent; |
21 |
import org.eclipse.swt.events.TraverseEvent; |
|
|
22 |
import org.eclipse.swt.events.MouseEvent; |
22 |
import org.eclipse.swt.graphics.Cursor; |
23 |
import org.eclipse.swt.graphics.Cursor; |
23 |
|
24 |
|
24 |
import org.eclipse.jface.util.Assert; |
25 |
import org.eclipse.jface.util.Assert; |
Lines 26-32
Link Here
|
26 |
import org.eclipse.jface.viewers.SelectionChangedEvent; |
27 |
import org.eclipse.jface.viewers.SelectionChangedEvent; |
27 |
|
28 |
|
28 |
import org.eclipse.draw2d.Cursors; |
29 |
import org.eclipse.draw2d.Cursors; |
|
|
30 |
import org.eclipse.draw2d.FigureCanvas; |
31 |
import org.eclipse.draw2d.Viewport; |
32 |
import org.eclipse.draw2d.text.CaretInfo; |
29 |
import org.eclipse.draw2d.geometry.Rectangle; |
33 |
import org.eclipse.draw2d.geometry.Rectangle; |
|
|
34 |
import org.eclipse.draw2d.geometry.Point; |
30 |
|
35 |
|
31 |
import org.eclipse.gef.DragTracker; |
36 |
import org.eclipse.gef.DragTracker; |
32 |
import org.eclipse.gef.EditPart; |
37 |
import org.eclipse.gef.EditPart; |
Lines 43-54
Link Here
|
43 |
import org.eclipse.gef.examples.text.TextCommand; |
48 |
import org.eclipse.gef.examples.text.TextCommand; |
44 |
import org.eclipse.gef.examples.text.TextLocation; |
49 |
import org.eclipse.gef.examples.text.TextLocation; |
45 |
import org.eclipse.gef.examples.text.TextUtilities; |
50 |
import org.eclipse.gef.examples.text.TextUtilities; |
|
|
51 |
import org.eclipse.gef.examples.text.edit.TextualEditPart; |
52 |
import org.eclipse.gef.examples.text.edit.CaretSearch; |
53 |
import org.eclipse.gef.examples.text.edit.AbstractTextualPart; |
54 |
import org.eclipse.gef.examples.text.edit.TextStyleManager; |
46 |
import org.eclipse.gef.examples.text.actions.StyleListener; |
55 |
import org.eclipse.gef.examples.text.actions.StyleListener; |
47 |
import org.eclipse.gef.examples.text.actions.StyleProvider; |
56 |
import org.eclipse.gef.examples.text.actions.StyleProvider; |
48 |
import org.eclipse.gef.examples.text.actions.StyleService; |
57 |
import org.eclipse.gef.examples.text.actions.StyleService; |
49 |
import org.eclipse.gef.examples.text.edit.CaretSearch; |
|
|
50 |
import org.eclipse.gef.examples.text.edit.TextStyleManager; |
51 |
import org.eclipse.gef.examples.text.edit.TextualEditPart; |
52 |
import org.eclipse.gef.examples.text.requests.TextRequest; |
58 |
import org.eclipse.gef.examples.text.requests.TextRequest; |
53 |
|
59 |
|
54 |
/** |
60 |
/** |
Lines 80-85
Link Here
|
80 |
private final StyleService styleService; |
86 |
private final StyleService styleService; |
81 |
private List styleValues = new ArrayList(); |
87 |
private List styleValues = new ArrayList(); |
82 |
private int textInputMode; |
88 |
private int textInputMode; |
|
|
89 |
private boolean overwrite = false; |
83 |
private boolean isMirrored; |
90 |
private boolean isMirrored; |
84 |
|
91 |
|
85 |
private final GraphicalTextViewer textViewer; |
92 |
private final GraphicalTextViewer textViewer; |
Lines 190-195
Link Here
|
190 |
case ST.LINE_DOWN: |
197 |
case ST.LINE_DOWN: |
191 |
doSelect(CaretSearch.ROW, true, append); |
198 |
doSelect(CaretSearch.ROW, true, append); |
192 |
break; |
199 |
break; |
|
|
200 |
//INSERT |
201 |
case ST.TOGGLE_OVERWRITE: |
202 |
toggleOverwrite(); |
203 |
break; |
193 |
//TAB |
204 |
//TAB |
194 |
case SWT.TAB | SWT.SHIFT: |
205 |
case SWT.TAB | SWT.SHIFT: |
195 |
doUnindent(); |
206 |
doUnindent(); |
Lines 208-214
Link Here
|
208 |
} |
227 |
} |
209 |
} |
228 |
} |
210 |
|
229 |
|
211 |
/** |
230 |
private void toggleOverwrite() { |
|
|
231 |
overwrite = !overwrite; |
232 |
} |
233 |
|
234 |
private void doPageUp() { |
235 |
GraphicalTextViewer viewer = getTextualViewer(); |
236 |
FigureCanvas canvas = (FigureCanvas) viewer.getControl(); |
237 |
Viewport viewport = canvas.getViewport(); |
238 |
Rectangle viewArea = viewport.getClientArea(); |
239 |
|
240 |
CaretInfo caretInfo = viewer.getCaretInfo(); |
241 |
if (caretInfo == null) { |
242 |
return; |
243 |
} |
244 |
|
245 |
// used to determine where the caret should be. |
246 |
int relativeY = caretInfo.getY(); |
247 |
int startY = viewport.getViewLocation().y; |
248 |
|
249 |
// scrolling the height of the viewport above. |
250 |
int newY = startY - viewArea.height; |
251 |
|
252 |
Point newCaretPoint; |
253 |
if (startY > 0) { |
254 |
newCaretPoint = new Point (caretInfo.getX(), relativeY); |
255 |
} else { |
256 |
// the page is already at the top -- just move the caret to the very beginning. |
257 |
newCaretPoint = new Point(0, 0); |
258 |
} |
259 |
|
260 |
doEndPageUpDown(newCaretPoint, newY); |
261 |
} |
262 |
|
263 |
private void doPageDown() { |
264 |
GraphicalTextViewer viewer = getTextualViewer(); |
265 |
FigureCanvas canvas = (FigureCanvas) viewer.getControl(); |
266 |
Viewport viewport = canvas.getViewport(); |
267 |
Rectangle viewArea = viewport.getClientArea(); |
268 |
|
269 |
CaretInfo caretInfo = viewer.getCaretInfo(); |
270 |
if (caretInfo == null) { |
271 |
return; |
272 |
} |
273 |
|
274 |
// used to determine where the caret should be. |
275 |
int relativeY = caretInfo.getY(); |
276 |
int startY = viewport.getViewLocation().y; |
277 |
int maxY = viewport.getVerticalRangeModel().getMaximum(); |
278 |
int maxBaseY = maxY - viewArea.height; |
279 |
|
280 |
// scrolling the height of the viewport above. |
281 |
int newY = startY + viewArea.height; |
282 |
|
283 |
Point newCaretPoint; |
284 |
if (startY < maxBaseY) { |
285 |
newCaretPoint = new Point (caretInfo.getX(), relativeY); |
286 |
} else { |
287 |
// the page is already at the bottom -- just move the caret to the very end. |
288 |
newCaretPoint = new Point(viewArea.width, maxY); |
289 |
} |
290 |
|
291 |
doEndPageUpDown(newCaretPoint, newY); |
292 |
} |
293 |
|
294 |
/** |
295 |
* Performs the end task common between page up and page down. |
296 |
* It scrolls the viewport and set the caret at the right position. |
297 |
* |
298 |
* @param newCaretPoint the new caret point where the caret should be set. |
299 |
* In some situations, this value is not directly used to set the caret location. |
300 |
* For example, when the caret is not completely visible in the viewport after scrolling, |
301 |
* the loation of caret gets adjusted so that it appears in the viewport. |
302 |
* @param newY the Y coordinate where the viewport should display. |
303 |
*/ |
304 |
private void doEndPageUpDown(Point newCaretPoint, int newY) { |
305 |
GraphicalTextViewer viewer = getTextualViewer(); |
306 |
FigureCanvas canvas = (FigureCanvas) viewer.getControl(); |
307 |
canvas.scrollToY (newY); |
308 |
EditPart part = viewer.findObjectAt(newCaretPoint); |
309 |
if (part instanceof AbstractTextualPart) { |
310 |
AbstractTextualPart textPart = (AbstractTextualPart) part; |
311 |
TextLocation loc = textPart.getLocation(newCaretPoint, new int[1]); |
312 |
|
313 |
CaretInfo newInfo = getCaretInfo(loc, true); |
314 |
if (newInfo != null) { |
315 |
viewer.refreshViewportX(newInfo); |
316 |
int y = newInfo.getY(); |
317 |
if (y < 0) { |
318 |
// the caret is visible in the viewport only partially |
319 |
// move the caret to the next line. |
320 |
Point movedCaretPoint = newCaretPoint.translate (0, newInfo.getLineHeight ()); |
321 |
EditPart part2 = viewer.findObjectAt(movedCaretPoint); |
322 |
if (part instanceof AbstractTextualPart) { |
323 |
AbstractTextualPart textPart2 = (AbstractTextualPart) part2; |
324 |
loc = textPart2.getLocation(newCaretPoint, new int[1]); |
325 |
} |
326 |
} |
327 |
} |
328 |
|
329 |
viewer.setSelectionRange(new SelectionRange(loc)); |
330 |
} |
331 |
} |
332 |
|
333 |
/** |
334 |
* Gets the caret info based on the text location. |
335 |
* @param location the location of the text. |
336 |
* @param forward |
337 |
* @return the caret info. |
338 |
*/ |
339 |
private CaretInfo getCaretInfo(TextLocation location, boolean forward) { |
340 |
GraphicalTextViewer viewer = getTextualViewer (); |
341 |
if (viewer.getCaretOwner() == null) |
342 |
return null; |
343 |
if (forward && location.offset > 0) { |
344 |
return viewer.getCaretOwner ().getCaretPlacement(location.offset - 1, true); |
345 |
} else { |
346 |
return viewer.getCaretOwner().getCaretPlacement(location.offset, false); |
347 |
} |
348 |
} |
349 |
|
350 |
/** |
212 |
* @since 3.1 |
351 |
* @since 3.1 |
213 |
* @param e |
352 |
* @param e |
214 |
*/ |
353 |
*/ |
Lines 257-263
Link Here
|
257 |
*/ |
396 |
*/ |
258 |
private boolean doInsertContent(char c) { |
397 |
private boolean doInsertContent(char c) { |
259 |
setTextInputMode(MODE_TYPING); |
398 |
setTextInputMode(MODE_TYPING); |
260 |
TextRequest edit = new TextRequest(getTextualViewer().getSelectionRange(), Character |
399 |
String type = (overwrite) ? TextRequest.REQ_REPLACE : TextRequest.REQ_INSERT; |
|
|
400 |
TextRequest edit = new TextRequest(type, getTextualViewer().getSelectionRange(), Character |
261 |
.toString(c), pendingCommand); |
401 |
.toString(c), pendingCommand); |
262 |
String keys[] = new String[styleKeys.size()]; |
402 |
String keys[] = new String[styleKeys.size()]; |
263 |
styleKeys.toArray(keys); |
403 |
styleKeys.toArray(keys); |
Lines 340-345
Link Here
|
340 |
else |
480 |
else |
341 |
getTextualViewer().setSelectionRange(new SelectionRange(newCaretLocation, newCaretLocation, false)); |
481 |
getTextualViewer().setSelectionRange(new SelectionRange(newCaretLocation, newCaretLocation, false)); |
342 |
} |
482 |
} |
|
|
483 |
|
484 |
// Scroll the view |
485 |
CaretInfo newCaretInfo = newCaretLocation.part.getCaretPlacement(newCaretLocation.offset, false); |
486 |
getTextualViewer().refreshViewport(newCaretInfo); |
343 |
} |
487 |
} |
344 |
|
488 |
|
345 |
/** |
489 |
/** |
Lines 540-551
Link Here
|
540 |
return ST.LINE_DOWN; |
684 |
return ST.LINE_DOWN; |
541 |
case ST.PAGE_UP: |
685 |
case ST.PAGE_UP: |
542 |
return ST.PAGE_UP; |
686 |
return ST.PAGE_UP; |
543 |
case ST.SELECT_LINE_UP: |
687 |
case ST.SELECT_LINE_UP: |
544 |
return ST.SELECT_LINE_UP; |
688 |
return ST.SELECT_LINE_UP; |
545 |
case ST.SELECT_LINE_DOWN: |
689 |
case ST.SELECT_LINE_DOWN: |
546 |
return ST.SELECT_LINE_DOWN; |
690 |
return ST.SELECT_LINE_DOWN; |
547 |
|
691 |
|
548 |
case SWT.DEL: |
692 |
case SWT.INSERT: |
|
|
693 |
return ST.TOGGLE_OVERWRITE; |
694 |
case SWT.DEL: |
549 |
return ST.DELETE_NEXT; |
695 |
return ST.DELETE_NEXT; |
550 |
case SWT.BS: |
696 |
case SWT.BS: |
551 |
return ST.DELETE_PREVIOUS; |
697 |
return ST.DELETE_PREVIOUS; |