org.vclipse.vcml.ui.hyperlinks.VcmlHyperlinkHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.vclipse.vcml.ui.hyperlinks.VcmlHyperlinkHelper.java

Source

/*******************************************************************************
 * Copyright (c) 2010 - 2013 webXcerpt Software GmbH.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *  
 * Contributors:
 *        webXcerpt Software GmbH - initial creator
 *       www.webxcerpt.com
 ******************************************************************************/
package org.vclipse.vcml.ui.hyperlinks;

import java.util.Arrays;
import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.hyperlink.IHyperlink;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.resource.EObjectAtOffsetHelper;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper;
import org.vclipse.vcml.utils.DependencySourceUtils;
import org.vclipse.vcml.vcml.Dependency;
import org.vclipse.vcml.vcml.VcmlPackage;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.inject.Inject;

public class VcmlHyperlinkHelper extends HyperlinkHelper {

    @Inject
    private EObjectAtOffsetHelper eObjectAtOffsetHelper;

    @Inject
    private DependencySourceUtils sourceUtils;

    @Inject
    private HyperlinkDelegateExtension extensions;

    @Override
    public IHyperlink[] createHyperlinksByOffset(XtextResource resource, int offset,
            boolean createMultipleHyperlinks) {
        List<IHyperlink> links = Lists.newArrayList();
        IHyperlink[] createHyperlinksByOffset = super.createHyperlinksByOffset(resource, offset,
                createMultipleHyperlinks);
        if (createHyperlinksByOffset != null) {
            links.addAll(Arrays.asList(createHyperlinksByOffset));
        }
        for (IHyperlinkHelper helper : extensions.getExtensions()) {
            createHyperlinksByOffset = helper.createHyperlinksByOffset(resource, offset, true);
            if (createHyperlinksByOffset != null) {
                links.addAll(Arrays.asList(createHyperlinksByOffset));
            }
        }
        return links.isEmpty() ? null : Iterables.toArray(links, IHyperlink.class);
    }

    @Override
    public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
        super.createHyperlinksByOffset(resource, offset, acceptor);
        EObject elementAt = eObjectAtOffsetHelper.resolveContainedElementAt(resource, offset);
        if (elementAt instanceof Dependency) {
            EObject source = sourceUtils.getSource((Dependency) elementAt);
            if (source != null) {
                List<INode> findNodesForFeature = NodeModelUtils.findNodesForFeature(elementAt,
                        VcmlPackage.eINSTANCE.getVCObject_Name());
                if (!findNodesForFeature.isEmpty()) {
                    INode nameNode = findNodesForFeature.get(0);
                    createHyperlinksTo(resource,
                            new Region(nameNode.getTotalOffset() + 1, nameNode.getTotalLength()), source, acceptor);
                }
            }
        }
    }
}