/******************************************************************************* * Copyright (c) 2007, 2009 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.php.internal.ui.actions; import java.lang.reflect.InvocationTargetException; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.dltk.core.DLTKLanguageManager; import org.eclipse.jface.action.IAction; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.php.internal.core.project.PHPNature; import org.eclipse.php.internal.ui.Logger; import org.eclipse.ui.IActionDelegate; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.progress.IProgressService; /** * Not API */ public class SetupPHPProjectAction implements IObjectActionDelegate, IActionDelegate { IWorkbenchPart fPart; Object[] fTarget; private void doInstall(IProject project, IProgressMonitor monitor) { try { IProjectDescription description = project.getDescription(); String[] prevNatures = description.getNatureIds(); String[] newNatures = new String[prevNatures.length + 1]; System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length); newNatures[prevNatures.length] = PHPNature.ID; description.setNatureIds(newNatures); project.setDescription(description, monitor); } catch (CoreException ex) { Logger.logException(ex); } } private void install(final IProject project) { IProgressService service = null; if (fPart != null) { service = (IProgressService) fPart.getSite().getService(IProgressService.class); } if (service == null) { doInstall(project, null); } else { IRunnableWithProgress runnable = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { doInstall(project, monitor); } }; try { service.run(false, false, runnable); } catch (InvocationTargetException e) { Logger.logException(e); } catch (InterruptedException e) { Logger.logException(e); } } } @Override public void run(IAction action) { if (fTarget == null) return; for (int i = 0; i < fTarget.length; i++) { if (fTarget[i] instanceof IResource) { final IProject project = ((IResource) fTarget[i]).getProject(); if (!DLTKLanguageManager.hasScriptNature(project)) { install(project); } } } } @Override public void selectionChanged(IAction action, ISelection selection) { if (selection instanceof IStructuredSelection) { fTarget = ((IStructuredSelection) selection).toArray(); boolean enabled = true; for (Object obj : fTarget) { if (!(obj instanceof IProject)) { enabled = false; break; } IProject project = (IProject) obj; if (!project.isAccessible() || DLTKLanguageManager.hasScriptNature(project)) { enabled = false; break; } } action.setEnabled(enabled); } else { fTarget = null; action.setEnabled(false); } } @Override public void setActivePart(IAction action, IWorkbenchPart targetPart) { fPart = targetPart; } }