blob: 86f9dc869ab69a03c08a0b31b1e838b6c45b3f79 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}