Wizard

Wizard is a SOLoist sample application that demonstrates a classical wizard pattern. Introduces the dialog component (GUIDialogComponent).

Live example

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<GUIPanelComponent> pages = new ArrayList<GUIPanelComponent>();
	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);
	}
}
Print/export