org.summer.dsl.xbase.ui.jvmmodel.outline.JvmOutlineNodeElementOpener.java Source code

Java tutorial

Introduction

Here is the source code for org.summer.dsl.xbase.ui.jvmmodel.outline.JvmOutlineNodeElementOpener.java

Source

/*******************************************************************************
 * Copyright (c) 2011 itemis AG (http://www.itemis.eu) and others.
 * 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
 *******************************************************************************/
package org.summer.dsl.xbase.ui.jvmmodel.outline;

import org.apache.log4j.Logger;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IStorage;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.ISourceRange;
import org.summer.dsl.model.types.JvmIdentifiableElement;
import org.summer.dsl.model.types.util.jdt.IJavaElementFinder;
import org.eclipse.xtext.generator.trace.ILocationInResource;
import org.eclipse.xtext.generator.trace.ITrace;
import org.eclipse.xtext.generator.trace.ITraceForStorageProvider;
import org.eclipse.xtext.ui.editor.GlobalURIEditorOpener;
import org.eclipse.xtext.ui.editor.outline.impl.OutlineNodeElementOpener;
import org.eclipse.xtext.util.TextRegion;

import com.google.inject.Inject;

/**
 * @author Jan Koehnlein - Initial contribution and API
 */
public class JvmOutlineNodeElementOpener extends OutlineNodeElementOpener {

    private static Logger LOG = Logger.getLogger(JvmOutlineNodeElementOpener.class);

    @Inject
    private IJavaElementFinder javaElementFinder;

    @Inject
    private ITraceForStorageProvider traceInformation;

    @Inject
    private GlobalURIEditorOpener globalURIEditorOpener;

    @Override
    protected void openEObject(EObject state) {
        try {
            if (state instanceof JvmIdentifiableElement) {
                IJavaElement javaElement = javaElementFinder.findElementFor((JvmIdentifiableElement) state);
                if (javaElement instanceof IMember) {
                    IResource resource = javaElement.getResource();
                    if (resource instanceof IStorage) {
                        ITrace traceToSource = traceInformation.getTraceToSource((IStorage) resource);
                        if (traceToSource != null) {
                            ISourceRange sourceRange = ((IMember) javaElement).getSourceRange();
                            ILocationInResource sourceInformation = traceToSource.getBestAssociatedLocation(
                                    new TextRegion(sourceRange.getOffset(), sourceRange.getLength()));
                            if (sourceInformation != null) {
                                globalURIEditorOpener.open(sourceInformation.getAbsoluteResourceURI(), javaElement,
                                        true);
                                return;
                            }
                        }
                    }
                    globalURIEditorOpener.open(null, javaElement, true);
                    return;
                }
            }
        } catch (Exception exc) {
            LOG.error("Error opening java editor", exc);
        }
        super.openEObject(state);
    }

}