Package org.erlide.ui.editors.erl

Source Code of org.erlide.ui.editors.erl.DoubleClickStrategy

/*******************************************************************************
* 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);
    }
}
TOP

Related Classes of org.erlide.ui.editors.erl.DoubleClickStrategy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.