Example usage for com.google.gwt.dom.client Range getStartOffset

List of usage examples for com.google.gwt.dom.client Range getStartOffset

Introduction

In this page you can find the example usage for com.google.gwt.dom.client Range getStartOffset.

Prototype

public final native int getStartOffset() ;

Source Link

Usage

From source file:de.catma.ui.client.ui.tagger.editor.RangeConverter.java

License:Open Source License

public TextRange convertToTextRange(Range range) {
    return convertToTextRange(range.getStartNode(), range.getEndNode(), range.getStartOffset(),
            range.getEndOffset());/*from   w w  w. ja va  2s.  c o  m*/
}

From source file:de.catma.ui.client.ui.tagger.editor.RangeConverter.java

License:Open Source License

public NodeRange convertToNodeRange(Element taggerElement, Range range) {
    NodeRange nodeRange = null;//w  w  w. j a va  2s.  c  o m
    if ((range != null) && (!range.isEmpty())) {

        Node startNode = range.getStartNode();
        int startOffset = range.getStartOffset();

        Node endNode = range.getEndNode();
        int endOffset = range.getEndOffset();

        DebugUtil.printNode(startNode);
        VConsole.log("startOffset: " + startOffset);

        DebugUtil.printNode(endNode);
        VConsole.log("endOffset: " + endOffset);

        if (taggerElement.isOrHasChild(endNode) && taggerElement.isOrHasChild(startNode)) {

            if (Element.is(startNode)) {
                startNode = findClosestTextNode(startNode.getChild(startOffset), Direction.RIGHT);
                VConsole.log("Found closest text node for startNode: ");
                DebugUtil.printNode(startNode);
                startOffset = 0;
            }

            if (Element.is(endNode)) {
                endNode = findClosestTextNode(endNode.getChild(endOffset), Direction.LEFT);
                VConsole.log("Found closest text node for endNode: ");
                DebugUtil.printNode(endNode);
                endOffset = endNode.getNodeValue().length();
            }
            nodeRange = new NodeRange(startNode, startOffset, endNode, endOffset);
        } else {
            VConsole.log("at least one node is out of the tagger's bounds");
        }
    } else {
        VConsole.log("range is empty or out of the tagger's bounds");
    }

    return nodeRange;
}

From source file:de.catma.ui.client.ui.tagger.editor.TaggerEditor.java

License:Open Source License

private List<TextRange> getLastTextRanges(RangeConverter converter) {

    if (lastTextRanges != null) {
        return lastTextRanges;
    }//from w  ww.  j a v  a  2 s  . com

    ArrayList<TextRange> textRanges = new ArrayList<TextRange>();
    for (Range range : lastRangeList) {
        if (!range.getStartNode().equals(getRootNode()) && !range.getEndNode().equals(getRootNode())) {
            TextRange textRange = validateTextRange(converter.convertToTextRange(range));

            if (!textRange.isPoint()) {
                VConsole.log("converted and adding range " + textRange);
                textRanges.add(textRange);
            } else {
                //TODO: consider tagging points (needs different visualization)
                VConsole.log("won't tag range " + textRange + " because it is a point");
            }
        } else {
            // one of the nodes is the root node, which is an out-of-bounds-selection
            // but we try to recover from that by looking for the next adjacent
            // text nodes
            Node startNode = range.getStartNode();
            int startOffset = range.getStartOffset();
            Node endNode = range.getEndNode();
            int endOffset = range.getEndOffset();

            if (range.getStartNode().equals(getRootNode())) {
                VConsole.log("startNode is root!");
                LeafFinder leafFinder = new LeafFinder(getRootNode().getChild(range.getStartOffset()),
                        getRootNode());
                startNode = leafFinder.getNextRightLeaf();
                startOffset = 0;
                VConsole.log("Setting new startNode with Offset 0: " + startNode);
            }

            if (range.getEndNode().equals(getRootNode())) {
                VConsole.log("endNode is root!");
                LeafFinder leafFinder = new LeafFinder(getRootNode().getChild(range.getEndOffset()),
                        getRootNode());
                endNode = leafFinder.getNextLeftTextLeaf();
                endOffset = endNode.getNodeValue().length();
                VConsole.log("Setting new endNode with Offset " + endOffset + ": " + endNode);
            }

            TextRange textRange = validateTextRange(
                    converter.convertToTextRange(startNode, endNode, startOffset, endOffset));

            if (!textRange.isPoint()) {
                VConsole.log("converted and adding range " + textRange);
                textRanges.add(textRange);
            } else {
                VConsole.log("won't tag range " + textRange + " because it is a point");
            }
        }
    }

    return textRanges;
}

