From: Jan P. <jp...@us...> - 2006-12-03 20:15:54
|
Update of /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv12893/src/org/epic/perleditor/editors Modified Files: Tag: stable PerlEditor.java Log Message: - Implemented RFE [ 1599854 ] Improved word stop recognition - Fixed bug [ 1608030 ] Delete Next/Previous Word misbehaves Index: PerlEditor.java =================================================================== RCS file: /cvsroot/e-p-i-c/org.epic.perleditor/src/org/epic/perleditor/editors/PerlEditor.java,v retrieving revision 1.69.2.3 retrieving revision 1.69.2.4 diff -u -d -r1.69.2.3 -r1.69.2.4 --- PerlEditor.java 16 Nov 2006 20:59:50 -0000 1.69.2.3 +++ PerlEditor.java 3 Dec 2006 20:15:42 -0000 1.69.2.4 @@ -482,25 +482,35 @@ action.setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_LINE_START); setAction(ITextEditorActionDefinitionIds.SELECT_LINE_START, action); - action = new NextWordAction(ST.WORD_NEXT, false); + action = new NextWordAction(ST.WORD_NEXT, false, false); action.setActionDefinitionId(ITextEditorActionDefinitionIds.WORD_NEXT); setAction(ITextEditorActionDefinitionIds.WORD_NEXT, action); - textWidget.setKeyBinding(SWT.CTRL | SWT.ARROW_RIGHT, SWT.NULL); + textWidget.setKeyBinding(SWT.MOD1 | SWT.ARROW_RIGHT, SWT.NULL); - action = new NextWordAction(ST.SELECT_WORD_NEXT, true); + action = new NextWordAction(ST.SELECT_WORD_NEXT, true, false); action.setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_WORD_NEXT); setAction(ITextEditorActionDefinitionIds.SELECT_WORD_NEXT, action); - textWidget.setKeyBinding(SWT.CTRL | SWT.SHIFT | SWT.ARROW_RIGHT, SWT.NULL); + textWidget.setKeyBinding(SWT.MOD1 | SWT.MOD2 | SWT.ARROW_RIGHT, SWT.NULL); - action = new PreviousWordAction(ST.WORD_PREVIOUS, false); + action = new NextWordAction(ST.DELETE_WORD_NEXT, false, true); + action.setActionDefinitionId(ITextEditorActionDefinitionIds.DELETE_NEXT_WORD); + setAction(ITextEditorActionDefinitionIds.DELETE_NEXT_WORD, action); + textWidget.setKeyBinding(SWT.MOD1 | SWT.DEL, SWT.NULL); + + action = new PreviousWordAction(ST.WORD_PREVIOUS, false, false); action.setActionDefinitionId(ITextEditorActionDefinitionIds.WORD_PREVIOUS); setAction(ITextEditorActionDefinitionIds.WORD_PREVIOUS, action); - textWidget.setKeyBinding(SWT.CTRL | SWT.ARROW_LEFT, SWT.NULL); + textWidget.setKeyBinding(SWT.MOD1 | SWT.ARROW_LEFT, SWT.NULL); - action = new PreviousWordAction(ST.SELECT_WORD_PREVIOUS, true); + action = new PreviousWordAction(ST.SELECT_WORD_PREVIOUS, true, false); action.setActionDefinitionId(ITextEditorActionDefinitionIds.SELECT_WORD_PREVIOUS); setAction(ITextEditorActionDefinitionIds.SELECT_WORD_PREVIOUS, action); - textWidget.setKeyBinding(SWT.CTRL | SWT.SHIFT | SWT.ARROW_LEFT, SWT.NULL); + textWidget.setKeyBinding(SWT.MOD1 | SWT.MOD2 | SWT.ARROW_LEFT, SWT.NULL); + + action = new PreviousWordAction(ST.DELETE_WORD_PREVIOUS, true, false); + action.setActionDefinitionId(ITextEditorActionDefinitionIds.DELETE_PREVIOUS_WORD); + setAction(ITextEditorActionDefinitionIds.DELETE_PREVIOUS_WORD, action); + textWidget.setKeyBinding(SWT.MOD1 | SWT.BS, SWT.NULL); } /* Create SourceViewer so we can use the PerlSourceViewer class */ @@ -963,11 +973,13 @@ protected abstract class WordNavigationAction extends TextNavigationAction { private boolean select; + private boolean delete; - protected WordNavigationAction(int code, boolean select) + protected WordNavigationAction(int code, boolean select, boolean delete) { super(getSourceViewer().getTextWidget(), code); this.select = select; + this.delete = delete; } public final void run() @@ -1000,9 +1012,17 @@ PerlPartitioner partitioner, int docLength); + protected final boolean isWordSeparator(char c) + { + return + !Character.isLetterOrDigit(c) && + !Character.isWhitespace(c) && + c != '_' && c != '&' && c != '$' && c != '@' && c != '%'; + } + protected final void setCaretPosition(final int position) { - if (select) + if (select || delete) { final ISourceViewer viewer = getSourceViewer(); final StyledText text = viewer.getTextWidget(); @@ -1013,10 +1033,30 @@ final int caret = text.getCaretOffset(); final int offset = modelOffset2WidgetOffset(viewer, position); + int start, length; if (caret == selection.x) - text.setSelectionRange(selection.y, offset - selection.y); + { + start = selection.y; + length = offset - selection.y; + } else - text.setSelectionRange(selection.x, offset - selection.x); + { + start = selection.x; + length = offset - selection.x; + } + + if (select) text.setSelectionRange(start, length); + else if (delete) + { + try + { + viewer.getDocument().replace(start, length, ""); //$NON-NLS-1$ + } + catch (BadLocationException exception) + { + // Should not happen + } + } } } else @@ -1028,7 +1068,7 @@ } /** - * Navigates or selects text up to the next word boundary. + * Navigates or selects/deletes text up to the next word boundary. */ private final class NextWordAction extends WordNavigationAction { @@ -1037,9 +1077,9 @@ * Action code for the default operation. * Must be an action code from {@link org.eclipse.swt.custom.ST}. */ - protected NextWordAction(int code, boolean select) + protected NextWordAction(int code, boolean select, boolean delete) { - super(code, select); + super(code, select, delete); } protected void run( @@ -1074,14 +1114,29 @@ partition = partitioner.getPartition(position+1, true); partitionEnd = partition.getOffset() + partition.getLength(); } - + + // If we start in front of a word separator character, + // just skip over it + int tmp = position; while (position < partitionEnd && - !Character.isWhitespace(document.getChar(position))) position++; - - while (position < length && - Character.isWhitespace(document.getChar(position)) && - document.getChar(position) != '\n' && - document.getChar(position) != '\r') position++; + isWordSeparator(document.getChar(position))) position++; + + if (position == tmp) + { + // If we get here, we did not start in front of + // a word separator. Then we skip until the next + // word separator or whitespace, and also over + // the whitespace + + while (position < partitionEnd && + !Character.isWhitespace(document.getChar(position)) && + !isWordSeparator(document.getChar(position))) position++; + + while (position < length && + Character.isWhitespace(document.getChar(position)) && + document.getChar(position) != '\n' && + document.getChar(position) != '\r') position++; + } } setCaretPosition(position); @@ -1104,7 +1159,7 @@ } /** - * Navigates or selects text up to the previous word boundary. + * Navigates or selects/deletes text up to the previous word boundary. */ private final class PreviousWordAction extends WordNavigationAction { @@ -1113,9 +1168,9 @@ * Action code for the default operation. * Must be an action code from {@link org.eclipse.swt.custom.ST}. */ - protected PreviousWordAction(int code, boolean select) + protected PreviousWordAction(int code, boolean select, boolean delete) { - super(code, select); + super(code, select, delete); } protected void run( @@ -1155,14 +1210,29 @@ partition = partitioner.getPartition(position-1, false); partitionStart = partition.getOffset(); } - - while (position > partitionStart && - Character.isWhitespace(document.getChar(position-1)) && - document.getChar(position-1) != '\n' && - document.getChar(position-1) != '\r') position--; - + + // If we start after a word separator character, + // just skip over it + int tmp = position; while (position > partitionStart && - !Character.isWhitespace(document.getChar(position-1))) position--; + isWordSeparator(document.getChar(position-1))) position--; + + if (position == tmp) + { + // If we get here, we did not start after + // a word separator. Then we skip the whitespace + // (if present) and also the previous word + // until whitespace or word separator + + while (position > partitionStart && + Character.isWhitespace(document.getChar(position-1)) && + document.getChar(position-1) != '\n' && + document.getChar(position-1) != '\r') position--; + + while (position > partitionStart && + !Character.isWhitespace(document.getChar(position-1)) && + !isWordSeparator(document.getChar(position-1))) position--; + } } setCaretPosition(position); |