Polymorphic Form

Polymorhpic Form is a SOLoist sample application that demonstrates how a form can change depending on the type of the selected object that is provided on the form's input pin.

Selecting a Bank Adviser object (as a subkind of Person) from the combo box on the left will display a details form with an additional field Bank Name.

The implementation uses a GUIConformsToFilter component that selects one of the panels in a deck to show, according to the type of the object provided on its input pin.

Live example

UML Model

Business Logic Code

None.

GUI Code

package rs.sol.sampleapps;
 
import rs.sol.soloist.helpers.init.DefaultContextInit;
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.GUIDeckComponent;
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.elementcomponents.GUIEdit;
import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIElementComponent;
import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIInput;
import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIConformsToFilter;
import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIFindAllInstancesSAPComponent;
import rs.sol.soloist.server.server.SoloistServiceServlet;
 
public enum Polymorphic implements Initializer
{
	INSTANCE;
 
	@Override
	public void init() throws InitializerFailedException
	{
		GUIApplicationComponent page = new GUIApplicationComponent();
		page.setName("Polymorphic"); 
		SoloistServiceServlet.registerApplication(page);
		page.setContext(DefaultContextInit.getRoot());
 
		GUIPanelComponent root = GUIPanelComponent.createFlow(page);
 
		GUILabelComponent title = GUILabelComponent.create(root, "Polymorphic");
		title.setStyle("titleStyle");
 
		GUIPanelComponent topPanel = GUIPanelComponent.createFlow(root);
		topPanel.setStyle("topPanel");
 
		GUIPanelComponent wrap = GUIPanelComponent.createFlow(topPanel);
 
		GUILabelComponent.create(wrap, "Choose person:");
 
		GUIFindAllInstancesSAPComponent allPersons = GUIFindAllInstancesSAPComponent.create(wrap, Person.CLASSIFIER);
		GUIInput comboBox = GUIInput.createCombo(wrap);
		GUIComponentBinding.create(allPersons.opValue(), comboBox.ipCollection());
 
		GUIDeckComponent deck = GUIDeckComponent.create(wrap);
 
		GUIPanelComponent personDetailsTable = GUIPanelComponent.createTable(deck);
		createPersonsDetails(comboBox, personDetailsTable);
 
		GUIPanelComponent bankAdviserDetailsTable = GUIPanelComponent.createTable(deck);
		int row = createPersonsDetails(comboBox, bankAdviserDetailsTable);
		GUILabelComponent.create(bankAdviserDetailsTable, "Bank Name: ", row, 0);
		GUIEdit nameEditor = GUIEdit.createField(bankAdviserDetailsTable, BankAdviser.PROPERTIES.bank, row++, 1);
		GUIComponentBinding.create(comboBox.opValue(), nameEditor.ipElement());
 
		// Is the selected object an instance of the BankAdviser class?
		GUIConformsToFilter isItBankAdviser = GUIConformsToFilter.create(deck, BankAdviser.CLASSIFIER);
		GUIComponentBinding.create(comboBox.opValue(), isItBankAdviser.ipInput());
		GUIComponentBinding.create(isItBankAdviser.opYes(), bankAdviserDetailsTable.ipShow());
		GUIComponentBinding.create(isItBankAdviser.opNo(), personDetailsTable.ipShow());
	}
 
	private int createPersonsDetails(GUIElementComponent comboBox, GUIPanelComponent detailsTable) {
		int row = 0;
		GUILabelComponent.create(detailsTable, "Name: ", row, 0);
		GUIEdit nameEditor = GUIEdit.createField(detailsTable, Person.PROPERTIES.name, row++, 1);
 
		GUILabelComponent.create(detailsTable, "Gender: ", row, 0);
		GUIEdit genderEditor = GUIEdit.createField(detailsTable, Person.PROPERTIES.gender, row++, 1);
 
		GUILabelComponent.create(detailsTable, "Age: ", row, 0);
		GUIEdit ageEditor = GUIEdit.createField(detailsTable, Person.PROPERTIES.age, row++, 1);
 
		GUILabelComponent.create(detailsTable, "Date of birth: ", row, 0);
		GUIEdit dateOfBirthEditor = GUIEdit.createField(detailsTable, Person.PROPERTIES.dateOfBirth, row++, 1);
 
		GUILabelComponent.create(detailsTable, "Height [m]: ", row, 0);
		GUIEdit heightEditor = GUIEdit.createField(detailsTable, Person.PROPERTIES.height, row++, 1);
 
		GUILabelComponent.create(detailsTable, "Is married: ", row, 0);
		GUIEdit isMarriedEditor = GUIEdit.createField(detailsTable, Person.PROPERTIES.isMarried, row++, 1);
 
		GUIComponentBinding.create(comboBox.opValue(), nameEditor.ipElement());
		GUIComponentBinding.create(comboBox.opValue(), genderEditor.ipElement());
		GUIComponentBinding.create(comboBox.opValue(), ageEditor.ipElement());
		GUIComponentBinding.create(comboBox.opValue(), dateOfBirthEditor.ipElement());
		GUIComponentBinding.create(comboBox.opValue(), heightEditor.ipElement());
		GUIComponentBinding.create(comboBox.opValue(), isMarriedEditor.ipElement());
		return row;
	}
}
Print/export