Differences
This shows you the differences between two versions of the page.
association_editor [2012/03/30 17:44] srdjan.lukovic created |
association_editor [2012/07/09 10:50] (current) srdjan.lukovic [GUI Code] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | This sample demonstrates distinctive feature, dynamically linking objects. | + | ====== Selection List ====== |
+ | |||
+ | **Selection List** is a [[SOLoist Sample Applications|SOLoist sample application]] that shows how persistent selections of a subset of objects linked over an association can be implemented by means of another (subsetting) association and the appropriate configuration of the //Element Component//. | ||
+ | |||
+ | The intention is to enable selection of a subset of //Bank Advisers// that are linked to a particular object of //Person// by checkboxes. | ||
+ | |||
+ | The particular object of //Person// whose //Bank Advisers// are shown in the list is fetched via a Service Access Point component. It provides the fetched object to its output pin that is wired to the input pin of the list box. | ||
+ | |||
+ | The list box is configured to render all objects linked to the slot //myBankAdvisers//, but to edit the (subsetting) slot //successfulAdvisers//. | ||
+ | |||
+ | This way, instead of using Boolean attributes as flags, a subsetting association is used to store the selection. The selection is inherently persistent. | ||
+ | |||
+ | ==== Live example ==== | ||
+ | |||
+ | [[http://soloistdemo.org/SampleApplications/associationeditor.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:associationeditor.png?250}}| | ||
+ | |||
+ | ===== UML Model ===== | ||
+ | {{associationeditor.png}} | ||
+ | |||
+ | ===== Business Logic Code ===== | ||
+ | None. | ||
+ | |||
+ | ===== GUI Code ===== | ||
+ | <code java> | ||
+ | package rs.sol.sampleapps; | ||
+ | |||
+ | import rs.sol.sampleapps.listener.ObjectSpaceInit; | ||
+ | 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.builtindomains.builtindatatypes.Text; | ||
+ | import rs.sol.soloist.server.builtindomains.common.ClassifierInstanceDescriptor; | ||
+ | import rs.sol.soloist.server.builtindomains.common.ElementDescriptor; | ||
+ | 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.GUIEdit; | ||
+ | import rs.sol.soloist.server.guiconfiguration.layout.TableLayoutData; | ||
+ | import rs.sol.soloist.server.guiconfiguration.nonvisualcompoments.GUIFindSingleInstanceSAPComponent; | ||
+ | import rs.sol.soloist.server.guiconfiguration.style.GUIContext; | ||
+ | import rs.sol.soloist.server.guiconfiguration.style.GUINavigatorFeature; | ||
+ | import rs.sol.soloist.server.guiconfiguration.style.GUIObjectSetting; | ||
+ | import rs.sol.soloist.server.guiconfiguration.style.GUIPictureFeature; | ||
+ | import rs.sol.soloist.server.guiconfiguration.style.GUITextFeature; | ||
+ | import rs.sol.soloist.server.server.SoloistServiceServlet; | ||
+ | |||
+ | public enum AssociationEditor implements Initializer{ | ||
+ | |||
+ | INSTANCE; | ||
+ | |||
+ | @Override | ||
+ | public void init() throws InitializerFailedException | ||
+ | { | ||
+ | GUIApplicationComponent page = new GUIApplicationComponent(); | ||
+ | page.setName("AssociationEditor"); | ||
+ | SoloistServiceServlet.registerApplication(page); | ||
+ | page.setContext(createContextAndStyles()); | ||
+ | |||
+ | GUIPanelComponent root = GUIPanelComponent.createFlow(page); | ||
+ | |||
+ | GUILabelComponent title = GUILabelComponent.create(root, "Association Editor"); | ||
+ | title.setStyle("titleStyle"); | ||
+ | |||
+ | GUIPanelComponent topPanel = GUIPanelComponent.createFlow(root); | ||
+ | topPanel.setStyle("topPanel"); | ||
+ | GUIPanelComponent table = GUIPanelComponent.createTable(topPanel); // panel with table layout | ||
+ | |||
+ | GUIFindSingleInstanceSAPComponent findJanneRoe = GUIFindSingleInstanceSAPComponent.create(table, | ||
+ | Person.FQ_TYPE_NAME, | ||
+ | Person.FQPropertyNames.desc, | ||
+ | (ClassifierInstanceDescriptor)ElementDescriptor.create(Text.fromString(ObjectSpaceInit.JANNE_ROE_IDENTIFIER))); | ||
+ | |||
+ | GUIEdit editList = GUIEdit.createList(table, Person.PROPERTIES.successfulAdvisers, Person.PROPERTIES.myBankAdvisers); | ||
+ | editList.setLayoutData(TableLayoutData.create(0, 0)); | ||
+ | GUIComponentBinding.create(findJanneRoe.opValue(), editList.ipElement()); | ||
+ | GUIComponentBinding.create(findJanneRoe.opValue(), editList.ipSlotValueElement()); | ||
+ | |||
+ | editList.setSize("250px", "200px"); | ||
+ | editList.setStyle("listEditor"); | ||
+ | } | ||
+ | |||
+ | private GUIContext createContextAndStyles() { | ||
+ | GUIContext context = new GUIContext(); | ||
+ | DefaultContextInit.getRoot().addContext(context); | ||
+ | |||
+ | GUIObjectSetting person = GUIObjectSetting.create(context, Person.CLASSIFIER); | ||
+ | GUITextFeature.createName(person, Person.PROPERTIES.name); | ||
+ | GUITextFeature.createFixedSeparator(person, ":"); | ||
+ | GUITextFeature.createDescription(person, Person.PROPERTIES.age); | ||
+ | GUIPictureFeature.createSmallIcon(person, "images/icons/person.png"); | ||
+ | GUINavigatorFeature.createSubnodes(person, Person.FQPropertyNames.accounts); | ||
+ | |||
+ | return context; | ||
+ | } | ||
+ | } | ||
+ | </code> |