diff --git a/msi.gama.core/src/msi/gama/common/interfaces/IGui.java b/msi.gama.core/src/msi/gama/common/interfaces/IGui.java index 587821cee7..d1b97b0b8f 100644 --- a/msi.gama.core/src/msi/gama/common/interfaces/IGui.java +++ b/msi.gama.core/src/msi/gama/common/interfaces/IGui.java @@ -27,6 +27,8 @@ import msi.gama.runtime.exceptions.GamaRuntimeException; import msi.gama.util.GamaFont; import msi.gama.util.GamaMapFactory; +import msi.gama.util.IList; +import msi.gama.util.IMap; import msi.gama.util.file.IFileMetaDataProvider; import msi.gaml.architecture.user.UserPanelStatement; import msi.gaml.statements.test.CompoundSummary; @@ -99,6 +101,8 @@ public interface IGui { Map openUserInputDialog(IScope scope, String title, List parameters, GamaFont font); + IList> openWizard(IScope scope, String title, IList> pages); + public Boolean openUserInputDialogConfirm(final IScope scope, final String title,final String message) ; diff --git a/msi.gama.core/src/msi/gama/runtime/HeadlessListener.java b/msi.gama.core/src/msi/gama/runtime/HeadlessListener.java index 9b3282afc0..d9f76e6e47 100644 --- a/msi.gama.core/src/msi/gama/runtime/HeadlessListener.java +++ b/msi.gama.core/src/msi/gama/runtime/HeadlessListener.java @@ -10,7 +10,6 @@ ********************************************************************************************************/ package msi.gama.runtime; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -23,6 +22,7 @@ import msi.gama.common.interfaces.IGamaView; import msi.gama.common.interfaces.IGamlLabelProvider; import msi.gama.common.interfaces.IGui; +import msi.gama.common.interfaces.IKeyword; import msi.gama.common.interfaces.IStatusDisplayer; import msi.gama.kernel.experiment.IExperimentPlan; import msi.gama.kernel.experiment.IParameter; @@ -39,7 +39,10 @@ import msi.gama.runtime.exceptions.GamaRuntimeException; import msi.gama.util.GamaColor; import msi.gama.util.GamaFont; +import msi.gama.util.GamaListFactory; import msi.gama.util.GamaMapFactory; +import msi.gama.util.IList; +import msi.gama.util.IMap; import msi.gama.util.file.IFileMetaDataProvider; import msi.gama.util.file.IGamaFileMetaData; import msi.gaml.architecture.user.UserPanelStatement; @@ -81,6 +84,24 @@ public Map openUserInputDialog(final IScope scope, final String }); return initialValues; } + @Override + public IList> openWizard(IScope scope, String title, IList> pages) { + final IList> initialValues = GamaListFactory.create(); + for (IMap l : pages) { + final IMap initialValuesPage = GamaMapFactory.create(); + initialValues.add(initialValuesPage); + IList ps = (IList) l.get(IKeyword.PARAMETERS); + if (ps != null) { + ps.forEach(p -> { + initialValuesPage.put(p.getName(), p.getInitialValue(scope)); + }); + } + + } + + return initialValues; + } + @Override public Boolean openUserInputDialogConfirm(final IScope scope, final String title,final String message) { diff --git a/msi.gama.core/src/msi/gaml/operators/System.java b/msi.gama.core/src/msi/gaml/operators/System.java index 8e54a57321..b66357f1ae 100644 --- a/msi.gama.core/src/msi/gaml/operators/System.java +++ b/msi.gama.core/src/msi/gaml/operators/System.java @@ -16,6 +16,7 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.eclipse.core.runtime.Platform; @@ -307,6 +308,30 @@ public static IMap userInput(final IScope scope, final String ti return GamaMapFactory.createWithoutCasting(Types.STRING, Types.NO_TYPE, scope.getGui().openUserInputDialog(scope, title, parameters,font)); } + + @operator ( + value = IKeyword.WIZARD, + category = { IOperatorCategory.SYSTEM, IOperatorCategory.USER_CONTROL }, + concept = {}) + @no_test + + public static IList> openWizard(final IScope scope, final String title, final IList> pages) { + return scope.getGui().openWizard(scope, title, pages); + } + + @operator ( + value = IKeyword.WIZARD_PAGE, + category = { IOperatorCategory.SYSTEM, IOperatorCategory.USER_CONTROL }, + concept = {}) + @no_test + public static IMap wizardPage(final String title, final String description,final IList parameters, final GamaFont font) { + IMap results = GamaMapFactory.create(); + results.put(IKeyword.TITLE, title); + results.put(IKeyword.DESCRIPTION, description); + results.put(IKeyword.PARAMETERS, parameters); + results.put(IKeyword.FONT, font); + return results; + } @operator ( value = IKeyword.USER_INPUT, diff --git a/ummisco.gama.annotations/src/msi/gama/common/interfaces/IKeyword.java b/ummisco.gama.annotations/src/msi/gama/common/interfaces/IKeyword.java index af9178e40f..b66d254b0d 100644 --- a/ummisco.gama.annotations/src/msi/gama/common/interfaces/IKeyword.java +++ b/ummisco.gama.annotations/src/msi/gama/common/interfaces/IKeyword.java @@ -414,6 +414,9 @@ public interface IKeyword { String TIME_SERIES = "time_series"; // hqnghi facet for // continuous Chart String TABLE = "table"; + + String DESCRIPTION = "description"; + String PARAMETERS = "parameters"; String TITLE = "title"; String TO = "to"; String TOPOLOGY = "topology"; @@ -432,6 +435,8 @@ public interface IKeyword { String USER_COMMAND = "user_command"; String USER_INPUT = "user_input"; String USER_CONFIRM = "user_confirm"; + String WIZARD = "wizard"; + String WIZARD_PAGE = "wizard_page"; String USER_ONLY = "user_only"; String USER_FIRST = "user_first"; String USER_LAST = "user_last"; diff --git a/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizard.java b/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizard.java new file mode 100644 index 0000000000..f361e46bdc --- /dev/null +++ b/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizard.java @@ -0,0 +1,51 @@ +package ummisco.gama.ui.parameters; + +import java.util.List; + +import org.eclipse.jface.wizard.Wizard; + +import msi.gama.util.GamaListFactory; +import msi.gama.util.IList; +import msi.gama.util.IMap; + + +public class GamaWizard extends Wizard{ + protected List pages; + protected String title; + + public GamaWizard(String title, List pages) { + super(); + this.title = title; + this.pages = pages; + setNeedsProgressMonitor(true); + } + + @Override + public String getWindowTitle() { + return title; + } + + public IList> getValues() { + IList> values = GamaListFactory.create(); + for(GamaWizardPage p : pages) { + System.out.println("page: " + p); + values.add(p.getValues()); + } + return values; + } + + @Override + public void addPages() { + for (GamaWizardPage p : pages) { + addPage(p); + } + } + + @Override + public boolean performFinish() { + return true; + } + + + +} diff --git a/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizardDialog.java b/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizardDialog.java new file mode 100644 index 0000000000..adfdc2c8bd --- /dev/null +++ b/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizardDialog.java @@ -0,0 +1,33 @@ +package ummisco.gama.ui.parameters; + + +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Shell; + +import msi.gama.util.IList; +import msi.gama.util.IMap; + +public class GamaWizardDialog extends WizardDialog{ + + GamaWizard wizard; + public GamaWizardDialog(Shell parentShell, GamaWizard newWizard) { + super(parentShell, newWizard); + this.wizard = newWizard; + } + + /*@Override + protected Point getInitialSize() { + final var p = super.getInitialSize(); + return new Point(p.x * 2, p.y); + } + + @Override + protected boolean isResizable() { + return true; + }*/ + + public IList> getValues() { + return wizard.getValues(); + } +} diff --git a/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizardPage.java b/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizardPage.java new file mode 100644 index 0000000000..860a2c24c4 --- /dev/null +++ b/ummisco.gama.ui.shared/src/ummisco/gama/ui/parameters/GamaWizardPage.java @@ -0,0 +1,60 @@ +package ummisco.gama.ui.parameters; + +import java.util.List; + +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; + +import msi.gama.kernel.experiment.IParameter; +import msi.gama.runtime.IScope; +import msi.gama.util.GamaFont; +import msi.gama.util.GamaMapFactory; +import msi.gama.util.IMap; +import ummisco.gama.ui.interfaces.EditorListener; + +public class GamaWizardPage extends WizardPage{ + + private final IMap values = GamaMapFactory.createUnordered(); + private final List parameters; + private final GamaFont font; + private final IScope scope; + + public GamaWizardPage(final IScope scope, final List parameters, + final String title, final String description, final GamaFont font) { + super(title); + setTitle(title); + setDescription(description); + this.scope = scope; + this.font = font; + this.parameters = parameters; + parameters.forEach(p -> { + values.put(p.getName(), p.getInitialValue(scope)); + }); + } + + @Override + public void createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + composite.setLayout(layout); + layout.numColumns = 2; + parameters.forEach(param -> { + final EditorListener listener = newValue -> { + param.setValue(scope, newValue); + values.put(param.getName(), newValue); + }; + EditorFactory.create(scope, composite, param, listener, false, false); + }); + composite.layout(); + setControl(composite); + } + + public IMap getValues() { + return values; + } + + + +} diff --git a/ummisco.gama.ui.shared/src/ummisco/gama/ui/utils/SwtGui.java b/ummisco.gama.ui.shared/src/ummisco/gama/ui/utils/SwtGui.java index 153060cf5e..b92d81488f 100644 --- a/ummisco.gama.ui.shared/src/ummisco/gama/ui/utils/SwtGui.java +++ b/ummisco.gama.ui.shared/src/ummisco/gama/ui/utils/SwtGui.java @@ -41,6 +41,7 @@ import msi.gama.common.interfaces.IGamaView.User; import msi.gama.common.interfaces.IGamlLabelProvider; import msi.gama.common.interfaces.IGui; +import msi.gama.common.interfaces.IKeyword; import msi.gama.common.interfaces.IRuntimeExceptionHandler; import msi.gama.common.interfaces.IStatusDisplayer; import msi.gama.common.preferences.GamaPreferences; @@ -62,7 +63,9 @@ import msi.gama.runtime.ISimulationStateProvider; import msi.gama.runtime.exceptions.GamaRuntimeException; import msi.gama.util.GamaFont; +import msi.gama.util.GamaListFactory; import msi.gama.util.GamaMapFactory; +import msi.gama.util.IList; import msi.gama.util.IMap; import msi.gama.util.file.IFileMetaDataProvider; import msi.gaml.architecture.user.UserPanelStatement; @@ -78,6 +81,9 @@ import ummisco.gama.ui.interfaces.ISpeedDisplayer; import ummisco.gama.ui.interfaces.IUserDialogFactory; import ummisco.gama.ui.parameters.EditorsDialog; +import ummisco.gama.ui.parameters.GamaWizard; +import ummisco.gama.ui.parameters.GamaWizardDialog; +import ummisco.gama.ui.parameters.GamaWizardPage; /** * Written by drogoul Modified on 6 mai 2011 @@ -280,6 +286,47 @@ public Map openUserInputDialog(final IScope scope, final String return result; } + @Override + public IList> openWizard(IScope scope, String title, IList> pages) { + final IList> result = GamaListFactory.create(); + final IList wizardPages = GamaListFactory.create(); + for (IMap l : pages) { + GamaFont f = (GamaFont) l.get(IKeyword.FONT); + String t = (String) l.get(IKeyword.TITLE); + String d = (String) l.get(IKeyword.DESCRIPTION); + List ps = (List) l.get(IKeyword.PARAMETERS); + + wizardPages.add(new GamaWizardPage(scope, ps,t,d, f)); + + } + + + WorkbenchHelper.run(() -> { + final GamaWizard wizard = new GamaWizard(title, wizardPages); + GamaWizardDialog wizardDialog = new GamaWizardDialog(WorkbenchHelper.getShell(),wizard); + if (wizardDialog.open() == Window.OK) { + result.addAll(wizardDialog.getValues()); + } + }); + return result; + } + + /*@Override + public Map openWizard(final IScope scope, final String title, + final List parameters, final GamaFont font) { + final IMap result = GamaMapFactory.createUnordered(); + for (final IParameter p : parameters) { + result.put(p.getName(), p.getInitialValue(scope)); + } + WorkbenchHelper.run(() -> { + final EditorsDialog dialog = new EditorsDialog(scope, WorkbenchHelper.getShell(), parameters, title, font); + if (dialog.open() == Window.OK) { + result.putAll(dialog.getValues()); + } + }); + return result; + }*/ + @Override public Boolean openUserInputDialogConfirm(final IScope scope, final String title,final String message) { final List result = new ArrayList<>();