/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.ui.actions; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder; import com.google.dart.tools.ui.internal.text.editor.DartSelection; import org.apache.commons.lang3.SystemUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import java.io.IOException; /** * {@link Action} to open folder with selected {@link IResource} and reveal it. */ public class ShowInFinderAction extends InstrumentedSelectionDispatchAction { public static final String ID = "com.google.dart.tools.ui.file.showInFinder"; private static ShowInFinderAction INSTANCE; public static ShowInFinderAction getInstance(IWorkbenchWindow window) { if (INSTANCE == null) { Assert.isNotNull(window); INSTANCE = new ShowInFinderAction(window); } return INSTANCE; } private final IWorkbenchWindow window; private ShowInFinderAction(IWorkbenchWindow window) { super(window); this.window = window; setId(ID); setActionDefinitionId(ID); if (SystemUtils.IS_OS_LINUX) { setText("Show in File Manager"); } if (SystemUtils.IS_OS_MAC) { setText("Show in Finder"); } if (SystemUtils.IS_OS_WINDOWS) { setText("Show in Explorer"); } } @Override public ISelection getSelection() { IWorkbenchPage page = window.getActivePage(); IWorkbenchPart activePart = page.getActivePart(); // editor is active if (activePart instanceof IEditorPart) { IEditorPart editorPart = (IEditorPart) activePart; IEditorInput editorInput = editorPart.getEditorInput(); if (editorInput instanceof IFileEditorInput) { IFileEditorInput fileEditorInput = (IFileEditorInput) editorInput; IFile file = fileEditorInput.getFile(); return new StructuredSelection(file); } } // view is active return window.getSelectionService().getSelection(); } @Override public void selectionChanged(DartSelection selection) { super.selectionChanged(selection); } public void updateEnablement() { boolean enabled = false; ISelection selection = getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection structuredSelection = (StructuredSelection) selection; if (!structuredSelection.isEmpty() && structuredSelection.getFirstElement() instanceof IResource) { enabled = true; } } setEnabled(enabled); } @Override protected void doRun(Event event, UIInstrumentationBuilder instrumentation) { ISelection selection = getSelection(); if (selection instanceof StructuredSelection) { StructuredSelection structuredSelection = (StructuredSelection) selection; if (structuredSelection.isEmpty()) { return; } Object element = structuredSelection.getFirstElement(); if (!(element instanceof IResource)) { return; } IResource resource = (IResource) element; instrumentation.data("path", resource.getLocation().toOSString()); String path = resource.getLocation().toOSString(); try { if (SystemUtils.IS_OS_LINUX) { try { new ProcessBuilder("/usr/bin/nautilus", path).start(); } catch (IOException e) { // no Nautilus, try generic xdg-open if (resource instanceof IFile) { path = resource.getParent().getLocation().toOSString(); } new ProcessBuilder("/usr/bin/xdg-open", path).start(); } return; } if (SystemUtils.IS_OS_MAC) { new ProcessBuilder("/usr/bin/open", "-R", path).start(); return; } if (SystemUtils.IS_OS_WINDOWS) { new ProcessBuilder("Explorer.exe", "/select,", path).start(); return; } } catch (IOException e) { instrumentation.record(e); ErrorDialog.openError( window.getShell(), null, null, DartToolsPlugin.createErrorStatus("Cannot " + getText(), e)); } } } }