Skip to content
Snippets Groups Projects
Commit 4ebbd49e authored by srosse's avatar srosse
Browse files

OO-593: implement print view of the calendar

parent 76317813
No related branches found
No related tags found
No related merge requests found
Showing
with 598 additions and 30 deletions
...@@ -41,7 +41,6 @@ import net.fortuna.ical4j.model.DateList; ...@@ -41,7 +41,6 @@ import net.fortuna.ical4j.model.DateList;
import net.fortuna.ical4j.model.DateTime; import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.Recur; import net.fortuna.ical4j.model.Recur;
import net.fortuna.ical4j.model.TimeZone; import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.WeekDayList; import net.fortuna.ical4j.model.WeekDayList;
import net.fortuna.ical4j.model.property.ExDate; import net.fortuna.ical4j.model.property.ExDate;
import net.fortuna.ical4j.model.property.RRule; import net.fortuna.ical4j.model.property.RRule;
...@@ -101,14 +100,14 @@ public class CalendarUtils { ...@@ -101,14 +100,14 @@ public class CalendarUtils {
* @param subject * @param subject
* @return * @return
*/ */
public static List findEvents(Kalendar calendar, String subject, String location, Date beginPeriod, Date endPeriod, boolean publicOnly) { public static List<KalendarEvent> findEvents(Kalendar calendar, String subject, String location, Date beginPeriod, Date endPeriod, boolean publicOnly) {
List results = new ArrayList(); List<KalendarEvent> results = new ArrayList<KalendarEvent>();
Collection events = calendar.getEvents(); Collection<KalendarEvent> events = calendar.getEvents();
String regExSubject = subject.replace("*", ".*"); String regExSubject = subject.replace("*", ".*");
String regExLocation = location.replace("*", ".*"); String regExLocation = location.replace("*", ".*");
regExSubject = ".*" + regExSubject + ".*"; regExSubject = ".*" + regExSubject + ".*";
regExLocation = ".*" + regExLocation + ".*"; regExLocation = ".*" + regExLocation + ".*";
for (Iterator iter = events.iterator(); iter.hasNext();) { for (Iterator<KalendarEvent> iter = events.iterator(); iter.hasNext();) {
KalendarEvent event = (KalendarEvent) iter.next(); KalendarEvent event = (KalendarEvent) iter.next();
if (publicOnly && event.getClassification() != KalendarEvent.CLASS_PUBLIC) continue; if (publicOnly && event.getClassification() != KalendarEvent.CLASS_PUBLIC) continue;
if (beginPeriod != null && event.getBegin().before(beginPeriod)) continue; if (beginPeriod != null && event.getBegin().before(beginPeriod)) continue;
...@@ -151,11 +150,11 @@ public class CalendarUtils { ...@@ -151,11 +150,11 @@ public class CalendarUtils {
return results; return results;
} }
public static List listEventsForPeriod(Kalendar calendar, Date periodStart, Date periodEnd) { public static List<KalendarEvent> listEventsForPeriod(Kalendar calendar, Date periodStart, Date periodEnd) {
List periodEvents = new ArrayList(); List<KalendarEvent> periodEvents = new ArrayList<KalendarEvent>();
Collection events = calendar.getEvents(); Collection<KalendarEvent> events = calendar.getEvents();
for (Iterator iter = events.iterator(); iter.hasNext();) { for (Iterator<KalendarEvent> iter = events.iterator(); iter.hasNext();) {
KalendarEvent event = (KalendarEvent) iter.next(); KalendarEvent event = iter.next();
CalendarManager cm = CalendarManagerFactory.getInstance().getCalendarManager(); CalendarManager cm = CalendarManagerFactory.getInstance().getCalendarManager();
List<KalendarRecurEvent> lstEvnt = cm.getRecurringDatesInPeriod(periodStart, periodEnd, event); List<KalendarRecurEvent> lstEvnt = cm.getRecurringDatesInPeriod(periodStart, periodEnd, event);
for ( KalendarRecurEvent recurEvent : lstEvnt ) { for ( KalendarRecurEvent recurEvent : lstEvnt ) {
...@@ -321,4 +320,16 @@ public class CalendarUtils { ...@@ -321,4 +320,16 @@ public class CalendarUtils {
return null; return null;
} }
} }
public static Date removeTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
} }
\ No newline at end of file
...@@ -18,6 +18,9 @@ cal.error.eventDeleted=Der gew\u00E4hlte Termin wurde in der Zwischenzeit von ei ...@@ -18,6 +18,9 @@ cal.error.eventDeleted=Der gew\u00E4hlte Termin wurde in der Zwischenzeit von ei
cal.error.save=Beim Speichern des Termins ist ein Fehler aufgetreten. Der Termin konnte nicht gespeichert werden. cal.error.save=Beim Speichern des Termins ist ein Fehler aufgetreten. Der Termin konnte nicht gespeichert werden.
cal.error.readonly=Sie haben keine Schreibrechte auf diesem Kalender cal.error.readonly=Sie haben keine Schreibrechte auf diesem Kalender
cal.eventdetails.hidden=(verborgen) cal.eventdetails.hidden=(verborgen)
cal.from=Von
cal.to=Bis
cal.print.desc=Wählen Sie die Start und End Datum.
cal.form.allday=Ganztags cal.form.allday=Ganztags
cal.form.begin=Beginn cal.form.begin=Beginn
cal.form.calendarname=Kalender cal.form.calendarname=Kalender
......
/**
* <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;
import java.util.Calendar;
import java.util.Date;
import org.olat.commons.calendar.CalendarManager;
import org.olat.commons.calendar.CalendarUtils;
import org.olat.commons.calendar.ui.events.KalendarGUIPrintEvent;
import org.olat.core.gui.UserRequest;
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.elements.DateChooser;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
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.link.Link;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.util.Util;
/**
*
* Initial date: 09.04.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class CalendarPrintController extends FormBasicController {
private FormLink printButton;
private DateChooser fromEl, toEl;
public CalendarPrintController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl);
setTranslator(Util.createPackageTranslator(CalendarManager.class, getLocale(), getTranslator()));
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
//default today to in one month
Date start = CalendarUtils.removeTime(new Date());
Calendar cal = Calendar.getInstance();
cal.setTime(start);
cal.add(Calendar.MONTH, 1);
Date end = cal.getTime();
setFormDescription("cal.print.desc");
fromEl = uifactory.addDateChooser("cal.from", start, formLayout);
toEl = uifactory.addDateChooser("cal.to", end, formLayout);
printButton = uifactory.addFormLink("print", formLayout, Link.BUTTON);
}
@Override
protected void doDispose() {
//
}
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(source == printButton) {
Date from = fromEl.getDate();
Date to = toEl.getDate();
fireEvent(ureq, new KalendarGUIPrintEvent(from, to));
}
super.formInnerEvent(ureq, source, event);
}
@Override
protected void formOK(UserRequest ureq) {
//
}
}
\ No newline at end of file
/**
* <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;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.olat.commons.calendar.CalendarUtils;
import org.olat.commons.calendar.model.KalendarEvent;
import org.olat.commons.calendar.ui.components.KalendarEventDateComparator;
import org.olat.commons.calendar.ui.components.KalendarEventRenderWrapper;
import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
import org.olat.core.dispatcher.mapper.Mapper;
import org.olat.core.gui.media.MediaResource;
import org.olat.core.gui.media.StringMediaResource;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
/**
*
* Initial date: 17.05.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class CalendarPrintMapper implements Mapper {
private final String themeBaseUri;
private final Translator translator;
private Date from, to;
private List<KalendarRenderWrapper> calendarWrappers;
private List<KalendarRenderWrapper> importedCalendarWrappers;
public CalendarPrintMapper(String themeBaseUri, Translator translator) {
this.themeBaseUri = themeBaseUri;
this.translator = translator;
}
public Date getFrom() {
return from;
}
public void setFrom(Date from) {
this.from = from;
}
public Date getTo() {
return to;
}
public void setTo(Date to) {
this.to = to;
}
public List<KalendarRenderWrapper> getCalendarWrappers() {
return calendarWrappers;
}
public void setCalendarWrappers(List<KalendarRenderWrapper> calendarWrappers) {
this.calendarWrappers = calendarWrappers;
}
public List<KalendarRenderWrapper> getImportedCalendarWrappers() {
return importedCalendarWrappers;
}
public void setImportedCalendarWrappers(List<KalendarRenderWrapper> importedCalendarWrappers) {
this.importedCalendarWrappers = importedCalendarWrappers;
}
@Override
public MediaResource handle(String relPath, HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
sb.append("<html><head><title>");
sb.append("Hello");
sb.append("</title>");
sb.append("<link href=\"").append(themeBaseUri).append("all/content.css\" rel=\"stylesheet\" type=\"text/css\" />\n");
sb.append("<link href=\"").append(themeBaseUri).append("layout.css\" rel=\"stylesheet\" type=\"text/css\" />\n");
sb.append("</title></head><body class='o_cal_print' onload='window.focus();window.print()'>");
//collect all events
List<KalendarEventRenderWrapper> sortedEventsWithin = new ArrayList<KalendarEventRenderWrapper>();
collectEvents(sortedEventsWithin, calendarWrappers);
collectEvents(sortedEventsWithin, importedCalendarWrappers);
Collections.sort(sortedEventsWithin, KalendarEventDateComparator.getInstance());
//list of events
renderEvents(sb, sortedEventsWithin, from, to);
//list of calendars
renderCalendars(sb) ;
sb.append("</body></html>");
StringMediaResource smr = new StringMediaResource();
smr.setContentType("text/html");
smr.setEncoding("UTF-8");
smr.setData(sb.toString());
return smr;
}
private void collectEvents(List<KalendarEventRenderWrapper> eventList, List<KalendarRenderWrapper> wrappers) {
for (KalendarRenderWrapper calendarWrapper:wrappers) {
if (calendarWrapper.getKalendarConfig().isVis()) {
List<KalendarEvent> events = CalendarUtils.listEventsForPeriod(calendarWrapper.getKalendar(), from, to);
for (KalendarEvent event : events) {
//private filter???
eventList.add(new KalendarEventRenderWrapper(event, calendarWrapper));
}
}
}
}
/*
<div class="o_cal_wv_print">
<ul class="o_cal_wv_list">
<li>
<span class="o_cal_date">Monday, May 13, 2013</span>
<ul class="o_cal_events">
<li class="o_cal_event">
<div class="o_cal_time"><span>4:00 AM - 9:00 AM</span></div>
<div class="o_cal_subject o_cal_blue"><p>Test</p></div>
</li>
</ul>
</li>
<li>
<span class="o_cal_date">Tuesday, May 14, 2013</span>
<ul class="o_cal_events">
<li class="o_cal_event">
<div class="o_cal_time"><span>2:00 PM - 3:00 PM</span></div>
<div class="o_cal_subject o_cal_blue"><p>Test 3</p></div>
</li>
</ul>
</li>
</ul>
<div class="b_clearfix">&nbsp;</div>
</div>
*/
private void renderEvents(StringBuilder sb, List<KalendarEventRenderWrapper> eventList, Date from , Date to) {
sb.append("<div class='o_cal_wv_print'><fieldset>")
.append("<legend>").append(StringHelper.formatLocaleDateFull(from, translator.getLocale()))
.append(" - ").append(StringHelper.formatLocaleDateFull(to, translator.getLocale()))
.append("</legend>")
.append("<ul class='o_cal_wv_list'>");
Collections.sort(eventList, new KalendarEventDateComparator());
Date currentDate = null;
List<KalendarEventRenderWrapper> eventByDayList = new ArrayList<KalendarEventRenderWrapper>();
for(KalendarEventRenderWrapper event:eventList) {
Date begin = event.getEvent().getBegin();
Date normalizedBegin = CalendarUtils.removeTime(begin);
//same day?
if(currentDate == null || currentDate.before(normalizedBegin)) {
renderDay(sb, currentDate, eventByDayList);
eventByDayList.clear();
currentDate = normalizedBegin;
}
eventByDayList.add(event);
}
renderDay(sb, currentDate, eventByDayList);
sb.append("</ul></fieldset><div class='b_clearfix'>&nbsp;</div></div>");
}
private void renderDay(StringBuilder sb, Date date, List<KalendarEventRenderWrapper> eventList) {
if(eventList.isEmpty()) return;
Date dayStart = date;
Calendar cal = Calendar.getInstance();
cal.setTime(dayStart);
cal.add(Calendar.DAY_OF_YEAR, 1);
Date dayEnd = cal.getTime();
sb.append("<li><span class='o_cal_date'>")
.append(StringHelper.formatLocaleDateFull(dayStart, translator.getLocale()))
.append("</span><ul class='o_cal_events'>");
for(KalendarEventRenderWrapper event:eventList) {
renderEvent(sb, event, dayStart, dayEnd);
}
sb.append("</ul></li>");
}
private void renderEvent(StringBuilder sb, KalendarEventRenderWrapper eventWrapper, Date dayStart, Date dayEnd) {
KalendarEvent event = eventWrapper.getEvent();
boolean hidden = eventWrapper.getCalendarAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY
&& !eventWrapper.getKalendarRenderWrapper().isImported() && event.getClassification() != KalendarEvent.CLASS_PUBLIC;
String escapedSubject = Formatter.escWithBR(event.getSubject()).toString();
escapedSubject = escapedSubject.replace('\r', ' ');
sb.append("<li class=\"o_cal_event\">\n");
// time
sb.append("<div class=\"o_cal_time\"><span>\n");
if (event.isAllDayEvent()) {
sb.append(translator.translate("cal.form.allday"));
} else {
// set start and end times for events spanning more than one day
Date begin = event.getBegin();
Date end = event.getEnd();
if (begin.before(dayStart)) {
begin = dayStart;
}
if (end.after(dayEnd)) {
end = dayEnd;
}
sb.append(StringHelper.formatLocaleTime(begin, translator.getLocale()));
sb.append(" - ");
sb.append(StringHelper.formatLocaleTime(end, translator.getLocale()));
}
sb.append("</span></div>\n");
// event name (subject)
//fxdiff BAKS-13: firefox doesn't break lines with only <br />, we need <p>
sb.append("<div class=\"o_cal_subject " + eventWrapper.getCssClass() + "\"><p>");
if (hidden) {
sb.append("-");
} else {
sb.append(escapedSubject.replace("<br />", "</p><p>"));
}
sb.append("</p></div>\n");
// location
if (StringHelper.containsNonWhitespace(event.getLocation())) {
sb.append("<div class=\"o_cal_location\"><span>\n");
sb.append(translator.translate("cal.form.location") + ": ");
if (!hidden) {
sb.append(event.getLocation());
}
sb.append("</span></div>\n");
}
sb.append("</li>\n");
}
/*
<div id="o_cal_config">
<fieldset>
<legend>List of calendars</legend>
<div class="o_cal_config_row">
<div class="o_cal_config_calendar o_cal_blue">
kanu
</div>
</div>
</fieldset>
</div>
*/
private void renderCalendars(StringBuilder sb) {
sb.append("<div id='o_cal_config'>")
.append("<fieldset><legend>").append(translator.translate("cal.list")).append("</legend>");
renderCalendar(sb, calendarWrappers);
sb.append("</fieldset>");
//list of imported calendars
sb.append("<fieldset><legend>").append(translator.translate("cal.import.list")).append("</legend>");
renderCalendar(sb, importedCalendarWrappers);
sb.append("</fieldset>")
.append("</div>");
}
private void renderCalendar(StringBuilder sb, List<KalendarRenderWrapper> calendarWrappers) {
for(KalendarRenderWrapper calendarWrapper:calendarWrappers) {
String cssClass = calendarWrapper.getKalendarConfig().getCss();
sb.append("<div class='o_cal_config_row'><div class='o_cal_config_calendar ").append(cssClass).append("'>")
.append(calendarWrapper.getKalendarConfig().getDisplayName())
.append("</div></div>");
}
}
}
\ No newline at end of file
...@@ -121,13 +121,13 @@ public class SearchAllCalendarsController extends BasicController { ...@@ -121,13 +121,13 @@ public class SearchAllCalendarsController extends BasicController {
KalendarRenderWrapper kalendarWrapper = (KalendarRenderWrapper)iter.next(); KalendarRenderWrapper kalendarWrapper = (KalendarRenderWrapper)iter.next();
// for locally read-only calendars: search only public events, for imported calendar search in private and public events // for locally read-only calendars: search only public events, for imported calendar search in private and public events
boolean searchPublicEventsOnly = (kalendarWrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY) && !kalendarWrapper.isImported(); boolean searchPublicEventsOnly = (kalendarWrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY) && !kalendarWrapper.isImported();
List matchingEvents = CalendarUtils.findEvents(kalendarWrapper.getKalendar(), subject, location, beginPeriod, endPeriod, searchPublicEventsOnly); List<KalendarEvent> matchingEvents = CalendarUtils.findEvents(kalendarWrapper.getKalendar(), subject, location, beginPeriod, endPeriod, searchPublicEventsOnly);
if (matchingEvents.size() == 0) continue; if (matchingEvents.size() == 0) continue;
GenericTreeNode calendarNode = new GenericTreeNode("<i>" + translate("cal.form.calendarname") + ": " + kalendarWrapper.getKalendarConfig().getDisplayName() + "</i>", null); GenericTreeNode calendarNode = new GenericTreeNode("<i>" + translate("cal.form.calendarname") + ": " + kalendarWrapper.getKalendarConfig().getDisplayName() + "</i>", null);
calendarNode.setAccessible(false); calendarNode.setAccessible(false);
rootNode.addChild(calendarNode); rootNode.addChild(calendarNode);
for (Iterator Iter_matching = matchingEvents.iterator(); Iter_matching.hasNext();) { for (Iterator<KalendarEvent> Iter_matching = matchingEvents.iterator(); Iter_matching.hasNext();) {
KalendarEvent matchingEvent = (KalendarEvent) Iter_matching.next(); KalendarEvent matchingEvent = Iter_matching.next();
StringBuilder display = new StringBuilder(); StringBuilder display = new StringBuilder();
String truncatedSubject = matchingEvent.getSubject(); String truncatedSubject = matchingEvent.getSubject();
if (truncatedSubject.length() > CalendarManager.MAX_SUBJECT_DISPLAY_LENGTH) if (truncatedSubject.length() > CalendarManager.MAX_SUBJECT_DISPLAY_LENGTH)
......
...@@ -47,6 +47,7 @@ import org.olat.commons.calendar.ui.events.KalendarGUIAddEvent; ...@@ -47,6 +47,7 @@ import org.olat.commons.calendar.ui.events.KalendarGUIAddEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIEditEvent; import org.olat.commons.calendar.ui.events.KalendarGUIEditEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIImportEvent; import org.olat.commons.calendar.ui.events.KalendarGUIImportEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIMoveEvent; import org.olat.commons.calendar.ui.events.KalendarGUIMoveEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIPrintEvent;
import org.olat.commons.calendar.ui.events.KalendarGUISelectEvent; import org.olat.commons.calendar.ui.events.KalendarGUISelectEvent;
import org.olat.commons.calendar.ui.events.KalendarModifiedEvent; import org.olat.commons.calendar.ui.events.KalendarModifiedEvent;
import org.olat.core.CoreSpringFactory; import org.olat.core.CoreSpringFactory;
...@@ -68,6 +69,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle ...@@ -68,6 +69,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle
import org.olat.core.gui.control.generic.dtabs.Activateable2; 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.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.gui.control.winmgr.JSCommand;
import org.olat.core.id.UserConstants; import org.olat.core.id.UserConstants;
import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.BusinessControlFactory;
import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.ContextEntry;
...@@ -112,6 +114,8 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -112,6 +114,8 @@ public class WeeklyCalendarController extends FormBasicController implements Act
private GotoDateCalendarsForm gotoDateForm; private GotoDateCalendarsForm gotoDateForm;
private SubscriptionContext subsContext; private SubscriptionContext subsContext;
private ContextualSubscriptionController csc; private ContextualSubscriptionController csc;
private CalendarPrintController printCtrl;
private CalendarDetailsController eventDetailsCtr; private CalendarDetailsController eventDetailsCtr;
private CloseableCalloutWindowController eventCalloutCtr; private CloseableCalloutWindowController eventCalloutCtr;
...@@ -170,6 +174,9 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -170,6 +174,9 @@ public class WeeklyCalendarController extends FormBasicController implements Act
this(ureq, wControl, calendarWrappers, new ArrayList<KalendarRenderWrapper>(), caller, calendarSubscription, eventAlwaysVisible); this(ureq, wControl, calendarWrappers, new ArrayList<KalendarRenderWrapper>(), caller, calendarSubscription, eventAlwaysVisible);
} }
private CalendarPrintMapper printMapper;
private String printUrl;
/** /**
* Display week view of calendar. Add the calendars to be displayed via * Display week view of calendar. Add the calendars to be displayed via
* addKalendarWrapper(KalendarRenderWrapper kalendarWrapper) method. * addKalendarWrapper(KalendarRenderWrapper kalendarWrapper) method.
...@@ -193,6 +200,10 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -193,6 +200,10 @@ public class WeeklyCalendarController extends FormBasicController implements Act
this.importedCalendarWrappers = importedCalendarWrappers; this.importedCalendarWrappers = importedCalendarWrappers;
this.calendarSubscription = calendarSubscription; this.calendarSubscription = calendarSubscription;
this.caller = caller; this.caller = caller;
String themeBaseUri = wControl.getWindowBackOffice().getWindow().getGuiTheme().getBaseURI();
printMapper = new CalendarPrintMapper(themeBaseUri, getTranslator());
printUrl = registerMapper(ureq, printMapper);
initForm(ureq); initForm(ureq);
...@@ -389,6 +400,13 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -389,6 +400,13 @@ public class WeeklyCalendarController extends FormBasicController implements Act
flc.contextPut("isSubscribed", new Boolean(calendarSubscription.isSubscribed())); flc.contextPut("isSubscribed", new Boolean(calendarSubscription.isSubscribed()));
CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new KalendarModifiedEvent(), OresHelper.lookupType(CalendarManager.class)); CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new KalendarModifiedEvent(), OresHelper.lookupType(CalendarManager.class));
} }
} else if (event instanceof KalendarGUIPrintEvent) {
KalendarGUIPrintEvent printEvent = (KalendarGUIPrintEvent)event;
if(printEvent.getFrom() != null && printEvent.getTo() != null) {
doPrint(ureq, printEvent.getFrom(), printEvent.getTo());
} else if(printEvent.getTargetDomId() != null) {
doPrintEventCallout(ureq, printEvent.getTargetDomId());
}
} }
super.formInnerEvent(ureq, source, event); super.formInnerEvent(ureq, source, event);
} }
...@@ -439,6 +457,14 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -439,6 +457,14 @@ public class WeeklyCalendarController extends FormBasicController implements Act
KalendarGUIEditEvent editEvent = (KalendarGUIEditEvent)event; KalendarGUIEditEvent editEvent = (KalendarGUIEditEvent)event;
pushEditEventController(ureq, editEvent.getKalendarEvent(), editEvent.getKalendarRenderWrapper()); pushEditEventController(ureq, editEvent.getKalendarEvent(), editEvent.getKalendarRenderWrapper());
} }
} else if(source == printCtrl) {
if (event instanceof KalendarGUIPrintEvent) {
KalendarGUIPrintEvent printEvent = (KalendarGUIPrintEvent)event;
if(printEvent.getFrom() != null && printEvent.getTo() != null) {
doPrint(ureq, printEvent.getFrom(), printEvent.getTo());
}
}
eventCalloutCtr.deactivate();
} else if (source == importCalendarController) { } else if (source == importCalendarController) {
cmc.deactivate(); cmc.deactivate();
} else if(source == cmc && event == CloseableModalController.CLOSE_MODAL_EVENT){ } else if(source == cmc && event == CloseableModalController.CLOSE_MODAL_EVENT){
...@@ -536,6 +562,30 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -536,6 +562,30 @@ public class WeeklyCalendarController extends FormBasicController implements Act
} }
} }
private void doPrint(UserRequest ureq, 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);
printMapper.setImportedCalendarWrappers(importedCalendarWrappers);
getWindowControl().getWindowBackOffice().sendCommandTo(new JSCommand(sb.toString()));
}
private void doPrintEventCallout(UserRequest ureq, String targetDomId) {
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, "b_cal_event_callout");
listenTo(eventCalloutCtr);
eventCalloutCtr.activate();
}
private void doOpenEventCallout(UserRequest ureq, KalendarEvent calEvent, KalendarRenderWrapper calWrapper, String targetDomId) { private void doOpenEventCallout(UserRequest ureq, KalendarEvent calEvent, KalendarRenderWrapper calWrapper, String targetDomId) {
removeAsListenerAndDispose(eventCalloutCtr); removeAsListenerAndDispose(eventCalloutCtr);
removeAsListenerAndDispose(eventDetailsCtr); removeAsListenerAndDispose(eventDetailsCtr);
...@@ -687,5 +737,4 @@ public class WeeklyCalendarController extends FormBasicController implements Act ...@@ -687,5 +737,4 @@ public class WeeklyCalendarController extends FormBasicController implements Act
} }
} }
} }
} }
\ No newline at end of file
...@@ -52,6 +52,7 @@ public class FullCalendarComponentRenderer implements ComponentRenderer { ...@@ -52,6 +52,7 @@ public class FullCalendarComponentRenderer implements ComponentRenderer {
Form rootForm = fcE.getRootForm(); Form rootForm = fcE.getRootForm();
String id = "o_c" + fcC.getDispatchID(); String id = "o_c" + fcC.getDispatchID();
String formId = fcE.getFormDispatchId(); String formId = fcE.getFormDispatchId();
String printId = "fc_p" + fcC.getDispatchID();
Calendar cal = Calendar.getInstance(fcC.getTranslator().getLocale()); Calendar cal = Calendar.getInstance(fcC.getTranslator().getLocale());
int firstDay = cal.getFirstDayOfWeek() - 1; int firstDay = cal.getFirstDayOfWeek() - 1;
...@@ -63,7 +64,7 @@ public class FullCalendarComponentRenderer implements ComponentRenderer { ...@@ -63,7 +64,7 @@ public class FullCalendarComponentRenderer implements ComponentRenderer {
.append("jQuery(function() {\n") .append("jQuery(function() {\n")
.append(" jQuery('#").append(id).append("').fullCalendar( {\n") .append(" jQuery('#").append(id).append("').fullCalendar( {\n")
.append(" header: {\n") .append(" header: {\n")
.append(" left: 'prev,next today',\n") .append(" left: 'prev,print,next today',\n")
.append(" center: 'title',\n") .append(" center: 'title',\n")
.append(" right: 'month,agendaWeek,agendaDay'\n") .append(" right: 'month,agendaWeek,agendaDay'\n")
.append(" },\n") .append(" },\n")
...@@ -71,7 +72,8 @@ public class FullCalendarComponentRenderer implements ComponentRenderer { ...@@ -71,7 +72,8 @@ public class FullCalendarComponentRenderer implements ComponentRenderer {
.append(" today: '").append(escapeJavaScript(translator.translate("cal.thisweek"))).append("',\n") .append(" today: '").append(escapeJavaScript(translator.translate("cal.thisweek"))).append("',\n")
.append(" month: '").append(escapeJavaScript(translator.translate("cal.month"))).append("',\n") .append(" month: '").append(escapeJavaScript(translator.translate("cal.month"))).append("',\n")
.append(" day: '").append(escapeJavaScript(translator.translate("cal.day"))).append("',\n") .append(" day: '").append(escapeJavaScript(translator.translate("cal.day"))).append("',\n")
.append(" week: '").append(escapeJavaScript(translator.translate("cal.week"))).append("'\n") .append(" week: '").append(escapeJavaScript(translator.translate("cal.week"))).append("',\n")
.append(" print: '").append(escapeJavaScript(translator.translate("print"))).append("'\n")
.append(" },\n") .append(" },\n")
.append(" monthNames: ").append(getMonthLong(translator)).append(",\n") .append(" monthNames: ").append(getMonthLong(translator)).append(",\n")
.append(" monthNamesShort: ").append(getMonthShort(translator)).append(",\n") .append(" monthNamesShort: ").append(getMonthShort(translator)).append(",\n")
...@@ -124,7 +126,13 @@ public class FullCalendarComponentRenderer implements ComponentRenderer { ...@@ -124,7 +126,13 @@ public class FullCalendarComponentRenderer implements ComponentRenderer {
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1)) .append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt,'evSelect',calEvent.id,'evDomId','o_cev_' + calEvent.id);\n") .append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt,'evSelect',calEvent.id,'evDomId','o_cev_' + calEvent.id);\n")
.append(" }\n") .append(" }\n")
.append(" })\n") .append(" });\n")
.append(" jQuery('.fc-header-left').append('<span class=\"fc-header-space\"></span><span id=\"").append(printId).append("\" class=\"fc-button fc-button-print fc-state-default fc-corner-left fc-corner-right\"><span>")
.append(translator.translate("print")).append("</span></span>');\n")
.append(" jQuery('.fc-button-print').click(function () {\n")
.append(FormJSHelper.generateXHRFnCallVariables(rootForm, formId, 1))
.append(" o_ffXHREvent(formNam, dispIdField, dispId, eventIdField, eventInt,'print','print');\n")
.append(" });\n")
.append("});\n") .append("});\n")
.append("/* ]]> */\n") .append("/* ]]> */\n")
.append("</script>"); .append("</script>");
......
...@@ -26,6 +26,7 @@ import java.util.List; ...@@ -26,6 +26,7 @@ import java.util.List;
import org.olat.commons.calendar.model.KalendarEvent; import org.olat.commons.calendar.model.KalendarEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIAddEvent; import org.olat.commons.calendar.ui.events.KalendarGUIAddEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIMoveEvent; import org.olat.commons.calendar.ui.events.KalendarGUIMoveEvent;
import org.olat.commons.calendar.ui.events.KalendarGUIPrintEvent;
import org.olat.commons.calendar.ui.events.KalendarGUISelectEvent; import org.olat.commons.calendar.ui.events.KalendarGUISelectEvent;
import org.olat.core.gui.UserRequest; import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.impl.FormItemImpl; import org.olat.core.gui.components.form.flexible.impl.FormItemImpl;
...@@ -84,10 +85,14 @@ public class FullCalendarElement extends FormItemImpl { ...@@ -84,10 +85,14 @@ public class FullCalendarElement extends FormItemImpl {
String addEventMarker = getRootForm().getRequestParameter("evAdd"); String addEventMarker = getRootForm().getRequestParameter("evAdd");
String movedEventId = getRootForm().getRequestParameter("evMove"); String movedEventId = getRootForm().getRequestParameter("evMove");
String changeViewName = getRootForm().getRequestParameter("evChangeView"); String changeViewName = getRootForm().getRequestParameter("evChangeView");
String print = getRootForm().getRequestParameter("print");
String dispatchuri = getRootForm().getRequestParameter("dispatchuri"); String dispatchuri = getRootForm().getRequestParameter("dispatchuri");
if("undefined".equals(dispatchuri)) { if("undefined".equals(dispatchuri)) {
//to nothing //to nothing
} else if(StringHelper.containsNonWhitespace(print)) {
String targetDomId = "fc_p" + component.getDispatchID();
getRootForm().fireFormEvent(ureq, new KalendarGUIPrintEvent(targetDomId));
} else if(StringHelper.containsNonWhitespace(selectedEventId)) { } else if(StringHelper.containsNonWhitespace(selectedEventId)) {
String targetDomId = getRootForm().getRequestParameter("evDomId"); String targetDomId = getRootForm().getRequestParameter("evDomId");
doSelect(ureq, selectedEventId, targetDomId); doSelect(ureq, selectedEventId, targetDomId);
......
...@@ -29,21 +29,22 @@ import java.util.Comparator; ...@@ -29,21 +29,22 @@ import java.util.Comparator;
import java.util.Date; import java.util.Date;
class KalendarEventDateComparator implements Comparator { public class KalendarEventDateComparator implements Comparator<KalendarEventRenderWrapper> {
private static final KalendarEventDateComparator INSTANCE = new KalendarEventDateComparator(); private static final KalendarEventDateComparator INSTANCE = new KalendarEventDateComparator();
private KalendarEventDateComparator() { public KalendarEventDateComparator() {
// singleton //
} }
public static KalendarEventDateComparator getInstance() { public static KalendarEventDateComparator getInstance() {
return INSTANCE; return INSTANCE;
} }
public int compare(Object event0, Object event1) { @Override
Date startEvent0 = ((KalendarEventRenderWrapper)event0).getEvent().getBegin(); public int compare(KalendarEventRenderWrapper event0, KalendarEventRenderWrapper event1) {
Date startEvent1 = ((KalendarEventRenderWrapper)event1).getEvent().getBegin(); Date startEvent0 = event0.getEvent().getBegin();
Date startEvent1 = event1.getEvent().getBegin();
return startEvent0.compareTo(startEvent1); return startEvent0.compareTo(startEvent1);
} }
} }
/**
* <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.events;
import java.util.Date;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
/**
*
* Initial date: 17.05.2013<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class KalendarGUIPrintEvent extends FormEvent {
private static final long serialVersionUID = -3476226273509422030L;
public static final String CMD_PRINT = "printcalevent";
private Date from;
private Date to;
private String targetDomId;
public KalendarGUIPrintEvent(String targetDomId) {
super(CMD_PRINT, null);
this.targetDomId = targetDomId;
}
public KalendarGUIPrintEvent(Date from, Date to) {
super(CMD_PRINT, null);
this.from = from;
this.to = to;
}
public String getTargetDomId() {
return targetDomId;
}
public Date getFrom() {
return from;
}
public Date getTo() {
return to;
}
}
...@@ -122,6 +122,17 @@ public class StringHelper { ...@@ -122,6 +122,17 @@ public class StringHelper {
if (date == -1) return "-"; if (date == -1) return "-";
return DateFormat.getDateInstance(DateFormat.FULL, locale).format(new Date(date)); return DateFormat.getDateInstance(DateFormat.FULL, locale).format(new Date(date));
} }
/**
*
* @param date
* @param locale
* @return Formatted date
*/
public static String formatLocaleDateFull(Date date, Locale locale) {
if (date == null) return "-";
return DateFormat.getDateInstance(DateFormat.FULL, locale).format(date);
}
/** /**
* @param date * @param date
...@@ -142,6 +153,17 @@ public class StringHelper { ...@@ -142,6 +153,17 @@ public class StringHelper {
if (time == -1) return "-"; if (time == -1) return "-";
return DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(new Date(time)); return DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(new Date(time));
} }
/**
*
* @param time
* @param locale
* @return
*/
public static String formatLocaleTime(Date time, Locale locale) {
if (time == null) return "-";
return DateFormat.getTimeInstance(DateFormat.SHORT, locale).format(time);
}
/** /**
* @param mem * @param mem
......
...@@ -571,6 +571,12 @@ option.White { background-color: White ; } ...@@ -571,6 +571,12 @@ option.White { background-color: White ; }
@charset "UTF-8"; @charset "UTF-8";
/* container for the calendar and the calenda config below the calendar */ /* container for the calendar and the calenda config below the calendar */
@media all { @media all {
.fc-button-print span {
background: url(../openolat/images/printer.png) no-repeat right 50%;
padding: 0 20px 0 0;
}
#o_cal_manage_calendars { #o_cal_manage_calendars {
float: right; float: right;
margin-right: 10px; margin-right: 10px;
...@@ -1001,16 +1007,39 @@ div.o_cal_week_year_label {font-weight: bold; margin-top:8px;} ...@@ -1001,16 +1007,39 @@ div.o_cal_week_year_label {font-weight: bold; margin-top:8px;}
.o_cal_wv_event_tooltip { display: none; } .o_cal_wv_event_tooltip { display: none; }
.o_cal_tooltip_buttons { text-align: right; } .o_cal_tooltip_buttons { text-align: right; }
.o_cal_wv .x-tip-body div { padding: 0.2em 0; } .o_cal_wv .x-tip-body div { padding: 0.2em 0; }
div.o_cal_wv_event_tooltip {} //div.o_cal_wv_event_tooltip {}
div.o_cal_wv_event_tooltip_content { padding-top: 1em;} div.o_cal_wv_event_tooltip_content { padding-top: 1em;}
div.o_cal_time { } //div.o_cal_time { }
div.o_cal_location {} //div.o_cal_location {}
div.o_cal_tooltip_buttons{padding-top: 1em;} div.o_cal_tooltip_buttons{padding-top: 1em;}
div.o_cal_links {} //div.o_cal_links {}
body.o_cal_print {
background:white;
.o_cal_toptoolbar.b_clearfix { display: none; } /* hide top toolbar */
.o_cal_wv { display: none; } /* hide grid calendar */
.o_cal_wv_print { display: block; } /* display the print view */
#o_cal_config .b_float_right { display: none; } /* hide buttons */
#o_cal_config_below_cal_container .b_subcolumns { display: none; } /* hide date navigation and search link */
.o_cal_wv_print ul { list-style-type: none; margin:0 0 0 0; padding: 0 0 0 0; }
.o_cal_event { clear:left; margin: 0.2em 0; }
.o_cal_wv_list * { float: left; width: 100%; } /* float all elements in order to fully include floating children */
.o_cal_event span { padding: 0 0.4em; display:block; }
.o_cal_date { font-weight: bold; }
.o_cal_time { width: 25%; }
.o_cal_subject { width: 40%; border-left-style: solid; border-left-width: thick; background: white; }
.o_cal_subject p { padding:0 0.4em; margin:0; color: black; }
.o_cal_location { float: right; width: 34%; } /* Since subject has a 1px border, decrease the width of location by 1% */
.o_cal_config_scrollwrapper { width: auto; height: auto; overflow: visible; overflow-x: visible; }
.o_cal_config_calendar { border-width: 0; border-left-style: solid; border-left-width: thick; float: none; display: block; color:black; background:white; }
}
/* hide the print layout */ /* hide the print layout */
.o_cal_wv_print { display: none; } //.o_cal_wv_print { display: none; }
} /* end all media styles */ } /* end all media styles */
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment