Package com.puppetlabs.geppetto.pp.dsl.ui.editor.hyperlinking

Source Code of com.puppetlabs.geppetto.pp.dsl.ui.editor.hyperlinking.PPHyperlinkHelper

/**
* Copyright (c) 2013 Puppet Labs, Inc. and other contributors, as listed below.
* 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:
*   Puppet Labs
*/
package com.puppetlabs.geppetto.pp.dsl.ui.editor.hyperlinking;

import java.util.List;

import com.puppetlabs.geppetto.pp.dsl.linking.PPObjectAtOffsetHelper;
import com.puppetlabs.geppetto.pp.dsl.ui.labeling.PPDescriptionLabelProvider;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jface.text.Region;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.resource.IEObjectDescription;
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.XtextHyperlink;
import org.eclipse.xtext.util.TextRegion;

import com.google.inject.Inject;

/**
* A PP specific hyperlink helper, that can find references using CrossReferenceAdapter instead of / in addition to
* eReferences.
*
*/
public class PPHyperlinkHelper extends HyperlinkHelper {

  @Inject
  PPObjectAtOffsetHelper ppObjectAtOffsetHelper;

  @Inject
  private PPDescriptionLabelProvider labelProvider;

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper#createHyperlinksByOffset(org.eclipse.xtext.resource.XtextResource, int,
   * org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor)
   */
  @Override
  public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
    super.createHyperlinksByOffset(resource, offset, acceptor);

    INode crossRefNode = ppObjectAtOffsetHelper.getCrossReferenceNode(resource, new TextRegion(offset, 0));
    if(crossRefNode == null)
      return;
    List<IEObjectDescription> crossLinkedObjects = ppObjectAtOffsetHelper.getCrossReferencedElement(crossRefNode);
    Region region = new Region(crossRefNode.getOffset(), crossRefNode.getLength());
    if(crossLinkedObjects != null)
      for(IEObjectDescription iod : crossLinkedObjects)
        createHyperlinksTo(resource, region, iod, acceptor);

  }

  public void createHyperlinksTo(XtextResource from, Region region, IEObjectDescription to,
      IHyperlinkAcceptor acceptor) {
    if(!isAcceptableTarget(to))
      return;
    final URIConverter uriConverter = from.getResourceSet().getURIConverter();
    final String hyperlinkText = labelProvider.getText(to);
    final URI uri = to.getEObjectURI();
    final URI normalized = uriConverter.normalize(uri);

    XtextHyperlink result = getHyperlinkProvider().get();
    result.setHyperlinkRegion(region);
    result.setURI(normalized);
    result.setHyperlinkText(hyperlinkText);
    acceptor.accept(result);
  }

  public boolean isAcceptableTarget(IEObjectDescription to) {
    String path = to.getEObjectURI().path();
    if(path == null)
      return false;
    // not meaningful to open a .pptp file (XML)
    if(path.endsWith(".pptp"))
      return false;
    return true;
  }

}
TOP

Related Classes of com.puppetlabs.geppetto.pp.dsl.ui.editor.hyperlinking.PPHyperlinkHelper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.