/******************************************************************************* * Copyright (c) 2007 - 2013 Spring IDE Developers * 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: * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.beans.ui.navigator; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.navigator.ILinkHelper; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.xml.core.internal.document.ElementImpl; import org.springframework.ide.eclipse.beans.core.BeansCorePlugin; import org.springframework.ide.eclipse.beans.core.BeansCoreUtils; import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils; import org.springframework.ide.eclipse.beans.core.model.IBeansConfig; import org.springframework.ide.eclipse.beans.core.model.IBeansModelElement; import org.springframework.ide.eclipse.beans.core.model.IBeansProject; import org.springframework.ide.eclipse.beans.ui.BeansUIUtils; import org.springframework.ide.eclipse.core.model.ILazyInitializedModelElement; import org.springframework.ide.eclipse.core.model.IModelElement; import org.springframework.ide.eclipse.ui.navigator.actions.ILinkHelperExtension; import org.springsource.ide.eclipse.commons.ui.SpringUIUtils; /** * {@link ILinkHelper} implementation for resolving links to {@link IBeansModelElement}s. * @author Torsten Juergeleit * @author Christian Dupuis */ @SuppressWarnings("restriction") public class BeansNavigatorLinkHelper implements ILinkHelper, ILinkHelperExtension { /** * {@inheritDoc} */ public void activateEditor(IWorkbenchPage page, IStructuredSelection selection) { } /** * {@inheritDoc} */ public IStructuredSelection findSelection(IEditorInput input) { if (input instanceof IFileEditorInput) { IFile file = ((IFileEditorInput) input).getFile(); // Ensure that if the project is not loaded we skip this in the UI IBeansProject project = BeansCorePlugin.getModel().getProject(file.getProject()); if (project instanceof ILazyInitializedModelElement && !((ILazyInitializedModelElement) project).isInitialized()) { return StructuredSelection.EMPTY; } IBeansConfig config = BeansCorePlugin.getModel().getConfig(file); if (config != null) { IEditorPart editor = SpringUIUtils.getActiveEditor(); if (editor.getEditorInput() == input && editor.getSite() != null && editor.getSite().getSelectionProvider() != null) { ISelection selection = editor.getSite().getSelectionProvider().getSelection(); IModelElement element = BeansUIUtils.getSelectedElement(selection, config); if (element != null) { return new TreeSelection(BeansUIUtils.createTreePath(element)); } } } } return StructuredSelection.EMPTY; } /** * {@inheritDoc} */ public IStructuredSelection findSelection(Object object) { if (object instanceof ElementImpl) { ElementImpl element = (ElementImpl) object; IStructuredDocument document = element.getStructuredDocument(); IFile resource = SpringUIUtils.getFile(document); // Ensure that if the project is not loaded we skip this in the UI IBeansProject project = BeansCorePlugin.getModel().getProject(resource.getProject()); if (project instanceof ILazyInitializedModelElement && !((ILazyInitializedModelElement) project).isInitialized()) { return StructuredSelection.EMPTY; } // Make sure that the file is actually a beans config if (!BeansCoreUtils.isBeansConfig(resource)) { return null; } // The line number-based approach is the best approximation that we can currently do int startLine = document.getLineOfOffset(element.getStartOffset()) + 1; int endLine = document.getLineOfOffset(element.getEndOffset()) + 1; IModelElement modelElement = BeansModelUtils.getMostSpecificModelElement(startLine, endLine, resource, new NullProgressMonitor()); if (modelElement != null) { return new TreeSelection(BeansUIUtils.createTreePath(modelElement)); } return new StructuredSelection(resource); } return null; } }