@Override String getText(ISelection selection) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; StringBuffer buf= new StringBuffer(cts.getLength()); int startLine= cts.getStartLine(); int endLine= cts.getEndLine(); int startColumn= cts.getStartColumn(); int endColumn= cts.getEndColumn(); int visualStartColumn= computeVisualColumn(startLine, startColumn); int visualEndColumn= computeVisualColumn(endLine, endColumn); for (int line= startLine; line <= endLine; line++) { appendColumnRange(buf, line, visualStartColumn, visualEndColumn); if (line != endLine) buf.append(fDocument.getLineDelimiter(line)); } return buf.toString(); }
int startColumn= cts.getStartColumn(); int endColumn= cts.getEndColumn(); int visualStartColumn= computeVisualColumn(startLine, startColumn); int visualEndColumn= computeVisualColumn(endLine, endColumn); root= new MultiTextEdit(); String[] delimiters= fDocument.getLegalLineDelimiters(); TextEdit replace= createReplaceEdit(line, visualStartColumn, visualEndColumn, string, delete); root.addChild(replace); TextEdit edit; if (endLine < fDocument.getNumberOfLines()) { edit= createReplaceEdit(endLine, visualStartColumn, visualEndColumn, string, delete); } else {
if (startColumn == -1) { if (visual == visualStartColumn) if (!delete && isWider(content.charAt(offset), visual) && replacement.length() == 0) startColumn= offset - 1; else startColumn= offset; else if (visual > visualStartColumn) { if (isWider(content.charAt(offset - 1), visual)) startColumn= offset - 1; else break; } else if (visual > visualEndColumn) { if (!delete && isWider(content.charAt(offset - 1), visual)) endColumn= offset - 1; else visual+= visualSizeIncrement(content.charAt(offset), visual);
int startColumn= cts.getStartColumn(); int endColumn= cts.getEndColumn(); int visualStartColumn= computeVisualColumn(startLine, startColumn); int visualEndColumn= computeVisualColumn(endLine, endColumn); root= new MultiTextEdit(); String[] delimiters= fDocument.getLegalLineDelimiters(); TextEdit replace= createReplaceEdit(line, visualStartColumn, visualEndColumn, string, delete); root.addChild(replace); TextEdit edit; if (endLine < fDocument.getNumberOfLines()) { edit= createReplaceEdit(endLine, visualStartColumn, visualEndColumn, string, delete); } else {
if (startColumn == -1) { if (visual == visualStartColumn) if (!delete && isWider(content.charAt(offset), visual) && replacement.length() == 0) startColumn= offset - 1; else startColumn= offset; else if (visual > visualStartColumn) { if (isWider(content.charAt(offset - 1), visual)) startColumn= offset - 1; else break; } else if (visual > visualEndColumn) { if (!delete && isWider(content.charAt(offset - 1), visual)) endColumn= offset - 1; else visual+= visualSizeIncrement(content.charAt(offset), visual);
private void appendColumnRange(StringBuilder buf, int line, int visualStartColumn, int visualEndColumn) throws BadLocationException { IRegion info= fDocument.getLineInformation(line); int lineLength= info.getLength(); String content= fDocument.get(info.getOffset(), lineLength); int startColumn= -1; int endColumn= -1; int visual= 0; for (int offset= 0; offset < lineLength; offset++) { if (startColumn == -1 && visual >= visualStartColumn) startColumn= offset; if (visual >= visualEndColumn) { endColumn= offset; break; } visual+= visualSizeIncrement(content.charAt(offset), visual); } if (startColumn != -1) buf.append(content.substring(startColumn, endColumn == -1 ? lineLength : endColumn)); if (endColumn == -1) { int spaces= Math.max(0, visualEndColumn - Math.max(visual, visualStartColumn)); for (int i= 0; i < spaces; i++) buf.append(' '); } }
private void appendColumnRange(StringBuffer buf, int line, int visualStartColumn, int visualEndColumn) throws BadLocationException { IRegion info= fDocument.getLineInformation(line); int lineLength= info.getLength(); String content= fDocument.get(info.getOffset(), lineLength); int startColumn= -1; int endColumn= -1; int visual= 0; for (int offset= 0; offset < lineLength; offset++) { if (startColumn == -1 && visual >= visualStartColumn) startColumn= offset; if (visual >= visualEndColumn) { endColumn= offset; break; } visual+= visualSizeIncrement(content.charAt(offset), visual); } if (startColumn != -1) buf.append(content.substring(startColumn, endColumn == -1 ? lineLength : endColumn)); if (endColumn == -1) { int spaces= Math.max(0, visualEndColumn - Math.max(visual, visualStartColumn)); for (int i= 0; i < spaces; i++) buf.append(' '); } }
@Override IRegion[] getRanges(ISelection selection) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; final int startLine= cts.getStartLine(); final int endLine= cts.getEndLine(); int visualStartColumn= computeVisualColumn(startLine, cts.getStartColumn()); int visualEndColumn= computeVisualColumn(endLine, cts.getEndColumn()); IRegion[] ranges= new IRegion[endLine - startLine + 1]; for (int line= startLine; line <= endLine; line++) { int startColumn= computeCharacterColumn(line, visualStartColumn); int endColumn= computeCharacterColumn(line, visualEndColumn); IRegion lineInfo= fDocument.getLineInformation(line); int lineEnd= lineInfo.getLength(); startColumn= Math.min(startColumn, lineEnd); endColumn= Math.min(endColumn, lineEnd); ranges[line - startLine]= new Region(lineInfo.getOffset() + startColumn, endColumn - startColumn); } return ranges; }
@Override ISelection makeEmpty(ISelection selection, boolean beginning) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; int startLine, startColumn, endLine, endColumn; if (beginning) { startLine= cts.getStartLine(); startColumn= cts.getStartColumn(); endLine= cts.getEndLine(); endColumn= computeCharacterColumn(endLine, computeVisualColumn(startLine, startColumn)); } else { endLine= cts.getEndLine(); endColumn= cts.getEndColumn(); startLine= cts.getStartLine(); startColumn= computeCharacterColumn(startLine, computeVisualColumn(endLine, endColumn)); } return new BlockTextSelection(fDocument, startLine, startColumn, endLine, endColumn, fTabWidth); }
@Override String getText(ISelection selection) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; StringBuilder buf= new StringBuilder(cts.getLength()); int startLine= cts.getStartLine(); int endLine= cts.getEndLine(); int startColumn= cts.getStartColumn(); int endColumn= cts.getEndColumn(); int visualStartColumn= computeVisualColumn(startLine, startColumn); int visualEndColumn= computeVisualColumn(endLine, endColumn); for (int line= startLine; line <= endLine; line++) { appendColumnRange(buf, line, visualStartColumn, visualEndColumn); if (line != endLine) buf.append(fDocument.getLineDelimiter(line)); } return buf.toString(); }
@Override ISelection makeEmpty(ISelection selection, boolean beginning) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; int startLine, startColumn, endLine, endColumn; if (beginning) { startLine= cts.getStartLine(); startColumn= cts.getStartColumn(); endLine= cts.getEndLine(); endColumn= computeCharacterColumn(endLine, computeVisualColumn(startLine, startColumn)); } else { endLine= cts.getEndLine(); endColumn= cts.getEndColumn(); startLine= cts.getStartLine(); startColumn= computeCharacterColumn(startLine, computeVisualColumn(endLine, endColumn)); } return new BlockTextSelection(fDocument, startLine, startColumn, endLine, endColumn, fTabWidth); }
@Override IRegion[] getRanges(ISelection selection) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; final int startLine= cts.getStartLine(); final int endLine= cts.getEndLine(); int visualStartColumn= computeVisualColumn(startLine, cts.getStartColumn()); int visualEndColumn= computeVisualColumn(endLine, cts.getEndColumn()); IRegion[] ranges= new IRegion[endLine - startLine + 1]; for (int line= startLine; line <= endLine; line++) { int startColumn= computeCharacterColumn(line, visualStartColumn); int endColumn= computeCharacterColumn(line, visualEndColumn); IRegion lineInfo= fDocument.getLineInformation(line); int lineEnd= lineInfo.getLength(); startColumn= Math.min(startColumn, lineEnd); endColumn= Math.min(endColumn, lineEnd); ranges[line - startLine]= new Region(lineInfo.getOffset() + startColumn, endColumn - startColumn); } return ranges; }
@Override ISelection makeReplaceSelection(ISelection selection, String replacement) throws BadLocationException { IBlockTextSelection bts= (IBlockTextSelection)selection; String[] delimiters= fDocument.getLegalLineDelimiters(); int[] index= TextUtilities.indexOf(delimiters, replacement, 0); int length; if (index[0] == -1) length= replacement.length(); else length= index[0]; int startLine= bts.getStartLine(); int column= bts.getStartColumn() + length; int endLine= bts.getEndLine(); int endColumn= computeCharacterColumn(endLine, computeVisualColumn(startLine, column)); return new BlockTextSelection(fDocument, startLine, column, endLine, endColumn, fTabWidth); }
private boolean isWider(char character, int visual) { return visualSizeIncrement(character, visual) > 1; }
@Override ISelection makeReplaceSelection(ISelection selection, String replacement) throws BadLocationException { IBlockTextSelection bts= (IBlockTextSelection)selection; String[] delimiters= fDocument.getLegalLineDelimiters(); int[] index= TextUtilities.indexOf(delimiters, replacement, 0); int length; if (index[0] == -1) length= replacement.length(); else length= index[0]; int startLine= bts.getStartLine(); int column= bts.getStartColumn() + length; int endLine= bts.getEndLine(); int endColumn= computeCharacterColumn(endLine, computeVisualColumn(startLine, column)); return new BlockTextSelection(fDocument, startLine, column, endLine, endColumn, fTabWidth); }
@Override TextEdit replace(ISelection selection, String replacement) throws BadLocationException { return replace(selection, replacement, false); }
private boolean isWider(char character, int visual) { return visualSizeIncrement(character, visual) > 1; }
private int computeCharacterColumn(int line, int visualColumn) throws BadLocationException { IRegion info= fDocument.getLineInformation(line); int lineLength= info.getLength(); String content= fDocument.get(info.getOffset(), lineLength); int visual= 0; for (int offset= 0; offset < lineLength; offset++) { if (visual >= visualColumn) return offset; visual+= visualSizeIncrement(content.charAt(offset), visual); } return lineLength + Math.max(0, visualColumn - visual); }
@Override TextEdit backspace(ISelection selection) throws BadLocationException { IBlockTextSelection cts= (IBlockTextSelection)selection; if (isEmpty(selection) && cts.getStartColumn() > 0) { selection= new BlockTextSelection(fDocument, cts.getStartLine(), cts.getStartColumn() - 1, cts.getEndLine(), cts.getEndColumn(), fTabWidth); } return replace(selection, ""); //$NON-NLS-1$ }
@Override TextEdit delete(ISelection selection) throws BadLocationException { if (isEmpty(selection)) { IBlockTextSelection cts= (IBlockTextSelection)selection; selection= new BlockTextSelection(fDocument, cts.getStartLine(), cts.getStartColumn(), cts.getEndLine(), cts.getEndColumn() + 1, fTabWidth); } return replace(selection, "", true); //$NON-NLS-1$ }