/*******************************************************************************
* Copyright (c) 2004 Eric Merritt 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:
* Eric Merritt
* Vlad Dumitrescu
*******************************************************************************/
package org.erlide.ui.editors.erl;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextDoubleClickStrategy;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.source.ICharacterPairMatcher;
/**
* The double click strategy for the editor
*
*
* @author Eric Merritt [cyberlync at gmail dot com]
*/
public class DoubleClickStrategy implements ITextDoubleClickStrategy {
/**
* The text container
*/
protected ITextViewer fText;
protected ICharacterPairMatcher fPairMatcher;
public DoubleClickStrategy(final ICharacterPairMatcher matcher) {
fPairMatcher = matcher;
}
/**
* If something is doubleclicking
*
* @see org.eclipse.jface.text.ITextDoubleClickStrategy#doubleClicked(org.eclipse.jface.text.ITextViewer)
*/
@Override
public void doubleClicked(final ITextViewer part) {
final int offset = part.getSelectedRange().x;
if (offset < 0) {
return;
}
final IDocument document = part.getDocument();
fText = part;
final IRegion region = fPairMatcher.match(document, offset);
if (region != null && region.getLength() >= 2) {
part.setSelectedRange(region.getOffset(), region.getLength());
} else {
if (!selectComment(offset)) {
selectWord(offset);
}
}
}
/**
* if a t_comment is selected
*
* @param caretPos
* @return
*/
protected boolean selectComment(final int caretPos) {
final IDocument doc = fText.getDocument();
final int startPos;
final int endPos;
try {
int pos = caretPos;
char c = ' ';
while (pos >= 0) {
c = doc.getChar(pos);
if (c == '\\') {
pos -= 2;
continue;
}
if (c == Character.LINE_SEPARATOR
|| c == Character.DIRECTIONALITY_PARAGRAPH_SEPARATOR
|| c == '\"') {
break;
}
--pos;
}
if (c != '\"') {
return false;
}
startPos = pos;
pos = caretPos;
final int length = doc.getLength();
c = ' ';
while (pos < length) {
c = doc.getChar(pos);
if (c == Character.LINE_SEPARATOR
|| c == Character.DIRECTIONALITY_PARAGRAPH_SEPARATOR
|| c == '\"') {
break;
}
++pos;
}
if (c != '\"') {
return false;
}
endPos = pos;
final int offset = startPos + 1;
final int len = endPos - offset;
fText.setSelectedRange(offset, len);
return true;
} catch (final BadLocationException x) {
// ignorable problem.
}
return false;
}
/**
* Select a word
*
* @param caretPos
* @return
*/
protected boolean selectWord(final int caretPos) {
final IDocument doc = fText.getDocument();
final int startPos;
final int endPos;
try {
int pos = caretPos;
char c;
while (pos >= 0) {
c = doc.getChar(pos);
if (!Character.isJavaIdentifierPart(c)) {
break;
}
--pos;
}
startPos = pos;
pos = caretPos;
final int length = doc.getLength();
while (pos < length) {
c = doc.getChar(pos);
if (!Character.isJavaIdentifierPart(c)) {
break;
}
++pos;
}
endPos = pos;
selectRange(startPos, endPos);
return true;
} catch (final BadLocationException x) {
// ignorable error
}
return false;
}
/**
* select a range of values
*
* @param startPos
* the starting pos
* @param stopPos
* the ending pos
*/
private void selectRange(final int startPos, final int stopPos) {
final int offset = startPos + 1;
final int length = stopPos - offset;
fText.setSelectedRange(offset, length);
}
}