| /******************************************************************************* |
| * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency |
| * 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: |
| * Pierre Allard, |
| * Regent L'Archeveque, |
| * Olivier L. Larouche - initial API and implementation |
| * |
| * SPDX-License-Identifier: EPL-1.0 |
| * |
| *******************************************************************************/ |
| package org.eclipse.apogy.core.invocator.ui.wizards; |
| |
| import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade; |
| import org.eclipse.apogy.common.emf.ui.composites.DescribedComposite; |
| import org.eclipse.apogy.common.emf.ui.composites.NamedComposite; |
| import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorFacade; |
| import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorPackage; |
| import org.eclipse.apogy.core.invocator.ProgramSettings; |
| import org.eclipse.apogy.core.invocator.ScriptBasedProgramsGroup; |
| import org.eclipse.apogy.core.invocator.ui.composites.NewScriptBasedProgramComposite; |
| import org.eclipse.emf.common.notify.Adapter; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.common.notify.impl.AdapterImpl; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.jface.dialogs.IDialogPage; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.wizard.WizardPage; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.DisposeEvent; |
| import org.eclipse.swt.events.DisposeListener; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| |
| public class NewScriptBasedProgramWizardPage extends WizardPage { |
| |
| private final static String WIZARD_PAGE_ID = "org.eclipse.apogy.core.invocator.ui.wizards.NewProgramWizardPage"; |
| private NewScriptBasedProgramComposite newProgramComposite; |
| private NamedComposite namedComposite; |
| private DescribedComposite describedComposite; |
| private Adapter adapter; |
| private ScriptBasedProgramsGroup programsGroup; |
| private EClass programSuperClass; |
| private EClass programsType; |
| private ProgramSettings programSettings; |
| |
| /** |
| * Constructor for the WizardPage. |
| * |
| * @param pageName |
| */ |
| public NewScriptBasedProgramWizardPage() { |
| super(WIZARD_PAGE_ID); |
| setTitle("New Program"); |
| setDescription("Select the programs's group and type."); |
| } |
| |
| public NewScriptBasedProgramWizardPage(ScriptBasedProgramsGroup programsGroup, EClass programSuperClass, |
| ProgramSettings programSettings) { |
| this(); |
| if (this.programsGroup != null) { |
| this.programsGroup.eAdapters().remove(getAdapter()); |
| } |
| if (this.programSuperClass != null) { |
| this.programSuperClass.eAdapters().remove(getAdapter()); |
| } |
| if (this.programSettings != null) { |
| this.programSettings.eAdapters().remove(getAdapter()); |
| } |
| |
| this.programSuperClass = programSuperClass; |
| programSuperClass.eAdapters().add(getAdapter()); |
| |
| this.programSettings = programSettings; |
| programSettings.eAdapters().add(getAdapter()); |
| |
| if (programsGroup != null) { |
| this.programsGroup = programsGroup; |
| programsGroup.eAdapters().add(getAdapter()); |
| } |
| } |
| |
| private Adapter getAdapter() { |
| if (this.adapter == null) { |
| this.adapter = new AdapterImpl() { |
| @Override |
| public void notifyChanged(Notification msg) { |
| validate(); |
| } |
| }; |
| } |
| return this.adapter; |
| } |
| |
| public EClass getProgramType() { |
| return this.programsType; |
| } |
| |
| public ScriptBasedProgramsGroup getScriptBasedProgramsGroup() { |
| return this.programsGroup; |
| } |
| |
| /** |
| * @see IDialogPage#createControl(Composite) |
| */ |
| @Override |
| public void createControl(Composite parent) { |
| Composite container = new Composite(parent, SWT.None); |
| container.setLayout(new GridLayout(2, false)); |
| container.addDisposeListener(new DisposeListener() { |
| @Override |
| public void widgetDisposed(DisposeEvent e) { |
| dispose(); |
| } |
| }); |
| |
| this.newProgramComposite = new NewScriptBasedProgramComposite(container, SWT.None); |
| this.newProgramComposite.setProgramSuperClass(this.programSuperClass); |
| this.newProgramComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 2)); |
| this.newProgramComposite.getTreeViewerGroups().addSelectionChangedListener(new ISelectionChangedListener() { |
| |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| if (NewScriptBasedProgramWizardPage.this.programsGroup != null) { |
| NewScriptBasedProgramWizardPage.this.programsGroup.eAdapters().remove(getAdapter()); |
| } |
| NewScriptBasedProgramWizardPage.this.programsGroup = (ScriptBasedProgramsGroup) ((StructuredSelection) event |
| .getSelection()).getFirstElement(); |
| if (NewScriptBasedProgramWizardPage.this.programsGroup != null) { |
| NewScriptBasedProgramWizardPage.this.programsGroup.eAdapters().add(getAdapter()); |
| } |
| |
| if (!NewScriptBasedProgramWizardPage.this.newProgramComposite.getTreeViewerTypes().getSelection() |
| .isEmpty()) { |
| NewScriptBasedProgramWizardPage.this.programSettings.setName(ApogyCommonEMFFacade.INSTANCE |
| .getDefaultName(NewScriptBasedProgramWizardPage.this.programsGroup, |
| EcoreUtil.create(NewScriptBasedProgramWizardPage.this.programsType), |
| ApogyCoreInvocatorPackage.Literals.PROGRAMS_GROUP__PROGRAMS)); |
| } |
| validate(); |
| } |
| }); |
| this.newProgramComposite.getTreeViewerTypes().addSelectionChangedListener(new ISelectionChangedListener() { |
| |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| if (NewScriptBasedProgramWizardPage.this.programsType != null) { |
| NewScriptBasedProgramWizardPage.this.programsType.eAdapters().remove(getAdapter()); |
| } |
| NewScriptBasedProgramWizardPage.this.programsType = (EClass) ((StructuredSelection) event |
| .getSelection()).getFirstElement(); |
| NewScriptBasedProgramWizardPage.this.programsType.eAdapters().add(getAdapter()); |
| NewScriptBasedProgramWizardPage.this.programSettings.setName( |
| ApogyCommonEMFFacade.INSTANCE.getDefaultName(NewScriptBasedProgramWizardPage.this.programsGroup, |
| EcoreUtil.create(NewScriptBasedProgramWizardPage.this.programsType), |
| ApogyCoreInvocatorPackage.Literals.PROGRAMS_GROUP__PROGRAMS)); |
| validate(); |
| } |
| }); |
| if (this.programsGroup != null) { |
| this.newProgramComposite.setProgramsList(this.programsGroup.getProgramsList(), this.programsGroup); |
| } else { |
| this.newProgramComposite.setProgramsList( |
| ApogyCoreInvocatorFacade.INSTANCE.getActiveInvocatorSession().getProgramsList(), null); |
| } |
| |
| this.namedComposite = new NamedComposite(container, SWT.NONE); |
| this.namedComposite.setNamed(this.programSettings); |
| this.namedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); |
| |
| this.describedComposite = new DescribedComposite(container, SWT.NONE); |
| this.describedComposite.setDescribed(this.programSettings); |
| this.describedComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); |
| |
| setControl(container); |
| |
| validate(); |
| } |
| |
| @Override |
| public void dispose() { |
| super.dispose(); |
| if (this.programsGroup != null) { |
| this.programsGroup.eAdapters().remove(getAdapter()); |
| } |
| if (this.programSuperClass != null) { |
| this.programSuperClass.eAdapters().remove(getAdapter()); |
| } |
| } |
| |
| /** |
| * This method is invoked to validate the content. |
| */ |
| protected void validate() { |
| String errorGroup = ""; |
| String errorType = ""; |
| String errorName = ""; |
| String infoDescription = ""; |
| |
| if (this.programsGroup == null) { |
| errorGroup = " <group>"; |
| } |
| if (this.programsType == null) { |
| errorType = " <type>"; |
| } |
| if (this.programSettings == null || this.programSettings.getName() == null) { |
| errorName = " <name>"; |
| } |
| if (this.programSettings == null || this.programSettings.getDescription() == null) { |
| infoDescription = "It is recommended to enter a description"; |
| } |
| |
| setMessage(infoDescription); |
| if (errorGroup != "" || errorType != "" || errorName != "") { |
| setErrorMessage(errorGroup + errorType + errorName + " must be provided"); |
| setPageComplete(false); |
| } else { |
| setErrorMessage(null); |
| setPageComplete(true); |
| } |
| } |
| |
| @Override |
| public void setPageComplete(boolean complete) { |
| super.setPageComplete(complete); |
| } |
| } |