From source file:de.catma.ui.client.ui.tagger.editor.TaggerEditor.java

License:Open Source License

public boolean hasSelection() {
    VConsole.log("checking for selection");
    if ((lastTextRanges != null) && !lastTextRanges.isEmpty()) {
        VConsole.log("found lastTextRanges: " + lastTextRanges.size());
        return true;
    }// w w w.  j av  a  2 s.co m

    if ((lastRangeList != null) && !lastRangeList.isEmpty()) {
        VConsole.log("found lastRangeList: " + lastRangeList.size());
        for (Range r : lastRangeList) {
            if ((r.getEndNode() != r.getStartNode()) || (r.getEndOffset() != r.getStartOffset())) {
                VConsole.log("found at least one range: " + r);
                return true;
            }
        }
        VConsole.log("lastRangeList contains only a point");
    }

    return false;
}

From source file:de.catma.ui.client.ui.tagger.RangeConverter.java

License:Open Source License

public TextRange convertToTextRange(Range range) {
    Node root = Document.get().getElementById(ContentElementID.CONTENT.name());

    int startPos = findPos(range.getStartNode(), root) + range.getStartOffset();
    int endPos = findPos(range.getEndNode(), root) + range.getEndOffset();
    TextRange tr = new TextRange(startPos, endPos);
    VConsole.log("RANGE!: " + tr);

    return tr;//from  w  ww. ja  va 2  s  . c  o m
}

From source file:org.nuxeo.ecm.platform.annotations.gwt.client.util.XPathUtil.java

License:Apache License

public String getSelectionXPointer(Range range) {
    int start = range.getStartOffset();
    Node clickedNode = range.getStartContainer();
    Node parentNode = clickedNode.getParentNode();

    if (clickedNode.getNodeType() == Node.TEXT_NODE) {
        TextGrabberVisitor processor = new TextGrabberVisitor();
        Visitor visitor = new Visitor(processor);
        visitor.process(parentNode, clickedNode);
        start += processor.getText().length();
    }//  w w  w.  ja  va  2  s. co m
    Log.debug("getSelectionXPointer; start: " + start);
    return "#xpointer(string-range(" + getXPath(parentNode) + ",\"\"," + start + ","
            + getShortLength(range.getSelectedText()) + "))";
}

From source file:org.rstudio.core.client.dom.impl.DomUtilsStandardImpl.java

License:Open Source License

public int[] getSelectionOffsets(Element container) {
    Range rng = getSelectionRange(NativeWindow.get(container.getOwnerDocument()), false);

    if (rng == null)
        return null;

    int start = NodeRelativePosition.toOffset(container,
            new NodeRelativePosition(rng.getStartContainer(), rng.getStartOffset()));
    int end = NodeRelativePosition.toOffset(container,
            new NodeRelativePosition(rng.getEndContainer(), rng.getEndOffset()));
    if (start >= 0 && end >= 0)
        return new int[] { start, end };
    else/*from  ww  w .  j  ava  2 s  . c  om*/
        return null;
}

From source file:org.xwiki.gwt.dom.client.DOMUtils.java

License:Open Source License

/**
 * @param range the range before which to look for a leaf
 * @return the previous leaf which is not touched by the specified range.
 *///from   www.j  av a  2  s .c o  m
