| /******************************************************************************* |
| * Copyright (c) 2005, 2017 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 |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.ui.wizards; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.ListenerList; |
| import org.eclipse.dltk.core.IModelElement; |
| import org.eclipse.dltk.core.IScriptFolder; |
| import org.eclipse.dltk.core.ISourceModule; |
| import org.eclipse.dltk.core.ModelException; |
| import org.eclipse.dltk.core.environment.EnvironmentManager; |
| import org.eclipse.dltk.core.environment.IEnvironment; |
| import org.eclipse.dltk.internal.ui.editor.EditorUtility; |
| import org.eclipse.dltk.ui.DLTKUIPlugin; |
| import org.eclipse.dltk.utils.LazyExtensionManager; |
| import org.eclipse.dltk.utils.LazyExtensionManager.Descriptor; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.ui.PartInitException; |
| |
| public abstract class NewSourceModuleWizard extends NewElementWizard |
| implements ISourceModuleWizard { |
| |
| static class WizardExtensionManager |
| extends LazyExtensionManager<ISourceModuleWizardExtension> { |
| |
| static final String EXTENSION_POINT = DLTKUIPlugin.PLUGIN_ID |
| + ".sourceModuleWizardExtension"; //$NON-NLS-1$ |
| private final String nature; |
| |
| /** |
| * @param nature |
| */ |
| public WizardExtensionManager(String nature) { |
| super(EXTENSION_POINT); |
| this.nature = nature; |
| } |
| |
| private static final String ATTR_NATURE = "nature"; //$NON-NLS-1$ |
| |
| @Override |
| protected boolean isValidDescriptor( |
| Descriptor<ISourceModuleWizardExtension> descriptor) { |
| final String extensionNatureId = descriptor |
| .getAttribute(ATTR_NATURE); |
| return extensionNatureId == null |
| || this.nature.equals(extensionNatureId) |
| || extensionNatureId.equals("#"); //$NON-NLS-1$ |
| } |
| |
| } |
| |
| private NewSourceModulePage page; |
| |
| private ISourceModule module; |
| |
| protected abstract NewSourceModulePage createNewSourceModulePage(); |
| |
| private final List<ISourceModuleWizardExtension> extensions = new ArrayList<ISourceModuleWizardExtension>(); |
| |
| @Override |
| public void addPages() { |
| super.addPages(); |
| page = createNewSourceModulePage(); |
| createExtensions(); |
| page.init(getSelection()); |
| addPage(page); |
| } |
| |
| private void createExtensions() { |
| final WizardExtensionManager manager = new WizardExtensionManager( |
| page.getRequiredNature()); |
| for (Descriptor<ISourceModuleWizardExtension> descriptor : manager |
| .getDescriptors()) { |
| final ISourceModuleWizardExtension extension = descriptor.get(); |
| if (extension != null && extension.start(this)) { |
| extensions.add(extension); |
| } |
| } |
| } |
| |
| @Override |
| public void createPageControls(Composite pageContainer) { |
| for (ISourceModuleWizardExtension extension : extensions) { |
| extension.initialize(); |
| } |
| super.createPageControls(pageContainer); |
| created = true; |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| protected List<ISourceModuleWizardExtension> getExtensions() { |
| return Collections.unmodifiableList(extensions); |
| } |
| |
| @Override |
| public IModelElement getCreatedElement() { |
| return module; |
| } |
| |
| @Override |
| protected void finishPage(IProgressMonitor monitor) |
| throws InterruptedException, CoreException { |
| module = page.createFile(monitor); |
| } |
| |
| @Override |
| public boolean performFinish() { |
| final boolean result = super.performFinish(); |
| if (result && module != null) { |
| openSourceModule(module); |
| } |
| return result; |
| } |
| |
| protected void openSourceModule(final ISourceModule module) { |
| Display.getDefault().asyncExec(() -> { |
| try { |
| EditorUtility.openInEditor(module); |
| } catch (PartInitException e1) { |
| final String msg1 = NLS.bind( |
| Messages.NewSourceModuleWizard_errorInOpenInEditor, |
| module.getElementName()); |
| DLTKUIPlugin.logErrorMessage(msg1, e1); |
| } catch (ModelException e2) { |
| final String msg2 = NLS.bind( |
| Messages.NewSourceModuleWizard_errorInOpenInEditor, |
| module.getElementName()); |
| DLTKUIPlugin.logErrorMessage(msg2, e2); |
| } |
| }); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public IEnvironment getEnvironment() { |
| return EnvironmentManager.getEnvironment(getProject()); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public IProject getProject() { |
| return getFolder().getScriptProject().getProject(); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public IScriptFolder getFolder() { |
| return page.getScriptFolder(); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public String getFileName() { |
| return page.getFileName(); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void validate() { |
| page.handleFieldChanged(NewSourceModulePage.EXTENSIONS); |
| } |
| |
| private boolean created = false; |
| private String mode = null; |
| private Set<String> disabledModes = null; |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public String getMode() { |
| if (!created) { |
| return mode; |
| } else { |
| return page.getMode(); |
| } |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void setMode(String mode) { |
| if (!created) { |
| this.mode = mode; |
| } else { |
| page.setMode(mode); |
| } |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void enableMode(String mode, boolean enable) { |
| if (!created) { |
| if (enable) { |
| if (disabledModes != null) { |
| disabledModes.remove(mode); |
| } |
| } else { |
| if (disabledModes == null) { |
| disabledModes = new HashSet<String>(); |
| } |
| disabledModes.add(mode); |
| } |
| } else { |
| page.enableMode(mode, enable); |
| } |
| } |
| |
| boolean isModeEnabled(String mode) { |
| if (disabledModes == null) { |
| return true; |
| } |
| return !disabledModes.contains(mode); |
| } |
| |
| private Map<String, ListenerList<IFieldChangeListener>> listeners = null; |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void addFieldChangeListener(String field, |
| IFieldChangeListener listener) { |
| if (listeners == null) { |
| listeners = new HashMap<String, ListenerList<IFieldChangeListener>>(); |
| } |
| ListenerList<IFieldChangeListener> list = listeners.get(field); |
| if (list == null) { |
| list = new ListenerList<>(); |
| listeners.put(field, list); |
| } |
| list.add(listener); |
| } |
| |
| /** |
| * @since 2.0 |
| */ |
| @Override |
| public void removeFieldChangeListener(String field, |
| IFieldChangeListener listener) { |
| if (listeners != null) { |
| final ListenerList<IFieldChangeListener> list = listeners |
| .get(field); |
| if (list != null) { |
| list.remove(listener); |
| if (list.isEmpty()) { |
| listeners.remove(field); |
| } |
| } |
| } |
| } |
| |
| void fireFieldChange(String field) { |
| if (listeners != null) { |
| final ListenerList<IFieldChangeListener> list = listeners |
| .get(field); |
| if (list != null) { |
| for (IFieldChangeListener listener : list) { |
| if (listener instanceof IFieldChangeListener) { |
| listener.fieldChanged(); |
| } |
| } |
| } |
| } |
| } |
| |
| } |