diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/CVS/Entries /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/CVS/Entries
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/CVS/Entries 2005-07-29 08:28:47.000000000 -0700
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/CVS/Entries 2005-08-08 09:46:55.000000000 -0700
@@ -8,7 +8,7 @@
/GraphicalTextViewer.java/1.9/Tue May 17 21:24:20 2005//
/SelectionRange.java/1.9/Fri May 13 19:26:02 2005//
/SelectionRangeRequest.java/1.3/Thu Mar 31 23:28:24 2005//
-/TextCommand.java/1.4/Thu Mar 31 23:28:24 2005//
+/TextCommand.java/1.4/Wed Aug 03 16:36:30 2005//
/TextEditor.java/1.15/Tue Apr 26 19:29:55 2005//
/TextLocation.java/1.4/Thu Mar 31 23:28:24 2005//
/TextUtilities.java/1.3/Wed Mar 30 21:27:52 2005//
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/edit/BlockEditPolicy.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/edit/BlockEditPolicy.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/edit/BlockEditPolicy.java 2005-05-23 14:30:12.000000000 -0700
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/edit/BlockEditPolicy.java 2005-08-08 13:49:52.000000000 -0700
@@ -41,6 +41,7 @@
import org.eclipse.gef.examples.text.model.commands.RemoveRange;
import org.eclipse.gef.examples.text.model.commands.RemoveText;
import org.eclipse.gef.examples.text.model.commands.SubdivideElement;
+import org.eclipse.gef.examples.text.model.commands.ReplaceString;
import org.eclipse.gef.examples.text.requests.TextRequest;
/**
@@ -107,8 +108,10 @@
if (TextRequest.REQ_STYLE == request.getType())
return getTextStyleApplication((TextRequest)request);
if (TextRequest.REQ_INSERT == request.getType())
- return getTextInsertionCommand((TextRequest)request);
- if (TextRequest.REQ_BACKSPACE == request.getType())
+ return getTextInsertionCommand((TextRequest)request, false);
+ if (TextRequest.REQ_REPLACE == request.getType())
+ return getTextInsertionCommand((TextRequest)request, true);
+ if (TextRequest.REQ_BACKSPACE == request.getType())
return getBackspaceCommand((TextRequest)request);
if (TextRequest.REQ_DELETE == request.getType())
return getDeleteCommand((TextRequest)request);
@@ -120,35 +123,35 @@
return getUnindentCommand((TextRequest)request);
if (TextRequest.REQ_INDENT == request.getType())
return getIndentCommand((TextRequest)request);
- return null;
+ return null;
}
private Command getTextStyleApplication(TextRequest request) {
- SelectionRange range = request.getSelectionRange();
- ModelLocation start = new ModelLocation(
- (TextRun)range.begin.part.getModel(), range.begin.offset);
- ModelLocation end = new ModelLocation(
- (TextRun)range.end.part.getModel(), range.end.offset);
- CompoundEditCommand command = new CompoundEditCommand("Set Style");
- command.setBeginLocation(start);
- command.setEndLocation(end);
-
- String styleID = request.getStyleKeys()[0];
- if (Style.PROPERTY_ALIGNMENT.equals(styleID)
- || Style.PROPERTY_ORIENTATION.equals(styleID)) {
- Object value = request.getStyleValues()[0];
- for (Iterator iter = range.getLeafParts().iterator(); iter.hasNext();) {
- // TODO optimize by ensuring that runs in the same container don't cause
- // that container's style to be set multiple times
- TextRun run = (TextRun)((TextualEditPart)iter.next()).getModel();
- command.pendEdit(new ApplyMultiStyle(run.getBlockContainer(), styleID, value));
- }
- } else if (!range.isEmpty()) {
- command.pendEdit(new ApplyBooleanStyle(start, end, request.getStyleKeys(),
- request.getStyleValues()));
- }
+ SelectionRange range = request.getSelectionRange();
+ ModelLocation start = new ModelLocation(
+ (TextRun)range.begin.part.getModel(), range.begin.offset);
+ ModelLocation end = new ModelLocation(
+ (TextRun)range.end.part.getModel(), range.end.offset);
+ CompoundEditCommand command = new CompoundEditCommand("Set Style");
+ command.setBeginLocation(start);
+ command.setEndLocation(end);
+
+ String styleID = request.getStyleKeys()[0];
+ if (Style.PROPERTY_ALIGNMENT.equals(styleID)
+ || Style.PROPERTY_ORIENTATION.equals(styleID)) {
+ Object value = request.getStyleValues()[0];
+ for (Iterator iter = range.getLeafParts().iterator(); iter.hasNext();) {
+ // TODO optimize by ensuring that runs in the same container don't cause
+ // that container's style to be set multiple times
+ TextRun run = (TextRun)((TextualEditPart)iter.next()).getModel();
+ command.pendEdit(new ApplyMultiStyle(run.getBlockContainer(), styleID, value));
+ }
+ } else if (!range.isEmpty()) {
+ command.pendEdit(new ApplyBooleanStyle(start, end, request.getStyleKeys(),
+ request.getStyleValues()));
+ }
- return command;
+ return command;
}
private Command getIndentCommand(TextRequest request) {
@@ -200,7 +203,7 @@
}
private Command getRangeRemovalCommand(TextRequest request) {
- return getTextInsertionCommand(request);
+ return getTextInsertionCommand(request, false);
}
public EditPart getTargetEditPart(Request request) {
@@ -209,7 +212,7 @@
return null;
}
-private Command getTextInsertionCommand(TextRequest request) {
+private Command getTextInsertionCommand(TextRequest request, boolean replace) {
CompoundEditCommand command = null;
if (request.getPreviousCommand() instanceof CompoundEditCommand)
command = (CompoundEditCommand)request.getPreviousCommand();
@@ -240,8 +243,12 @@
}
if (request.getText() != null) {
- InsertString insert = new InsertString(rangeBegin, request.getText(), range.begin.offset);
- command.pendEdit(insert);
+ MiniEdit edit;
+ if (replace)
+ edit = new ReplaceString(rangeBegin, request.getText(), range.begin.offset);
+ else
+ edit = new InsertString(rangeBegin, request.getText(), range.begin.offset);
+ command.pendEdit(edit);
}
return command;
}
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/AbstractModifyString.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/AbstractModifyString.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/AbstractModifyString.java 1969-12-31 16:00:00.000000000 -0800
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/AbstractModifyString.java 2005-08-08 15:52:40.000000000 -0700
@@ -0,0 +1,80 @@
+
+package org.eclipse.gef.examples.text.model.commands;
+
+import org.eclipse.jface.util.Assert;
+
+import org.eclipse.gef.examples.text.model.TextRun;
+
+/**
+ * This class provides a base for modifying string in a TextRun
.
+ * Subclasses should define what kind of modification is to be performed.
+ */
+public abstract class AbstractModifyString extends MiniEdit {
+
+/**
+ * The string that will be used to modify the run
object.
+ */
+protected String pending;
+
+/**
+ * The characters that has been inserted.
+ */
+protected char insertedChars[];
+
+/**
+ * The offset where the modification is performed.
+ */
+protected final int offset;
+
+/**
+ * The text run on which the modification is performed.
+ */
+protected final TextRun run;
+
+public AbstractModifyString(TextRun run, String c, int offset) {
+ this.run = run;
+ this.pending = c;
+ this.offset = offset;
+}
+
+/**
+ * @since 3.1
+ * @param append the text to append.
+ */
+public void appendText(String append) {
+ // not used now
+ Assert.isTrue(pending == null);
+ pending = append;
+}
+
+/**
+ * @see org.eclipse.gef.commands.Command#execute()
+ */
+public void apply() {
+ applyImpl();
+ insertedChars = pending.toCharArray();
+ pending = null;
+}
+
+/**
+ * Applies this command. This method should only do the modification to run
object.
+ */
+protected abstract void applyImpl();
+
+public boolean canApply() {
+ return pending != null;
+}
+
+/**
+ * re-executes the command for the additional character added above.
+ */
+public void commitPending() {
+ //TODO: not used now. should this be implemented in subclasses?
+ run.insertText(pending, offset + insertedChars.length);
+ char old[] = insertedChars;
+ insertedChars = new char[old.length + 1];
+ System.arraycopy(old, 0, insertedChars, 0, old.length);
+ insertedChars[insertedChars.length - 1] = pending.toCharArray()[0];
+ pending = null;
+}
+}
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/CVS/Entries /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/CVS/Entries
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/CVS/Entries 2005-07-29 08:28:47.000000000 -0700
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/CVS/Entries 2005-08-08 09:46:55.000000000 -0700
@@ -1,16 +1,16 @@
/ApplyBooleanStyle.java/1.3/Wed Apr 20 17:54:29 2005//
/ApplyMultiStyle.java/1.2/Thu Jun 16 18:32:14 2005//
-/CompoundEditCommand.java/1.4/Wed Apr 20 00:05:15 2005//
-/ConvertElementCommand.java/1.3/Wed Mar 30 21:27:52 2005//
-/ExampleTextCommand.java/1.3/Thu Mar 31 23:28:24 2005//
+/CompoundEditCommand.java/1.4/Wed Aug 03 16:34:38 2005//
+/ConvertElementCommand.java/1.3/Wed Aug 03 16:34:38 2005//
+/ExampleTextCommand.java/1.3/Wed Aug 03 16:34:38 2005//
/InsertModelElement.java/1.3/Wed Mar 30 21:27:52 2005//
/InsertString.java/1.3/Thu Mar 31 23:28:24 2005//
/MergeWithPrevious.java/1.3/Wed Mar 30 21:27:52 2005//
/MiniEdit.java/1.3/Thu Mar 31 23:28:24 2005//
-/NestElementCommand.java/1.3/Wed Mar 30 21:27:52 2005//
-/ProcessMacroCommand.java/1.3/Wed Mar 30 21:27:52 2005//
+/NestElementCommand.java/1.3/Wed Aug 03 16:34:38 2005//
+/ProcessMacroCommand.java/1.3/Wed Aug 03 16:35:32 2005//
/PromoteElementCommand.java/1.3/Wed Mar 30 21:27:52 2005//
/RemoveRange.java/1.3/Thu Mar 31 23:28:24 2005//
/RemoveText.java/1.3/Thu Mar 31 23:28:24 2005//
-/SingleEditCommand.java/1.4/Wed Apr 20 00:05:15 2005//
+/SingleEditCommand.java/1.4/Wed Aug 03 16:36:12 2005//
/SubdivideElement.java/1.3/Wed Mar 30 21:27:52 2005//
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/InsertString.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/InsertString.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/InsertString.java 2005-03-31 15:28:24.000000000 -0800
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/InsertString.java 2005-08-08 15:25:13.000000000 -0700
@@ -11,68 +11,26 @@
package org.eclipse.gef.examples.text.model.commands;
-import org.eclipse.jface.util.Assert;
-
import org.eclipse.gef.examples.text.model.ModelLocation;
import org.eclipse.gef.examples.text.model.TextRun;
/**
* @since 3.1
*/
-public class InsertString extends MiniEdit {
-
-private String pending;
-
-private char insertedChars[];
-
-private final int offset;
-
-private final TextRun run;
+public class InsertString extends AbstractModifyString {
public InsertString(TextRun run, String c, int offset) {
- this.run = run;
- this.pending = c;
- this.offset = offset;
-}
-
-/**
- * @since 3.1
- * @param char1
- */
-public void appendText(String append) {
- Assert.isTrue(pending == null);
- pending = append;
-}
-
-/**
- * @see org.eclipse.gef.commands.Command#execute()
- */
-public void apply() {
- run.insertText(pending, offset);
- insertedChars = pending.toCharArray();
- pending = null;
-}
-
-public boolean canApply() {
- return pending != null;
-}
-
-/**
- * re-executes the command for the additional character added above.
- */
-public void commitPending() {
- run.insertText(pending, offset + insertedChars.length);
- char old[] = insertedChars;
- insertedChars = new char[old.length + 1];
- System.arraycopy(old, 0, insertedChars, 0, old.length);
- insertedChars[insertedChars.length - 1] = pending.toCharArray()[0];
- pending = null;
+ super (run, c, offset);
}
public ModelLocation getResultingLocation() {
return new ModelLocation(run, offset + insertedChars.length);
}
+protected void applyImpl() {
+ run.insertText(pending, offset);
+}
+
public void reapply() {
run.insertText(new String(insertedChars), offset);
}
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/ReplaceString.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/ReplaceString.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/commands/ReplaceString.java 1969-12-31 16:00:00.000000000 -0800
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/commands/ReplaceString.java 2005-08-08 15:52:40.000000000 -0700
@@ -0,0 +1,35 @@
+
+package org.eclipse.gef.examples.text.model.commands;
+
+import org.eclipse.gef.examples.text.model.ModelLocation;
+import org.eclipse.gef.examples.text.model.TextRun;
+
+/**
+ *
+ */
+public class ReplaceString extends AbstractModifyString {
+
+private String replacedString;
+
+public ReplaceString(TextRun run, String c, int offset) {
+ super(run, c, offset);
+}
+
+protected void applyImpl() {
+ replacedString = run.getText().substring(offset, offset + pending.length());
+ run.replaceText(pending, offset);
+
+}
+
+public ModelLocation getResultingLocation() {
+ return new ModelLocation(run, offset + insertedChars.length);
+}
+
+public void reapply() {
+ run.replaceText(new String(insertedChars), offset);
+}
+
+public void rollback() {
+ run.replaceText(replacedString, offset);
+}
+}
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/TextRun.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/TextRun.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/model/TextRun.java 2005-05-17 15:24:48.000000000 -0700
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/model/TextRun.java 2005-08-08 13:52:37.000000000 -0700
@@ -66,6 +66,15 @@
firePropertyChange("text", null, text);
}
+public void replaceText(String someText, int offset) {
+ StringBuffer buf = new StringBuffer();
+ buf.append(text.substring(0, offset));
+ buf.append(someText);
+ buf.append(text.substring(offset + someText.length(), text.length()));
+ text = buf.toString();
+ firePropertyChange("text", null, text);
+}
+
public String removeRange(int offset, int length) {
Assert.isTrue(offset <= text.length());
Assert.isTrue(offset + length <= text.length());
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/requests/TextRequest.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/requests/TextRequest.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/requests/TextRequest.java 2005-03-31 15:28:24.000000000 -0800
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/requests/TextRequest.java 2005-08-08 13:31:39.000000000 -0700
@@ -36,6 +36,8 @@
public static final String REQ_INSERT = "TextRequest.input";
+public static final String REQ_REPLACE = "TextRequest.replace";
+
public static final String REQ_STYLE = "TextRequest.style";
/**
@@ -63,10 +65,7 @@
* @since 3.1
*/
public TextRequest(SelectionRange range, String text, AppendableCommand prevoius) {
- super(REQ_INSERT);
- this.text = text;
- this.range = range;
- this.previous = prevoius;
+ this(REQ_INSERT, range, text, prevoius);
}
public TextRequest(String type, SelectionRange range) {
@@ -79,6 +78,13 @@
this.previous = previous;
}
+public TextRequest(String type, SelectionRange range, String text, AppendableCommand prevoius) {
+ super(type);
+ this.text = text;
+ this.range = range;
+ this.previous = prevoius;
+}
+
public int getInsertionOffset() {
return range.begin.offset;
}
diff -Naur /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/tools/TextTool.java /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/tools/TextTool.java
--- /usr/tkato/eclipse_cvs/org.eclipse.gef.examples.text/src/org/eclipse/gef/examples/text/tools/TextTool.java 2005-05-09 13:26:56.000000000 -0700
+++ /usr/tkato/IdeaProjects/gef_cvs/text_example/src/org/eclipse/gef/examples/text/tools/TextTool.java 2005-08-08 13:32:14.000000000 -0700
@@ -19,6 +19,7 @@
import org.eclipse.swt.custom.ST;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.jface.util.Assert;
@@ -26,7 +27,11 @@
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.draw2d.Cursors;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.text.CaretInfo;
import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
@@ -43,12 +48,13 @@
import org.eclipse.gef.examples.text.TextCommand;
import org.eclipse.gef.examples.text.TextLocation;
import org.eclipse.gef.examples.text.TextUtilities;
+import org.eclipse.gef.examples.text.edit.TextualEditPart;
+import org.eclipse.gef.examples.text.edit.CaretSearch;
+import org.eclipse.gef.examples.text.edit.AbstractTextualPart;
+import org.eclipse.gef.examples.text.edit.TextStyleManager;
import org.eclipse.gef.examples.text.actions.StyleListener;
import org.eclipse.gef.examples.text.actions.StyleProvider;
import org.eclipse.gef.examples.text.actions.StyleService;
-import org.eclipse.gef.examples.text.edit.CaretSearch;
-import org.eclipse.gef.examples.text.edit.TextStyleManager;
-import org.eclipse.gef.examples.text.edit.TextualEditPart;
import org.eclipse.gef.examples.text.requests.TextRequest;
/**
@@ -80,6 +86,7 @@
private final StyleService styleService;
private List styleValues = new ArrayList();
private int textInputMode;
+private boolean overwrite = false;
private boolean isMirrored;
private final GraphicalTextViewer textViewer;
@@ -190,6 +197,10 @@
case ST.LINE_DOWN:
doSelect(CaretSearch.ROW, true, append);
break;
+//INSERT
+ case ST.TOGGLE_OVERWRITE:
+ toggleOverwrite();
+ break;
//TAB
case SWT.TAB | SWT.SHIFT:
doUnindent();
@@ -208,7 +227,127 @@
}
}
-/**
+private void toggleOverwrite() {
+ overwrite = !overwrite;
+}
+
+private void doPageUp() {
+ GraphicalTextViewer viewer = getTextualViewer();
+ FigureCanvas canvas = (FigureCanvas) viewer.getControl();
+ Viewport viewport = canvas.getViewport();
+ Rectangle viewArea = viewport.getClientArea();
+
+ CaretInfo caretInfo = viewer.getCaretInfo();
+ if (caretInfo == null) {
+ return;
+ }
+
+ // used to determine where the caret should be.
+ int relativeY = caretInfo.getY();
+ int startY = viewport.getViewLocation().y;
+
+ // scrolling the height of the viewport above.
+ int newY = startY - viewArea.height;
+
+ Point newCaretPoint;
+ if (startY > 0) {
+ newCaretPoint = new Point (caretInfo.getX(), relativeY);
+ } else {
+ // the page is already at the top -- just move the caret to the very beginning.
+ newCaretPoint = new Point(0, 0);
+ }
+
+ doEndPageUpDown(newCaretPoint, newY);
+}
+
+private void doPageDown() {
+ GraphicalTextViewer viewer = getTextualViewer();
+ FigureCanvas canvas = (FigureCanvas) viewer.getControl();
+ Viewport viewport = canvas.getViewport();
+ Rectangle viewArea = viewport.getClientArea();
+
+ CaretInfo caretInfo = viewer.getCaretInfo();
+ if (caretInfo == null) {
+ return;
+ }
+
+ // used to determine where the caret should be.
+ int relativeY = caretInfo.getY();
+ int startY = viewport.getViewLocation().y;
+ int maxY = viewport.getVerticalRangeModel().getMaximum();
+ int maxBaseY = maxY - viewArea.height;
+
+ // scrolling the height of the viewport above.
+ int newY = startY + viewArea.height;
+
+ Point newCaretPoint;
+ if (startY < maxBaseY) {
+ newCaretPoint = new Point (caretInfo.getX(), relativeY);
+ } else {
+ // the page is already at the bottom -- just move the caret to the very end.
+ newCaretPoint = new Point(viewArea.width, maxY);
+ }
+
+ doEndPageUpDown(newCaretPoint, newY);
+}
+
+/**
+ * Performs the end task common between page up and page down.
+ * It scrolls the viewport and set the caret at the right position.
+ *
+ * @param newCaretPoint the new caret point where the caret should be set.
+ * In some situations, this value is not directly used to set the caret location.
+ * For example, when the caret is not completely visible in the viewport after scrolling,
+ * the loation of caret gets adjusted so that it appears in the viewport.
+ * @param newY the Y coordinate where the viewport should display.
+ */
+private void doEndPageUpDown(Point newCaretPoint, int newY) {
+ GraphicalTextViewer viewer = getTextualViewer();
+ FigureCanvas canvas = (FigureCanvas) viewer.getControl();
+ canvas.scrollToY (newY);
+ EditPart part = viewer.findObjectAt(newCaretPoint);
+ if (part instanceof AbstractTextualPart) {
+ AbstractTextualPart textPart = (AbstractTextualPart) part;
+ TextLocation loc = textPart.getLocation(newCaretPoint, new int[1]);
+
+ CaretInfo newInfo = getCaretInfo(loc, true);
+ if (newInfo != null) {
+ viewer.refreshViewportX(newInfo);
+ int y = newInfo.getY();
+ if (y < 0) {
+ // the caret is visible in the viewport only partially
+ // move the caret to the next line.
+ Point movedCaretPoint = newCaretPoint.translate (0, newInfo.getLineHeight ());
+ EditPart part2 = viewer.findObjectAt(movedCaretPoint);
+ if (part instanceof AbstractTextualPart) {
+ AbstractTextualPart textPart2 = (AbstractTextualPart) part2;
+ loc = textPart2.getLocation(newCaretPoint, new int[1]);
+ }
+ }
+ }
+
+ viewer.setSelectionRange(new SelectionRange(loc));
+ }
+}
+
+/**
+ * Gets the caret info based on the text location.
+ * @param location the location of the text.
+ * @param forward
+ * @return the caret info.
+ */
+private CaretInfo getCaretInfo(TextLocation location, boolean forward) {
+ GraphicalTextViewer viewer = getTextualViewer ();
+ if (viewer.getCaretOwner() == null)
+ return null;
+ if (forward && location.offset > 0) {
+ return viewer.getCaretOwner ().getCaretPlacement(location.offset - 1, true);
+ } else {
+ return viewer.getCaretOwner().getCaretPlacement(location.offset, false);
+ }
+}
+
+ /**
* @since 3.1
* @param e
*/
@@ -257,7 +396,8 @@
*/
private boolean doInsertContent(char c) {
setTextInputMode(MODE_TYPING);
- TextRequest edit = new TextRequest(getTextualViewer().getSelectionRange(), Character
+ String type = (overwrite) ? TextRequest.REQ_REPLACE : TextRequest.REQ_INSERT;
+ TextRequest edit = new TextRequest(type, getTextualViewer().getSelectionRange(), Character
.toString(c), pendingCommand);
String keys[] = new String[styleKeys.size()];
styleKeys.toArray(keys);
@@ -340,6 +480,10 @@
else
getTextualViewer().setSelectionRange(new SelectionRange(newCaretLocation, newCaretLocation, false));
}
+
+ // Scroll the view
+ CaretInfo newCaretInfo = newCaretLocation.part.getCaretPlacement(newCaretLocation.offset, false);
+ getTextualViewer().refreshViewport(newCaretInfo);
}
/**
@@ -540,12 +684,16 @@
return ST.LINE_DOWN;
case ST.PAGE_UP:
return ST.PAGE_UP;
case ST.SELECT_LINE_UP:
return ST.SELECT_LINE_UP;
case ST.SELECT_LINE_DOWN:
return ST.SELECT_LINE_DOWN;
- case SWT.DEL:
+ case SWT.INSERT:
+ return ST.TOGGLE_OVERWRITE;
+ case SWT.DEL:
return ST.DELETE_NEXT;
case SWT.BS:
return ST.DELETE_PREVIOUS;