/**
* 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.customer;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;
import com.trg.search.Filter;
import de.forsthaus.backend.model.Branche;
import de.forsthaus.backend.model.Customer;
import de.forsthaus.backend.service.BrancheService;
import de.forsthaus.backend.service.CustomerService;
import de.forsthaus.backend.util.HibernateSearchObject;
import de.forsthaus.webui.customer.model.CustomerBrancheListModelItemRenderer;
import de.forsthaus.webui.util.GFCBaseCtrl;
import de.forsthaus.webui.util.pagging.PagedListWrapper;
import de.forsthaus.webui.util.searching.SearchOperatorListModelItemRenderer;
import de.forsthaus.webui.util.searching.SearchOperators;
/**
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
* This is the controller class for the
* /WEB-INF/pages/customer/customerSearchDialog.zul file.<br>
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
*
* @changes 07/24/2009:sge changings for clustering.<br>
* 11/07/2009:bbr changed to extending from GFCBaseCtrl<br>
* (GenericForwardComposer) for spring-managed creation.<br>
* 03/18/2010:sge added a result counter next buttons.<br>
*
* @author bbruhns
* @author sgerth
*
*/
public class CustomerSearchCtrl extends GFCBaseCtrl implements Serializable {
private static final long serialVersionUID = -6320398861070378344L;
private final static Logger logger = Logger.getLogger(CustomerSearchCtrl.class);
/*
* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* 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 customerSearchWindow; // autowired
protected Listbox sortOperator_kunNr; // autowired
protected Textbox kunNr; // autowired
protected Listbox sortOperator_kunMatchcode; // autowired
protected Textbox kunMatchcode; // autowired
protected Listbox sortOperator_kunName1; // autowired
protected Textbox kunName1; // autowired
protected Listbox sortOperator_kunName2; // autowired
protected Textbox kunName2; // autowired
protected Listbox sortOperator_kunOrt; // autowired
protected Textbox kunOrt; // autowired
protected Listbox sortOperator_kunBranch; // autowired
protected Listbox kunBranche; // autowired
protected Label labelCustomerSearchResult; // autowired
// not auto wired vars
private transient CustomerListCtrl customerCtrl; // overhanded per param
private transient BrancheService brancheService;
private transient CustomerService customerService;
/**
* constructor
*/
public CustomerSearchCtrl() {
super();
}
/**
* @param event
* @throws Exception
*/
@SuppressWarnings("unchecked")
public void onCreate$customerSearchWindow(Event event) throws Exception {
// doOnCreateCommon(customerSearchWindow, event); // autowire the vars
// get the params map that are overhanded by creation.
Map<String, Object> args = getCreationArgsMap(event);
if (args.containsKey("customerCtrl")) {
customerCtrl = (CustomerListCtrl) args.get("customerCtrl");
} else {
customerCtrl = null;
}
// TODO chnagwed to ListPagedWrapper
// +++++++++++++++++++++++ DropDown ListBox ++++++++++++++++++++++ //
// set listModel and itemRenderer for the Branch dropdown listbox
kunBranche.setModel(new ListModelList(getBrancheService().getAllBranches()));
kunBranche.setItemRenderer(new CustomerBrancheListModelItemRenderer());
// +++++++++++++++++++++++ DropDown ListBox ++++++++++++++++++++++ //
// set listModel and itemRenderer for the search operator type listboxes
sortOperator_kunNr.setModel(new ListModelList(new SearchOperators().getAllOperators(), true));
sortOperator_kunNr.setItemRenderer(new SearchOperatorListModelItemRenderer());
sortOperator_kunMatchcode.setModel(new ListModelList(new SearchOperators().getAllOperators()));
sortOperator_kunMatchcode.setItemRenderer(new SearchOperatorListModelItemRenderer());
sortOperator_kunName1.setModel(new ListModelList(new SearchOperators().getAllOperators()));
sortOperator_kunName1.setItemRenderer(new SearchOperatorListModelItemRenderer());
sortOperator_kunName2.setModel(new ListModelList(new SearchOperators().getAllOperators()));
sortOperator_kunName2.setItemRenderer(new SearchOperatorListModelItemRenderer());
sortOperator_kunOrt.setModel(new ListModelList(new SearchOperators().getAllOperators()));
sortOperator_kunOrt.setItemRenderer(new SearchOperatorListModelItemRenderer());
sortOperator_kunBranch.setModel(new ListModelList(new SearchOperators().getAllOperators()));
sortOperator_kunBranch.setItemRenderer(new SearchOperatorListModelItemRenderer());
// ++++ Restore the search mask input definition ++++ //
// if exists a searchObject than show formerly inputs of filter values
if (args.containsKey("searchObject")) {
final HibernateSearchObject<Customer> searchObj = (HibernateSearchObject<Customer>) args.get("searchObject");
// get the filters from the searchObject
final List<Filter> ft = searchObj.getFilters();
for (final Filter filter : ft) {
// restore founded properties
if (filter.getProperty().equals("kunNr")) {
restoreOperator(sortOperator_kunNr, filter);
kunNr.setValue(filter.getValue().toString());
} else if (filter.getProperty().equals("kunMatchcode")) {
restoreOperator(sortOperator_kunMatchcode, filter);
kunMatchcode.setValue(filter.getValue().toString());
} else if (filter.getProperty().equals("kunName1")) {
restoreOperator(sortOperator_kunName1, filter);
kunName1.setValue(filter.getValue().toString());
} else if (filter.getProperty().equals("kunName2")) {
restoreOperator(sortOperator_kunName2, filter);
kunName2.setValue(filter.getValue().toString());
} else if (filter.getProperty().equals("kunOrt")) {
restoreOperator(sortOperator_kunOrt, filter);
kunOrt.setValue(filter.getValue().toString());
} else if (filter.getProperty().equals("branche")) {
restoreOperator(sortOperator_kunBranch, filter);
ListModelList lml = (ListModelList) this.kunBranche.getModel();
// get and select the customers branch
Branche branche = (Branche) filter.getValue();
kunBranche.setSelectedIndex(lml.indexOf(branche));
}
}
}
showCustomerSeekDialog();
}
/**
* Restore the operator sign in the operator listbox by comparing the <br>
* value of the filter. <br>
*
* @param listbox
* Listbox that shows the operator signs.
* @param filter
* Filter that corresponds to the operator listbox.
*/
private void restoreOperator(Listbox listbox, Filter filter) {
if (filter.getOperator() == Filter.OP_EQUAL) {
listbox.setSelectedIndex(1);
} else if (filter.getOperator() == Filter.OP_NOT_EQUAL) {
listbox.setSelectedIndex(2);
} else if (filter.getOperator() == Filter.OP_LESS_THAN) {
listbox.setSelectedIndex(3);
} else if (filter.getOperator() == Filter.OP_GREATER_THAN) {
listbox.setSelectedIndex(4);
} else if (filter.getOperator() == Filter.OP_LESS_OR_EQUAL) {
listbox.setSelectedIndex(5);
} else if (filter.getOperator() == Filter.OP_GREATER_OR_EQUAL) {
listbox.setSelectedIndex(6);
} else if (filter.getOperator() == Filter.OP_ILIKE) {
// Delete used '%' signs if the operator is like or iLike
String str = StringUtils.replaceChars(filter.getValue().toString(), "%", "");
filter.setValue(str);
listbox.setSelectedIndex(7);
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// +++++++++++++++++++++++ Components events +++++++++++++++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* when the "search/filter" button is clicked.
*
* @param event
*/
public void onClick$btnSearch(Event event) {
logger.debug(event.toString());
doSearch();
}
/**
* when the "close" button is clicked. <br>
*
* @param event
*/
public void onClick$btnClose(Event event) throws InterruptedException {
logger.debug(event.toString());
doClose();
}
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++ GUI operations +++++++++++++++++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* closes the dialog window
*/
private void doClose() {
customerSearchWindow.onClose();
}
/**
* Opens the SearchDialog window modal.
*/
private void showCustomerSeekDialog() throws InterruptedException {
try {
// open the dialog in modal mode
customerSearchWindow.doModal();
} catch (final Exception e) {
Messagebox.show(e.toString());
}
}
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++ GUI operations +++++++++++++++++++++++++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* Search/filter data for the filled out fields<br>
* <br>
* 1. Checks for each textbox if there are a value. <br>
* 2. Checks which operator is selected. <br>
* 3. Store the filter and value in the searchObject. <br>
* 4. Call the ServiceDAO method with searchObject as parameter. <br>
*/
@SuppressWarnings("unchecked")
public void doSearch() {
HibernateSearchObject<Customer> so = new HibernateSearchObject(Customer.class);
if (StringUtils.isNotEmpty(kunNr.getValue())) {
// get the search operator
Listitem item = this.sortOperator_kunNr.getSelectedItem();
if (item != null) {
int searchOpId = ((SearchOperators) item.getAttribute("data")).getSearchOperatorId();
if (searchOpId == Filter.OP_ILIKE) {
so.addFilter(new Filter("kunNr", "%" + kunNr.getValue().toUpperCase() + "%", searchOpId));
} else if (searchOpId == -1) {
// do nothing
} else {
so.addFilter(new Filter("kunNr", kunNr.getValue(), searchOpId));
}
}
}
if (StringUtils.isNotEmpty(kunMatchcode.getValue())) {
// get the search operator
Listitem item = sortOperator_kunMatchcode.getSelectedItem();
if (item != null) {
int searchOpId = ((SearchOperators) item.getAttribute("data")).getSearchOperatorId();
if (searchOpId == Filter.OP_ILIKE) {
so.addFilter(new Filter("kunMatchcode", "%" + kunMatchcode.getValue().toUpperCase() + "%", searchOpId));
} else if (searchOpId == -1) {
// do nothing
} else {
so.addFilter(new Filter("kunMatchcode", kunMatchcode.getValue(), searchOpId));
}
}
}
if (StringUtils.isNotEmpty(kunName1.getValue())) {
// get the search operator
Listitem item = sortOperator_kunName1.getSelectedItem();
if (item != null) {
int searchOpId = ((SearchOperators) item.getAttribute("data")).getSearchOperatorId();
if (searchOpId == Filter.OP_ILIKE) {
so.addFilter(new Filter("kunName1", "%" + kunName1.getValue().toUpperCase() + "%", searchOpId));
} else if (searchOpId == -1) {
// do nothing
} else {
so.addFilter(new Filter("kunName1", kunName1.getValue(), searchOpId));
}
}
}
if (StringUtils.isNotEmpty(this.kunName2.getValue())) {
// get the search operator
Listitem item = sortOperator_kunName2.getSelectedItem();
if (item != null) {
int searchOpId = ((SearchOperators) item.getAttribute("data")).getSearchOperatorId();
if (searchOpId == Filter.OP_ILIKE) {
so.addFilter(new Filter("kunName2", "%" + kunName2.getValue().toUpperCase() + "%", searchOpId));
} else if (searchOpId == -1) {
// do nothing
} else {
so.addFilter(new Filter("kunName2", kunName2.getValue(), searchOpId));
}
}
}
if (StringUtils.isNotEmpty(this.kunOrt.getValue())) {
// get the search operator
Listitem item = sortOperator_kunOrt.getSelectedItem();
if (item != null) {
int searchOpId = ((SearchOperators) item.getAttribute("data")).getSearchOperatorId();
if (searchOpId == Filter.OP_ILIKE) {
so.addFilter(new Filter("kunOrt", "%" + kunOrt.getValue().toUpperCase() + "%", searchOpId));
} else if (searchOpId == -1) {
// do nothing
} else {
so.addFilter(new Filter("kunOrt", kunOrt.getValue(), searchOpId));
}
}
}
if (this.kunBranche.getSelectedCount() > 0) {
// check if it the default empty item
Listitem itemB = kunBranche.getSelectedItem();
Branche branche = (Branche) itemB.getAttribute("data");
if (!StringUtils.isEmpty(branche.getBraBezeichnung())) {
// get the search operator
Listitem item = this.sortOperator_kunBranch.getSelectedItem();
if (item != null) {
int searchOpId = ((SearchOperators) item.getAttribute("data")).getSearchOperatorId();
if (searchOpId == Filter.OP_ILIKE) {
so.addFilter(new Filter("branche", branche, searchOpId));
} else if (searchOpId == -1) {
// do nothing
} else {
so.addFilter(new Filter("branche", branche, searchOpId));
}
}
}
}
if (logger.isDebugEnabled()) {
List<Filter> lf = so.getFilters();
for (Filter filter : lf) {
logger.debug(filter.getProperty().toString() + " / " + filter.getValue().toString());
if (Filter.OP_ILIKE == filter.getOperator()) {
logger.debug(filter.getOperator());
}
}
}
// store the searchObject for reReading
customerCtrl.setSearchObj(so);
Listbox listBox = customerCtrl.listBoxCustomer;
Paging paging = customerCtrl.pagingCustomerList;
int ps = customerCtrl.pagingCustomerList.getPageSize();
// set the model to the listbox with the initial resultset get by the
// DAO method.
((PagedListWrapper<Customer>) listBox.getModel()).init(so, listBox, paging);
labelCustomerSearchResult.setValue(Labels.getLabel("labelCustomerSearchResult.value") + " " + String.valueOf(paging.getTotalSize()));
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// ++++++++++++++++++ getter / setter +++++++++++++++++++//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++//
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;
}
}