/** * Copyright 2010 the original author or authors. * * This file is part of Zksample2. http://zksample2.sourceforge.net/ * * Zksample2 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Zksample2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Zksample2. If not, see <http://www.gnu.org/licenses/gpl.html>. */ package de.forsthaus.webui.order; import java.io.Serializable; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.dao.DataAccessException; import org.zkoss.util.resource.Labels; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zul.Bandbox; import org.zkoss.zul.Button; import org.zkoss.zul.Decimalbox; import org.zkoss.zul.FieldComparator; import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox; import org.zkoss.zul.Listheader; import org.zkoss.zul.Listitem; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Paging; import org.zkoss.zul.SimpleConstraint; import org.zkoss.zul.Textbox; import org.zkoss.zul.Window; import com.trg.search.Filter; import de.forsthaus.UserWorkspace; import de.forsthaus.backend.model.Article; import de.forsthaus.backend.model.Customer; import de.forsthaus.backend.model.Order; import de.forsthaus.backend.model.Orderposition; import de.forsthaus.backend.service.BrancheService; import de.forsthaus.backend.service.CustomerService; import de.forsthaus.backend.service.OrderService; import de.forsthaus.backend.util.HibernateSearchObject; import de.forsthaus.webui.order.model.SearchArticleListModelItemRenderer; import de.forsthaus.webui.util.ButtonStatusCtrl; import de.forsthaus.webui.util.GFCBaseCtrl; import de.forsthaus.webui.util.MultiLineMessageBox; import de.forsthaus.webui.util.ZksampleMessageUtils; import de.forsthaus.webui.util.pagging.PagedListWrapper; /** * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * This is the controller class for the * /WEB-INF/pages/order/orderPositionDialog.zul file.<br> * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * * @changes 05/15/2009: sge Migrating the list models for paging. <br> * 07/24/2009: sge changes for clustering.<br> * 10/12/2009: sge changings in the saving routine.<br> * 11/07/2009: bbr changed to extending from GFCBaseCtrl<br> * (GenericForwardComposer) for spring-managed creation.<br> * * @author bbruhns * @author sgerth * */ public class OrderPositionDialogCtrl extends GFCBaseCtrl implements Serializable { private static final long serialVersionUID = -8352659530536077973L; private static final Logger logger = Logger.getLogger(OrderPositionDialogCtrl.class); private transient PagedListWrapper<Orderposition> plwOrderpositions; private transient PagedListWrapper<Article> plwArticles; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * All the components that are defined here and have a corresponding * component with the same 'id' in the zul-file are getting autowired by our * 'extends GFCBaseCtrl' GenericForwardComposer. * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ protected Window orderPositionDialogWindow; // autowired // input area protected Textbox artNr; // autowired protected Textbox artKurzbezeichnung; // autowired protected Decimalbox aupMenge; // autowired protected Decimalbox aupEinzelwert; // autowired protected Decimalbox aupGesamtwert; // autowired // bandbock searchArticle protected Bandbox bandbox_OrderPositionDialog_ArticleSearch; // autowired protected Textbox tb_OrderPosition_SearchArticlelNo; // autowired protected Textbox tb_OrderPosition_SearchArticleDesc; // autowired // listbox articlesearch in bandbox private transient int pageSizeArticleSearch; protected Paging paging_ListBoxArticleSearch; // autowired protected Listbox listBoxArticleSearch; // autowired protected Listheader listheader_ArticleSearch_artNr; // autowired protected Listheader listheader_ArticleSearch_artKurzbezeichnung; // autowired protected Listheader listheader_ArticleSearch_aupEinzelwert; // autowired // search bandbox customer protected Bandbox bbox_Orders_CustomerSearch; // autowired protected Textbox tb_Orders_SearchCustNo; // autowired protected Textbox tb_Orders_CustSearchMatchcode; // autowired protected Textbox tb_Orders_SearchCustName1; // autowired protected Textbox tb_Orders_SearchCustCity; // autowired // overhanded vars from parent controller private transient Listbox listBoxOrderOrderPositions; // overhanded private transient Order order; // overhanded private transient Orderposition orderposition; // overhanded private transient OrderDialogCtrl orderDialogCtrl; // overhanded private transient OrderListCtrl orderListCtrl; // overhanded // old value vars for edit mode. that we can check if something // on the values are edited since the last init. private transient String oldVar_artNr; private transient String oldVar_artKurzbezeichnung; private transient BigDecimal oldVar_aupMenge; private transient BigDecimal oldVar_aupEinzelwert; private transient BigDecimal oldVar_aupGesamtwert; private transient boolean validationOn; // Button controller for the CRUD buttons private transient final String btnCtroller_RightPrefix = "button_OrderPositionDialog_"; private transient ButtonStatusCtrl btnCtrl; protected Button btnNew; // autowire protected Button btnEdit; // autowire protected Button btnDelete; // autowire protected Button btnSave; // autowire protected Button btnCancel; // autowire protected Button btnClose; // autowire protected Button btnHelp; // autowire // ServiceDAOs / Domain Classes private transient Customer customer; private transient Article article; private transient OrderService orderService; private transient CustomerService customerService; private transient BrancheService brancheService; /** * default constructor.<br> */ public OrderPositionDialogCtrl() { super(); } /** * Before binding the data and calling the dialog window we check, if the * zul-file is called with a parameter for a selected user object in a Map. * * @param event * @throws Exception */ public void onCreate$orderPositionDialogWindow(Event event) throws Exception { /* set components visible dependent of the users rights */ doCheckRights(); // create the Button Controller. Disable not used buttons during working btnCtrl = new ButtonStatusCtrl(getUserWorkspace(), btnCtroller_RightPrefix, true, btnNew, btnEdit, btnDelete, btnSave, btnCancel, btnClose); // get the params map that are overhanded by creation. Map<String, Object> args = getCreationArgsMap(event); if (args.containsKey("order")) { order = (Order) args.get("order"); } else { setOrder(null); } if (args.containsKey("orderposition")) { orderposition = (Orderposition) args.get("orderposition"); setOrderposition(orderposition); // we must addionally check if there is NO order object in the // orderPosition, so its new. if (orderposition.getOrder() != null) { setOrder(this.order); setArticle(this.orderposition.getArticle()); setCustomer(this.order.getCustomer()); } } else { setOrderposition(null); } // we get the listBox Object for the offices list. So we have access // to it and can synchronize the shown data when we do insert, edit or // delete orderPositions here. if (args.containsKey("listBoxOrderOrderPositions")) { listBoxOrderOrderPositions = (Listbox) args.get("listBoxOrderOrderPositions"); } else { listBoxOrderOrderPositions = null; } if (args.containsKey("orderDialogCtrl")) { orderDialogCtrl = (OrderDialogCtrl) args.get("orderDialogCtrl"); } else { orderDialogCtrl = null; } if (args.containsKey("orderListCtrl")) { orderListCtrl = (OrderListCtrl) args.get("orderListCtrl"); } else { orderListCtrl = null; } setPageSizeArticleSearch(20); paging_ListBoxArticleSearch.setPageSize(getPageSizeArticleSearch()); paging_ListBoxArticleSearch.setDetailed(true); /* Sorting Comparator for search bandbox article list */ listheader_ArticleSearch_artNr.setSortAscending(new FieldComparator("artNr", true)); listheader_ArticleSearch_artNr.setSortDescending(new FieldComparator("artNr", true)); listheader_ArticleSearch_artKurzbezeichnung.setSortAscending(new FieldComparator("article.artKurzbezeichnung", true)); listheader_ArticleSearch_artKurzbezeichnung.setSortDescending(new FieldComparator("article.artKurzbezeichnung", true)); listBoxArticleSearch.setItemRenderer(new SearchArticleListModelItemRenderer()); doShowDialog(getOrderposition()); } /** * SetVisible for components by checking if there's a right for it. */ private void doCheckRights() { final UserWorkspace workspace = getUserWorkspace(); orderPositionDialogWindow.setVisible(workspace.isAllowed("orderPositionDialogWindow")); btnHelp.setVisible(workspace.isAllowed("button_OrderPositionDialog_btnHelp")); btnNew.setVisible(workspace.isAllowed("button_OrderPositionDialog_btnNew")); btnEdit.setVisible(workspace.isAllowed("button_OrderPositionDialog_btnEdit")); btnDelete.setVisible(workspace.isAllowed("button_OrderPositionDialog_btnDelete")); btnSave.setVisible(workspace.isAllowed("button_OrderPositionDialog_btnSave")); btnClose.setVisible(workspace.isAllowed("button_OrderPositionDialog_btnClose")); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++ Components events +++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * If we close the dialog window. <br> * * @param event * @throws Exception */ public void onClose$orderPositionDialogWindow(Event event) throws Exception { // logger.debug(event.toString()); doClose(); } /** * when the "save" button is clicked. <br> * * @param event * @throws InterruptedException */ public void onClick$btnSave(Event event) throws InterruptedException { // logger.debug(event.toString()); doSave(); } /** * when the "edit" button is clicked. <br> * * @param event */ public void onClick$btnEdit(Event event) { // logger.debug(event.toString()); doEdit(); } /** * when the "new" button is clicked. <br> * * @param event */ public void onClick$btnNew(Event event) { // logger.debug(event.toString()); doNew(); } /** * when the "delete" button is clicked. <br> * * @param event * @throws InterruptedException */ public void onClick$btnDelete(Event event) throws InterruptedException { // logger.debug(event.toString()); doDelete(); } /** * when the "cancel" button is clicked. <br> * * @param event */ public void onClick$btnCancel(Event event) { // logger.debug(event.toString()); doCancel(); } /** * when the "close" button is clicked. <br> * * @param event * @throws InterruptedException */ public void onClick$btnClose(Event event) throws InterruptedException { // logger.debug(event.toString()); try { doClose(); } catch (final Exception e) { // close anyway orderPositionDialogWindow.onClose(); // Messagebox.show(e.toString()); } } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++ GUI operations +++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Closes the dialog window. <br> * <br> * Before closing we check if there are unsaved changes in <br> * the components and ask the user if saving the modifications. <br> * */ private void doClose() throws Exception { if (isDataChanged()) { // Show a confirm box String msg = Labels.getLabel("message_Data_Modified_Save_Data_YesNo"); String title = Labels.getLabel("message.Information"); MultiLineMessageBox.doSetTemplate(); if (MultiLineMessageBox.show(msg, title, MultiLineMessageBox.YES | MultiLineMessageBox.NO, MultiLineMessageBox.QUESTION, true, new EventListener() { @Override public void onEvent(Event evt) { switch (((Integer) evt.getData()).intValue()) { case MultiLineMessageBox.YES: try { doSave(); } catch (final InterruptedException e) { throw new RuntimeException(e); } case MultiLineMessageBox.NO: break; // } } } ) == MultiLineMessageBox.YES) { } } orderPositionDialogWindow.onClose(); } /** * Cancel the actual operation. <br> * <br> * Resets to the original status.<br> * */ private void doCancel() { doResetInitValues(); aupMenge.setReadonly(true); aupEinzelwert.setReadonly(true); aupGesamtwert.setReadonly(true); btnCtrl.setInitEdit(); } /** * Writes the bean data to the components.<br> * * @param anOrderposition * Orderposition */ public void doWriteBeanToComponents(Orderposition anOrderposition) { artNr.setValue(anOrderposition.getArticle().getArtNr()); artKurzbezeichnung.setValue(anOrderposition.getArticle().getArtKurzbezeichnung()); aupMenge.setValue(anOrderposition.getAupMenge()); aupEinzelwert.setValue(anOrderposition.getAupEinzelwert()); aupGesamtwert.setValue(anOrderposition.getAupGesamtwert()); } /** * Writes the components values to the bean.<br> * * @param anOrderposition */ public void doWriteComponentsToBean(Orderposition anOrderposition) { Order anOrder = getOrder(); Article anArticle = getArticle(); anOrderposition.setOrder(anOrder); anOrderposition.setArticle(anArticle); anOrderposition.setAupMenge(aupMenge.getValue()); anOrderposition.setAupEinzelwert(aupEinzelwert.getValue()); anOrderposition.setAupGesamtwert(aupGesamtwert.getValue()); } /** * Opens the Dialog window modal. * * It checks if the dialog opens with a new or existing object and set the * readOnly mode accordingly. * * @param anOrderposition * @throws InterruptedException */ public void doShowDialog(Orderposition anOrderposition) throws InterruptedException { // if aBranche == null then we opened the Dialog without // args for a given entity, so we get a new Obj(). if (anOrderposition == null) { /** !!! DO NOT BREAK THE TIERS !!! */ // We don't create a new DomainObject() in the frontend. // We GET it from the backend. anOrderposition = getOrderService().getNewOrderposition(); } try { if (anOrderposition.getOrder() != null) { // fill the components with the data doWriteBeanToComponents(anOrderposition); } // set Readonly mode accordingly if the object is new or not. if (anOrderposition.isNew()) { btnCtrl.setInitNew(); doEdit(); } else { btnCtrl.setInitEdit(); doReadOnly(); } // stores the inital data for comparing if they are changed // during user action. doStoreInitValues(); orderPositionDialogWindow.doModal(); // open the dialog in // modal // mode } catch (final Exception e) { Messagebox.show(e.toString()); } } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++ helpers ++++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Stores the init values in mem vars. <br> */ private void doStoreInitValues() { oldVar_artNr = artNr.getValue(); oldVar_artKurzbezeichnung = artKurzbezeichnung.getValue(); oldVar_aupMenge = aupMenge.getValue(); oldVar_aupEinzelwert = aupEinzelwert.getValue(); oldVar_aupGesamtwert = aupGesamtwert.getValue(); } /** * Resets the init values from mem vars. <br> */ private void doResetInitValues() { artNr.setValue(oldVar_artNr); artKurzbezeichnung.setValue(oldVar_artKurzbezeichnung); aupMenge.setValue(oldVar_aupMenge); aupEinzelwert.setValue(oldVar_aupEinzelwert); aupGesamtwert.setValue(oldVar_aupGesamtwert); } /** * Calculates all necessary values new. */ private void doCalculate() { if (!(aupMenge.getValue() == null) && !(aupEinzelwert.getValue() == null)) { if (!aupMenge.getValue().equals(new BigDecimal(0)) && !aupEinzelwert.getValue().equals(new BigDecimal(0))) { BigDecimal count = aupMenge.getValue(); BigDecimal singlePrice = aupEinzelwert.getValue(); BigDecimal amount = count.multiply(singlePrice); aupGesamtwert.setValue(amount); } } } /** * Checks, if data are changed since the last call of <br> * doStoreInitData() . <br> * * @return true, if data are changed, otherwise false */ private boolean isDataChanged() { boolean changed = false; if (oldVar_artNr != artNr.getValue()) { changed = true; } if (oldVar_artKurzbezeichnung != artKurzbezeichnung.getValue()) { changed = true; } if (oldVar_aupMenge != aupMenge.getValue()) { changed = true; } if (oldVar_aupEinzelwert != aupEinzelwert.getValue()) { changed = true; } if (oldVar_aupGesamtwert != aupGesamtwert.getValue()) { changed = true; } return changed; } /** * Sets the Validation by setting the accordingly constraints to the fields. */ private void doSetValidation() { setValidationOn(true); artNr.setConstraint(new SimpleConstraint("NO EMPTY")); aupMenge.setConstraint("NO EMPTY, NO ZERO"); aupEinzelwert.setConstraint("NO EMPTY, NO ZERO"); aupGesamtwert.setConstraint("NO EMPTY, NO ZERO"); } /** * Disables the Validation by setting empty constraints. */ private void doRemoveValidation() { setValidationOn(false); artNr.setConstraint(""); aupMenge.setConstraint(""); aupEinzelwert.setConstraint(""); aupGesamtwert.setConstraint(""); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++++ crud operations +++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Deletes a orderPosition object from database.<br> * * @throws InterruptedException */ private void doDelete() throws InterruptedException { // Show a confirm box String msg = Labels.getLabel("message.Question.Are_you_sure_to_delete_this_record") + "\n\n --> " + this.orderposition.getArticle().getArtKurzbezeichnung(); String title = Labels.getLabel("message.Deleting.Record"); MultiLineMessageBox.doSetTemplate(); if (MultiLineMessageBox.show(msg, title, MultiLineMessageBox.YES | MultiLineMessageBox.NO, MultiLineMessageBox.QUESTION, true, new EventListener() { @Override public void onEvent(Event evt) { switch (((Integer) evt.getData()).intValue()) { case MultiLineMessageBox.YES: try { delete(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } case MultiLineMessageBox.NO: break; // } } // delete from database private void delete() throws InterruptedException { try { getOrderService().delete(orderposition); } catch (DataAccessException e) { ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString()); } // now synchronize the listBox in the parent zul-file final ListModelList lml = (ListModelList) listBoxOrderOrderPositions.getListModel(); // Check if the orderPosition object is new or updated // -1 means that the obj is not in the list, so it's // new. if (lml.indexOf(orderposition) == -1) { } else { lml.remove(lml.indexOf(orderposition)); } // +++++++ now synchronize the listBox in the parent // zul-file // +++ // Listbox listBoxOrderArticle = orderListCtrl.getListBoxOrderArticle(); // now synchronize the orderposition listBox ListModelList lml3 = (ListModelList) listBoxOrderArticle.getListModel(); // Check if the orderPosition object is new or updated // -1 means that the obj is not in the list, so it's // new. if (lml3.indexOf(orderposition) == -1) { } else { lml3.remove(lml3.indexOf(orderposition)); } orderPositionDialogWindow.onClose(); // close // the // dialog } } ) == MultiLineMessageBox.YES) { } } /** * Create a new orderPosition object. <br> */ private void doNew() { /** !!! DO NOT BREAK THE TIERS !!! */ // We don't create a new DomainObject() in the frontend. // We GET it from the backend. Orderposition anOrderposition = getOrderService().getNewOrderposition(); setOrderposition(anOrderposition); anOrderposition.setOrder(order); doClear(); // clear all commponents doEdit(); // edit mode btnCtrl.setBtnStatus_New(); // remember the old vars doStoreInitValues(); } /** * Set the components for edit mode. <br> */ private void doEdit() { // artNr + description are only be filled by searchBox artNr.setReadonly(true); artKurzbezeichnung.setReadonly(true); bandbox_OrderPositionDialog_ArticleSearch.setDisabled(false); aupMenge.setReadonly(false); aupEinzelwert.setReadonly(false); aupGesamtwert.setReadonly(false); btnCtrl.setBtnStatus_Edit(); // remember the old vars doStoreInitValues(); } /** * Set the components to ReadOnly. <br> */ public void doReadOnly() { // artNr + description are only be filled by searchBox artNr.setReadonly(true); artKurzbezeichnung.setReadonly(true); bandbox_OrderPositionDialog_ArticleSearch.setDisabled(true); aupMenge.setReadonly(true); aupEinzelwert.setReadonly(true); aupGesamtwert.setReadonly(true); } /** * Clears the components values. <br> */ public void doClear() { // remove validation, if there are a save before doRemoveValidation(); artNr.setValue(""); artKurzbezeichnung.setValue(""); bandbox_OrderPositionDialog_ArticleSearch.setValue(""); aupMenge.setValue(new BigDecimal(0)); aupEinzelwert.setValue(new BigDecimal(0)); aupGesamtwert.setValue(new BigDecimal(0)); } /** * Saves the components to table. <br> * * @throws InterruptedException */ public void doSave() throws InterruptedException { Orderposition anOrderposition = getOrderposition(); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // force validation, if on, than execute by component.getValue() // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (!isValidationOn()) { doSetValidation(); } artNr.getValue(); // additionally calculate new if (isDataChanged()) { doCalculate(); } // fill the objects with the components data doWriteComponentsToBean(anOrderposition); // save it to database try { getOrderService().saveOrUpdate(anOrderposition); } catch (DataAccessException e) { ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString()); // Reset to init values doResetInitValues(); doReadOnly(); btnCtrl.setBtnStatus_Save(); return; } /** Synchronize the listbox in the OrderDialog */ HibernateSearchObject<Orderposition> soOrderPosition = new HibernateSearchObject<Orderposition>(Orderposition.class, orderDialogCtrl.getPageSizeOrderPosition()); soOrderPosition.addFilter(new Filter("order", getOrder(), Filter.OP_EQUAL)); // deeper loading of a relation to prevent the lazy // loading problem. soOrderPosition.addFetch("article"); // Set the ListModel. getPlwOrderpositions().init(soOrderPosition, orderDialogCtrl.listBoxOrderOrderPositions, orderDialogCtrl.paging_ListBoxOrderOrderPositions); /** Synchronize the OrderList */ // Listbox listBoxOrderArticle = orderListCtrl.getListBoxOrderArticle(); // listBoxOrderArticle.setModel(orderDialogCtrl.listBoxOrderOrderPositions.getModel()); orderListCtrl.getListBoxOrderArticle().setModel(orderDialogCtrl.listBoxOrderOrderPositions.getModel()); // synchronize the TotalCount from the paging component orderListCtrl.paging_OrderArticleList.setTotalSize(orderDialogCtrl.paging_ListBoxOrderOrderPositions.getTotalSize()); doReadOnly(); btnCtrl.setBtnStatus_Save(); // init the old values vars new doStoreInitValues(); } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++ bandbox search Customer +++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// /** * when the "close" button is clicked. * * @param event */ public void onClick$bt_Orders_CustomerSearchClose(Event event) { // logger.debug(event.toString()); bbox_Orders_CustomerSearch.close(); } /** * when the "new" button is clicked. * * Calls the Customer dialog. * * @param event */ public void onClick$bt_Orders_CustomerNew(Event event) { // logger.debug(event.toString()); /** !!! DO NOT BREAK THE TIERS !!! */ // We don't create a new DomainObject() in the frontend. // We GET it from the backend. Customer aCustomer = getCustomerService().getNewCustomer(); aCustomer.setOffice(getUserWorkspace().getOffice()); // init // customer.setBranche(Workspace.getBranche()); // init // TODO get the init values from a setup configuration aCustomer.setBranche(getBrancheService().getBrancheById(new Integer(1033).longValue())); // init aCustomer.setKunMahnsperre(false); // init /* * We can call our Dialog zul-file with parameters. So we can call them * with a object of the selected item. For handed over these parameter * only a Map is accepted. So we put the object in a HashMap. */ HashMap<String, Object> map = new HashMap<String, Object>(); map.put("customer", aCustomer); /* * we can additionally handed over the listBox, so we have in the dialog * access to the listbox Listmodel. This is fine for syncronizing the * data in the customerListbox from the dialog when we do a delete, edit * or insert a customer. */ // call the zul-file with the parameters packed in a map Executions.createComponents("/WEB-INF/pages/customer/customerDialog.zul", null, map); } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++ bandbox search article +++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// /** * when the "close" button of the search bandbox is clicked. * * @param event */ public void onClick$button_bbox_ArticleSearch_Close(Event event) { // logger.debug(event.toString()); bandbox_OrderPositionDialog_ArticleSearch.close(); } /** * when the "search/filter" button is clicked. * * @param event */ public void onClick$button_bbox_ArticleSearch_Search(Event event) { // logger.debug(event.toString()); doSearchArticle(); } public void onOpen$bandbox_OrderPositionDialog_ArticleSearch(Event event) throws Exception { // logger.debug(event.toString()); // ++ create the searchObject and init sorting ++// // only in sample app init with all orders HibernateSearchObject<Article> soArticle = new HibernateSearchObject<Article>(Article.class, getPageSizeArticleSearch()); soArticle.addSort("artNr", false); // Set the ListModel. getPlwArticles().init(soArticle, listBoxArticleSearch, paging_ListBoxArticleSearch); } /** * Search/filter data for the filled out fields<br> * <br> * 1. Count how many textboxes are filled. <br> * 2. Create a map with the count entries. <br> * 3. Store the propertynames(must corresponds to the domain classes * properties) and values to the map. <br> * 4. Call the ServiceDAO method with the map as parameter. <br> */ private void doSearchArticle() { // ++ create the searchObject and init sorting ++// // only in sample app init with all orders HibernateSearchObject<Article> soArticle = new HibernateSearchObject<Article>(Article.class, getPageSizeArticleSearch()); soArticle.addSort("artNr", false); if (StringUtils.isNotEmpty(tb_OrderPosition_SearchArticlelNo.getValue())) { soArticle.addFilter(new Filter("artNr", "%" + tb_OrderPosition_SearchArticlelNo.getValue() + "%", Filter.OP_ILIKE)); } if (StringUtils.isNotEmpty(tb_OrderPosition_SearchArticleDesc.getValue())) { soArticle.addFilter(new Filter("artKurzbezeichnung", "%" + tb_OrderPosition_SearchArticleDesc.getValue() + "%", Filter.OP_ILIKE)); } // Set the ListModel. getPlwArticles().init(soArticle, listBoxArticleSearch, paging_ListBoxArticleSearch); } /** * when doubleClick on a item in the bandbox search list.<br> * <br> * Select the customer and search all orders for him. * * @param event */ public void onDoubleClickedArticleItem(Event event) { // logger.debug(event.toString()); // get the customer Listitem item = this.listBoxArticleSearch.getSelectedItem(); if (item != null) { // get and cast the selected object setArticle((Article) item.getAttribute("data")); artNr.setValue(article.getArtNr()); artKurzbezeichnung.setValue(article.getArtKurzbezeichnung()); aupEinzelwert.setValue(article.getArtPreis()); } // clear old stuff at end, because the NO EMPTY validation aupMenge.setValue(new BigDecimal(0)); aupGesamtwert.setValue(new BigDecimal(0)); // close the bandbox bandbox_OrderPositionDialog_ArticleSearch.close(); } /** * when click on button calculate. <br> * <br> * Calculate the count x singlePrice = amount * * @param event */ public void onClick$button_OrderPositionDialog_Calculate(Event event) { // logger.debug(event.toString()); doCalculate(); } /** * close the article search bandbox. <br> * * @param event */ public void onClick$btn_ArticleSearchClose(Event event) { // logger.debug(event.toString()); // close the bandbox bandbox_OrderPositionDialog_ArticleSearch.close(); } /** * when the "help" button is clicked. <br> * * @param event * @throws InterruptedException */ public void onClick$btnHelp(Event event) throws InterruptedException { // logger.debug(event.toString()); ZksampleMessageUtils.doShowNotImplementedMessage(); } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++++++ getter / setter +++++++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// public void setValidationOn(boolean validationOn) { this.validationOn = validationOn; } public boolean isValidationOn() { return this.validationOn; } public void setArticle(Article article) { this.article = article; } public Article getArticle() { return this.article; } public void setCustomer(Customer customer) { this.customer = customer; } public Customer getCustomer() { return this.customer; } public void setOrderService(OrderService orderService) { this.orderService = orderService; } public OrderService getOrderService() { return this.orderService; } public void setCustomerService(CustomerService customerService) { this.customerService = customerService; } public CustomerService getCustomerService() { return this.customerService; } public BrancheService getBrancheService() { return this.brancheService; } public void setBrancheService(BrancheService brancheService) { this.brancheService = brancheService; } public void setOrder(Order order) { this.order = order; } public Order getOrder() { return this.order; } public void setOrderposition(Orderposition orderposition) { this.orderposition = orderposition; } public Orderposition getOrderposition() { return this.orderposition; } public void setPageSizeArticleSearch(int pageSizeArticleSearch) { this.pageSizeArticleSearch = pageSizeArticleSearch; } public int getPageSizeArticleSearch() { return this.pageSizeArticleSearch; } public void setPlwOrderpositions(PagedListWrapper<Orderposition> plwOrderpositions) { this.plwOrderpositions = plwOrderpositions; } public PagedListWrapper<Orderposition> getPlwOrderpositions() { return this.plwOrderpositions; } public void setPlwArticles(PagedListWrapper<Article> plwArticles) { this.plwArticles = plwArticles; } public PagedListWrapper<Article> getPlwArticles() { return this.plwArticles; } }