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

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

Introduction

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

Prototype

public final native int getEndOffset() ;

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 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  .ja v a  2  s  .co 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;
    }// w  w w . j a va  2 s  . co  m

    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;
    }/*from  w  w w  .ja v a  2 s  .com*/

    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  . j  av  a2s .c  o  m
}

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/*  www . ja  v  a  2  s . com*/
        return null;
}

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

License:Open Source License

/**
 * @param range the range after which to look for a leaf
 * @return the next leaf which is not touched by the specified range.
 *///ww  w .ja  v a 2s. c om
public Node getNextLeaf(Range range) {
    Node endContainer = range.getEndContainer();
    if (endContainer.getNodeType() != Node.ELEMENT_NODE) {
        // The node is either a text node or a comment node, return next leaf
        return getNextLeaf(endContainer);
    } else {
        // the node is an element node, and the selection ends somewhere in between two child nodes. Check if it's
        // at the end of it's parent and return the parent's next leaf or the first leaf of the next node otherwise
        if (endContainer.hasChildNodes() && range.getEndOffset() < endContainer.getChildNodes().getLength()) {
            // get the first leaf of the node after the end container
            Node nodeAfter = endContainer.getChildNodes().getItem(range.getEndOffset());
            return getFirstLeaf(nodeAfter);
        } else {
            return getNextLeaf(endContainer);
        }
    }
}

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>/*  w w w . j  a  v a2s . c o m*/
 * <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 end point of the shrunken range (obtained with {@link #shrinkRange(Range)}).
 * //from   w w w . jav  a2  s .  c  o  m
 * @param range a DOM range
 * @return the end point of the range returned by {@link #shrinkRange(Range)}
 * @see #shrinkRange(Range)
 */
private Range getShrunkenRangeEnd(Range range) {
    Node endContainer = range.getEndContainer();
    if (endContainer.hasChildNodes()) {
        if (range.getEndOffset() > 0) {
            // After a child node of an element.
            endContainer = getLastLeaf(endContainer.getChild(range.getEndOffset() - 1));
        } else {
            // Before the first child of an element.
            endContainer = getPreviousLeaf(endContainer);
        }
    } else if (range.getEndOffset() == 0 && getLength(endContainer) > 0) {
        // At the start of a non-empty text node.
        endContainer = getPreviousLeaf(endContainer);
    }

    if (endContainer != null) {
        int endOffset = getLength(endContainer);
        if (endContainer.getNodeType() == Node.ELEMENT_NODE && !canHaveChildren(endContainer)) {
            endOffset = getNodeIndex(endContainer) + 1;
            endContainer = endContainer.getParentNode();
        }

        // Return a new range only if we managed to move the end.
        if (endContainer != range.getEndContainer()) {
            Range end = range.cloneRange();
            end.setStart(endContainer, endOffset);
            end.collapse(true);
            return end;
        }
    }

    return range;
}

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

License:Open Source License

/**
 * @param range A DOM range.// w w  w  .  j  av a  2s  . c  o  m
 * @return the last leaf node that is partially or entirely included in the given range.
 */
public Node getLastLeaf(Range range) {
    if (range.getEndContainer().hasChildNodes()) {
        if (range.isCollapsed()) {
            return null;
        } else if (range.getEndOffset() == 0) {
            return getPreviousLeaf(range.getEndContainer());
        } else {
            return getLastLeaf(range.getEndContainer().getChildNodes().getItem(range.getEndOffset() - 1));
        }
    } else {
        return range.getEndContainer();
    }
}