/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <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 the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <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>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.commons.calendar.ui.components;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.olat.commons.calendar.CalendarManager;
import org.olat.commons.calendar.model.KalendarEvent;
import org.olat.commons.calendar.model.KalendarRecurEvent;
import org.olat.commons.calendar.ui.events.CalendarGUIAddEvent;
import org.olat.commons.calendar.ui.events.CalendarGUIFormEvent;
import org.olat.commons.calendar.ui.events.CalendarGUIMoveEvent;
import org.olat.commons.calendar.ui.events.CalendarGUIPrintEvent;
import org.olat.commons.calendar.ui.events.CalendarGUISelectEvent;
import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.impl.FormItemImpl;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.StringHelper;
import org.olat.core.util.ValidationStatus;
/**
*
* Initial date: 09.04.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class FullCalendarElement extends FormItemImpl {
private final FullCalendarComponent component;
public FullCalendarElement(UserRequest ureq, String name,
List<KalendarRenderWrapper> calendarWrappers, Translator translator) {
super(name);
component = new FullCalendarComponent(ureq, this, name, calendarWrappers, translator);
}
public String getMapperUrl() {
return component.getMapperUrl();
}
public Date getFocusDate() {
return component.getCurrentDate();
}
public void setFocusDate(Date date) {
component.setCurrentDate(date);
}
public boolean isConfigurationEnabled() {
return component.isConfigurationEnabled();
}
public void setConfigurationEnabled(boolean configurationEnabled) {
component.setConfigurationEnabled(configurationEnabled);
}
public boolean isAggregatedFeedEnabled() {
return component.isAggregatedFeedEnabled();
}
public void setAggregatedFeedEnabled(boolean aggregatedFeedEnabled) {
component.setAggregatedFeedEnabled(aggregatedFeedEnabled);
}
public KalendarRenderWrapper getCalendar(String calendarID) {
return component.getCalendar(calendarID);
}
public void setCalendars(List<KalendarRenderWrapper> calendarWrappers) {
component.setCalendars(calendarWrappers);
}
public void addCalendar(KalendarRenderWrapper calendarWrapper) {
component.addCalendar(calendarWrapper);
}
/**
* @see org.olat.core.gui.components.form.flexible.FormItemImpl#evalFormRequest(org.olat.core.gui.UserRequest)
*/
@Override
public void evalFormRequest(UserRequest ureq) {
String selectedEventId = getRootForm().getRequestParameter("evSelect");
String addEventMarker = getRootForm().getRequestParameter("evAdd");
String movedEventId = getRootForm().getRequestParameter("evMove");
String changeViewName = getRootForm().getRequestParameter("evChangeView");
String print = getRootForm().getRequestParameter("print");
String config = getRootForm().getRequestParameter("config");
String aggregate = getRootForm().getRequestParameter("aggregate");
String dispatchuri = getRootForm().getRequestParameter("dispatchuri");
if("undefined".equals(dispatchuri)) {
//to nothing
} else if(StringHelper.containsNonWhitespace(print)) {
String targetDomId = "fc_p" + component.getDispatchID();
getRootForm().fireFormEvent(ureq, new CalendarGUIPrintEvent(this, targetDomId));
} else if(StringHelper.containsNonWhitespace(config)) {
String targetDomId = "fc_x" + component.getDispatchID();
getRootForm().fireFormEvent(ureq, new CalendarGUIFormEvent(CalendarGUIFormEvent.CONFIGURE, this, targetDomId));
} else if(StringHelper.containsNonWhitespace(aggregate)) {
String targetDomId = "fc_g" + component.getDispatchID();
getRootForm().fireFormEvent(ureq, new CalendarGUIFormEvent(CalendarGUIFormEvent.AGGREGATED_FEED, this, targetDomId));
} else if(StringHelper.containsNonWhitespace(selectedEventId)) {
String targetDomId = getRootForm().getRequestParameter("evDomId");
doSelect(ureq, selectedEventId, targetDomId);
} else if(StringHelper.containsNonWhitespace(addEventMarker)) {
String start = getRootForm().getRequestParameter("start");
String end = getRootForm().getRequestParameter("end");
String allDay = getRootForm().getRequestParameter("allDay");
doAdd(ureq, start, end, allDay);
} else if(StringHelper.containsNonWhitespace(movedEventId)) {
String dayDelta = getRootForm().getRequestParameter("dayDelta");
String minuteDelta = getRootForm().getRequestParameter("minuteDelta");
String allDay = getRootForm().getRequestParameter("allDay");
doMove(ureq, movedEventId, dayDelta, minuteDelta, allDay);
} else if(StringHelper.containsNonWhitespace(changeViewName)) {
String start = getRootForm().getRequestParameter("start");
doChangeView(changeViewName, start);
}
}
protected void doChangeView(String viewName, String start) {
if(StringHelper.isLong(start)) {
long startTime = Long.parseLong(start);
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(startTime);
component.setCurrentDate(cal.getTime());
}
if("month".equals(viewName) || "agendaWeek".equals(viewName)
|| "agendaDay".equals(viewName) || "basicWeek".equals(viewName)
|| "basicDay".equals(viewName)) {
component.setViewName(viewName);
}
}
protected void doMove(UserRequest ureq, String eventId, String dayDelta, String minuteDelta, String allDayStr) {
Long day = null;
if(StringHelper.isLong(dayDelta)) {
day = Long.parseLong(dayDelta);
}
Long minute = null;
if(StringHelper.isLong(minuteDelta)) {
minute = Long.parseLong(minuteDelta);
}
Boolean allDay = null;
if("true".equals(allDayStr)) {
allDay = Boolean.TRUE;
} else if("false".equals(allDayStr)) {
allDay = Boolean.FALSE;
}
if(component.isOccurenceOfCalendarEvent(eventId)) {
String uid = component.getCalendarEventUid(eventId);
KalendarRenderWrapper cal = component.getCalendarById(uid);
KalendarRecurEvent rEvent = getCurrenceKalendarEvent(cal, eventId);
getRootForm().fireFormEvent(ureq, new CalendarGUIMoveEvent(this, rEvent, cal, day, minute, allDay));
} else if(component.isReccurenceOfCalendarEvent(eventId)) {
String uid = component.getCalendarEventUid(eventId);
KalendarRenderWrapper cal = component.getCalendarById(uid);
KalendarRecurEvent rEvent = getCurrenceKalendarEvent(cal, eventId);
getRootForm().fireFormEvent(ureq, new CalendarGUIMoveEvent(this, rEvent, cal, day, minute, allDay));
} else {
KalendarEvent event = component.getCalendarEvent(eventId);
KalendarRenderWrapper calWrapper = component.getCalendarByNormalizedId(eventId);
getRootForm().fireFormEvent(ureq, new CalendarGUIMoveEvent(this, event, calWrapper, day, minute, allDay));
}
}
private void doAdd(UserRequest ureq, String start, String end, String allDay) {
long startTime = -1;
if(StringHelper.isLong(start)) {
startTime = Long.parseLong(start);
}
long endTime = -1;
if(StringHelper.isLong(end)) {
endTime = Long.parseLong(end);
}
boolean allDayEvent = "true".equalsIgnoreCase(allDay);
getRootForm().fireFormEvent(ureq, new CalendarGUIAddEvent(this, null, new Date(startTime), new Date(endTime), allDayEvent));
}
private void doSelect(UserRequest ureq, String eventId, String targetDomId) {
KalendarEvent event = component.getCalendarEvent(eventId);
if(component.isOccurenceOfCalendarEvent(eventId)) {
String uid = component.getCalendarEventUid(eventId);
KalendarRenderWrapper cal = component.getCalendarById(uid);
KalendarRecurEvent recurEvent = getCurrenceKalendarEvent(cal, eventId);
getRootForm().fireFormEvent(ureq, new CalendarGUISelectEvent(this, recurEvent, cal, targetDomId));
} else if(component.isReccurenceOfCalendarEvent(eventId)) {
String uid = component.getCalendarEventUid(eventId);
KalendarRenderWrapper cal = component.getCalendarById(uid);
KalendarRecurEvent recurEvent = getCurrenceKalendarEvent(cal, eventId);
getRootForm().fireFormEvent(ureq, new CalendarGUISelectEvent(this, recurEvent, cal, targetDomId));
} else {
KalendarRenderWrapper calWrapper = component.getCalendarByNormalizedId(eventId);
getRootForm().fireFormEvent(ureq, new CalendarGUISelectEvent(this, event, calWrapper, targetDomId));
}
}
private KalendarRecurEvent getCurrenceKalendarEvent(KalendarRenderWrapper cal, String eventId) {
boolean privateEventsVisible = cal.isPrivateEventsVisible();
CalendarManager calendarManager = CoreSpringFactory.getImpl(CalendarManager.class);
Date currentDate = component.getCurrentDate();
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.add(Calendar.MONTH, -2);
Date from = calendar.getTime();
calendar.add(Calendar.MONTH, +4);
Date to = calendar.getTime();
List<KalendarEvent> events = calendarManager.getEvents(cal.getKalendar(), from, to, privateEventsVisible);
for(KalendarEvent event:events) {
if(event instanceof KalendarRecurEvent) {
KalendarRecurEvent kEvent = (KalendarRecurEvent)event;
if(eventId.equals(FullCalendarComponent.normalizeId(event))) {
return kEvent;
}
}
}
return null;
}
@Override
public void validate(List<ValidationStatus> validationResults) {
//static text must not validate
}
@Override
public void reset() {
//
}
/**
* Prevent parent to be set as dirty for every request
*/
@Override
public boolean isInlineEditingElement() {
return true;
}
@Override
protected void rootFormAvailable() {
//root form not interesting for Static text
}
@Override
protected FullCalendarComponent getFormItemComponent() {
return component;
}
}