Table of Contents
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; } }