| /******************************************************************************* |
| * 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.wst.jsdt.web.ui; |
| |
| import java.lang.reflect.InvocationTargetException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.Platform; |
| 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.swt.widgets.Shell; |
| import org.eclipse.ui.IActionDelegate; |
| import org.eclipse.ui.IObjectActionDelegate; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.dialogs.PreferencesUtil; |
| import org.eclipse.ui.progress.IProgressService; |
| import org.eclipse.wst.jsdt.core.IIncludePathEntry; |
| import org.eclipse.wst.jsdt.core.IJavaScriptProject; |
| import org.eclipse.wst.jsdt.core.JavaScriptCore; |
| import org.eclipse.wst.jsdt.core.JavaScriptModelException; |
| import org.eclipse.wst.jsdt.web.core.internal.Logger; |
| import org.eclipse.wst.jsdt.web.core.internal.project.JsWebNature; |
| import org.eclipse.wst.jsdt.web.ui.internal.JsUIPlugin; |
| |
| /** |
| * Not API |
| */ |
| public class SetupProjectsWizzard implements IObjectActionDelegate, IActionDelegate { |
| IWorkbenchPart fPart; |
| Object[] fTarget; |
| |
| private void doInstall(IProject project, final boolean openProperties, IProgressMonitor monitor) { |
| boolean configured = false; |
| JsWebNature nature = new JsWebNature(project, monitor); |
| try { |
| boolean hadBasicNature = JsWebNature.hasNature(project); |
| |
| nature.configure(); |
| |
| if (!hadBasicNature) { |
| /* |
| * No nature before, so no existing build path. Define the |
| * project itself as an include folder. |
| */ |
| IJavaScriptProject jp = JavaScriptCore.create(project); |
| IIncludePathEntry[] oldEntries = null; |
| try { |
| oldEntries = jp.getRawIncludepath(); |
| } |
| catch (JavaScriptModelException ex1) { |
| Logger.log(Logger.ERROR_DEBUG, null, ex1); |
| } |
| IIncludePathEntry[] newEntries = new IIncludePathEntry[oldEntries.length + 1]; |
| System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length); |
| IPath projectPath = project.getFullPath(); |
| newEntries[oldEntries.length] = JavaScriptCore.newSourceEntry(projectPath); |
| jp.setRawIncludepath(newEntries, monitor); |
| } |
| configured = true; |
| } |
| catch (CoreException ex) { |
| Logger.logException(ex); |
| } |
| |
| if (configured && openProperties) { |
| showPropertiesOn(project); |
| } |
| } |
| |
| private void install(final IProject project, final boolean openProperties) { |
| IProgressService service = null; |
| if (fPart != null) { |
| service = (IProgressService) fPart.getSite().getService(IProgressService.class); |
| } |
| if (service == null) { |
| doInstall(project, openProperties, null); |
| } |
| else { |
| IRunnableWithProgress runnable = new IRunnableWithProgress() { |
| public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { |
| doInstall(project, openProperties, monitor); |
| } |
| }; |
| try { |
| service.run(false, false, runnable); |
| } |
| catch (InvocationTargetException e) { |
| Logger.logException(e); |
| } |
| catch (InterruptedException e) { |
| Logger.logException(e); |
| } |
| } |
| } |
| |
| 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 (!JsWebNature.hasNature(project)) { |
| /* Doesn't have nature, do a full install. */ |
| install(project, i == fTarget.length - 1); |
| } |
| else { |
| /* |
| * Has nature, check for browser library on include path |
| * and setup if not found. |
| */ |
| IJavaScriptProject jp = JavaScriptCore.create(project); |
| IIncludePathEntry[] rawClasspath = null; |
| try { |
| rawClasspath = jp.getRawIncludepath(); |
| } |
| catch (JavaScriptModelException ex1) { |
| Logger.log(Logger.ERROR_DEBUG, null, ex1); |
| } |
| |
| boolean browserFound = false; |
| for (int k = 0; rawClasspath != null && !browserFound && k < rawClasspath.length; k++) { |
| if (rawClasspath[k].getPath().equals(JsWebNature.VIRTUAL_BROWSER_CLASSPATH)) { |
| browserFound = true; |
| } |
| } |
| if (!browserFound) { |
| install(project, false); |
| } |
| } |
| } |
| } |
| |
| } |
| |
| public void selectionChanged(IAction action, ISelection selection) { |
| if (selection instanceof IStructuredSelection) { |
| fTarget = ((IStructuredSelection) selection).toArray(); |
| } |
| else { |
| fTarget = null; |
| } |
| } |
| |
| public void setActivePart(IAction action, IWorkbenchPart targetPart) { |
| fPart = targetPart; |
| } |
| |
| private void showPropertiesOn(final IProject project) { |
| IExtension[] extensions = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.ui.propertyPages").getExtensions(); //$NON-NLS-1$ |
| final List pageIds = new ArrayList(8); |
| for (int i = 0; i < extensions.length; i++) { |
| if (extensions[i].getNamespaceIdentifier().startsWith("org.eclipse.wst.jsdt.")) { //$NON-NLS-1$ |
| IConfigurationElement[] configurationElements = extensions[i].getConfigurationElements(); |
| for (int j = 0; j < configurationElements.length; j++) { |
| if ("page".equals(configurationElements[j].getName())) { |
| pageIds.add(configurationElements[j].getAttribute("id")); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| Shell shell = (Shell) fPart.getAdapter(Shell.class); |
| if (shell == null) { |
| IWorkbenchWindow activeWorkbenchWindow = JsUIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(); |
| if (activeWorkbenchWindow != null) |
| shell = activeWorkbenchWindow.getShell(); |
| } |
| final Shell finalShell = shell; |
| if (finalShell != null) { |
| finalShell.getDisplay().asyncExec(new Runnable() { |
| public void run() { |
| PreferencesUtil.createPropertyDialogOn(finalShell, project, "org.eclipse.wst.jsdt.ui.propertyPages.BuildPathsPropertyPage", (String[]) pageIds.toArray(new String[pageIds.size()]), null).open(); //$NON-NLS-1$ |
| } |
| }); |
| } |
| } |
| } |