/******************************************************************************* * Copyright (c) 2009, 2010 Sven Kiera * 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 *******************************************************************************/ package org.phpsrc.eclipse.pti.ui.actions; import java.util.ArrayList; import java.util.Iterator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.dltk.core.IMember; import org.eclipse.dltk.core.IOpenable; import org.eclipse.dltk.core.IScriptFolder; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ModelException; import org.eclipse.jface.action.IAction; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.phpsrc.eclipse.pti.core.PHPToolkitUtil; import org.phpsrc.eclipse.pti.ui.Logger; public abstract class ResourceAction implements IWorkbenchWindowActionDelegate { private IWorkbenchWindow window; private IResource[] selectedResources; public void dispose() { selectedResources = null; } public void init(IWorkbenchWindow window) { selectedResources = new IResource[0]; this.window = window; } public void selectionChanged(IAction action, ISelection selection) { ArrayList<IResource> resources = new ArrayList<IResource>(1); if (selection.isEmpty()) { addActiveEditorFileToList(resources); } else if (selection instanceof ITextSelection) { addActiveEditorFileToList(resources); } else if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; resources = new ArrayList<IResource>(structuredSelection.size()); Iterator<?> iterator = structuredSelection.iterator(); while (iterator.hasNext()) { Object entry = iterator.next(); try { if (entry instanceof IResource) { addResourceToList(resources, (IResource) entry); } else if (entry instanceof ISourceModule) { if (((ISourceModule) entry).exists()) { IFile file = (IFile) ((ISourceModule) entry).getCorrespondingResource(); if (PHPToolkitUtil.isPhpFile(file)) { addResourceToList(resources, file); } } } else if (entry instanceof IOpenable) { if (((IOpenable) entry).exists()) { addResourceToList(resources, ((IOpenable) entry).getCorrespondingResource()); } } else if (entry instanceof IMember) { if (((IMember) entry).exists()) { addResourceToList(resources, ((IMember) entry).getResource()); } } else if (entry instanceof IFileEditorInput) { if (((IFileEditorInput) entry).exists()) { addResourceToList(resources, ((IFileEditorInput) entry).getFile()); } } else if (entry instanceof IScriptFolder) { if (((IScriptFolder) entry).exists()) { addResourceToList(resources, ((IScriptFolder) entry).getResource()); } } } catch (ModelException e) { Logger.logException(e); } } } else { addActiveEditorFileToList(resources); } selectedResources = resources.toArray(new IResource[0]); } public void setSelectedResources(IResource[] resources) { selectedResources = resources; } public IResource[] getSelectedResources() { return selectedResources; } private void addResourceToList(ArrayList<IResource> list, IResource resource) { if (resource != null && resource.exists() && !list.contains(resource) && canAddResourceToList(resource)) list.add(resource); } protected void addActiveEditorFileToList(ArrayList<IResource> list) { IWorkbenchPage page = window.getActivePage(); if (page != null) { IEditorPart editor = page.getActiveEditor(); if (editor != null) { IEditorInput input = editor.getEditorInput(); if (input != null && input instanceof IFileEditorInput) { addResourceToList(list, ((IFileEditorInput) input).getFile()); } } } } protected boolean canAddResourceToList(IResource resource) { return true; } }