com.google.dart.tools.ui.actions.OpenExternalDartdocAction_OLD.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.tools.ui.actions.OpenExternalDartdocAction_OLD.java

Source

/*
 * Copyright (c) 2013, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.dart.tools.ui.actions;

import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.element.CompilationUnitElement;
import com.google.dart.engine.element.Element;
import com.google.dart.engine.element.LibraryElement;
import com.google.dart.engine.source.Source;
import com.google.dart.tools.core.DartCore;
import com.google.dart.tools.core.model.DartSdkManager;
import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder;
import com.google.dart.tools.ui.internal.filesview.nodes.old.IDartNode_OLD;
import com.google.dart.tools.ui.internal.text.editor.DartEditor;
import com.google.dart.tools.ui.internal.text.editor.DartSelection;
import com.google.dart.tools.ui.internal.util.ExternalBrowserUtil;

import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IWorkbenchSite;

import java.io.File;

/**
 * This action opens an external DartDoc link.
 */
public class OpenExternalDartdocAction_OLD extends AbstractDartSelectionAction_OLD {

    public OpenExternalDartdocAction_OLD(DartEditor editor) {
        super(editor);
    }

    public OpenExternalDartdocAction_OLD(IWorkbenchSite site) {
        super(site);
    }

    @Override
    public void selectionChanged(DartSelection selection) {
        setEnabled(isValidSelection(selection));
    }

    @Override
    public void selectionChanged(ISelection selection) {
        // overridden to not set enabled to false
    }

    @Override
    protected void doRun(DartSelection selection, Event event, UIInstrumentationBuilder instrumentation) {
        // prepare Element
        Element element = getSelectionElement(selection);
        if (element == null) {
            instrumentation.metric("Problem", "element was null");
            return;
        }
        // prepare LibraryElement
        LibraryElement libraryElement = element.getLibrary();
        if (libraryElement == null) {
            instrumentation.metric("Problem", "library was null");
            return;
        }
        String libraryName = libraryElement.getDisplayName();
        // prepare names
        String className;
        String elementName;
        ClassElement enclosingClassElement = element.getAncestor(ClassElement.class);
        if (element instanceof ClassElement) {
            className = element.getDisplayName();
            elementName = null;
        } else if (enclosingClassElement != null) {
            className = enclosingClassElement.getDisplayName();
            elementName = element.getDisplayName();
        } else {
            className = null;
            elementName = element.getDisplayName();
        }
        // do open
        browseDartDoc(libraryName, className, elementName, instrumentation);
    }

    @Override
    protected void doRun(IStructuredSelection selection, Event event, UIInstrumentationBuilder instrumentation) {
        if (selection == null || selection.isEmpty()) {
            return;
        }
        String libraryName = null;
        boolean browseSdkLibDocs = false;
        Object object = selection.getFirstElement();
        if (object instanceof IDartNode_OLD) {
            object = ((IDartNode_OLD) object).getFileStore();
        }
        if (object instanceof IFileStore) {
            IFileStore fileStore = (IFileStore) object;
            try {
                object = fileStore.toLocalFile(0, null);
            } catch (CoreException e) {
                DartCore.logError("Failed to convert to local file", e);
            }
        }
        if (object instanceof File) {
            IPath path = new Path(((File) object).getAbsolutePath());
            File sdkLibDir = DartSdkManager.getManager().getSdk().getLibraryDirectory();
            IPath sdkLibPath = new Path(sdkLibDir.getAbsolutePath());
            if (sdkLibPath.equals(path)) {
                browseSdkLibDocs = true;
            } else if (sdkLibPath.isPrefixOf(path)) {
                libraryName = "dart:" + path.segment(sdkLibPath.segmentCount());
            }
        }
        if (libraryName != null || browseSdkLibDocs) {
            browseDartDoc(libraryName, null, instrumentation);
        }
    }

    @Override
    protected void init() {
        setText(ActionMessages.OpenExternalDartdocAction_label);
        setDescription(ActionMessages.OpenExternalDartdocAction_description);
        setToolTipText(ActionMessages.OpenExternalDartdocAction_tooltip);
    }

    /**
     * @return {@code true} if given {@link DartSelection} looks valid and we can try to open Dart Doc
     *         for it.
     */
    protected boolean isValidSelection(DartSelection selection) {
        Element element = getSelectionElement(selection);
        // no element
        if (element == null) {
            return false;
        }
        // top-level or class member
        {
            Element enclosing = element.getEnclosingElement();
            if (enclosing instanceof CompilationUnitElement || enclosing instanceof ClassElement) {
            } else {
                return false;
            }
        }
        // prepare LibraryElement
        LibraryElement libraryElement = element.getLibrary();
        if (libraryElement == null) {
            return false;
        }
        // not external, so cannot be on http://api.dartlang.org/
        Source librarySource = libraryElement.getSource();
        if (librarySource == null || !librarySource.isInSystemLibrary()) {
            return false;
        }
        // OK
        return true;
    }

    /**
     * Open an external browser on the Dart doc for the specified library and class.
     * 
     * @param libraryName the library name (not {@code null})
     * @param className the class name or {@code null} to display library Dart doc
     * @param elementName the name of the element in library or class, may be {@code null}
     */
    private void browseDartDoc(String libraryName, String className, String elementName,
            UIInstrumentationBuilder instrumentation) {
        String url = "http://api.dartlang.org/";
        if (libraryName != null) {
            libraryName = transformLibraryName(libraryName);
            libraryName = libraryName.replace(':', '_');
            libraryName = libraryName.replace('.', '_');
            url += libraryName;
            // class
            if (className != null) {
                url += '.' + className;
            }
            url += ".html";
            // specific element
            if (elementName != null && !elementName.isEmpty()) {
                url += "#id_" + elementName;
            }
        }

        instrumentation.metric("ClickTarget", className != null ? "type" : "library");
        instrumentation.data("LibraryName", libraryName).data("ClassNameHtml", className);
        instrumentation.data("Url", url);

        ExternalBrowserUtil.openInExternalBrowser(url);
    }

    /**
     * Open an external browser on the Dart doc for the specified library and class.
     * 
     * @param libraryName the library name (not {@code null})
     * @param className the class name or {@code null} to display library Dart doc
     */
    private void browseDartDoc(String libraryName, String className, UIInstrumentationBuilder instrumentation) {
        String url = "http://api.dartlang.org/";
        if (libraryName != null) {
            libraryName = transformLibraryName(libraryName);
            url += libraryName.replace(':', '_');
            if (className != null) {
                url += '/' + className;
            }
            url += ".html";
        }

        instrumentation.metric("ClickTarget", className != null ? "type" : "library");
        instrumentation.data("LibraryName", libraryName).data("ClassNameHtml", className);
        instrumentation.data("Url", url);

        ExternalBrowserUtil.openInExternalBrowser(url);
    }

    private String transformLibraryName(String name) {
        if (name.contains("dart.dom.")) {
            name = name.replace(".dom.", ".");
        }
        if (name.equals("chrome")) {
            name = "dart.chrome";
        }
        return name;
    }
}