====== Dynamic Panel ====== **Dynamic Panel** is a [[SOLoist Sample Applications|SOLoist sample application]] that demonstrates a panel with dynamic contents that are programmatically created by the backend UI code triggered from the client, using //GUIDynamicContentPanel//. Selecting an object of //Person// from the combo box will show its details on the right. The details will be bordered by a red or a blue line, depending on the gender of the selected person. In addition, the details will have some additional information if the selected person is a //Bank Adviser//. The backend processing that creates the contents of a dynamic panel is triggerred when the dynamic panel gets a new value on its input pin. ==== Live example ==== [[http://soloistdemo.org/SampleApplications/personcombo.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:dynamicpanel.png?250}}| ===== UML Model ===== {{personcombo.png}} ===== Business Logic Code ===== None. ===== GUI Code ===== package rs.sol.sampleapps; import rs.sol.sampleapps.gui.GUIPersonDetails; 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.GUILabelComponent; import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent; import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding; import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIInput; import rs.sol.soloist.server.guiconfiguration.layout.VerticalAlignment; import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIFindAllInstancesSAPComponent; import rs.sol.soloist.server.server.SoloistServiceServlet; public enum PersonCombo implements Initializer{ INSTANCE; @Override public void init() throws InitializerFailedException { GUIApplicationComponent page = new GUIApplicationComponent(); page.setName("PersonCombo"); SoloistServiceServlet.registerApplication(page); page.setContext(DefaultContextInit.getRoot()); GUIPanelComponent root = GUIPanelComponent.createFlow(page); GUILabelComponent title = GUILabelComponent.create(root, "Dynamic Panel"); title.setStyle("titleStyle"); GUIPanelComponent topPanel = GUIPanelComponent.createFlow(root); topPanel.setStyle("topPanel"); GUIPanelComponent horizontal = GUIPanelComponent.createHorizontal(topPanel, VerticalAlignment.TOP); GUILabelComponent.create(horizontal, "Choose person:").setStyle("margin3"); GUIFindAllInstancesSAPComponent allPersons = GUIFindAllInstancesSAPComponent.create(horizontal, Person.CLASSIFIER); GUIInput comboBox = GUIInput.createCombo(horizontal); GUIComponentBinding.create(allPersons.opValue(), comboBox.ipCollection()); GUIPersonDetails pd = new GUIPersonDetails(); horizontal.add(pd); GUIComponentBinding.create(comboBox.opValue(), pd.ipElement()); } } @Override protected GUIContainerComponent getDynamicContents(IElement el) { GUIPanelComponent rootPanel = GUIPanelComponent.createFlow(null); rootPanel.setStyle("person_details"); Person p = (Person) el; if (p == null) { GUILabelComponent.create(rootPanel, "No Persons selected."); return rootPanel; } GUIPanelComponent table = GUIPanelComponent.createTable(rootPanel); int row = 0; if (p instanceof BankAdviser) { GUILabelComponent.create(table, "Bank: ", row, 0); GUILabelComponent.create(table, Text.stringValue(((BankAdviser) p).bank), row++, 1); } GUILabelComponent.create(table, "Name: ", row, 0); GUILabelComponent.create(table, Text.stringValue(p.name), row++, 1); GUILabelComponent.create(table, "Is married? ", row, 0); GUILabelComponent.create(table, p.isMarried.val().toBoolean() ? "YES" : "NO", row++, 1); if (Gender.MALE.equals(p.gender.val())) { GUILabelComponent.create(table, "Age: ", row, 0); GUILabelComponent.create(table, p.age.val().toString(), row++, 1); table.setStyle("male"); } else { table.setStyle("female"); } return rootPanel; }