Differences
This shows you the differences between two versions of the page.
polymorphic [2012/03/31 21:31] srdjan.lukovic created |
polymorphic [2012/07/09 10:52] (current) srdjan.lukovic [GUI Code] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Polymorphic Sample ====== | + | ====== Polymorphic Form ====== |
- | This sample demonstrates how GUI can change depending on the class of selected object. | + | |
+ | **Polymorhpic Form** is a [[SOLoist Sample Applications|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 ==== | ==== Live example ==== | ||
- | [[http://soloistdemo.org/SampleApplications/submitperson.html]]\\ | + | [[http://soloistdemo.org/SampleApplications/polymorphic.html]]\\ |
+ | [[http://soloistdemo.org/SampleApplications/oql?q=SELECT+p%2C+p.name%2C+p.gender%2C+p.age%2C+p.dateOfBirth%2C+p.height%2C+p.isMarried%2C+p.photo%2C+p.rootFolder%0D%0AFROM+Person+p&f=html | OQL Query: Persons]] | ||
+ | |{{screen:polymorphic.png?250}}| | ||
===== UML Model ===== | ===== UML Model ===== | ||
{{polymorphic.png}} | {{polymorphic.png}} | ||
- | |||
===== Business Logic Code ===== | ===== Business Logic Code ===== | ||
- | <code java> | + | None. |
- | //... | + | |
- | </code> | + | |
===== GUI Code ===== | ===== GUI Code ===== | ||
<code java> | <code java> | ||
- | //... | + | 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; | ||
+ | } | ||
+ | } | ||
</code> | </code> |