/**
* 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.
* <p>
*/
package org.olat.commons.calendar.ui;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.olat.commons.calendar.CalendarManager;
import org.olat.commons.calendar.CalendarManagerFactory;
import org.olat.commons.calendar.model.Kalendar;
import org.olat.commons.calendar.model.KalendarEvent;
import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.form.Form;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.tabbedpane.TabbedPane;
import org.olat.core.gui.components.tabbedpane.TabbedPaneChangedEvent;
import org.olat.core.gui.components.velocity.VelocityContainer;
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.controller.BasicController;
import org.olat.core.gui.control.generic.modal.DialogBoxController;
import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
import org.olat.core.gui.translator.PackageTranslator;
import org.olat.core.util.Util;
public class KalendarEntryDetailsController extends BasicController {
private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(CalendarManager.class);
private Collection availableCalendars;
private boolean isNew, isReadOnly;
private KalendarEvent kalendarEvent;
private Panel mainPanel;
private VelocityContainer mainVC, eventVC, linkVC;
private TabbedPane pane;
private KalendarEntryForm eventForm;
private LinkProvider activeLinkProvider;
private DialogBoxController deleteYesNoController;
private CopyEventToCalendarController copyEventToCalendarController;
private Link deleteButton;
public KalendarEntryDetailsController(UserRequest ureq, KalendarEvent kalendarEvent, KalendarRenderWrapper calendarWrapper,
List availableCalendars, boolean isNew, String caller, WindowControl wControl) {
super(ureq, wControl);
this.availableCalendars = availableCalendars;
this.kalendarEvent = kalendarEvent;
this.isNew = isNew;
setTranslator(new PackageTranslator(CalendarManager.class.getPackage().getName(), getLocale()));
mainVC = new VelocityContainer("calEditMain", VELOCITY_ROOT + "/calEditMain.html", getTranslator(), this);
mainVC.contextPut("caller", caller);
pane = new TabbedPane("pane", getLocale());
pane.addListener(this);
mainVC.put("pane", pane);
eventVC = new VelocityContainer("calEditDetails", VELOCITY_ROOT + "/calEditDetails.html", getTranslator(), this);
deleteButton = LinkFactory.createButton("cal.edit.delete", eventVC, this);
eventVC.contextPut("caller", caller);
eventForm = new KalendarEntryForm("eventForm", kalendarEvent, calendarWrapper, availableCalendars, isNew, getLocale());
eventForm.addListener(this);
eventVC.put("eventForm", eventForm);
eventVC.contextPut("isNewEvent", new Boolean(isNew));
isReadOnly = calendarWrapper.getAccess() == KalendarRenderWrapper.ACCESS_READ_ONLY;
eventVC.contextPut("isReadOnly", new Boolean(isReadOnly));
pane.addTab(translate("tab.event"), eventVC);
linkVC = new VelocityContainer("calEditLinks", VELOCITY_ROOT + "/calEditLinks.html", getTranslator(), this);
linkVC.contextPut("caller", caller);
if (!isReadOnly)
pane.addTab(translate("tab.links"), linkVC);
// wrap everything in a panel
mainPanel = putInitialPanel(mainVC);
}
public void event(UserRequest ureq, Component source, Event event) {
if (source == pane) {
if (event instanceof TabbedPaneChangedEvent) {
// prepare links tab
TabbedPaneChangedEvent tpce = (TabbedPaneChangedEvent)event;
if (tpce.getNewComponent().equals(linkVC)) {
// display link provider if any
String calendarID = eventForm.getChoosenKalendarID();
KalendarRenderWrapper calendarWrapper = null;
for (Iterator iter = availableCalendars.iterator(); iter.hasNext();) {
calendarWrapper = (KalendarRenderWrapper) iter.next();
if (calendarWrapper.getKalendar().getCalendarID().equals(calendarID)) break;
}
if(activeLinkProvider == null) {
activeLinkProvider = calendarWrapper.getLinkProvider();
if (activeLinkProvider != null) {
activeLinkProvider.addControllerListener(this);
activeLinkProvider.setKalendarEvent(kalendarEvent);
activeLinkProvider.setDisplayOnly(isReadOnly);
linkVC.put("linkprovider", activeLinkProvider.getControler().getInitialComponent());
linkVC.contextPut("hasLinkProvider", Boolean.TRUE);
} else {
linkVC.contextPut("hasLinkProvider", Boolean.FALSE);
}
}
}
}
} else if (source == eventForm) {
if (event == Form.EVNT_VALIDATION_OK) {
// ok, save edited entry
kalendarEvent = eventForm.getUpdatedKalendarEvent();
boolean doneSuccessfully = true;
if (isNew) {
// this is a new event, add event to calendar
String calendarID = eventForm.getChoosenKalendarID();
for (Iterator iter = availableCalendars.iterator(); iter.hasNext();) {
KalendarRenderWrapper calendarWrapper = (KalendarRenderWrapper) iter.next();
if (!calendarWrapper.getKalendar().getCalendarID().equals(calendarID)) continue;
Kalendar cal = calendarWrapper.getKalendar();
boolean result = CalendarManagerFactory.getInstance().getCalendarManager().addEventTo(cal, kalendarEvent);
if (result==false) {
// if one failed => done not successfully
doneSuccessfully = false;
}
}
} else {
// this is an existing event, so we get the previousely assigned calendar from the event
Kalendar cal = kalendarEvent.getCalendar();
doneSuccessfully =CalendarManagerFactory.getInstance().getCalendarManager().updateEventFrom(cal, kalendarEvent);
}
// check if event is still available
if (!doneSuccessfully) {
showError("cal.error.save");
fireEvent(ureq, Event.FAILED_EVENT);
return;
}
if (eventForm.getSelectedSubmitKey().equals(KalendarEntryForm.SUBMIT_MULTI)) {
// offer to copy event to multiple calendars.
copyEventToCalendarController = new CopyEventToCalendarController(kalendarEvent, availableCalendars, getTranslator(), getWindowControl());
copyEventToCalendarController.addControllerListener(this);
mainPanel.setContent(copyEventToCalendarController.getInitialComponent());
return;
}
// saving was ok, finish workflow
fireEvent(ureq, Event.DONE_EVENT);
} else if (event == Form.EVNT_FORM_CANCELLED) {
eventForm.setEntry(kalendarEvent);
// user canceled, finish workflow
fireEvent(ureq, Event.DONE_EVENT);
}
} else if (source == deleteButton) {
// delete calendar entry
deleteYesNoController = activateYesNoDialog(ureq, null, translate("cal.delete.dialogtext"), deleteYesNoController);
return;
}
}
public void event(UserRequest ureq, Controller source, Event event) {
if (source == deleteYesNoController) {
if (DialogBoxUIFactory.isYesEvent(event)) {
Kalendar cal = kalendarEvent.getCalendar();
CalendarManagerFactory.getInstance().getCalendarManager().removeEventFrom(cal,kalendarEvent);
fireEvent(ureq, Event.DONE_EVENT);
}
} else if (source == copyEventToCalendarController) {
if (event.equals(Event.DONE_EVENT))
fireEvent(ureq, Event.DONE_EVENT);
else if (event.equals(Event.CANCELLED_EVENT))
mainPanel.setContent(mainVC);
} else if (source == activeLinkProvider) {
fireEvent(ureq, Event.DONE_EVENT);
}
}
protected void doDispose() {
// DialogBoxController gets disposed by BasicController
}
public KalendarEvent getKalendarEvent() {
return kalendarEvent;
}
}