/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.ui.handlers; import java.io.IOException; import java.util.ArrayList; 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.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.handlers.HandlerUtil; import tern.EcmaVersion; import tern.eclipse.ide.core.IIDETernProject; import tern.eclipse.ide.core.TernCorePlugin; import tern.eclipse.ide.core.preferences.TernCorePreferenceConstants; import tern.eclipse.ide.internal.ui.Trace; import tern.eclipse.ide.ui.TernUIPlugin; import tern.eclipse.ide.ui.properties.TernModulesPropertyPage; import tern.server.ITernModule; import tern.utils.TernModuleHelper; /** * Abstract class to convert selected project to Tern project. * */ public abstract class AbstractConvertProjectCommandHandler extends AbstractHandler { private IPreferencesService fPreferenceService; public AbstractConvertProjectCommandHandler() { fPreferenceService = Platform.getPreferencesService(); } private void doInstall(IProject project, IProgressMonitor monitor, ExecutionEvent event) throws CoreException { // Get or create tern project. boolean force = !TernCorePlugin.hasTernNature(project); IIDETernProject ternProject = TernCorePlugin.getTernProject(project, force); IScopeContext[] context = new IScopeContext[] { InstanceScope.INSTANCE, DefaultScope.INSTANCE }; // Upate ECMAScript version EcmaVersion ecmaVersion = getEcmaVersion(context); ternProject.setEcmaVersion(ecmaVersion); // Update tern modules : JSON type definitions + plugins ITernModule modules[] = getModules(context); for (int i = 0; i < modules.length; i++) { TernModuleHelper.update(modules[i], ternProject); } showPropertiesOn(project, monitor, event); // save tern project if needed try { ternProject.save(); } catch (IOException e) { Trace.trace(Trace.SEVERE, "Error while configuring tern nature.", e); } } private void doUninstall(IProject project, IProgressMonitor monitor) { } public Object execute(final ExecutionEvent event) throws ExecutionException { final IProject project = getSelectedProject(event); if (project == null) { return null; } WorkspaceJob convertJob = new WorkspaceJob( getConvertingProjectJobTitle(project)) { public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { doInstall(project, monitor, event); return Status.OK_STATUS; } }; convertJob.setUser(true); convertJob.setRule(ResourcesPlugin.getWorkspace().getRoot()); convertJob.schedule(); return null; } private IProject getSelectedProject(ExecutionEvent event) { ISelection currentSelection = HandlerUtil.getCurrentSelection(event); if (currentSelection instanceof IStructuredSelection) { Object element = ((IStructuredSelection) currentSelection) .getFirstElement(); return (IProject) Platform.getAdapterManager().getAdapter(element, IProject.class); } return null; } private void showPropertiesOn(final IProject project, final IProgressMonitor monitor, final ExecutionEvent event) { IExtension[] extensions = Platform .getExtensionRegistry() .getExtensionPoint("org.eclipse.ui.propertyPages").getExtensions(); //$NON-NLS-1$ final List<String> pageIds = new ArrayList<String>(8); for (int i = 0; i < extensions.length; i++) { if (extensions[i].getNamespaceIdentifier().startsWith( "tern.eclipse.ide.ui")) { //$NON-NLS-1$ IConfigurationElement[] configurationElements = extensions[i] .getConfigurationElements(); for (int j = 0; j < configurationElements.length; j++) { if ("page".equals(configurationElements[j].getName())) { //$NON-NLS-1$ pageIds.add(configurationElements[j].getAttribute("id")); //$NON-NLS-1$ } } } } Shell shell = HandlerUtil.getActiveShell(event); if (shell == null) { IWorkbenchWindow activeWorkbenchWindow = TernUIPlugin.getDefault() .getWorkbench().getActiveWorkbenchWindow(); if (activeWorkbenchWindow != null) shell = activeWorkbenchWindow.getShell(); } final Shell finalShell = shell; if (finalShell != null) { finalShell.getDisplay().asyncExec(new Runnable() { public void run() { PreferenceDialog dialog = PreferencesUtil .createPropertyDialogOn( finalShell, project, TernModulesPropertyPage.PAGE_ID, (String[]) pageIds .toArray(new String[pageIds.size()]), null); //$NON-NLS-1$ if (dialog.open() == Window.CANCEL) { doUninstall(project, monitor); } } }); } } /** * Returns the preferences ecma version. * * @param context * @return the preferences ecma version. */ protected EcmaVersion getEcmaVersion(IScopeContext[] context) { int version = fPreferenceService.getInt(TernCorePlugin .getDefault().getBundle().getSymbolicName(), TernCorePreferenceConstants.DEFAULT_ECMA_VERSION, TernCorePreferenceConstants.DEFAULT_ECMA_VERSION_VALUE, context); return EcmaVersion.get(version); } /** * Returns the preferences list of tern modules. * @param context * @return the preferences list of tern modules. */ protected ITernModule[] getModules(IScopeContext[] context) { String moduleNames = fPreferenceService.getString(TernCorePlugin .getDefault().getBundle().getSymbolicName(), TernCorePreferenceConstants.DEFAULT_TERN_MODULES, TernCorePreferenceConstants.DEFAULT_TERN_MODULES_VALUE, context); return TernCorePlugin.getTernRepositoryManager().getTernModules( moduleNames, null); } protected abstract String getConvertingProjectJobTitle(IProject project); }