blob: 8c842f2d654809ce55ed894ecd77d9c925b4562e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.client.ui.ide.navigator;
import java.util.ArrayList;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditor;
import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditorInput;
import org.eclipse.mylyn.docs.intent.client.ui.ide.builder.IntentNature;
import org.eclipse.mylyn.docs.intent.client.ui.utils.IntentEditorOpener;
import org.eclipse.mylyn.docs.intent.collab.common.query.IndexQuery;
import org.eclipse.mylyn.docs.intent.collab.common.query.IntentDocumentQuery;
import org.eclipse.mylyn.docs.intent.collab.common.repository.IntentRepositoryManager;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
import org.eclipse.mylyn.docs.intent.collab.ide.repository.WorkspaceConfig;
import org.eclipse.mylyn.docs.intent.collab.ide.repository.WorkspaceRepository;
import org.eclipse.mylyn.docs.intent.collab.repository.RepositoryConnectionException;
import org.eclipse.mylyn.docs.intent.core.indexer.IntentIndexEntry;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.navigator.ILinkHelper;
/**
* An {@link ILinkHelper} allowing to link Intent Editors with the Intent Document structure displayed in the
* Project explorer.
*
* @author <a href="mailto:alex.lagarde@obeo.fr">Alex Lagarde</a>
*/
public class IntentLinkHelper implements ILinkHelper {
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.navigator.ILinkHelper#findSelection(org.eclipse.ui.IEditorInput)
*/
public IStructuredSelection findSelection(IEditorInput anInput) {
ArrayList<Object> elementsToSelect = new ArrayList<Object>();
// To avoid expanding the whole document hierarchy, always return the IndexEntry referencing the
// document
RepositoryAdapter repositoryAdapter = ((IntentEditorInput)anInput).getRepositoryAdapter();
Object[] index = new IndexQuery(repositoryAdapter).getOrCreateIntentIndex().getEntries().toArray();
for (int i = 0; i < index.length; i++) {
elementsToSelect.add(index[i]);
}
// Also add the Intent project to the selection
if (repositoryAdapter.getRepository() instanceof WorkspaceRepository) {
WorkspaceConfig workspaceConfig = ((WorkspaceRepository)repositoryAdapter.getRepository())
.getWorkspaceConfig();
String projectName = workspaceConfig.getRepositoryAbsolutePath()
.replace(workspaceConfig.getRepositoryRelativePath(), "").replaceFirst("/", "");
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if (project.exists()) {
elementsToSelect.add(project);
}
}
return new StructuredSelection(elementsToSelect.toArray(new Object[elementsToSelect.size()]));
}
/**
* {@inheritDoc}
*
* @see org.eclipse.ui.navigator.ILinkHelper#activateEditor(org.eclipse.ui.IWorkbenchPage,
* org.eclipse.jface.viewers.IStructuredSelection)
*/
public void activateEditor(IWorkbenchPage aPage, IStructuredSelection aSelection) {
Object selectedElement = aSelection.getFirstElement();
IntentEditor alreadyOpenedEditor = null;
if (selectedElement instanceof IntentIndexEntry) {
alreadyOpenedEditor = IntentEditorOpener
.getAlreadyOpenedEditor(((IntentIndexEntry)selectedElement).getReferencedElement());
}
// This case can never happen if jdt is installed, as LinkEditorAction.activateEditorJob only takes
// the first linkhelper available (if installed, the JDT for an IProject)
else if (selectedElement instanceof IProject) {
try {
if (((IProject)selectedElement).hasNature(IntentNature.NATURE_ID)) {
RepositoryAdapter adapter = IntentRepositoryManager.INSTANCE.getRepository(
((IProject)selectedElement).getName()).createRepositoryAdapter();
alreadyOpenedEditor = IntentEditorOpener.getAlreadyOpenedEditor(new IntentDocumentQuery(
adapter).getOrCreateIntentDocument());
}
} catch (RepositoryConnectionException e) {
// Silent catch
} catch (CoreException e) {
// Silent catch
}
}
if (alreadyOpenedEditor != null) {
aPage.bringToTop(alreadyOpenedEditor);
}
}
}