Differences
This shows you the differences between two versions of the page.
|
bank_advisers [2012/04/02 11:32] srdjan.lukovic [Business Logic Code] |
bank_advisers [2012/07/09 10:51] (current) srdjan.lukovic [GUI Code] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Bank Advisers Sample ====== | + | ====== Bank Advisers ====== |
| - | ... | + | |
| + | **Bank Advisers** is a [[SOLoist Sample Applications|SOLoist sample application]] that combines several features presented in the previous examples, most notably [[Edit Person's Details|Edit Object Details]], [[Person Tables|Grids]], [[Persons and Bank Accounts|CRUD]], and [[Association Editor|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 ==== | ==== Live example ==== | ||
| Line 6: | Line 13: | ||
| [[http://soloistdemo.org/SampleApplications/bankadvisers.html]]\\ | [[http://soloistdemo.org/SampleApplications/bankadvisers.html]]\\ | ||
| [[http://soloistdemo.org/SampleApplications/oql?q=SELECT+b%2C+b.name%2C+b.gender%2C+b.age%2C+b.dateOfBirth%2C+b.height%2C+b.isMarried%2C+b.photo%2C+b.rootFolder%2C+b.bank%2C+b.myDepartment%0D%0AFROM+BankAdviser+b&f=html | OQL Query: Bank Advisers]] | [[http://soloistdemo.org/SampleApplications/oql?q=SELECT+b%2C+b.name%2C+b.gender%2C+b.age%2C+b.dateOfBirth%2C+b.height%2C+b.isMarried%2C+b.photo%2C+b.rootFolder%2C+b.bank%2C+b.myDepartment%0D%0AFROM+BankAdviser+b&f=html | OQL Query: Bank Advisers]] | ||
| + | |{{screen:bankadvisers.png?250}}| | ||
| ===== UML Model ===== | ===== UML Model ===== | ||
| Line 11: | Line 19: | ||
| ===== Business Logic Code ===== | ===== Business Logic Code ===== | ||
| - | <code java> | + | <code java FetchPersonsOnly.java> |
| - | //FetchPersonsOnly.java | + | |
| public void execute() | public void execute() | ||
| // -------------<SOL id="1a6091eb-09c4-4579-8d13-14cd0d54d44c:___throw__" /> | // -------------<SOL id="1a6091eb-09c4-4579-8d13-14cd0d54d44c:___throw__" /> | ||
| Line 36: | Line 43: | ||
| <code java> | <code java> | ||
| package rs.sol.sampleapps; | 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; | ||
| + | } | ||
| + | } | ||
| </code> | </code> | ||