====== Wizard ======
**Wizard** is a [[SOLoist Sample Applications|SOLoist sample application]] that demonstrates a classical wizard pattern. Introduces the dialog component (//GUIDialogComponent//).
==== Live example ====
[[http://soloistdemo.org/SampleApplications/wizard.html]]
|{{screen:wizard.png?250}}|
===== UML Model =====
None.
===== Business Logic Code =====
None.
===== GUI Code =====
package rs.sol.sampleapps.wizard;
import rs.sol.soloist.helpers.init.Initializer;
import rs.sol.soloist.helpers.init.InitializerFailedException;
import rs.sol.soloist.server.guiconfiguration.components.GUIApplicationComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIButtonComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIDialogComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUILabelComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent;
import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding;
import rs.sol.soloist.server.guiconfiguration.layout.FlowLayout;
import rs.sol.soloist.server.server.SoloistServiceServlet;
public enum WizardSample implements Initializer {
INSTANCE;
@Override
public void init() throws InitializerFailedException {
GUIApplicationComponent application = new GUIApplicationComponent();
application.setName("WizardSample");
SoloistServiceServlet.registerApplication(application);
GUIPanelComponent root = GUIPanelComponent.createFlow(application);
GUILabelComponent title = GUILabelComponent.create(root, "Wizard");
title.setStyle("titleStyle");
GUIPanelComponent topPanel = GUIPanelComponent.createFlow(root);
topPanel.setStyle("topPanel");
// background panel which is shown when wizard dialog pops up, aids visual effect
GUIPanelComponent blackScreen = GUIPanelComponent.createFlow(root);
blackScreen.setStyle("blackScreen");
GUIDialogComponent dialog = new GUIDialogComponent();
dialog.setModal(true);
application.addDialog(dialog);
dialog.setCaption("SOLoist Wizard");
GUIPanelComponent dialogPanel = GUIPanelComponent.createFlow(dialog);
dialogPanel.setStyle("dialogPanel");
Wizard wizard = new Wizard(dialogPanel, dialog, blackScreen);
// Panels which will be shown as steps in wizard
GUIPanelComponent p1 = new GUIPanelComponent();
p1.setLayout(new FlowLayout());
GUIPanelComponent p2 = new GUIPanelComponent();
p2.setLayout(new FlowLayout());
GUIPanelComponent p3 = new GUIPanelComponent();
p3.setLayout(new FlowLayout());
// The content can arbitrarily complex
GUILabelComponent.create(p1, "1/3").setStyle("largeText");
GUILabelComponent.create(p2, "2/3").setStyle("largeText");
GUILabelComponent.create(p3, "3/3").setStyle("largeText");
// Add pages to wizard in order
wizard.addPage(p1);
wizard.addPage(p2);
wizard.addPage(p3);
// Generate the wizard GUI
wizard.generate();
GUIButtonComponent cmdStart = GUIButtonComponent.create(topPanel, "Start wizard");
GUIComponentBinding.create(cmdStart.opClick(), wizard.getBufferDarkenBackground().ipSend());
GUIComponentBinding.create(cmdStart.opClick(), wizard.getFirstChild().ipShowInParent());
GUIComponentBinding.create(cmdStart.opClick(), wizard.getFirstButtonChild().ipShowInParent());
GUIComponentBinding.create(cmdStart.opClick(), dialog.ipShow());
GUIComponentBinding.create(cmdStart.opResult(), dialogPanel.ipRelay1());
GUIComponentBinding.create(cmdStart.opResult(), p1.ipRelay1());
GUIComponentBinding.create(cmdStart.opResult(), p2.ipRelay1());
GUIComponentBinding.create(cmdStart.opResult(), p3.ipRelay1());
}
}
package rs.sol.sampleapps.wizard;
import java.util.ArrayList;
import java.util.List;
import rs.sol.soloist.server.builtindomains.builtindatatypes.Text;
import rs.sol.soloist.server.guiconfiguration.components.GUIButtonComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIDeckComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIDialogComponent;
import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent;
import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding;
import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIBufferComponent;
public class Wizard {
private List pages = new ArrayList();
private GUIDeckComponent mainDeck;
private GUIDeckComponent buttonDeck;
private GUIDialogComponent dialog;
private GUIBufferComponent bufferSet;
private GUIBufferComponent bufferRemove;
private GUIPanelComponent blackScreen;
private GUIPanelComponent rootPanel;
public Wizard(GUIPanelComponent rootPanel, GUIDialogComponent dialog, GUIPanelComponent blackScreen) {
this.rootPanel = rootPanel;
this.dialog = dialog;
this.blackScreen = blackScreen;
}
public void addPage(GUIPanelComponent page) {
pages.add(page);
}
public void generate() {
bufferSet = GUIBufferComponent.create(rootPanel, false, Text.fromString("darkenBackground"));
bufferRemove = GUIBufferComponent.create(rootPanel, false, Text.fromString("darkenBackground"));
GUIComponentBinding.create(bufferSet.opOutput(), blackScreen.ipAddStyle());
GUIComponentBinding.create(bufferRemove.opOutput(), blackScreen.ipRemoveStyle());
GUIPanelComponent mainPanel = GUIPanelComponent.createFlow(rootPanel);
GUIPanelComponent btnPanel = GUIPanelComponent.createFlow(rootPanel);
mainDeck = GUIDeckComponent.create(mainPanel);
mainPanel.setStyle("wizardMain");
buttonDeck = GUIDeckComponent.create(btnPanel);
btnPanel.setStyle("wizardButtons");
for (int i = 0; i < pages.size(); i++) {
mainDeck.add(pages.get(i));
GUIPanelComponent.createFlow(buttonDeck);
}
for (int i = 0; i < pages.size(); i++) {
GUIPanelComponent buttonPanel = (GUIPanelComponent) buttonDeck.get(i);
GUIButtonComponent btnCancel = GUIButtonComponent.create(buttonPanel, "Cancel");
btnCancel.setStyle("cancelButton");
btnCancel.setConfirmationRequired(true);
btnCancel.setConfirmationMessage("Cancel?");
GUIComponentBinding.create(btnCancel.opClick(), dialog.ipHide());
GUIComponentBinding.create(btnCancel.opClick(), bufferRemove.ipSend());
if (i != 0) {
GUIButtonComponent btnPrev = GUIButtonComponent.create(buttonPanel, "< Back");
GUIComponentBinding.create(btnPrev.opClick(), mainDeck.get(i - 1).ipShow());
GUIComponentBinding.create(btnPrev.opClick(), buttonDeck.get(i - 1).ipShow());
btnPrev.setStyle("previousButton");
}
if (i == pages.size() - 1) {
GUIButtonComponent btnFinish = GUIButtonComponent.create(buttonPanel, "Finish");
btnFinish.setStyle("finishButton");
btnFinish.setConfirmationMessage("Finish?");
btnFinish.setConfirmationRequired(true);
GUIComponentBinding.create(btnFinish.opClick(), dialog.ipHide());
GUIComponentBinding.create(btnFinish.opClick(), bufferRemove.ipSend());
} else {
GUIButtonComponent btnNext = GUIButtonComponent.create(buttonPanel, "Next >");
btnNext.setStyle("nextButton");
GUIComponentBinding.create(btnNext.opClick(), mainDeck.get(i + 1).ipShow());
GUIComponentBinding.create(btnNext.opClick(), buttonDeck.get(i + 1).ipShow());
}
}
}
public GUIBufferComponent getBufferDarkenBackground() {
return bufferSet;
}
public GUIPanelComponent getFirstChild() {
return (GUIPanelComponent) mainDeck.get(0);
}
public GUIPanelComponent getFirstButtonChild() {
return (GUIPanelComponent) buttonDeck.get(0);
}
}