org.eclipse.jface.text.BlockTextSelection Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2009 Avaloq Evolution AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tom Eicher (Avaloq Evolution AG) - initial API and implementation
*******************************************************************************/
package org.eclipse.jface.text;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.internal.text.SelectionProcessor;
/**
* Standard implementation of {@link org.eclipse.jface.text.IBlockTextSelection}.
*
* @since 3.5
*/
public class BlockTextSelection extends TextSelection implements IBlockTextSelection {
/** The start line. */
private final int fStartLine;
/** The start column. */
private final int fStartColumn;
/** The end line. */
private final int fEndLine;
/** The end column. */
private final int fEndColumn;
/** The tabulator width used to compute visual columns from character offsets. */
private final int fTabWidth;
/**
* Creates a column selection for the given lines and columns.
*
* @param document the document that this selection refers to
* @param startLine the start line
* @param startColumn the possibly virtual start column, measured in characters from the start
* of startLine
* @param endLine the inclusive end line
* @param endColumn the exclusive and possibly virtual end column, measured in characters from
* the start of endLine
* @param tabWidth the tabulator width used to compute the visual offsets from character offsets
*/
public BlockTextSelection(IDocument document, int startLine, int startColumn, int endLine, int endColumn, int tabWidth) {
super(document, computeOffset(document, startLine, startColumn), computeOffset(document, endLine, endColumn) - computeOffset(document, startLine, startColumn));
Assert.isLegal(startLine >= 0);
Assert.isLegal(startColumn >= 0);
Assert.isLegal(endLine >= startLine);
Assert.isLegal(endColumn >= 0);
Assert.isLegal(tabWidth >= 0);
fStartLine= startLine;
fStartColumn= startColumn;
fEndLine= endLine;
fEndColumn= endColumn;
fTabWidth= tabWidth > 0 ? tabWidth : 8; // seems to be the default when StyledText.getTabs returns 0
}
/**
* Returns the document offset for a given tuple of line and column count. If the column count
* points beyond the end of the line, the end of the line is returned (virtual location). If the
* line points beyond the number of lines, the end of the document is returned; if the line is
* < zero, 0 is returned.
*
* @param document the document to get line information from
* @param line the line in the document, may be greater than the line count
* @param column the offset in the given line, may be greater than the line length
* @return the document offset corresponding to the line and column counts
*/
private static int computeOffset(IDocument document, int line, int column) {
try {
IRegion lineInfo= document.getLineInformation(line);
int offsetInLine= Math.min(column, lineInfo.getLength());
return lineInfo.getOffset() + offsetInLine;
} catch (BadLocationException x) {
if (line < 0)
return 0;
return document.getLength();
}
}
/*
* @see org.eclipse.jface.text.TextSelection#getStartLine()
*/
public int getStartLine() {
return fStartLine;
}
/*
* @see org.eclipse.jface.text.IColumnTextSelection#getStartColumn()
*/
public int getStartColumn() {
return fStartColumn;
}
/*
* @see org.eclipse.jface.text.TextSelection#getEndLine()
*/
public int getEndLine() {
return fEndLine;
}
/*
* @see org.eclipse.jface.text.IColumnTextSelection#getEndColumn()
*/
public int getEndColumn() {
return fEndColumn;
}
/*
* @see org.eclipse.jface.text.TextSelection#getText()
*/
public String getText() {
IDocument document= getDocument();
if (document != null) {
try {
return new SelectionProcessor(document, fTabWidth).getText(this);
} catch (BadLocationException x) {
// ignore and default to super implementation
}
}
return super.getText();
}
/*
* @see org.eclipse.jface.text.TextSelection#hashCode()
*/
public int hashCode() {
final int prime= 31;
int result= super.hashCode();
result= prime * result + fEndColumn;
result= prime * result + fEndLine;
result= prime * result + fStartColumn;
result= prime * result + fStartLine;
return result;
}
/*
* @see org.eclipse.jface.text.TextSelection#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
final BlockTextSelection other= (BlockTextSelection) obj;
if (fEndColumn != other.fEndColumn)
return false;
if (fEndLine != other.fEndLine)
return false;
if (fStartColumn != other.fStartColumn)
return false;
if (fStartLine != other.fStartLine)
return false;
return true;
}
/*
* @see org.eclipse.jface.text.IColumnTextSelection#getRegions()
*/
public IRegion[] getRegions() {
IDocument document= getDocument();
if (document != null) {
try {
return new SelectionProcessor(document, fTabWidth).getRanges(this);
} catch (BadLocationException x) {
// default to single region behavior
}
}
return new IRegion[] {new Region(getOffset(), getLength())};
}
}