org.rstudio.core.client.dom.impl.DomUtilsStandardImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.rstudio.core.client.dom.impl.DomUtilsStandardImpl.java

Source

/*
 * DomUtilsStandardImpl.java
 *
 * Copyright (C) 2009-12 by RStudio, Inc.
 *
 * Unless you have received this program directly from RStudio pursuant
 * to the terms of a commercial license agreement with RStudio, then
 * this program is licensed to you under the terms of version 3 of the
 * GNU Affero General Public License. This program is distributed WITHOUT
 * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
 * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
 *
 */
package org.rstudio.core.client.dom.impl;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.dom.client.Text;
import org.rstudio.core.client.Rectangle;
import org.rstudio.core.client.dom.DomUtils;
import org.rstudio.core.client.dom.ElementEx;
import org.rstudio.core.client.dom.NativeWindow;

public class DomUtilsStandardImpl implements DomUtilsImpl {
    public void focus(Element element, boolean alwaysDriveSelection) {
        ElementEx el = (ElementEx) element;

        el.focus();
        if (alwaysDriveSelection
                || (el.getContentEditable() && (el.getInnerText() == null || el.getInnerText() == ""))) {
            Document doc = el.getOwnerDocument();
            Range range = Range.create(doc);
            range.selectNodeContents(el);
            Selection sel = Selection.get(NativeWindow.get(doc));
            sel.setRange(range);
        }

        NativeWindow.get().focus();
    }

    public void collapseSelection(boolean toStart) {
        Selection sel = Selection.get();
        if (sel == null || sel.getRangeCount() <= 0)
            return;
        Range range = sel.getRangeAt(0);
        range.collapse(toStart);
        sel.removeAllRanges();
        sel.addRange(range);
    }

    public boolean isSelectionCollapsed() {
        Selection sel = Selection.get();
        return sel != null && sel.getRangeCount() == 1 && sel.getRangeAt(0).isCollapsed();
    }

    public boolean isSelectionInElement(Element element) {
        Range rng = getSelectionRange(NativeWindow.get(element.getOwnerDocument()), false);
        if (rng == null)
            return false;
        return DomUtils.contains(element, rng.getCommonAncestorContainer());
    }

    public boolean selectionExists() {
        Selection sel = Selection.get();
        if (sel == null || sel.getRangeCount() == 0)
            return false;
        if (sel.getRangeCount() > 1)
            return true;
        return !sel.getRangeAt(0).isCollapsed();
    }

    public Range getSelectionRange(NativeWindow window, boolean clone) {
        Selection sel = Selection.get(window);
        if (sel.getRangeCount() != 1)
            return null;

        Range result = sel.getRangeAt(0);
        if (clone)
            result = result.cloneRange();
        return result;
    }

    public Rectangle getCursorBounds(Document doc) {

        Selection sel = Selection.get(NativeWindow.get(doc));
        Range selRng = sel.getRangeAt(0);
        if (selRng == null)
            return null;
        sel.removeAllRanges();
        SpanElement span = doc.createSpanElement();

        Range rng = selRng.cloneRange();
        rng.collapse(true);
        rng.insertNode(span);

        int x = span.getAbsoluteLeft();
        int y = span.getAbsoluteTop();
        int w = 0;
        int h = span.getOffsetHeight();
        Rectangle result = new Rectangle(x, y, w, h);

        ElementEx parent = (ElementEx) span.getParentElement();
        parent.removeChild(span);
        parent.normalize();
        sel.setRange(selRng);
        return result;
    }

    public String replaceSelection(Document document, String text) {
        if (!isSelectionInElement(document.getBody()))
            throw new IllegalStateException("Selection is not active");

        Range rng = getSelectionRange(NativeWindow.get(document), true);
        String orig = rng.toStringJs();
        rng.deleteContents();

        Text textNode = document.createTextNode(text);
        rng.insertNode(textNode);
        rng.selectNode(textNode);

        Selection.get(NativeWindow.get(document)).setRange(rng);

        return orig;
    }

    public String getSelectionText(Document document) {
        Range range = getSelectionRange(NativeWindow.get(document), false);
        if (range == null || range.isCollapsed())
            return null;
        else
            return range.toStringJs();
    }

    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
            return null;
    }

    public void setSelectionOffsets(Element container, int start, int end) {
        NodeRelativePosition startp = NodeRelativePosition.toPosition(container, start);
        NodeRelativePosition endp = NodeRelativePosition.toPosition(container, end);

        Document doc = container.getOwnerDocument();
        Range rng = Range.create(doc);
        rng.setStart(startp.node, startp.offset);
        rng.setEnd(endp.node, endp.offset);
        Selection.get(NativeWindow.get(doc)).setRange(rng);

    }

    public boolean isSelectionAsynchronous() {
        return false;
    }

    @Override
    public void selectElement(Element el) {
        Document doc = el.getOwnerDocument();
        Range rng = Range.create(doc);
        rng.selectNode(el);
        Selection.get(NativeWindow.get(doc)).setRange(rng);
    }
}