Table of Contents
Bank Advisers
Bank Advisers is a SOLoist sample application that combines several features presented in the previous examples, most notably Edit Object Details, Grids, CRUD, and Selection List.
All objects of the class BankAdviser are shown in a grid. Attribute slots of these objects can be edited in the grid fields.
Objects of the class BankAdviser can be created or deleted with the command buttons.
Selecting one Bank Adviser from the grid will enable the checkbox editor in the Clients list. Ticking a checkbox next to a Person object in the list will make that person a client of the selected Bank Adviser.
Live example
UML Model
Business Logic Code
- FetchPersonsOnly.java
public void execute() // -------------<SOL id="1a6091eb-09c4-4579-8d13-14cd0d54d44c:___throw__" /> // -------------<LOS id="1a6091eb-09c4-4579-8d13-14cd0d54d44c:___throw__" /> { // ---------<SOL id="1a6091eb-09c4-4579-8d13-14cd0d54d44c:___body___" /> List<Person> allPersons = QueryUtils.getAllInstances(Person.CLASSIFIER); List<Person> justPersons = new ArrayList<Person>(); for (Person person : allPersons) { if (person instanceof BankAdviser) { continue; } justPersons.add(person); } fetchedPersons.set(justPersons); // ---------<LOS id="1a6091eb-09c4-4579-8d13-14cd0d54d44c:___body___" /> }
GUI Code
package rs.sol.sampleapps; import rs.sol.sampleapps.commands.FetchPersonsOnly; 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.builtincommands.CmdCreateObjectOfClass; import rs.sol.soloist.server.builtindomains.builtincommands.CmdDestroyObject; import rs.sol.soloist.server.guiconfiguration.components.GUIApplicationComponent; import rs.sol.soloist.server.guiconfiguration.components.GUIButtonComponent; import rs.sol.soloist.server.guiconfiguration.components.GUICommandComponent; import rs.sol.soloist.server.guiconfiguration.components.GUILabelComponent; import rs.sol.soloist.server.guiconfiguration.components.GUIPanelComponent; import rs.sol.soloist.server.guiconfiguration.components.PerformImmediately; import rs.sol.soloist.server.guiconfiguration.construction.GUIComponentBinding; import rs.sol.soloist.server.guiconfiguration.elementcomponents.GUIEdit; 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.guiconfiguration.style.GUIContext; 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 BankAdvisers implements Initializer{ INSTANCE; @Override public void init() throws InitializerFailedException { GUIApplicationComponent page = new GUIApplicationComponent(); page.setName("BankAdvisers"); SoloistServiceServlet.registerApplication(page); GUIContext context = createContextAndStyles(); page.setContext(context); GUIPanelComponent root = GUIPanelComponent.createFlow(page); GUILabelComponent title = GUILabelComponent.create(root, "Bank Advisers"); title.setStyle("titleStyle"); GUIPanelComponent topPanel = GUIPanelComponent.createFlow(root); topPanel.setStyle("topPanel"); GUIFindAllInstancesSAPComponent allBankAdvisers = GUIFindAllInstancesSAPComponent.create(root, BankAdviser.CLASSIFIER); // Column components GUIEdit nameEditor = GUIEdit.createField(null, Person.PROPERTIES.name); GUIEdit bankNameEditor = GUIEdit.createField(null, BankAdviser.PROPERTIES.bank); GUIEdit genderEditor = GUIEdit.createField(null, Person.PROPERTIES.gender); GUIEdit ageEditor = GUIEdit.createField(null, Person.PROPERTIES.age); GUIEdit isMarriedEditor = GUIEdit.createField(null, Person.PROPERTIES.isMarried); // Column header texts and oredering of column components GUIInput editableTable = GUIInput.createTable(topPanel, "Bank Adviser", "Name", "Bank Name", "Age", "Gender", "Is married"); editableTable.setColumnComponents(nameEditor, bankNameEditor, ageEditor, genderEditor, isMarriedEditor); editableTable.setMinRows(3); // min rows to show if there is no data in the table GUIComponentBinding.create(allBankAdvisers.opValue(), editableTable.ipCollection()); GUIPanelComponent buttonsPanel = GUIPanelComponent.createHorizontal(topPanel, VerticalAlignment.MIDDLE); buttonsPanel.setStyle("margin3"); CmdCreateObjectOfClass createCmd = new CmdCreateObjectOfClass(); createCmd.setClass(BankAdviser.CLASSIFIER); GUIButtonComponent createAdviserButton = GUIButtonComponent.create(buttonsPanel, "Create Bank Adviser", createCmd); CmdDestroyObject destroyCmd = new CmdDestroyObject(); destroyCmd.setType(BankAdviser.CLASSIFIER); GUIButtonComponent destroyAdviserButton = GUIButtonComponent.create(buttonsPanel, "Delete Bank Adviser", destroyCmd); GUIComponentBinding.create(editableTable.opValue(), destroyAdviserButton, CmdDestroyObject.PROPERTIES.input); GUIComponentBinding.create(createAdviserButton.opCommandExecuted(), allBankAdvisers.ipRefresh()); // this is to tell SAP to read advisers again GUIComponentBinding.create(destroyAdviserButton.opCommandExecuted(), allBankAdvisers.ipRefresh()); // this is to tell SAP to read advisers again GUILabelComponent clientsLabel = GUILabelComponent.create(topPanel, "Clients"); clientsLabel.setStyle("padding3"); GUIEdit clients = GUIEdit.createList(topPanel, BankAdviser.PROPERTIES.myClients); clients.setSize("250px", "300px"); clients.setStyle("listEditor"); // invisible command: fetches all persons, but not bank advisers GUICommandComponent allPersons = GUICommandComponent.create(root, new FetchPersonsOnly(), PerformImmediately.NOTHING); GUIComponentBinding.create(allPersons, FetchPersonsOnly.PROPERTIES.fetchedPersons, clients.ipCollection()); GUIComponentBinding.create(editableTable.opValue(), clients.ipElement()); GUIComponentBinding.create(page.opStart(), allPersons.ipClick()); } private GUIContext createContextAndStyles() { GUIContext context = new GUIContext(); DefaultContextInit.getRoot().addContext(context); // This is how Person objects will look like in the GUI. GUIObjectSetting person = GUIObjectSetting.create(context, Person.CLASSIFIER); GUITextFeature.createName(person, Person.PROPERTIES.name); GUIPictureFeature.createSmallIcon(person, "images/icons/person.png"); return context; } }