//<OLATCE-103> /** * <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> * BPS Bildungsportal Sachsen GmbH, http://www.bps-system.de * <p> */ package de.bps.course.nodes.vc; import java.util.Date; import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.tabbedpane.TabbedPane; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.ControllerEventListener; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; 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.tabbable.ActivateableTabbableDefaultController; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentHelper; import org.olat.course.condition.Condition; import org.olat.course.condition.ConditionEditController; import org.olat.course.editor.NodeEditController; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.ModuleConfiguration; import de.bps.course.nodes.VCCourseNode; import de.bps.course.nodes.vc.provider.VCProvider; import de.bps.course.nodes.vc.provider.VCProviderFactory; /** * Description:<br> * Edit controller for dates list course nodes - Virtual Classroom dates . * * <P> * Initial Date: 30.08.2010 <br> * * @author Jens Lindner (jlindne4@hs-mittweida.de) * @author skoeber */ public class VCEditController extends ActivateableTabbableDefaultController implements ControllerEventListener { private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility"; public static final String PANE_TAB_VCCONFIG = "pane.tab.vcconfig"; final static String[] paneKeys = { PANE_TAB_VCCONFIG, PANE_TAB_ACCESSIBILITY }; // GUI private VelocityContainer editVc; private ConditionEditController accessibilityCondContr; private TabbedPane tabPane; private Controller configCtr; private VCSelectionForm selForm; private VCEditForm editForm; private DialogBoxController yesNoUpdate; private DialogBoxController yesNoDelete; // runtime data private VCCourseNode courseNode; private VCConfiguration config; private VCProvider provider; private String roomId; public VCEditController(UserRequest ureq, WindowControl wControl, VCCourseNode courseNode, ICourse course, UserCourseEnvironment userCourseEnv, VCProvider provider, VCConfiguration config) { super(ureq, wControl); this.courseNode = courseNode; this.config = config; this.provider = provider; editVc = this.createVelocityContainer("edit"); Condition accessCondition = courseNode.getPreConditionAccess(); accessibilityCondContr = new ConditionEditController(ureq, wControl, userCourseEnv, accessCondition, AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), courseNode)); listenTo(accessibilityCondContr); // show selection form when there is more than one registered virtual classroom provider List<VCProvider> registeredProviders = VCProviderFactory.getProviders(); if(registeredProviders.size() > 1) { selForm = new VCSelectionForm(ureq, wControl, provider.getProviderId()); listenTo(selForm); editVc.put("VCSelectionForm", selForm.getInitialComponent()); } editForm = new VCEditForm(ureq, wControl, provider.getTemplates(), (DefaultVCConfiguration) config); listenTo(editForm); editVc.put("editForm", editForm.getInitialComponent()); roomId = course.getResourceableId() + "_" + courseNode.getIdent(); configCtr = provider.createConfigController(ureq, wControl, roomId, config); listenTo(configCtr); editVc.put("configCtr", configCtr.getInitialComponent()); } @Override public String[] getPaneKeys() { return paneKeys; } @Override public TabbedPane getTabbedPane() { return tabPane; } @Override protected void doDispose() { if(configCtr != null) { removeAsListenerAndDispose(configCtr); configCtr = null; } if(editForm != null) { removeAsListenerAndDispose(editForm); editForm = null; } if(selForm != null) { removeAsListenerAndDispose(selForm); selForm = null; } if(yesNoDelete != null) { removeAsListenerAndDispose(yesNoDelete); yesNoDelete = null; } if(yesNoUpdate != null) { removeAsListenerAndDispose(yesNoUpdate); yesNoUpdate = null; } } @Override protected void event(UserRequest ureq, Component source, Event event) { // nothing to do } @Override protected void event(UserRequest ureq, Controller source, Event event) { if (source == accessibilityCondContr) { if (event == Event.CHANGED_EVENT) { Condition cond = accessibilityCondContr.getCondition(); courseNode.setPreConditionAccess(cond); fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); } } else if (source == configCtr | source == editForm) { courseNode.getModuleConfiguration().set(VCCourseNode.CONF_VC_CONFIGURATION, config); courseNode.getModuleConfiguration().setStringValue(VCCourseNode.CONF_PROVIDER_ID, config.getProviderId()); /* if(provider.existsClassroom(roomId, config)) { removeAsListenerAndDispose(yesNoUpdate); yesNoUpdate = DialogBoxUIFactory.createYesNoDialog(ureq, getWindowControl(), translate("sync.meeting.title"), translate("sync.meeting.text")); listenTo(yesNoUpdate); yesNoUpdate.activate(); } */ fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); } else if (source == selForm) { /* * If classroom already exists and the user changes the provider, * the existing room has to be deleted for cleanup purposes. Ask * the user if this is intended. */ if(provider.existsClassroom(roomId, config)) { removeAsListenerAndDispose(yesNoDelete); yesNoDelete = DialogBoxUIFactory.createYesNoDialog(ureq, getWindowControl(), translate("delete.meeting.title"), translate("delete.meeting.text")); listenTo(yesNoDelete); yesNoDelete.activate(); } else { reset(ureq); } } else if (source == yesNoDelete) { if(DialogBoxUIFactory.isYesEvent(event)) { provider.removeClassroom(roomId, config); reset(ureq); } } else if(source == yesNoUpdate) { if(DialogBoxUIFactory.isYesEvent(event)) { Date allBegin = null, allEnd = null; if(config.getMeetingDates() != null) { for(MeetingDate date : config.getMeetingDates()) { Date begin = date.getBegin(); Date end = date.getEnd(); allBegin = allBegin == null ? begin : begin.before(allBegin) ? begin : allBegin; allEnd = allEnd == null ? end : end.after(allEnd) ? end : allEnd; } } boolean success = provider.updateClassroom(roomId, courseNode.getShortTitle(), courseNode.getLongTitle(), allBegin, allEnd, config); if(success) { getWindowControl().setInfo(translate("success.update.room")); } else { getWindowControl().setError(translate("error.update.room")); } } } else if(event == NodeEditController.NODECONFIG_CHANGED_EVENT) { // something has changed, maybe the title or description, thus ask to update if(provider.existsClassroom(roomId, config)) { removeAsListenerAndDispose(yesNoUpdate); yesNoUpdate = DialogBoxUIFactory.createYesNoDialog(ureq, getWindowControl(), translate("sync.meeting.title"), translate("sync.meeting.text")); listenTo(yesNoUpdate); yesNoUpdate.activate(); } } } private void reset(UserRequest ureq) { removeAsListenerAndDispose(editForm); removeAsListenerAndDispose(configCtr); // prepare new edit view String providerId = selForm.getSelectedProvider(); provider = VCProviderFactory.createProvider(providerId); config = provider.createNewConfiguration(); // create room if configured to do it immediately if(config.isCreateMeetingImmediately()) { // here, the config is empty in any case, thus there are no start and end dates provider.createClassroom(roomId, courseNode.getShortName(), courseNode.getLongTitle(), null, null, config); } editForm = new VCEditForm(ureq, getWindowControl(), provider.getTemplates(), (DefaultVCConfiguration) config); listenTo(editForm); editVc.put("editForm", editForm.getInitialComponent()); configCtr = provider.createConfigController(ureq, getWindowControl(), roomId, config); listenTo(configCtr); editVc.put("configCtr", configCtr.getInitialComponent()); editVc.setDirty(true); // save the minimal config courseNode.getModuleConfiguration().set(VCCourseNode.CONF_VC_CONFIGURATION, config); courseNode.getModuleConfiguration().setStringValue(VCCourseNode.CONF_PROVIDER_ID, config.getProviderId()); fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT); } public void addTabs(TabbedPane tabbedPane) { tabPane = tabbedPane; tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessibilityCondContr.getWrappedDefaultAccessConditionVC(translate("condition.accessibility.title"))); tabbedPane.addTab(translate(PANE_TAB_VCCONFIG), editVc); } public static boolean isConfigValid(ModuleConfiguration moduleConfig) { List<MeetingDate> dateList = (List<MeetingDate>) moduleConfig.get(VCCourseNode.CONF_VC_CONFIGURATION); if (dateList != null) { for (MeetingDate date : dateList) { if (date.getTitle().isEmpty() || date.getDescription().isEmpty()) { return false; } } return true; } return false; } } //</OLATCE-103>