import java.util.Iterator; import java.util.Map; import java.util.HashMap; import java.util.Date; import java.util.Calendar; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.TimeZone; import javax.faces.component.UIComponent; import javax.faces.event.FacesEvent; import javax.faces.event.AjaxBehaviorEvent; import org.primefaces.util.Constants; import org.primefaces.event.SelectEvent; import org.primefaces.event.ScheduleEntryMoveEvent; import org.primefaces.event.ScheduleEntryResizeEvent; import org.primefaces.model.ScheduleModel; import org.primefaces.model.ScheduleEvent; private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("UTC"); private static final Collection<String> EVENT_NAMES = Collections.unmodifiableCollection(Arrays.asList("dateSelect","eventSelect", "eventMove", "eventResize", "viewChange")); private java.util.Locale appropriateLocale; java.util.Locale calculateLocale(FacesContext facesContext) { if(appropriateLocale == null) { Object userLocale = getLocale(); if(userLocale != null) { if(userLocale instanceof String) appropriateLocale = new java.util.Locale((String) userLocale, ""); else if(userLocale instanceof java.util.Locale) appropriateLocale = (java.util.Locale) userLocale; else throw new IllegalArgumentException("Type:" + userLocale.getClass() + " is not a valid locale type for calendar:" + this.getClientId(facesContext)); } else { appropriateLocale = facesContext.getViewRoot().getLocale(); } } return appropriateLocale; } private TimeZone appropriateTimeZone; java.util.TimeZone calculateTimeZone() { if(appropriateTimeZone == null) { Object usertimeZone = getTimeZone(); if(usertimeZone != null) { if(usertimeZone instanceof String) appropriateTimeZone = TimeZone.getTimeZone((String) usertimeZone); else if(usertimeZone instanceof java.util.TimeZone) appropriateTimeZone = (TimeZone) usertimeZone; else throw new IllegalArgumentException("TimeZone could be either String or java.util.TimeZone"); } else { appropriateTimeZone = DEFAULT_TIME_ZONE; } } return appropriateTimeZone; } @Override public void queueEvent(FacesEvent event) { FacesContext context = getFacesContext(); Map<String,String> params = context.getExternalContext().getRequestParameterMap(); String eventName = params.get(Constants.RequestParams.PARTIAL_BEHAVIOR_EVENT_PARAM); String clientId = this.getClientId(context); TimeZone tz = calculateTimeZone(); if(isSelfRequest(context)) { AjaxBehaviorEvent behaviorEvent = (AjaxBehaviorEvent) event; FacesEvent wrapperEvent = null; if(eventName.equals("dateSelect")) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(Long.valueOf(params.get(clientId + "_selectedDate"))); calendar.setTimeZone(tz); Date selectedDate = calendar.getTime(); SelectEvent selectEvent = new SelectEvent(this, behaviorEvent.getBehavior(), selectedDate); selectEvent.setPhaseId(behaviorEvent.getPhaseId()); wrapperEvent = selectEvent; } else if(eventName.equals("eventSelect")) { String selectedEventId = params.get(clientId + "_selectedEventId"); ScheduleEvent selectedEvent = this.getValue().getEvent(selectedEventId); wrapperEvent = new SelectEvent(this, behaviorEvent.getBehavior(), selectedEvent); } else if(eventName.equals("eventMove")) { String movedEventId = params.get(clientId + "_movedEventId"); ScheduleEvent movedEvent = this.getValue().getEvent(movedEventId); int dayDelta = Integer.valueOf(params.get(clientId + "_dayDelta")); int minuteDelta = Integer.valueOf(params.get(clientId + "_minuteDelta")); Calendar calendar = Calendar.getInstance(); calendar.setTime(movedEvent.getStartDate()); calendar.setTimeZone(tz); calendar.add(Calendar.DATE, dayDelta); calendar.add(Calendar.MINUTE, minuteDelta); movedEvent.getStartDate().setTime(calendar.getTimeInMillis()); calendar = Calendar.getInstance(); calendar.setTime(movedEvent.getEndDate()); calendar.setTimeZone(tz); calendar.add(Calendar.DATE, dayDelta); calendar.add(Calendar.MINUTE, minuteDelta); movedEvent.getEndDate().setTime(calendar.getTimeInMillis()); wrapperEvent = new ScheduleEntryMoveEvent(this, behaviorEvent.getBehavior(), movedEvent, dayDelta, minuteDelta); } else if(eventName.equals("eventResize")) { String resizedEventId = params.get(clientId + "_resizedEventId"); ScheduleEvent resizedEvent = this.getValue().getEvent(resizedEventId); int dayDelta = Integer.valueOf(params.get(clientId + "_dayDelta")); int minuteDelta = Integer.valueOf(params.get(clientId + "_minuteDelta")); Calendar calendar = Calendar.getInstance(); calendar.setTime(resizedEvent.getEndDate()); calendar.setTimeZone(tz); calendar.add(Calendar.DATE, dayDelta); calendar.add(Calendar.MINUTE, minuteDelta); resizedEvent.getEndDate().setTime(calendar.getTimeInMillis()); wrapperEvent = new ScheduleEntryResizeEvent(this, behaviorEvent.getBehavior(), resizedEvent, dayDelta, minuteDelta); } else if(eventName.equals("viewChange")) { wrapperEvent = new SelectEvent(this, behaviorEvent.getBehavior(), this.getView()); } wrapperEvent.setPhaseId(behaviorEvent.getPhaseId()); super.queueEvent(wrapperEvent); } else { super.queueEvent(event); } } private boolean isSelfRequest(FacesContext context) { return this.getClientId(context).equals(context.getExternalContext().getRequestParameterMap().get(Constants.RequestParams.PARTIAL_SOURCE_PARAM)); } @Override public Collection<String> getEventNames() { return EVENT_NAMES; } @Override public void processUpdates(FacesContext context) { if(!isRendered()) { return; } super.processUpdates(context); ValueExpression expr = this.getValueExpression("view"); if(expr != null) { expr.setValue(getFacesContext().getELContext(), this.getView()); getStateHelper().remove(PropertyKeys.view); } }