/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ package org.olat.commons.calendar.ui; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.RandomStringUtils; import org.olat.commons.calendar.CalendarManager; import org.olat.commons.calendar.CalendarNotificationManager; import org.olat.commons.calendar.CalendarUtils; import org.olat.commons.calendar.model.CalendarUserConfiguration; import org.olat.commons.calendar.model.Kalendar; import org.olat.commons.calendar.model.KalendarComparator; import org.olat.commons.calendar.model.KalendarEvent; import org.olat.commons.calendar.model.KalendarRecurEvent; import org.olat.commons.calendar.ui.components.FullCalendarElement; import org.olat.commons.calendar.ui.components.KalendarRenderWrapper; import org.olat.commons.calendar.ui.events.CalendarGUIAddEvent; import org.olat.commons.calendar.ui.events.CalendarGUIEditEvent; import org.olat.commons.calendar.ui.events.CalendarGUIFormEvent; import org.olat.commons.calendar.ui.events.CalendarGUIImportEvent; import org.olat.commons.calendar.ui.events.CalendarGUIModifiedEvent; import org.olat.commons.calendar.ui.events.CalendarGUIMoveEvent; import org.olat.commons.calendar.ui.events.CalendarGUIPrintEvent; import org.olat.commons.calendar.ui.events.CalendarGUIRemoveEvent; import org.olat.commons.calendar.ui.events.CalendarGUISelectEvent; import org.olat.commons.calendar.ui.events.CalendarGUISettingEvent; import org.olat.commons.calendar.ui.events.CalendarGUIUpdateEvent; import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.commons.services.notifications.PublisherData; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.commons.services.notifications.ui.ContextualSubscriptionController; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.util.ComponentUtil; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.winmgr.JSCommand; import org.olat.core.helpers.Settings; import org.olat.core.id.UserConstants; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.activity.ILoggingAction; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.CodeHelper; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.GenericEventListener; import org.olat.core.util.resource.OresHelper; import org.olat.group.BusinessGroup; import org.olat.util.logging.activity.LoggingResourceable; import org.springframework.beans.factory.annotation.Autowired; public class WeeklyCalendarController extends FormBasicController implements Activateable2, CalendarController, GenericEventListener { public static final String CALLER_HOME = "home"; public static final String CALLER_PROFILE = "profile"; public static final String CALLER_COLLAB = "collab"; public static final String CALLER_COURSE = "course"; private FullCalendarElement calendarEl; private CalendarAggregatedURLController feedUrlCtrl; private CalendarEntryDetailsController editController; private CalendarPersonalConfigurationController configurationCtrl; private CloseableModalController cmc; private SubscriptionContext subsContext; private ContextualSubscriptionController csc; private ConfirmUpdateController updateCtr; private CalendarPrintController printCtrl; private CalendarDetailsController eventDetailsCtr; private CloseableCalloutWindowController eventCalloutCtr; /** * three options: * 1. edit sequence * 2. delete single date * 3. delete whole sequence */ private DialogBoxController dbcSequence; private DialogBoxController deleteSingleYesNoController, deleteSequenceYesNoController; private String modifiedCalendarId; private boolean modifiedCalenderDirty = false; private final String caller; private boolean dirty = false; private final boolean allowImport; private List<KalendarRenderWrapper> calendarWrappers; private CalendarPrintMapper printMapper; private final String printUrl; private ILoggingAction calLoggingAction; @Autowired private CalendarManager calendarManager; @Autowired private CalendarNotificationManager calendarNotificationsManager; /** * Display week view of calendar. Add the calendars to be displayed via * addKalendarWrapper(KalendarRenderWrapper kalendarWrapper) method. * @param ureq * @param wControl * @param calendarWrappers * @param importedCalendarWrappers * @param caller * @param calendarSubscription * @param eventAlwaysVisible When true, the 'isVis()' check is disabled and events will be displayed always. */ public WeeklyCalendarController(UserRequest ureq, WindowControl wControl, List<KalendarRenderWrapper> calendarWrappers, String caller, boolean allowImport) { super(ureq,wControl, "indexWeekly"); setTranslator(Util.createPackageTranslator(CalendarManager.class, ureq.getLocale(), getTranslator())); this.allowImport = allowImport; this.calendarWrappers = calendarWrappers; this.caller = caller; String themeBaseUri = wControl.getWindowBackOffice().getWindow().getGuiTheme().getBaseURI(); printMapper = new CalendarPrintMapper(themeBaseUri, getTranslator()); printUrl = registerMapper(ureq, printMapper); initForm(ureq); CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), OresHelper.lookupType(CalendarManager.class)); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly(); Collections.sort(calendarWrappers, KalendarComparator.getInstance()); calendarEl = new FullCalendarElement(ureq, "weeklyCalendar", calendarWrappers, getTranslator()); formLayout.add("calendar", calendarEl); calendarEl.setConfigurationEnabled(true); calendarEl.setAggregatedFeedEnabled(true); if(formLayout instanceof FormLayoutContainer) { FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; if (!isGuest && !calendarWrappers.isEmpty()) { subsContext = calendarNotificationsManager.getSubscriptionContext(calendarWrappers.get(0)); // if sc is null, then no subscription is desired if (subsContext != null) { csc = getContextualSubscriptionController(ureq, calendarWrappers.get(0), subsContext); layoutCont.put("calsubscription", csc.getInitialComponent()); } } } } @Override protected void formOK(UserRequest ureq) { // } private ContextualSubscriptionController getContextualSubscriptionController(UserRequest ureq, KalendarRenderWrapper kalendarRenderWrapper, SubscriptionContext context) { String businessPath = getWindowControl().getBusinessControl().getAsString(); if ((caller.equals(CalendarController.CALLER_COURSE) || caller.equals(CalendarManager.TYPE_COURSE))) { Long courseId = kalendarRenderWrapper.getLinkProvider().getControler().getCourseId(); PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(CalendarManager.class), String.valueOf(courseId), businessPath); return new ContextualSubscriptionController(ureq, getWindowControl(), context, pdata); } if ((caller.equals(CalendarController.CALLER_COLLAB) || caller.equals(CalendarManager.TYPE_GROUP))) { BusinessGroup businessGroup = calendarNotificationsManager.getBusinessGroup(kalendarRenderWrapper); if(businessGroup != null) { PublisherData pdata = new PublisherData(OresHelper.calculateTypeName(CalendarManager.class), String.valueOf(businessGroup.getResourceableId()), businessPath); return new ContextualSubscriptionController(ureq, getWindowControl(), context, pdata); } } return null; } public Date getFocus() { return calendarEl.getFocusDate(); } @Override public void setFocus(Date date) { Calendar focus = CalendarUtils.createCalendarInstance(getLocale()); focus.setTime(date); calendarEl.setFocusDate(focus.getTime()); } @Override public void setFocusOnEvent(String eventId, String recurenceId) { if (eventId.length() > 0) { for(KalendarRenderWrapper wrapper:calendarWrappers) { KalendarEvent event = wrapper.getKalendar().getEvent(eventId, recurenceId); if(event != null) { setFocus(event.getBegin()); break; } } } } @Override public void setCalendars(List<KalendarRenderWrapper> calendars) { calendarWrappers = calendars; Collections.sort(calendarWrappers, KalendarComparator.getInstance()); calendarEl.setCalendars(calendarWrappers); } @Override public void setDirty() { dirty = true; } private ILoggingAction getCalLoggingAction() { return calLoggingAction; } private void setCalLoggingAction(ILoggingAction calLoggingAction) { this.calLoggingAction = calLoggingAction; } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == calendarEl) { if (event instanceof CalendarGUIEditEvent) { CalendarGUIEditEvent guiEvent = (CalendarGUIEditEvent) event; KalendarEvent kalendarEvent = guiEvent.getKalendarEvent(); if (kalendarEvent == null) { // event already deleted getWindowControl().setError(translate("cal.error.eventDeleted")); return; } String recurrence = kalendarEvent.getRecurrenceRule(); boolean isImported = false; KalendarRenderWrapper kalendarRenderWrapper = guiEvent.getKalendarRenderWrapper(); if (kalendarRenderWrapper!=null) { isImported = kalendarRenderWrapper.isImported(); } if( !isImported && recurrence != null && !recurrence.equals("") ) { List<String> btnLabels = new ArrayList<>(3); btnLabels.add(translate("cal.edit.dialog.sequence")); btnLabels.add(translate("cal.edit.dialog.delete.single")); btnLabels.add(translate("cal.edit.dialog.delete.sequence")); if (dbcSequence != null) { dbcSequence.dispose(); } dbcSequence = DialogBoxUIFactory.createGenericDialog(ureq, getWindowControl(), translate("cal.edit.dialog.title"), translate("cal.edit.dialog.text"), btnLabels); dbcSequence.addControllerListener(this); dbcSequence.setUserObject(guiEvent); dbcSequence.activate(); return; } KalendarRenderWrapper kalendarWrapper = guiEvent.getKalendarRenderWrapper(); pushEditEventController(ureq, kalendarEvent, kalendarWrapper); } else if (event instanceof CalendarGUIAddEvent) { pushAddEventController((CalendarGUIAddEvent)event, ureq); } else if (event instanceof CalendarGUISelectEvent) { CalendarGUISelectEvent selectEvent = (CalendarGUISelectEvent)event; if(selectEvent.getKalendarEvent() != null) { doOpenEventCallout(ureq, selectEvent.getKalendarEvent(), selectEvent.getKalendarRenderWrapper(), selectEvent.getTargetDomId()); } } else if (event instanceof CalendarGUIMoveEvent) { CalendarGUIMoveEvent moveEvent = (CalendarGUIMoveEvent)event; doMove(ureq, moveEvent.getKalendarEvent(), moveEvent.getDayDelta(), moveEvent.getMinuteDelta(), moveEvent.getAllDay()); } else if (event instanceof CalendarGUIFormEvent) { String cmd = event.getCommand(); if(CalendarGUIFormEvent.CONFIGURE.equals(cmd)) { doConfigure(ureq); } else if(CalendarGUIFormEvent.AGGREGATED_FEED.equals(cmd)) { CalendarGUIFormEvent guiEvent = (CalendarGUIFormEvent)event; doOpenAggregatedFeelUrl(ureq, guiEvent.getTargetDomId()); } } else if (event instanceof CalendarGUIPrintEvent) { CalendarGUIPrintEvent printEvent = (CalendarGUIPrintEvent)event; if(printEvent.getFrom() != null && printEvent.getTo() != null) { doPrint(printEvent.getFrom(), printEvent.getTo()); } else if(printEvent.getTargetDomId() != null) { doPrintEventCallout(ureq, printEvent.getTargetDomId()); } } } super.formInnerEvent(ureq, source, event); } @Override public void event(UserRequest ureq, Component source, Event event) { if (event == ComponentUtil.VALIDATE_EVENT && dirty) { dirty = false; fireEvent(ureq, new CalendarGUIModifiedEvent()); } else if (event == ComponentUtil.VALIDATE_EVENT && calendarEl.getComponent().isDirty() && modifiedCalenderDirty ) { KalendarRenderWrapper kalendarRenderWrapper = calendarEl.getCalendar(modifiedCalendarId); kalendarRenderWrapper.reloadKalendar(); } super.event(ureq, source, event); } @Override public void event(UserRequest ureq, Controller source, Event event) { Kalendar affectedCal = null; if (dirty) { dirty = false; fireEvent(ureq, new CalendarGUIModifiedEvent()); } if (source == editController) { affectedCal = editController.getKalendarEvent().getCalendar(); cmc.deactivate(); calendarEl.getComponent().setDirty(true); // do logging if affectedCal not null if(affectedCal!=null) { ThreadLocalUserActivityLogger.log(getCalLoggingAction(), getClass(), LoggingResourceable.wrap(ureq.getIdentity()), LoggingResourceable.wrap(affectedCal)); } cleanUp(); } else if (source == eventDetailsCtr) { if(event instanceof CalendarGUIEditEvent) { eventCalloutCtr.deactivate(); cleanUp(); CalendarGUIEditEvent editEvent = (CalendarGUIEditEvent)event; pushEditEventController(ureq, editEvent.getKalendarEvent(), editEvent.getKalendarRenderWrapper()); } else if(event == Event.DONE_EVENT) { eventCalloutCtr.deactivate(); cleanUp(); } } else if(source == updateCtr) { if(event instanceof CalendarGUIUpdateEvent) { doUpdate((CalendarGUIUpdateEvent)event, updateCtr.getKalendarEvent(), updateCtr.getDayDelta(), updateCtr.getMinuteDelta(), updateCtr.getAllDay()); } cmc.deactivate(); cleanUp(); } else if(source == printCtrl) { if (event instanceof CalendarGUIPrintEvent) { CalendarGUIPrintEvent printEvent = (CalendarGUIPrintEvent)event; if(printEvent.getFrom() != null && printEvent.getTo() != null) { doPrint(printEvent.getFrom(), printEvent.getTo()); } } eventCalloutCtr.deactivate(); cleanUp(); } else if(source == cmc) { calendarEl.getComponent().setDirty(true); cleanUp(); } else if (source == dbcSequence) { if(event != Event.CANCELLED_EVENT) { int pos = DialogBoxUIFactory.getButtonPos(event); CalendarGUIEditEvent guiEvent = (CalendarGUIEditEvent)dbcSequence.getUserObject(); KalendarRenderWrapper kalendarWrapper = guiEvent.getKalendarRenderWrapper(); KalendarEvent kalendarEvent = guiEvent.getKalendarEvent(); if(pos == 0) { // edit the sequence // load the parent event of this sequence KalendarEvent parentEvent = kalendarWrapper.getKalendar().getEvent(kalendarEvent.getID(), kalendarEvent.getRecurrenceID()); pushEditEventController(ureq, parentEvent, kalendarWrapper); } else if(pos == 1) { // delete a single event of the sequence deleteSingleYesNoController = activateYesNoDialog(ureq, null, translate("cal.delete.dialogtext"), deleteSingleYesNoController); deleteSingleYesNoController.setUserObject(kalendarEvent); } else if(pos == 2) { // delete the whole sequence deleteSequenceYesNoController = activateYesNoDialog(ureq, null, translate("cal.delete.dialogtext.sequence"), deleteSequenceYesNoController); deleteSequenceYesNoController.setUserObject(kalendarEvent); } } dbcSequence.dispose(); } else if (source == deleteSingleYesNoController) { if (DialogBoxUIFactory.isYesEvent(event)) { KalendarEvent kalendarEvent = (KalendarEvent)deleteSingleYesNoController.getUserObject(); affectedCal = kalendarEvent.getCalendar(); KalendarEvent kEvent = affectedCal.getEvent(kalendarEvent.getID(), kalendarEvent.getRecurrenceID()); kEvent.addRecurrenceExc(kalendarEvent.getBegin()); calendarManager.updateEventFrom(affectedCal, kEvent); deleteSingleYesNoController.dispose(); calendarEl.getComponent().setDirty(true); } } else if (source == deleteSequenceYesNoController) { if (DialogBoxUIFactory.isYesEvent(event)) { KalendarEvent kalendarEvent = (KalendarEvent)deleteSequenceYesNoController.getUserObject(); affectedCal = kalendarEvent.getCalendar(); calendarManager.removeEventFrom(affectedCal, kalendarEvent); deleteSequenceYesNoController.dispose(); calendarEl.getComponent().setDirty(true); } } else if (configurationCtrl == source) { if(event instanceof CalendarGUIImportEvent) { CalendarGUIImportEvent importEvent = (CalendarGUIImportEvent)event; calendarWrappers.add(importEvent.getCalendar()); calendarEl.setCalendars(calendarWrappers); } else if(event instanceof CalendarGUIRemoveEvent) { CalendarGUIRemoveEvent removeEvent = (CalendarGUIRemoveEvent)event; calendarWrappers.remove(removeEvent.getCalendar()); calendarEl.setCalendars(calendarWrappers); } else if(event instanceof CalendarGUISettingEvent) { calendarEl.setCalendars(calendarWrappers); } } else if(eventCalloutCtr == source) { cleanUp(); } else if(eventDetailsCtr == source) { } if (calendarEl.getComponent().isDirty()) { if (subsContext != null) { // group or course calendar -> prepared subscription context is the right one NotificationsManager.getInstance().markPublisherNews(subsContext, ureq.getIdentity(), true); } else if(caller.equals(CALLER_HOME) && affectedCal != null) { // one can add/edit/remove dates of group and course calendars from the home calendar view -> choose right subscription context for( KalendarRenderWrapper calWrapper : calendarWrappers) { if(affectedCal == calWrapper.getKalendar()) { SubscriptionContext tmpSubsContext = calendarNotificationsManager.getSubscriptionContext(calWrapper); NotificationsManager.getInstance().markPublisherNews(tmpSubsContext, ureq.getIdentity(), true); } } } } } private void cleanUp() { removeAsListenerAndDispose(configurationCtrl); removeAsListenerAndDispose(eventCalloutCtr); removeAsListenerAndDispose(eventDetailsCtr); removeAsListenerAndDispose(editController); removeAsListenerAndDispose(updateCtr); removeAsListenerAndDispose(cmc); eventCalloutCtr = null; eventDetailsCtr = null; configurationCtrl = null; editController = null; updateCtr = null; cmc = null; } @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; String dateEntry = entries.get(0).getOLATResourceable().getResourceableTypeName(); if(dateEntry.startsWith("date")) { Date gotoDate = BusinessControlFactory.getInstance().getDateFromContextEntry(entries.get(0)); if(gotoDate != null) { calendarEl.setFocusDate(gotoDate); } } } private void doOpenAggregatedFeelUrl(UserRequest ureq, String targetDomId) { List<CalendarUserConfiguration> configurations = calendarManager .getCalendarUserConfigurationsList(getIdentity(), CalendarManager.TYPE_USER_AGGREGATED); CalendarUserConfiguration config; if(configurations.isEmpty()) { config = calendarManager.createAggregatedCalendarConfig(getIdentity()); } else if(StringHelper.containsNonWhitespace(configurations.get(0).getToken())) { config = configurations.get(0); } else { config = configurations.get(0); config.setToken(RandomStringUtils.randomAlphanumeric(6)); config = calendarManager.saveCalendarConfig(config); } String token = config.getToken(); Long configKey = config.getKey(); String url = Settings.getServerContextPathURI() + "/ical/" + CalendarManager.TYPE_USER_AGGREGATED + "/" + configKey + "/" + token + ".ics"; feedUrlCtrl = new CalendarAggregatedURLController(ureq, getWindowControl(), url); listenTo(feedUrlCtrl); eventCalloutCtr = new CloseableCalloutWindowController(ureq, getWindowControl(), feedUrlCtrl.getInitialComponent(), targetDomId, translate("print"), true, "o_cal_event_callout"); listenTo(eventCalloutCtr); eventCalloutCtr.activate(); } private void doConfigure(UserRequest ureq) { removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(configurationCtrl); List<KalendarRenderWrapper> allCalendars = new ArrayList<>(calendarWrappers); configurationCtrl = new CalendarPersonalConfigurationController(ureq, getWindowControl(), allCalendars, allowImport); listenTo(configurationCtrl); String title = translate("cal.configuration.list"); cmc = new CloseableModalController(getWindowControl(), "c", configurationCtrl.getInitialComponent(), true, title); cmc.setContextHelp(getTranslator(), "Calendar"); listenTo(cmc); cmc.activate(); } private void doPrint(Date from, Date to) { StringBuilder sb = new StringBuilder(); sb.append("window.open('" + printUrl + "/print.html', '_print','height=800,left=100,top=100,width=800,toolbar=no,titlebar=0,status=0,menubar=yes,location= no,scrollbars=1');"); printMapper.setFrom(from); printMapper.setTo(to); printMapper.setCalendarWrappers(calendarWrappers); getWindowControl().getWindowBackOffice().sendCommandTo(new JSCommand(sb.toString())); } private void doPrintEventCallout(UserRequest ureq, String targetDomId) { if(eventCalloutCtr != null && printCtrl != null) return; removeAsListenerAndDispose(eventCalloutCtr); removeAsListenerAndDispose(printCtrl); printCtrl = new CalendarPrintController(ureq, getWindowControl()); listenTo(printCtrl); Component eventCmp = printCtrl.getInitialComponent(); eventCalloutCtr = new CloseableCalloutWindowController(ureq, getWindowControl(), eventCmp, targetDomId, translate("print"), true, "o_cal_event_callout"); listenTo(eventCalloutCtr); eventCalloutCtr.activate(); } private void doOpenEventCallout(UserRequest ureq, KalendarEvent calEvent, KalendarRenderWrapper calWrapper, String targetDomId) { if(eventCalloutCtr != null && eventDetailsCtr != null) return; removeAsListenerAndDispose(eventCalloutCtr); removeAsListenerAndDispose(eventDetailsCtr); eventDetailsCtr = new CalendarDetailsController(ureq, getWindowControl(), calEvent, calWrapper); listenTo(eventDetailsCtr); Component eventCmp = eventDetailsCtr.getInitialComponent(); eventCalloutCtr = new CloseableCalloutWindowController(ureq, getWindowControl(), eventCmp, targetDomId, "Event", true, "o_cal_event_callout"); listenTo(eventCalloutCtr); eventCalloutCtr.activate(); } private void doMove(UserRequest ureq, KalendarEvent calEvent, Long dayDelta, Long minuteDelta, Boolean allDay) { if(calEvent instanceof KalendarRecurEvent && !StringHelper.containsNonWhitespace(calEvent.getRecurrenceID())) { updateCtr = new ConfirmUpdateController(ureq, getWindowControl(), (KalendarRecurEvent)calEvent, dayDelta, minuteDelta, allDay); listenTo(updateCtr); String title = translate("cal.edit.update"); cmc = new CloseableModalController(getWindowControl(), translate("close"), updateCtr.getInitialComponent(), true, title); listenTo(cmc); cmc.activate(); } else { Kalendar cal = calEvent.getCalendar(); calEvent.setBegin(doMove(calEvent.getBegin(), dayDelta, minuteDelta)); calEvent.setEnd(doMove(calEvent.getEnd(), dayDelta, minuteDelta)); if(allDay != null && calEvent.isAllDayEvent() != allDay.booleanValue()) { calEvent.setAllDayEvent(allDay.booleanValue()); } calendarManager.updateEventFrom(cal, calEvent); calendarEl.getComponent().setDirty(true); } } private void doUpdate(CalendarGUIUpdateEvent event, KalendarEvent kalendarEvent, Long dayDelta, Long minuteDelta, Boolean allDay) { switch(event.getCascade()) { case all: { kalendarEvent.setBegin(doMove(kalendarEvent.getBegin(), dayDelta, minuteDelta)); kalendarEvent.setEnd(doMove(kalendarEvent.getEnd(), dayDelta, minuteDelta)); if(allDay != null && kalendarEvent.isAllDayEvent() != allDay.booleanValue()) { kalendarEvent.setAllDayEvent(allDay.booleanValue()); } calendarManager.updateEventFrom(kalendarEvent.getCalendar(), kalendarEvent); break; } case once: { if(kalendarEvent instanceof KalendarRecurEvent) { KalendarRecurEvent refEvent = (KalendarRecurEvent)kalendarEvent; kalendarEvent = calendarManager.createKalendarEventRecurringOccurence(refEvent); kalendarEvent.setBegin(doMove(kalendarEvent.getBegin(), dayDelta, minuteDelta)); kalendarEvent.setEnd(doMove(kalendarEvent.getEnd(), dayDelta, minuteDelta)); if(allDay != null && kalendarEvent.isAllDayEvent() != allDay.booleanValue()) { kalendarEvent.setAllDayEvent(allDay.booleanValue()); } calendarManager.addEventTo(refEvent.getCalendar(), kalendarEvent); } break; } } } private Date doMove(Date date, Long dayDelta, Long minuteDelta) { if(date == null) { return date; } Calendar cal = Calendar.getInstance(); cal.setTime(date); if(dayDelta != null) { cal.add(Calendar.DATE, dayDelta.intValue()); } if(minuteDelta != null) { cal.add(Calendar.MINUTE, minuteDelta.intValue()); } return cal.getTime(); } /** * @param ureq * @param kalendarEvent * @param kalendarWrapper */ private void pushEditEventController(UserRequest ureq, KalendarEvent kalendarEvent, KalendarRenderWrapper kalendarWrapper) { if(editController != null) return; removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(editController); boolean canEdit = false; for (Iterator<KalendarRenderWrapper> iter = calendarWrappers.iterator(); iter.hasNext();) { KalendarRenderWrapper wrapper = iter.next(); if (wrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_WRITE && kalendarWrapper.getKalendar().getCalendarID().equals(wrapper.getKalendar().getCalendarID())) { canEdit = true; } } if(canEdit) { editController = new CalendarEntryDetailsController(ureq, kalendarEvent, kalendarWrapper, calendarWrappers, false, caller, getWindowControl()); listenTo(editController); removeAsListenerAndDispose(cmc); cmc = new CloseableModalController(getWindowControl(), translate("close"), editController.getInitialComponent()); listenTo(cmc); cmc.activate(); // set logging action setCalLoggingAction(CalendarLoggingAction.CALENDAR_ENTRY_MODIFIED); } else { showError("cal.error.readonly"); } } private void pushAddEventController(CalendarGUIAddEvent addEvent, UserRequest ureq) { if(editController != null || ureq.getUserSession().getRoles().isGuestOnly()) { return; } removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(editController); KalendarRenderWrapper calendarWrapper = calendarEl.getCalendar(addEvent.getCalendarID()); List<KalendarRenderWrapper> copyCalendarWrappers = new ArrayList<>(calendarWrappers); boolean isReadOnly = calendarWrapper == null ? true : calendarWrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY; for(KalendarRenderWrapper copyCalendarWrapper:copyCalendarWrappers) { isReadOnly &= copyCalendarWrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY; } if(!isReadOnly) { // create new KalendarEvent KalendarEvent newEvent; Date begin = addEvent.getStartDate(); String eventId = CodeHelper.getGlobalForeverUniqueID(); if(addEvent.getEndDate() == null) { newEvent = new KalendarEvent(eventId, "", begin, (1000 * 60 * 60 * 1)); } else { newEvent = new KalendarEvent(eventId, null, "", begin, addEvent.getEndDate()); } if (calendarWrapper != null && (calendarWrapper.getKalendar().getType().equals(CalendarManager.TYPE_COURSE) || calendarWrapper.getKalendar().getType().equals(CalendarManager.TYPE_GROUP))) { newEvent.setClassification(KalendarEvent.CLASS_PUBLIC); } newEvent.setAllDayEvent(addEvent.isAllDayEvent()); String lastName = ureq.getIdentity().getUser().getProperty(UserConstants.LASTNAME, getLocale()); String firstName = ureq.getIdentity().getUser().getProperty(UserConstants.FIRSTNAME, getLocale()); newEvent.setCreatedBy(firstName + " " + lastName); newEvent.setCreated(new Date().getTime()); editController = new CalendarEntryDetailsController(ureq, newEvent, calendarWrapper, copyCalendarWrappers, true, caller, getWindowControl()); listenTo(editController); cmc = new CloseableModalController(getWindowControl(), translate("close"), editController.getInitialComponent()); listenTo(cmc); cmc.activate(); // set logging action setCalLoggingAction(CalendarLoggingAction.CALENDAR_ENTRY_CREATED); } } @Override protected void doDispose() { CoordinatorManager.getInstance().getCoordinator().getEventBus().deregisterFor(this, OresHelper.lookupType(CalendarManager.class)); } @Override public void event(Event event) { if (event instanceof CalendarGUIModifiedEvent) { CalendarGUIModifiedEvent kalendarModifiedEvent = (CalendarGUIModifiedEvent)event; if (kalendarModifiedEvent.getType()!=null && kalendarModifiedEvent.getCalendarId()!=null && calendarEl.getCalendar(kalendarModifiedEvent.getCalendarId())!=null && kalendarModifiedEvent.getType().equals(calendarEl.getCalendar(kalendarModifiedEvent.getCalendarId()).getKalendar().getType()) && kalendarModifiedEvent.getCalendarId().equals(calendarEl.getCalendar(kalendarModifiedEvent.getCalendarId()).getKalendar().getCalendarID())) { // the event is for my calendar => reload it //keeping a reference to the dirty calendar as reloading here raises an nested do in sync error. Using the component validation event to reload modifiedCalendarId = kalendarModifiedEvent.getCalendarId(); modifiedCalenderDirty = true; calendarEl.getComponent().setDirty(true); } } } }