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> |