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;