/** * 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.calendar; import java.io.Serializable; import java.text.ParseException; import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.log4j.Logger; import org.springframework.security.core.context.SecurityContextHolder; import org.zkoss.calendar.Calendars; import org.zkoss.calendar.event.CalendarsEvent; import org.zkoss.calendar.impl.SimpleCalendarModel; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.Path; import org.zkoss.zk.ui.event.Event; import org.zkoss.zul.Borderlayout; import org.zkoss.zul.Button; import org.zkoss.zul.Div; import org.zkoss.zul.Intbox; import org.zkoss.zul.West; import org.zkoss.zul.Window; import de.forsthaus.backend.model.MyCalendarEvent; import de.forsthaus.backend.model.SecUser; import de.forsthaus.backend.service.MyCalendarEventService; import de.forsthaus.policy.model.UserImpl; import de.forsthaus.webui.calendar.model.CalendarDateFormatter; import de.forsthaus.webui.calendar.model.MySimpleCalendarEvent; import de.forsthaus.webui.util.GFCBaseCtrl; import de.forsthaus.webui.util.ZksampleMessageUtils; /** * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * Main controller for the calendar module.<br> * <br> * zul-file: /WEB-INF/pages/calendar/calendar.zul.<br> * <br> * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> * <br> * * @author bbruhns * @author sgerth */ public class CalendarMainCtrl extends GFCBaseCtrl implements Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(CalendarMainCtrl.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 windowCalendar; // autowired protected Borderlayout borderLayout_calendar; // autowired protected Div divCenter; // autowired protected Calendars cal; // autowired protected Button btn_Show1Day; // autowired protected Button btn_Show5Days; // autowired protected Button btn_ShowWeek; // autowired protected Button btn_Show2Weeks; // autowired protected Button btn_ShowMonth; // autowired private String btnOriginColor = "color: black; font-weight: normal;"; private String btnPressedColor = "color: red; font-weight: bold;"; private SimpleCalendarModel calModel; // ServiceDAOs / Domain Classes MyCalendarEventService calendarEventService; /** * default constructor.<br> */ public CalendarMainCtrl() { super(); } @Override public void doAfterCompose(Component window) throws Exception { super.doAfterCompose(window); setCal(cal); cal.setHflex("true"); cal.setWeekOfYear(true); // cal.setEventRender(render) cal.setDateFormatter(new CalendarDateFormatter()); /** * 1. Set an 'alias' for this composer name to access it in the * zul-file.<br> * 2. Set the parameter 'recurse' to 'false' to avoid problems with * managing more than one zul-file in one page. Otherwise it would be * overridden and can ends in curious error messages. */ this.self.setAttribute("controller", this, false); init(); } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // +++++++++++++++ Component Events ++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // /** * Automatically called method from zk. * * @param event * @throws Exception */ public void onCreate$windowCalendar(Event event) throws Exception { doFitSize(); } public void init() { // cal.addTimeZone("Mexico", "GMT-6"); // this.cal.addTimeZone("Germany", "GMT+1"); // this.cal.setTimeZone("Germany=GMT+1"); cal.setMold("default"); cal.setFirstDayOfWeek("monday"); cal.setDays(7); cal.setCurrentDate(new Date()); btn_Show1Day.setStyle(btnOriginColor); btn_Show5Days.setStyle(btnOriginColor); btn_ShowWeek.setStyle(btnPressedColor); btn_ShowWeek.focus(); btn_Show2Weeks.setStyle(btnOriginColor); btn_ShowMonth.setStyle(btnOriginColor); } /** * If the onEventCreate event is called. <br> * Loads the create event window. * * @param event */ public void onEventCreate$cal(CalendarsEvent event) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("calendarController", this); map.put("calendarsEvent", event); try { Executions.createComponents("/WEB-INF/pages/calendar/cal_createEvent.zul", windowCalendar, map); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } /** * If the onEventUpdate event is called. <br> * Handles the resizing or movement of an calendarEvent. Saves the new data * to db. * * @param event */ public void onEventUpdate$cal(CalendarsEvent evt) { // SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/d"); // sdf1.setTimeZone(cal.getDefaultTimeZone()); int left = evt.getX(); int top = evt.getY(); if (top + 100 > evt.getDesktopHeight()) top = evt.getDesktopHeight() - 100; if (left + 330 > evt.getDesktopWidth()) left = evt.getDesktopWidth() - 330; SimpleCalendarModel m = (SimpleCalendarModel) cal.getModel(); MySimpleCalendarEvent sce = (MySimpleCalendarEvent) evt.getCalendarEvent(); sce.setBeginDate(evt.getBeginDate()); sce.setEndDate(evt.getEndDate()); // update the model // m.update(sce); <-- if activated, later an error occurs // prepare the backend Bean MyCalendarEvent calEvt = getCalendarEventService().getNewCalendarEvent(); calEvt.setId(sce.getId()); calEvt.setSecUser(sce.getUser()); calEvt.setVersion(sce.getVersion()); calEvt.setTitle(sce.getTitle()); calEvt.setContent(sce.getContent()); calEvt.setBeginDate(sce.getBeginDate()); calEvt.setEndDate(sce.getEndDate()); calEvt.setHeaderColor(sce.getHeaderColor()); calEvt.setContentColor(sce.getContentColor()); // Save the calendar event to database try { getCalendarEventService().saveOrUpdate(calEvt); } catch (Exception e) { e.printStackTrace(); } try { synchronizeModel(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * If the onEventEdit event is called. <br> * Loads the edit event window. * * @param event */ public void onEventEdit$cal(CalendarsEvent event) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("calendarController", this); map.put("calendarsEvent", event); try { Executions.createComponents("/WEB-INF/pages/calendar/cal_editEvent.zul", windowCalendar, map); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } /** * When the "help" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btnHelp(Event event) throws InterruptedException { doHelp(event); } /** * when the "refresh" button is clicked. <br> * <br> * * @param event * @throws InterruptedException * @throws ParseException */ public void onClick$btnRefresh(Event event) throws InterruptedException, ParseException { doFitSize(); } /** * when the "print calendar" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_Calendar_PrintCalendar(Event event) throws InterruptedException { ZksampleMessageUtils.doShowNotImplementedMessage(); } /** * when the "resize to full screen" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btnFullScreen(Event event) throws InterruptedException { doViewInFullScreen(event); } /** * when the "previous" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_Previous(Event event) throws InterruptedException { doShowPrevious(event); } /** * when the "next" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_Next(Event event) throws InterruptedException { doShowNext(event); } /** * when the "show 1 Day" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_Show1Day(Event event) throws InterruptedException { doShow1Day(event); } /** * when the "show 5 Day" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_Show5Days(Event event) throws InterruptedException { doShow5Days(event); } /** * when the "show week" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_ShowWeek(Event event) throws InterruptedException { doShowWeek(event); } /** * when the "show 2 weeks" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_Show2Weeks(Event event) throws InterruptedException { doShow2Weeks(event); } /** * when the "show month" button is clicked. * * @param event * @throws InterruptedException */ public void onClick$btn_ShowMonth(Event event) throws InterruptedException { doShowMonth(event); } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // +++++++++++++++++ Business Logic ++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // /** * Changes the view for full width screen mode by collapsing the west * borderlayout are, means the menu. * * @param event */ public void doViewInFullScreen(Event event) { final Borderlayout bl = ((Borderlayout) Path.getComponent("/outerIndexWindow/borderlayoutMain")); final West west = bl.getWest(); if (west != null) { try { if (west.isOpen()) { west.setOpen(false); } else west.setOpen(true); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } /** * Loads the PREVIOUS data for the given view mode. * * @param event * @throws InterruptedException */ public void doShowPrevious(Event event) throws InterruptedException { this.cal.previousPage(); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Loads the NEXT data for the given view mode. * * @param event * @throws InterruptedException */ public void doShowNext(Event event) throws InterruptedException { this.cal.nextPage(); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Changes the view for 1 day view. * * @param event * @throws InterruptedException */ public void doShow1Day(Event event) throws InterruptedException { this.cal.setMold("default"); btn_Show1Day.setStyle(btnPressedColor); btn_Show5Days.setStyle(btnOriginColor); btn_ShowWeek.setStyle(btnOriginColor); btn_Show2Weeks.setStyle(btnOriginColor); btn_ShowMonth.setStyle(btnOriginColor); this.cal.setDays(1); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Changes the view for 5 days view. * * @param event * @throws InterruptedException */ public void doShow5Days(Event event) throws InterruptedException { this.cal.setMold("default"); btn_Show1Day.setStyle(btnOriginColor); btn_Show5Days.setStyle(btnPressedColor); btn_ShowWeek.setStyle(btnOriginColor); btn_Show2Weeks.setStyle(btnOriginColor); btn_ShowMonth.setStyle(btnOriginColor); this.cal.setFirstDayOfWeek("monday"); this.cal.setDays(5); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Changes the view for 1 week view. * * @param event * @throws InterruptedException */ public void doShowWeek(Event event) throws InterruptedException { this.cal.setMold("default"); btn_Show1Day.setStyle(btnOriginColor); btn_Show5Days.setStyle(btnOriginColor); btn_ShowWeek.setStyle(btnPressedColor); btn_Show2Weeks.setStyle(btnOriginColor); btn_ShowMonth.setStyle(btnOriginColor); this.cal.setFirstDayOfWeek("monday"); this.cal.setDays(7); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Changes the view for 2 weeks view. * * @param event * @throws InterruptedException */ public void doShow2Weeks(Event event) throws InterruptedException { this.cal.setMold("default"); btn_Show1Day.setStyle(btnOriginColor); btn_Show5Days.setStyle(btnOriginColor); btn_ShowWeek.setStyle(btnOriginColor); btn_Show2Weeks.setStyle(btnPressedColor); btn_ShowMonth.setStyle(btnOriginColor); this.cal.setFirstDayOfWeek("monday"); this.cal.setDays(14); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Changes the view for month view. * * @param event * @throws InterruptedException */ public void doShowMonth(Event event) throws InterruptedException { this.cal.setMold("month"); btn_Show1Day.setStyle(btnOriginColor); btn_Show5Days.setStyle(btnOriginColor); btn_ShowWeek.setStyle(btnOriginColor); btn_Show2Weeks.setStyle(btnOriginColor); btn_ShowMonth.setStyle(btnPressedColor); try { synchronizeModel(); } catch (ParseException e) { e.printStackTrace(); } } /** * Opens the help screen for the current module. * * @param event * @throws InterruptedException */ private void doHelp(Event event) throws InterruptedException { ZksampleMessageUtils.doShowNotImplementedMessage(); // we stop the propagation of the event, because zk will call ALL events // with the same name in the namespace and 'btnHelp' is a standard // button in this application and can often appears. // Events.getRealOrigin((ForwardEvent) event).stopPropagation(); event.stopPropagation(); } public void synchronizeModel() throws ParseException { SimpleCalendarModel cm = null; MySimpleCalendarEvent sce = null; Date beginDate = cal.getBeginDate(); Date endDate = cal.getEndDate(); // first, delete old stuff cm = (SimpleCalendarModel) cal.getModel(); if (cm != null) { cm.clear(); } final SecUser user = ((UserImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getSecUser(); // List<MyCalendarEvent> list = // getCalendarEventService().getAllCalendarEvents(user.getId()); List<MyCalendarEvent> list = getCalendarEventService().getCalendarEventsFromToDate(beginDate, endDate, user.getId()); cm = new SimpleCalendarModel(); for (MyCalendarEvent myCalendarEvent : list) { sce = new MySimpleCalendarEvent(); sce.setId(myCalendarEvent.getId()); sce.setUser(myCalendarEvent.getSecUser()); sce.setVersion(myCalendarEvent.getVersion()); sce.setBeginDate(myCalendarEvent.getBeginDate()); sce.setContent(myCalendarEvent.getContent()); sce.setContentColor(myCalendarEvent.getContentColor()); sce.setEndDate(myCalendarEvent.getEndDate()); sce.setHeaderColor(myCalendarEvent.getHeaderColor()); sce.setLocked(myCalendarEvent.isLocked()); sce.setTitle(myCalendarEvent.getTitle()); cm.add(sce); } setCalModel(cm); cal.setModel(cm); cal.invalidate(); } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // ++++++++++++++++++++ Helpers ++++++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // /** * Recalculates the container size for this controller and resize them. * * Calculate how many rows have been place in the listbox. Get the * currentDesktopHeight from a hidden Intbox from the index.zul that are * filled by onClientInfo() in the indexCtroller. * * @throws ParseException */ public void doFitSize() throws ParseException { // normally 0 ! Or we have a i.e. a toolBar on top of the listBox. final int specialSize = 0; final int height = ((Intbox) Path.getComponent("/outerIndexWindow/currentDesktopHeight")).getValue().intValue(); final int maxListBoxHeight = height - specialSize - 119; // setCountRows((int) Math.round((maxListBoxHeight) / 17.7)); this.borderLayout_calendar.setHeight(String.valueOf(maxListBoxHeight) + "px"); synchronizeModel(); } // +++++++++++++++++++++++++++++++++++++++++++++++++ // // ++++++++++++++++ Setter/Getter ++++++++++++++++++ // // +++++++++++++++++++++++++++++++++++++++++++++++++ // public void setCalModel(SimpleCalendarModel calModel) { this.calModel = calModel; } public SimpleCalendarModel getCalModel() { return calModel; } public Calendars getCal() { return cal; } public void setCal(Calendars cal) { this.cal = cal; } public MyCalendarEventService getCalendarEventService() { return calendarEventService; } public void setCalendarEventService(MyCalendarEventService calendarEventService) { this.calendarEventService = calendarEventService; } }