/** * 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.guestbook; import java.io.Serializable; import java.util.Date; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.dao.DataAccessException; import org.springframework.security.access.annotation.Secured; import org.zkoss.util.resource.Labels; import org.zkoss.zk.ui.event.Event; import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zul.Button; import org.zkoss.zul.ListModelList; import org.zkoss.zul.Listbox; import org.zkoss.zul.Messagebox; import org.zkoss.zul.Textbox; import org.zkoss.zul.Window; import de.forsthaus.backend.model.GuestBook; import de.forsthaus.backend.service.GuestBookService; import de.forsthaus.webui.util.ButtonStatusCtrl; import de.forsthaus.webui.util.GFCBaseCtrl; import de.forsthaus.webui.util.MultiLineMessageBox; import de.forsthaus.webui.util.ZksampleMessageUtils; /** * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * This is the controller class for the * /WEB-INF/pages/guestbook/guestBookDialog.zul file.<br> * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * * @changes 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 GuestBookDialogCtrl extends GFCBaseCtrl implements Serializable { private static final long serialVersionUID = -546886879998950467L; private final static Logger logger = Logger.getLogger(GuestBookDialogCtrl.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 window_GuestBookDialog; // autowired protected Textbox textbox_gubUsrName; // autowired protected Textbox textbox_gubSubject; // autowired protected Textbox textbox_gubText; // autowired // overhanded vars per params private transient Listbox listbox_GuestBookList; // 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_gubUsrName; private transient String oldVar_gubSubject; private transient String oldVar_gubText; private transient boolean validationOn; // Button controller for the CRUD buttons private transient final String btnCtroller_ClassPrefix = "button_GuestBookDialog_"; 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 GuestBook guestBook; // overhanded per param private transient GuestBookService guestBookService; private GuestBookDialogCtrl guestBookDialogCtrl; /** * default constructor.<br> */ public GuestBookDialogCtrl() { super(); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++ Components events +++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * 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$window_GuestBookDialog(Event event) throws Exception { // create the Button Controller. Disable not used buttons during working btnCtrl = new ButtonStatusCtrl(getUserWorkspace(), btnCtroller_ClassPrefix, true, btnNew, btnEdit, btnDelete, btnSave, null, btnClose); /* set components visible dependent of the users rights */ doCheckRights(); // get the params map that are overhanded by creation. Map<String, Object> args = getCreationArgsMap(event); if (args.containsKey("guestBook")) { GuestBook guestBook = (GuestBook) args.get("guestBook"); setGuestBook(guestBook); } else { setGuestBook(null); } // we get the listBox Object for the branch list. So we have access // to it and can synchronize the shown data when we do insert, edit or // delete branches here. if (args.containsKey("listbox_GuestBookList")) { listbox_GuestBookList = (Listbox) args.get("listbox_GuestBookList"); } else { listbox_GuestBookList = null; } // set Field Properties doSetFieldProperties(); doShowDialog(getGuestBook()); } /** * If we close the dialog window. <br> * * @param event * @throws Exception */ public void onClose$window_GuestBookDialog(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 "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 "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 window_GuestBookDialog.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 { // logger.debug("--> DataIsChanged :" + isDataChanged()); 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, Messagebox.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) { } } window_GuestBookDialog.onClose(); } /** * Cancel the actual operation. <br> * <br> * Resets to the original status.<br> * */ private void doCancel() { doResetInitValues(); // manually settings btnSave.setVisible(false); btnClose.setVisible(true); } /** * Opens the Dialog window modal. * * It checks if the dialog opens with a new or existing object and set the * readOnly mode accordingly. * * @param aGuestBook * @throws InterruptedException */ public void doShowDialog(GuestBook aGuestBook) throws InterruptedException { // if aGuestBook == null then we opened the Dialog without // args for a given entity, so we get a new Obj(). if (aGuestBook == null) { /** !!! DO NOT BREAK THE TIERS !!! */ // We don't create a new DomainObject() in the frontend. // We GET it from the backend. aGuestBook = getguestBookService().getNewGuestBook(); aGuestBook.setGubDate(new Date()); setGuestBook(aGuestBook); } // set Readonly mode accordingly if the object is new or not. if (aGuestBook.isNew()) { // manually settings // btnCtrl.setInitNew(); doEdit(); } else { // manually settings btnSave.setVisible(false); doReadOnly(); } try { // fill the components with the data doWriteBeanToComponents(aGuestBook); // stores the inital data for comparing if they are changed // during user action. doStoreInitValues(); window_GuestBookDialog.doModal(); // open the dialog in modal // mode } catch (final Exception e) { Messagebox.show(e.toString()); } } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++ helpers ++++++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Writes the bean data to the components.<br> * * @param aGuestBook * GuestBook */ public void doWriteBeanToComponents(GuestBook aGuestBook) { textbox_gubUsrName.setValue(aGuestBook.getGubUsrname()); textbox_gubSubject.setValue(aGuestBook.getGubSubject()); textbox_gubText.setValue(aGuestBook.getGubText()); } /** * Writes the components values to the bean.<br> * * @param aGuestBook */ public void doWriteComponentsToBean(GuestBook aGuestBook) { aGuestBook.setGubUsrname(textbox_gubUsrName.getValue()); aGuestBook.setGubSubject(textbox_gubSubject.getValue()); aGuestBook.setGubText(textbox_gubText.getValue()); } /** * Set the properties of the fields, like maxLength.<br> */ private void doSetFieldProperties() { textbox_gubUsrName.setMaxlength(40); textbox_gubSubject.setMaxlength(40); textbox_gubText.setMaxlength(10000); } /** * SetVisible for components by checking if there's a right for it. */ private void doCheckRights() { // I'm tired. In the guestbook we set manually the rights window_GuestBookDialog.setVisible(true); btnCtrl.setSecurityActive(false); btnCtrl.setActive(false); btnHelp.setVisible(false); btnNew.setVisible(false); btnEdit.setVisible(false); btnDelete.setVisible(false); btnSave.setVisible(true); // btnCancel.setVisible(true); btnClose.setVisible(true); } /** * Stores the init values in mem vars. <br> */ private void doStoreInitValues() { oldVar_gubUsrName = textbox_gubUsrName.getValue(); oldVar_gubSubject = textbox_gubSubject.getValue(); oldVar_gubText = textbox_gubText.getValue(); } /** * Resets the init values from mem vars. <br> */ private void doResetInitValues() { textbox_gubUsrName.setValue(oldVar_gubUsrName); textbox_gubSubject.setValue(oldVar_gubSubject); textbox_gubText.setValue(oldVar_gubText); } /** * 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_gubUsrName != textbox_gubUsrName.getValue()) { changed = true; } if (oldVar_gubSubject != textbox_gubSubject.getValue()) { changed = true; } if (oldVar_gubText != textbox_gubText.getValue()) { changed = true; } return changed; } /** * Sets the Validation by setting the accordingly constraints to the fields. */ private void doSetValidation() { setValidationOn(true); textbox_gubUsrName.setConstraint("NO EMPTY"); textbox_gubSubject.setConstraint("NO EMPTY"); } /** * Disables the Validation by setting empty constraints. */ private void doRemoveValidation() { setValidationOn(false); textbox_gubUsrName.setConstraint(""); textbox_gubSubject.setConstraint(""); } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++++++ crud operations +++++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /** * Deletes a guestbook object from database.<br> * * @throws InterruptedException */ private void doDelete() throws InterruptedException { final GuestBook guestBook = getGuestBook(); // Show a confirm box String msg = Labels.getLabel("message.Question.Are_you_sure_to_delete_this_record") + "\n\n --> " + guestBook.getGubDate() + "/" + guestBook.getGubSubject(); String title = Labels.getLabel("message.Deleting.Record"); MultiLineMessageBox.doSetTemplate(); if (MultiLineMessageBox.show(msg, title, MultiLineMessageBox.YES | MultiLineMessageBox.NO, Messagebox.QUESTION, new EventListener() { @Override public void onEvent(Event evt) { switch (((Integer) evt.getData()).intValue()) { case MultiLineMessageBox.YES: try { deleteBranch(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } case MultiLineMessageBox.NO: break; // } } // delete from database private void deleteBranch() throws InterruptedException { try { getguestBookService().delete(guestBook); } catch (DataAccessException e) { ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString()); } // now synchronize the branches listBox final ListModelList lml = (ListModelList) listbox_GuestBookList.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(guestBook) == -1) { } else { lml.remove(lml.indexOf(guestBook)); } window_GuestBookDialog.onClose(); // close } // deleteBranch() } ) == MultiLineMessageBox.YES) { } } /** * Create a new guestbook 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. GuestBook aGuestBook = getguestBookService().getNewGuestBook(); // init with actual date aGuestBook.setGubDate(new Date()); setGuestBook(aGuestBook); doClear(); // clear all commponents doEdit(); // edit mode // manually settings // btnCtrl.setBtnStatus_New(); // remember the old vars doStoreInitValues(); } /** * Set the components for edit mode. <br> */ private void doEdit() { textbox_gubUsrName.setReadonly(false); textbox_gubSubject.setReadonly(false); textbox_gubText.setReadonly(false); // manually settings // btnCtrl.setBtnStatus_Edit(); // remember the old vars doStoreInitValues(); } /** * Set the components to ReadOnly. <br> */ public void doReadOnly() { textbox_gubUsrName.setReadonly(true); textbox_gubSubject.setReadonly(true); textbox_gubText.setReadonly(true); } /** * Clears the components values. <br> */ public void doClear() { // remove validation, if there are a save before doRemoveValidation(); textbox_gubUsrName.setValue(""); textbox_gubSubject.setValue(""); textbox_gubText.setValue(""); } /** * Saves the components to table. <br> * * @throws InterruptedException */ @Secured( { btnCtroller_ClassPrefix + "btnSave" }) public void doSave() throws InterruptedException { System.out.println("doSave"); GuestBook aGuestBook = getGuestBook(); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // force validation, if on, than execute by component.getValue() // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (!isValidationOn()) { doSetValidation(); } // fill the objects with the components data doWriteComponentsToBean(aGuestBook); // save it to database try { getguestBookService().saveOrUpdate(aGuestBook); } catch (DataAccessException e) { ZksampleMessageUtils.showErrorMessage(e.getMostSpecificCause().toString()); // Reset to init values doResetInitValues(); doReadOnly(); // manually settings // btnCtrl.setBtnStatus_Save(); btnSave.setVisible(false); // btnCancel.setVisible(false); btnClose.setVisible(true); return; } // now synchronize the branches listBox ListModelList lml = (ListModelList) this.listbox_GuestBookList.getListModel(); // Check if the branch object is new or updated // -1 means that the obj is not in the list, so its new. if (lml.indexOf(aGuestBook) == -1) { lml.add(aGuestBook); } else { lml.set(lml.indexOf(aGuestBook), aGuestBook); } doReadOnly(); // manually settings // btnCtrl.setBtnStatus_Save(); // init the old values vars new doStoreInitValues(); btnSave.setVisible(false); // btnCancel.setVisible(false); btnClose.setVisible(true); } // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// // ++++++++++++++++++ getter / setter +++++++++++++++++++// // ++++++++++++++++++++++++++++++++++++++++++++++++++++++// public GuestBook getGuestBook() { return this.guestBook; } public void setGuestBook(GuestBook guestBook) { this.guestBook = guestBook; } public void setValidationOn(boolean validationOn) { this.validationOn = validationOn; } public boolean isValidationOn() { return this.validationOn; } public GuestBookService getguestBookService() { return this.guestBookService; } public void setGuestBookService(GuestBookService guestBookService) { this.guestBookService = guestBookService; } public void setGuestBookDialogCtrl(GuestBookDialogCtrl guestBookDialogCtrl) { this.guestBookDialogCtrl = guestBookDialogCtrl; } public GuestBookDialogCtrl getGuestBookDialogCtrl() { return this.guestBookDialogCtrl; } }