/** * 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.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.Path; 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.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.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.OrderSearchCustomerListModelItemRenderer; import de.forsthaus.webui.order.report.OrderDJReport; import de.forsthaus.webui.orderposition.model.OrderpositionListModelItemRenderer; 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/orderDialog.zul * file. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<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 OrderDialogCtrl extends GFCBaseCtrl implements Serializable { private static final long serialVersionUID = -8352659530536077973L; private static final Logger logger = Logger.getLogger(OrderDialogCtrl.class); private transient PagedListWrapper<Orderposition> plwOrderpositions; private transient PagedListWrapper<Customer> plwCustomers; /* * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * 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 orderDialogWindow; // autowired protected Textbox kunNr; // autowired protected Textbox kunName1; // autowired protected Textbox aufNr; // autowired protected Textbox aufBezeichnung; // autowired protected Paging paging_ListBoxOrderOrderPositions; // autowired protected Listbox listBoxOrderOrderPositions; // autowired protected Listheader listheader_OrderPosList2_Orderpos_No; // autowired protected Listheader listheader_OrderPosList2_Shorttext; // autowired protected Listheader listheader_OrderPosList2_Count; // autowired protected Listheader listheader_OrderPosList2_SinglePrice; // autowired protected Listheader listheader_OrderPosList2_WholePrice; // autowired // search components // bandbox for searchCustomer protected Bandbox bandbox_OrderDialog_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 protected Paging paging_OrderDialog_CustomerSearchList; // autowired protected Listbox listBoxCustomerSearch; // autowired protected Listheader listheader_CustNo_2; // autowired protected Listheader listheader_CustMatchcode_2; // autowired protected Listheader listheader_CustName1_2; // autowired protected Listheader listheader_CustCity_2; // autowired // not wired vars private transient Order order; // overhanded per param private transient Listbox listBoxOrder; // overhanded per param private transient OrderListCtrl orderListCtrl; // overhanded per param // 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_kunNr; private transient String oldVar_kunName1; private transient String oldVar_aufNr; private transient String oldVar_aufBezeichnung; private transient boolean validationOn; // Button controller for the CRUD buttons private transient final String btnCtroller_ClassPrefix = "button_OrderDialog_"; 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 protected Button button_OrderDialog_PrintOrder; // autowire protected Button button_OrderDialog_NewOrderPosition; // autowire private int pageSizeOrderPosition; private int pageSizeSearchCustomer; // ServiceDAOs / Domain Classes private transient Customer customer; private transient OrderService orderService; private transient CustomerService customerService; private transient BrancheService brancheService; /** * default constructor.<br> */ public OrderDialogCtrl() { 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$orderDialogWindow(Event event) throws Exception { setPageSizeOrderPosition(10); setPageSizeSearchCustomer(20); /* set components visible dependent of the users rights */ doCheckRights(); // create the Button Controller. Disable not used buttons during working btnCtrl = new ButtonStatusCtrl(getUserWorkspace(), btnCtroller_ClassPrefix, 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 anOrder = (Order) args.get("order"); setOrder(anOrder); // we must addionally check if there is NO customer object in // the order, so its new. if (anOrder.getCustomer() != null) { setCustomer(anOrder.getCustomer()); } } else { setOrder(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 offices here. if (args.containsKey("listBoxOrder")) { listBoxOrder = (Listbox) args.get("listBoxOrder"); } else { listBoxOrder = null; } if (args.containsKey("orderListCtrl")) { orderListCtrl = (OrderListCtrl) args.get("orderListCtrl"); } else { orderListCtrl = null; } // not used listheaders must be declared like -> // lh.setSortAscending(""); lh.setSortDescending("") listheader_OrderPosList2_Orderpos_No.setSortAscending(new FieldComparator("aupId", true)); listheader_OrderPosList2_Orderpos_No.setSortDescending(new FieldComparator("aupId", false)); listheader_OrderPosList2_Shorttext.setSortAscending(new FieldComparator("article.artKurzbezeichnung", true)); listheader_OrderPosList2_Shorttext.setSortDescending(new FieldComparator("article.artKurzbezeichnung", false)); listheader_OrderPosList2_Count.setSortAscending(new FieldComparator("aupMenge", true)); listheader_OrderPosList2_Count.setSortDescending(new FieldComparator("aupMenge", false)); listheader_OrderPosList2_SinglePrice.setSortAscending(new FieldComparator("aupEinzelwert", true)); listheader_OrderPosList2_SinglePrice.setSortDescending(new FieldComparator("aupEinzelwert", false)); listheader_OrderPosList2_WholePrice.setSortAscending(new FieldComparator("aupGesamtwert", true)); listheader_OrderPosList2_WholePrice.setSortDescending(new FieldComparator("aupGesamtwert", false)); paging_ListBoxOrderOrderPositions.setPageSize(pageSizeOrderPosition); paging_ListBoxOrderOrderPositions.setDetailed(true); // Set the ListModel for the orderPositions. if (getOrder() != null) { if (!getOrder().isNew()) { HibernateSearchObject<Orderposition> soOrderPosition = new HibernateSearchObject<Orderposition>(Orderposition.class, pageSizeOrderPosition); soOrderPosition.addFilter(new Filter("order", getOrder(), Filter.OP_EQUAL)); // deeper loading of the relation to prevent the lazy // loading problem. soOrderPosition.addFetch("article"); // Set the ListModel. getPlwOrderpositions().init(soOrderPosition, listBoxOrderOrderPositions, paging_ListBoxOrderOrderPositions); } } listBoxOrderOrderPositions.setItemRenderer(new OrderpositionListModelItemRenderer()); // set Field Properties doSetFieldProperties(); doShowDialog(getOrder()); } /** * SetVisible for components by checking if there's a right for it. */ private void doCheckRights() { final UserWorkspace workspace = getUserWorkspace(); orderDialogWindow.setVisible(workspace.isAllowed("orderDialogWindow")); btnHelp.setVisible(workspace.isAllowed("button_OrderDialog_btnHelp")); btnNew.setVisible(workspace.isAllowed("button_OrderDialog_btnNew")); btnEdit.setVisible(workspace.isAllowed("button_OrderDialog_btnEdit")); btnDelete.setVisible(workspace.isAllowed("button_OrderDialog_btnDelete")); btnSave.setVisible(workspace.isAllowed("button_OrderDialog_btnSave")); btnClose.setVisible(workspace.isAllowed("button_OrderDialog_btnClose")); button_OrderDialog_PrintOrder.setVisible(workspace.isAllowed("button_OrderDialog_PrintOrder")); button_OrderDialog_NewOrderPosition.setVisible(workspace.isAllowed("button_OrderDialog_NewOrderPosition")); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++ Components events +++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * If we close the dialog window. <br> * * @param event * @throws Exception */ public void onClose$orderDialogWindow(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 "help" button is clicked. <br> * * @param event * @throws InterruptedException */ public void onClick$btnHelp(Event event) throws InterruptedException { // logger.debug(event.toString()); ZksampleMessageUtils.doShowNotImplementedMessage(); } /** * 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 orderDialogWindow.onClose(); // Messagebox.show(e.toString()); } } /** * when 'print order' is clicked.<br> * * @param event * @throws InterruptedException */ public void onClick$button_OrderDialog_PrintOrder(Event event) throws InterruptedException { // logger.debug(event.toString()); // doPrintReport(); doPrintOrderReport(event); } private void doPrintOrderReport(Event event) throws InterruptedException { Order anOrder = getOrder(); if (anOrder == null || anOrder.isNew()) { ZksampleMessageUtils.showErrorMessage(Labels.getLabel("message.error.PleaseFirstCreateOrder")); return; } Window win = (Window) Path.getComponent("/outerIndexWindow"); try { new OrderDJReport(win, anOrder); } catch (final InterruptedException e) { ZksampleMessageUtils.showErrorMessage(e.toString()); } } /** * when the "new order position" button is clicked. * * @param event */ public void onClick$button_OrderDialog_NewOrderPosition(Event event) throws InterruptedException { // logger.debug(event.toString()); if (getOrder() == null || getOrder().isNew()) { ZksampleMessageUtils.showErrorMessage(Labels.getLabel("message.error.PleaseFirstCreateOrder")); doCancel(); return; } // create a new orderPosition object Orderposition anOrderposition = getOrderService().getNewOrderposition(); /* * 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("orderListCtrl", orderListCtrl); map.put("order", getOrder()); map.put("orderposition", anOrderposition); /* * 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. */ map.put("listBoxOrderOrderPositions", listBoxOrderOrderPositions); map.put("orderDialogCtrl", this); // call the zul-file with the parameters packed in a map try { Executions.createComponents("/WEB-INF/pages/order/orderPositionDialog.zul", null, map); } catch (final Exception e) { logger.error("onOpenWindow:: error opening window / " + e.getMessage()); // Show a error box String msg = e.getMessage(); String title = Labels.getLabel("message.Error"); MultiLineMessageBox.doSetTemplate(); MultiLineMessageBox.show(msg, title, MultiLineMessageBox.OK, "ERROR", true); } } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++ GUI operations +++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Cancel the actual operation. <br> * <br> * Resets to the original status.<br> * */ private void doCancel() { doResetInitValues(); doReadOnly(); btnCtrl.setInitEdit(); } /** * 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) { } } orderDialogWindow.onClose(); } /** * Opens the Dialog window modal. * * It checks if the dialog opens with a new or existing object and set the * readOnly mode accordingly. * * @param anOrder * @throws InterruptedException */ public void doShowDialog(Order anOrder) throws InterruptedException { // if anOrder == null then we opened the Dialog without // args for a given entity, so we get a new Obj(). if (anOrder == null) { /** !!! DO NOT BREAK THE TIERS !!! */ // We don't create a new DomainObject() in the frontend. // We GET it from the backend. anOrder = getOrderService().getNewOrder(); } // set Readonly mode accordingly if the object is new or not. if (anOrder.isNew()) { btnCtrl.setInitNew(); doEdit(); } else { btnCtrl.setInitEdit(); doReadOnly(); } try { // fill the components with the data if (anOrder.getCustomer() != null) { kunNr.setValue(anOrder.getCustomer().getKunNr()); String substr = anOrder.getCustomer().getKunName1() + " " + anOrder.getCustomer().getKunName2() + ", " + anOrder.getCustomer().getKunOrt(); substr = StringUtils.substring(substr, 0, 49); kunName1.setValue(substr); } aufNr.setValue(anOrder.getAufNr()); aufBezeichnung.setValue(anOrder.getAufBezeichnung()); // stores the inital data for comparing if they are changed // during user action. doStoreInitValues(); orderDialogWindow.doModal(); // open the dialog in modal mode } catch (final Exception e) { Messagebox.show(e.toString()); } } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++ helpers ++++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Set the properties of the fields, like maxLength.<br> */ private void doSetFieldProperties() { kunNr.setMaxlength(20); kunName1.setMaxlength(150); aufNr.setMaxlength(20); aufBezeichnung.setMaxlength(50); } /** * Stores the init values in mem vars. <br> */ private void doStoreInitValues() { oldVar_kunNr = kunNr.getValue(); oldVar_kunName1 = kunName1.getValue(); oldVar_aufNr = aufNr.getValue(); oldVar_aufBezeichnung = aufBezeichnung.getValue(); } /** * Resets the init values from mem vars. <br> */ private void doResetInitValues() { kunNr.setValue(oldVar_kunNr); kunName1.setValue(oldVar_kunName1); aufNr.setValue(oldVar_aufNr); aufBezeichnung.setValue(oldVar_aufBezeichnung); } /** * 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_kunNr != kunNr.getValue()) { changed = true; } if (oldVar_kunName1 != kunName1.getValue()) { changed = true; } if (oldVar_aufNr != aufNr.getValue()) { changed = true; } if (oldVar_aufBezeichnung != aufBezeichnung.getValue()) { changed = true; } return changed; } /** * Sets the Validation by setting the accordingly constraints to the fields. */ private void doSetValidation() { setValidationOn(true); kunNr.setConstraint(new SimpleConstraint("NO EMPTY")); kunName1.setConstraint("NO EMPTY"); aufNr.setConstraint("NO EMPTY"); aufBezeichnung.setConstraint("NO EMPTY"); } /** * Disables the Validation by setting empty constraints. */ private void doRemoveValidation() { setValidationOn(false); kunNr.setConstraint(""); kunName1.setConstraint(""); aufNr.setConstraint(""); aufBezeichnung.setConstraint(""); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++++ crud operations +++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Deletes a order object from database.<br> * * @throws InterruptedException */ private void doDelete() throws InterruptedException { final Order order = getOrder(); // Show a confirm box String msg = Labels.getLabel("message.Question.Are_you_sure_to_delete_this_record"); 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(order); } catch (DataAccessException e) { ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString()); } // now synchronize the listBox in the parent zul-file ListModelList lml = (ListModelList) listBoxOrder.getListModel(); // Check if the branch object is new or updated // -1 means that the obj is not in the list, so it's // new. if (lml.indexOf(order) == -1) { } else { lml.remove(lml.indexOf(order)); } orderDialogWindow.onClose(); // close // the // dialog } } ) == MultiLineMessageBox.YES) { } } /** * Create a new order 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. setOrder(getOrderService().getNewOrder()); doClear(); // clear all commponents doEdit(); // edit mode // btnCtrl.setBtnStatus_New(); btnCtrl.setInitNew(); // remember the old vars doStoreInitValues(); } /** * Set the components for edit mode. <br> */ private void doEdit() { // kunNr only be filled by searchBandBox kunNr.setDisabled(true); bandbox_OrderDialog_CustomerSearch.setDisabled(false); // kunName1.setReadonly(false); aufNr.setReadonly(false); aufBezeichnung.setReadonly(false); btnCtrl.setBtnStatus_Edit(); // remember the old vars doStoreInitValues(); } /** * Set the components to ReadOnly. <br> */ public void doReadOnly() { kunNr.setDisabled(true); bandbox_OrderDialog_CustomerSearch.setDisabled(true); kunName1.setReadonly(true); aufNr.setReadonly(true); aufBezeichnung.setReadonly(true); } /** * Clears the components values. <br> */ public void doClear() { // remove validation, if there are a save before doRemoveValidation(); kunNr.setValue(""); bandbox_OrderDialog_CustomerSearch.setValue(""); kunName1.setValue(""); aufNr.setValue(""); aufBezeichnung.setValue(""); // clear the listbox if data exists ListModelList lml = (ListModelList) this.listBoxOrderOrderPositions.getModel(); if (lml != null) lml.clear(); // doSetValidation(); } /** * Saves the components to table. <br> * * @throws InterruptedException */ public void doSave() throws InterruptedException { Order anOrder = getOrder(); Customer aCustomer = getCustomer(); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // force validation, if on, than execute by component.getValue() // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (!isValidationOn()) { doSetValidation(); } kunNr.getValue(); kunName1.getValue(); // bbox_Orders_CustomerSearch.getValue(); // fill the order object with the components data anOrder.setCustomer(aCustomer); anOrder.setAufNr(aufNr.getValue()); anOrder.setAufBezeichnung(aufBezeichnung.getValue()); // save it to database try { getOrderService().saveOrUpdate(anOrder); } catch (DataAccessException e) { ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString()); // Reset to init values doResetInitValues(); doReadOnly(); btnCtrl.setBtnStatus_Save(); return; } // now synchronize the offices listBox ListModelList lml = (ListModelList) listBoxOrder.getListModel(); // Check if the object is new or updated // -1 means that the object is not in the list, so its new. if (lml.indexOf(anOrder) == -1) { lml.add(anOrder); } else { lml.set(lml.indexOf(anOrder), anOrder); } // bind the vars new for updating the components // officeCtrl.doBindNew(); doReadOnly(); btnCtrl.setBtnStatus_Save(); // init the old values vars new doStoreInitValues(); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++ Order Positions operations ++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * when an item in the order positions list is double clicked. <br> * * @param event */ public void onDoubleClickedOrderPositionItem(Event event) throws InterruptedException { // logger.debug(event.toString()); // get the selected object Listitem item = listBoxOrderOrderPositions.getSelectedItem(); if (item != null) { // CAST AND STORE THE SELECTED OBJECT Orderposition anOrderposition = (Orderposition) item.getValue(); /* * 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("orderListCtrl", orderListCtrl); map.put("order", getOrder()); map.put("orderposition", anOrderposition); /* * 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. */ map.put("listBoxOrderOrderPositions", listBoxOrderOrderPositions); map.put("orderDialogCtrl", this); // call the zul-file with the parameters packed in a map try { Executions.createComponents("/WEB-INF/pages/order/orderPositionDialog.zul", null, map); } catch (final Exception e) { logger.error("onOpenWindow:: error opening window / " + e.getMessage()); // Show a error box String msg = e.getMessage(); String title = Labels.getLabel("message.Error"); MultiLineMessageBox.doSetTemplate(); MultiLineMessageBox.show(msg, title, MultiLineMessageBox.OK, "ERROR", true); } } } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++ bandbox search Customer +++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// /** * when the "close" button is clicked. * * @param event */ public void onClick$button_bbox_CustomerSearch_Close(Event event) { // logger.debug(event.toString()); bandbox_OrderDialog_CustomerSearch.close(); } /** * when the "new" button is clicked. * * Calls the Customer dialog. * * @param event */ public void onClick$button_bbox_CustomerSearch_NewCustomer(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 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); } /** * when the "search/filter" button in the bandbox is clicked. * * @param event */ public void onClick$button_bbox_CustomerSearch_Search(Event event) { // logger.debug(event.toString()); doSearch(); } public void onOpen$bandbox_OrderDialog_CustomerSearch(Event event) throws Exception { // logger.debug(event.toString()); // ++ create the searchObject and init sorting ++// HibernateSearchObject<Customer> soCustomer = new HibernateSearchObject<Customer>(Customer.class); soCustomer.addSort("kunName1", false); // set the paging params paging_OrderDialog_CustomerSearchList.setPageSize(pageSizeSearchCustomer); paging_OrderDialog_CustomerSearchList.setDetailed(true); // Set the ListModel. getPlwCustomers().init(soCustomer, listBoxCustomerSearch, paging_OrderDialog_CustomerSearchList); // set the itemRenderer listBoxCustomerSearch.setItemRenderer(new OrderSearchCustomerListModelItemRenderer()); } /** * Search/filter data for the filled out fields<br> * <br> * 1. Create a map with the count entries. <br> * 2. Store the propertynames and values to the map. <br> * 3. Call the ServiceDAO method with the map as parameter. <br> */ private void doSearch() { // ++ create the searchObject and init sorting ++// HibernateSearchObject<Customer> soCustomer = new HibernateSearchObject<Customer>(Customer.class); if (StringUtils.isNotEmpty(tb_Orders_SearchCustNo.getValue())) { soCustomer.addFilter(new Filter("kunNr", tb_Orders_SearchCustNo.getValue(), Filter.OP_EQUAL)); } if (StringUtils.isNotEmpty(tb_Orders_CustSearchMatchcode.getValue())) { soCustomer.addFilter(new Filter("kunMatchcode", "%" + tb_Orders_CustSearchMatchcode.getValue() + "%", Filter.OP_ILIKE)); } if (StringUtils.isNotEmpty(tb_Orders_SearchCustName1.getValue())) { soCustomer.addFilter(new Filter("kunName1", "%" + tb_Orders_SearchCustName1.getValue() + "%", Filter.OP_ILIKE)); } if (StringUtils.isNotEmpty(tb_Orders_SearchCustCity.getValue())) { soCustomer.addFilter(new Filter("kunOrt", "%" + tb_Orders_SearchCustCity.getValue() + "%", Filter.OP_ILIKE)); } soCustomer.addSort("kunName1", false); // set the paging params paging_OrderDialog_CustomerSearchList.setPageSize(pageSizeSearchCustomer); paging_OrderDialog_CustomerSearchList.setDetailed(true); // Set the ListModel. getPlwCustomers().init(soCustomer, listBoxCustomerSearch, paging_OrderDialog_CustomerSearchList); // set the itemRenderer listBoxCustomerSearch.setItemRenderer(new OrderSearchCustomerListModelItemRenderer()); } /** * when doubleClick on a item in the customerSearch listbox.<br> * <br> * Select the customer and search all orders for him. * * @param event */ public void onDoubleClickedCustomerItem(Event event) { // logger.debug(event.toString()); // get the customer Listitem item = listBoxCustomerSearch.getSelectedItem(); if (item != null) { Customer aCustomer = (Customer) item.getAttribute("data"); setCustomer(aCustomer); kunNr.setValue(getCustomer().getKunNr()); bandbox_OrderDialog_CustomerSearch.setValue(getCustomer().getKunNr()); kunName1.setValue(getCustomer().getKunName1() + " " + getCustomer().getKunName2() + ", " + getCustomer().getKunOrt()); } // close the bandbox bandbox_OrderDialog_CustomerSearch.close(); } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++++++ getter / setter +++++++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// public void setValidationOn(boolean validationOn) { this.validationOn = validationOn; } public boolean isValidationOn() { return this.validationOn; } 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 Order getOrder() { return this.order; } public void setOrder(Order order) { this.order = order; } public Listbox getListBoxOrderOrderPositions() { return this.listBoxOrderOrderPositions; } public void setListBoxOrderOrderPositions(Listbox listBoxOrderOrderPositions) { this.listBoxOrderOrderPositions = listBoxOrderOrderPositions; } public void setPlwOrderpositions(PagedListWrapper<Orderposition> plwOrderpositions) { this.plwOrderpositions = plwOrderpositions; } public PagedListWrapper<Orderposition> getPlwOrderpositions() { return this.plwOrderpositions; } public void setPlwCustomers(PagedListWrapper<Customer> plwCustomers) { this.plwCustomers = plwCustomers; } public PagedListWrapper<Customer> getPlwCustomers() { return this.plwCustomers; } public int getPageSizeOrderPosition() { return this.pageSizeOrderPosition; } public void setPageSizeOrderPosition(int pageSizeOrderPosition) { this.pageSizeOrderPosition = pageSizeOrderPosition; } public int getPageSizeSearchCustomer() { return this.pageSizeSearchCustomer; } public void setPageSizeSearchCustomer(int pageSizeSearchCustomer) { this.pageSizeSearchCustomer = pageSizeSearchCustomer; } }