package org.erlide.ui.navigator.actions;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.window.IShellProvider;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.OpenResourceAction;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.erlide.engine.model.IErlElement;
import org.erlide.engine.model.root.IErlExternal;
import org.erlide.ui.editors.util.EditorUtility;
import org.erlide.util.ErlLogger;
import com.google.common.collect.Sets;
public class OpenErlangAction extends Action {
private IErlElement selectedElement;
private final ISelectionProvider provider;
private final Set<IProject> selectedClosedProjects;
private final OpenResourceAction openResourceAction;
private final ICommonActionExtensionSite site;
/**
* Construct the OpenPropertyAction with the given page.
*
* @param p
* The page to use as context to open the editor.
* @param selectionProvider
* The selection provider
*/
public OpenErlangAction(final ICommonActionExtensionSite site,
final ISelectionProvider selectionProvider) {
this.site = site;
setText(Messages.getString("OpenErlangAction.0")); //$NON-NLS-1$
provider = selectionProvider;
selectedElement = null;
selectedClosedProjects = Sets.newHashSet();
final IShellProvider shellProvider = (IShellProvider) site.getViewSite()
.getAdapter(IShellProvider.class);
openResourceAction = new OpenResourceAction(shellProvider);
}
@Override
public boolean isEnabled() {
selectedElement = null;
selectedClosedProjects.clear();
final ISelection selection = provider.getSelection();
if (!selection.isEmpty()) {
final IStructuredSelection sSelection = (IStructuredSelection) selection;
if (sSelection.size() == 1
&& sSelection.getFirstElement() instanceof IErlElement) {
selectedElement = (IErlElement) sSelection.getFirstElement();
return true;
}
for (final Object element : sSelection.toList()) {
if (element instanceof IProject) {
final IProject project = (IProject) element;
if (!project.isOpen()) {
selectedClosedProjects.add(project);
return true;
}
}
}
}
return false;
}
@Override
public void run() {
if (isEnabled()) {
try {
if (selectedElement != null) {
if (selectedElement instanceof IErlExternal) {
final StructuredViewer structuredViewer = site
.getStructuredViewer();
if (structuredViewer instanceof AbstractTreeViewer) {
final AbstractTreeViewer treeViewer = (AbstractTreeViewer) structuredViewer;
final boolean expanded = treeViewer
.getExpandedState(selectedElement);
treeViewer.setExpandedState(selectedElement, !expanded);
}
} else {
final IEditorPart part = EditorUtility
.openInEditor(selectedElement, true);
EditorUtility.revealInEditor(part, selectedElement);
}
} else if (!selectedClosedProjects.isEmpty()) {
openResourceAction.selectionChanged(
(IStructuredSelection) provider.getSelection());
openResourceAction.run();
}
} catch (final PartInitException e) {
ErlLogger.warn(e);
}
}
}
}