List of usage examples for com.google.gwt.dom.client Range getStartOffset
public final native int getStartOffset() ;
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; }