public Node getPreviousLeaf(Range range) {
    Node startContainer = range.getStartContainer();
    if (startContainer.getNodeType() != Node.ELEMENT_NODE) {
        return getPreviousLeaf(startContainer);
    } else {
        // the node is an element node and the selection begins somewhere in between two child nodes. Check if it's
        // at the beginning of its parent and return the parent's previous leaf or the last leaf of the previous
        // node otherwise.
        if (startContainer.hasChildNodes() && range.getStartOffset() > 0) {
            Node nodeBefore = startContainer.getChildNodes().getItem(range.getStartOffset() - 1);
            return getLastLeaf(nodeBefore);
        } else {
            return getPreviousLeaf(startContainer);
        }

    }
}

From source file:org.xwiki.gwt.dom.client.DOMUtils.java

License:Open Source License

/**
 * Computes the maximal <strong>sub-range</strong> of the given range that satisfies the following two conditions:
 * <ul>//from  www .  j  a  v  a2  s  .  com
 * <li>the start point is before a <strong>leaf</strong> element node that can't have child nodes (e.g. an image) or
 * inside a leaf node at position 0 (e.g. an empty span or a text node)</li>
 * <li>the end point is after a leaf element node that can't have child nodes (e.g. an image) or inside a leaf node
 * at the end (e.g. inside an empty span or at the end of a text node)</li>
 * </ul>
 * . If no such sub-range exists (because the given range doesn't wrap any leaf node and none of its end points
 * satisfies the corresponding condition) then the given range is returned unmodified.
 * 
 * @param range a DOM range
 * @return the maximal sub-range that selects the same content as the given range
 */
public Range shrinkRange(Range range) {
    if (range == null || range.isCollapsed()) {
        return range;
    }

    // Find the start and end points that satisfy the conditions.
    Range start = getShrunkenRangeStart(range);
    Range end = getShrunkenRangeEnd(range);

    // If at least one of the end points moved and the range is still valid.
    if ((start != range || end != range) && start.compareBoundaryPoints(RangeCompare.END_TO_START, end) <= 0) {
        Range result = range.cloneRange();
        result.setStart(start.getEndContainer(), start.getEndOffset());
        result.setEnd(end.getStartContainer(), end.getStartOffset());
        return result;
    }
    return range;
}

From source file:org.xwiki.gwt.dom.client.DOMUtils.java

License:Open Source License

/**
 * Utility method to get the start point of the shrunken range (obtained with {@link #shrinkRange(Range)}).
 * //from   w ww  . j a  v a 2 s. c  om
 * @param range a DOM range
 * @return the start point of the range returned by {@link #shrinkRange(Range)}
 * @see #shrinkRange(Range)
 */
private Range getShrunkenRangeStart(Range range) {
    Node startContainer = range.getStartContainer();
    if (startContainer.hasChildNodes()) {
        if (range.getStartOffset() < startContainer.getChildCount()) {
            // Before a child node of an element.
            startContainer = getFirstLeaf(startContainer.getChild(range.getStartOffset()));
        } else {
            // After the last child of an element.
            startContainer = getNextLeaf(startContainer);
        }
    } else if (range.getStartOffset() > 0 && range.getStartOffset() == startContainer.getNodeValue().length()) {
        // At the end of a non-empty text node.
        startContainer = getNextLeaf(startContainer);
    }

    if (startContainer != null) {
        int startOffset = 0;
        if (startContainer.getNodeType() == Node.ELEMENT_NODE && !canHaveChildren(startContainer)) {
            startOffset = getNodeIndex(startContainer);
            startContainer = startContainer.getParentNode();
        }

        // Return a new range only if we managed to move the start.
        if (startContainer != range.getStartContainer()) {
            Range start = range.cloneRange();
            start.setEnd(startContainer, startOffset);
            start.collapse(false);
            return start;
        }
    }

    return range;
}