package com.deepnighttwo.tools.openfolder.handlers; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.IHandler; import org.eclipse.core.expressions.IEvaluationContext; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.internal.core.JavaProject; import org.eclipse.jdt.internal.core.Openable; import org.eclipse.jface.text.TextSelection; import org.eclipse.swt.program.Program; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.part.MultiPageEditorPart; import com.deepnighttwo.tools.openfolder.Activator; /** * Our sample handler extends AbstractHandler, an IHandler base class. * * @see org.eclipse.core.commands.IHandler * @see org.eclipse.core.commands.AbstractHandler */ @SuppressWarnings("restriction") public class OpenFolderHandler extends AbstractHandler { /** * The constructor. */ public OpenFolderHandler() { } private final static IHandler[] EXTRA_HANDLERS; // private final static IWorkspaceRoot root = ResourcesPlugin.getWorkspace() // .getRoot(); static { IExtension[] extensions = Platform .getExtensionRegistry() .getExtensionPoint( com.deepnighttwo.tools.openfolder.Activator.PLUGIN_ID, "openFolderExtraType").getExtensions(); List<IHandler> handlers = new ArrayList<IHandler>(); for (IExtension extension : extensions) { IConfigurationElement[] configElements = extension .getConfigurationElements(); for (IConfigurationElement element : configElements) { if (element.getName().equals("openFolderHandler") == false) { continue; } try { IHandler handler = (IHandler) element .createExecutableExtension("handlerName"); handlers.add(handler); } catch (CoreException e) { e.printStackTrace(); } } } EXTRA_HANDLERS = handlers.toArray(new IHandler[0]); } /** * the command has been executed, so extract extract the needed information * from the application context. */ public Object execute(ExecutionEvent event) throws ExecutionException { Object obj = event.getApplicationContext(); if (obj instanceof IEvaluationContext == false) { return null; } IEvaluationContext context = (IEvaluationContext) obj; Object value = context.getDefaultVariable(); if (value instanceof Collection == false) { return null; } Collection<?> items = (Collection<?>) value; if (items.size() == 0) { Object file = getFileFromActiveEditor(); if (file != null) { handleFileObject(file); } return null; } Object selection = items.toArray()[0]; if (selection instanceof IProject) { IProject project = (IProject) selection; handleIProject(project); } else if (selection instanceof IFolder) { IFolder folder = (IFolder) selection; handleIFolder(folder); } else if (selection instanceof IFile) { IFile file = (IFile) selection; handleIFile(file); } else if (selection instanceof Openable) { Openable openable = (Openable) selection; File file = getFileFromOpenable(openable); if (file.exists() == false) { IJavaElement parent = openable.getParent(); while ((parent != null) && ((parent instanceof IProject == false) && (parent instanceof JavaProject == false))) { parent = parent.getParent(); } IProject project = null; if (parent instanceof JavaProject) { project = ((JavaProject) parent).getProject(); } else if (parent instanceof IProject) { project = (IProject) parent; } if (parent != null) { IFile projectFile = project.getFile(openable.getPath()); file = projectFile.getLocation().toFile(); } } handleFile(file); } else if (selection instanceof TextSelection) { Object file = getFileFromActiveEditor(); if (file != null) { handleFileObject(file); } } else { System.out.println(selection.getClass()); org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader cl = (org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader) selection .getClass().getClassLoader(); System.out.println(cl.getBundle()); for (IHandler handler : EXTRA_HANDLERS) { Object ret = handler.execute(event); if (Boolean.TRUE.equals(ret) == true) { return null; } } } return null; } public void handleFileObject(Object file) { if (file instanceof IFile) { handleIFile((IFile) file); } else if (file instanceof File) { handleFile((File) file); } } public void handleIProject(IProject project) { File localFile = project.getLocation().toFile(); handleFile(localFile); } public void handleIFolder(IFolder folder) { File localFile = folder.getLocation().toFile(); handleFile(localFile); } public void handleIFile(IFile file) { File localfile = file.getLocation().toFile(); handleFile(localfile); } public void handleFile(File file) { if (file.isDirectory() == true) { Program.launch(file.toString()); } else if (file.isFile() == true) { Program.launch(file.getParent()); } } private Object getFileFromActiveEditor() { IWorkbench workbench = Activator.getDefault().getWorkbench(); IWorkbenchPage page = workbench.getActiveWorkbenchWindow() .getActivePage(); IEditorPart activeEditor = page.getActiveEditor(); Object file = null; if (activeEditor instanceof MultiPageEditorPart) { MultiPageEditorPart multiPageEditor = (MultiPageEditorPart) (activeEditor); Integer currPageID = multiPageEditor.getActivePage(); try { Method m = MultiPageEditorPart.class.getDeclaredMethod( "getEditor", int.class); m.setAccessible(true); Object epObj = m.invoke(multiPageEditor, currPageID); if (epObj instanceof IEditorPart) { IEditorPart ep = (IEditorPart) epObj; file = getFileFromEditor(ep); } } catch (Exception e) { e.printStackTrace(); } } if (file == null) { file = getFileFromEditor(activeEditor); } return file; } private Object getFileFromEditor(IEditorPart ep) { IAdaptable currEditor = ep.getEditorInput(); IFile input = null; input = (IFile) currEditor.getAdapter(IFile.class); if (input != null) { return input; } { IJavaElement javaEle = (IJavaElement) ep.getEditorInput() .getAdapter(IJavaElement.class); if (javaEle instanceof Openable) { return getFileFromOpenable((Openable) javaEle); } } return null; } private File getFileFromOpenable(Openable openable) { try { File file = openable.getResource().getLocation().toFile(); if (file.exists() == true) { return file; } } catch (Throwable e) { } try { File file = openable.getPath().toFile(); if (file.exists() == true) { return file; } } catch (Throwable e) { } return null; } }