Package org.olat.course.nodes.dialog

Source Code of org.olat.course.nodes.dialog.DialogCourseNodeEditController

/**
* 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.course.nodes.dialog;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.olat.core.commons.modules.bc.FileUploadController;
import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.commons.modules.bc.FolderEvent;
import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
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.tabbedpane.TabbedPane;
import org.olat.core.gui.components.table.TableController;
import org.olat.core.gui.components.table.TableGuiConfiguration;
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.tabbable.ActivateableTabbableDefaultController;
import org.olat.core.gui.translator.PackageTranslator;
import org.olat.core.logging.activity.CourseLoggingAction;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.Util;
import org.olat.core.util.vfs.Quota;
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.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.BCCourseNode;
import org.olat.course.nodes.DialogCourseNode;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.tree.CourseEditorTreeModel;
import org.olat.group.ui.context.BGContextEvent;
import org.olat.modules.dialog.DialogElement;
import org.olat.modules.dialog.DialogElementsController;
import org.olat.modules.dialog.DialogElementsPropertyManager;
import org.olat.modules.dialog.DialogElementsTableModel;
import org.olat.modules.dialog.DialogPropertyElements;
import org.olat.modules.fo.Forum;
import org.olat.modules.fo.ForumManager;
import org.olat.util.logging.activity.LoggingResourceable;

/**
* Description:<br>
* controller for the tabbed pane inside the course editor for the course node 'dialog elements'
* <P>
* Initial Date: 02.11.2005 <br>
*
* @author guido
*/
public class DialogCourseNodeEditController extends ActivateableTabbableDefaultController implements ControllerEventListener {

  private static final String PANE_TAB_DIALOGCONFIG = "pane.tab.dialogconfig";
  private static final String PANE_TAB_ACCESSIBILITY = "pane.tab.accessibility";
 
  private static final String[] paneKeys = { PANE_TAB_DIALOGCONFIG, PANE_TAB_ACCESSIBILITY };
 
  private VelocityContainer content, accessContent; 
  private DialogCourseNode courseNode;
  private ConditionEditController readerCondContr, posterCondContr, moderatorCondContr;
  private TabbedPane myTabbedPane;
  private BCCourseNode bcNode = new BCCourseNode();
  private ICourse course;
  private DialogConfigForm configForumLaunch;
  private TableController tableCtr;
  private PackageTranslator resourceTrans;
  private FileUploadController fileUplCtr;
  private DialogElement recentElement;
  private TableGuiConfiguration tableConf;
  private Link uploadButton;
 
  public DialogCourseNodeEditController(UserRequest ureq, WindowControl wControl, DialogCourseNode node,
      ICourse course, UserCourseEnvironment userCourseEnv) {
    super(ureq,wControl);
    //o_clusterOk by guido: save to hold reference to course inside editor
    this.course = course;
    this.courseNode = node;
   
    this.resourceTrans = new PackageTranslator(Util.getPackageName(DialogElementsTableModel.class), ureq.getLocale(), getTranslator());
    // set name of the folder we use
    bcNode.setShortTitle(translate("dialog.folder.name"));

    // dialog specific config tab   
    content = this.createVelocityContainer("edit");
    uploadButton = LinkFactory.createButton("dialog.upload.file", content, this);
   
    //configure table
    tableConf = new TableGuiConfiguration();
    tableConf.setResultsPerPage(10);
    showOverviewTable(ureq);

    initConfigForm();

    // accessability config tab   
    accessContent = this.createVelocityContainer("edit_access");

    CourseGroupManager groupMgr = course.getCourseEnvironment().getCourseGroupManager();
    CourseEditorTreeModel editorModel = course.getEditorTreeModel();
    // Reader precondition
    Condition readerCondition = courseNode.getPreConditionReader();
    // TODO:gs:a getAssessableNodes ist der dialog node assessable oder nicht?
    readerCondContr = new ConditionEditController(ureq, getWindowControl(), groupMgr, readerCondition, "readerConditionForm",
        AssessmentHelper.getAssessableNodes(editorModel, courseNode), userCourseEnv);   
    this.listenTo(readerCondContr);
    accessContent.put("readerCondition", readerCondContr.getInitialComponent());

    // Poster precondition
    Condition posterCondition = courseNode.getPreConditionPoster();
    posterCondContr = new ConditionEditController(ureq, getWindowControl(), groupMgr, posterCondition, "posterConditionForm",
        AssessmentHelper.getAssessableNodes(editorModel, courseNode), userCourseEnv);   
    this.listenTo(posterCondContr);
    accessContent.put("posterCondition", posterCondContr.getInitialComponent());

    // Moderator precondition
    Condition moderatorCondition = courseNode.getPreConditionModerator();
    moderatorCondContr = new ConditionEditController(ureq, getWindowControl(), groupMgr, moderatorCondition, "moderatorConditionForm",
        AssessmentHelper.getAssessableNodes(editorModel, courseNode), userCourseEnv);
    //FIXME:gs: why is firing needed here?
    fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);   
    this.listenTo(moderatorCondContr);
    accessContent.put("moderatorCondition", moderatorCondContr.getInitialComponent());
  }

  private void initConfigForm() {
    configForumLaunch = new DialogConfigForm("forumAsPopup", getTranslator(), courseNode.getModuleConfiguration());
    configForumLaunch.addListener(this);
    content.put("showForumAsPopupConfigForm", configForumLaunch);
  }


  /**
   * @see org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController#getPaneKeys()
   */
  public String[] getPaneKeys() {
    return paneKeys;
  }

  /**
   * @see org.olat.core.gui.control.generic.tabbable.ActivateableTabbableDefaultController#getTabbedPane()
   */
  public TabbedPane getTabbedPane() {
    return myTabbedPane;
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
   *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
   */
  public void event(UserRequest ureq, Component source, Event event) {
    if (source == configForumLaunch) {
      if (event == Form.EVNT_VALIDATION_OK) {
        configForumLaunch.updateConfiguration(courseNode.getModuleConfiguration());
        fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
      } else
        if (event == Event.CANCELLED_EVENT) {
        // reinitalize form data
        initConfigForm();
      }
    } else if (source == uploadButton) {
      Forum forum = ForumManager.getInstance().addAForum();
      OlatRootFolderImpl forumContainer = DialogElementsController.getForumContainer(forum.getKey());
      fileUplCtr = new FileUploadController(getWindowControl(),forumContainer, ureq, (int)FolderConfig.getLimitULKB(), Quota.UNLIMITED, null, false);     
      this.listenTo(fileUplCtr);
      recentElement = new DialogElement();
      recentElement.setForumKey(forum.getKey());
      recentElement.setAuthor(ureq.getIdentity().getName());
      content.contextPut("overview", Boolean.FALSE);
      content.put("upload", fileUplCtr.getInitialComponent());
    }
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
   *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
   */
  public void event(UserRequest ureq, Controller source, Event event) {
    if (source == readerCondContr) {
      if (event == Event.CHANGED_EVENT) {
        Condition cond = readerCondContr.getCondition();
        courseNode.setPreConditionReader(cond);
        fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
      }else if(event instanceof BGContextEvent) {
        //fired by condition edit controllers if areas / groups created
        //updated other condition controllers -> e.g. change create link to choose
        posterCondContr.updateGroupsAndAreasCheck();
        moderatorCondContr.updateGroupsAndAreasCheck();
      }
    } else if (source == posterCondContr) {
      if (event == Event.CHANGED_EVENT) {
        Condition cond = posterCondContr.getCondition();
        courseNode.setPreConditionPoster(cond);
        fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
      }else if(event instanceof BGContextEvent) {
        //fired by condition edit controllers if areas / groups created
        //updated other condition controllers -> e.g. change create link to choose
        readerCondContr.updateGroupsAndAreasCheck();
        moderatorCondContr.updateGroupsAndAreasCheck();
      }
    } else if (source == moderatorCondContr) {
      if (event == Event.CHANGED_EVENT) {
        Condition cond = moderatorCondContr.getCondition();
        courseNode.setPreConditionModerator(cond);
        fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
      }else if(event instanceof BGContextEvent) {
        //fired by condition edit controllers if areas / groups created
        //updated other condition controllers -> e.g. change create link to choose
        readerCondContr.updateGroupsAndAreasCheck();
        posterCondContr.updateGroupsAndAreasCheck();
      }
    } else if (source == tableCtr) {
      // process table events
    } else if (source == fileUplCtr) {
      // event.
      if (event == Event.DONE_EVENT || event == Event.CANCELLED_EVENT) {
        // reset recent element
        recentElement = null;
        showOverviewTable(ureq);
      } else if (event.getCommand().equals(FolderEvent.UPLOAD_EVENT)) {

        // new dialog element
        DialogElement element = new DialogElement();
        element.setAuthor(recentElement.getAuthor());
        element.setDate(new Date());
        final String filename = ((FolderEvent) event).getFilename();
        element.setFilename(filename);
        element.setForumKey(recentElement.getForumKey());
        element.setFileSize(DialogElementsController.getFileSize(recentElement.getForumKey()));

        // save property
        DialogElementsPropertyManager.getInstance().addDialogElement(course.getCourseEnvironment().getCoursePropertyManager(), courseNode, element);

        // do logging
        ThreadLocalUserActivityLogger.log(CourseLoggingAction.DIALOG_ELEMENT_FILE_UPLOADED, getClass(),
            LoggingResourceable.wrapUploadFile(filename));
      }
    }
  }
/**
* update table with latest elements
* @param ureq
*/
  private void showOverviewTable(UserRequest ureq) {
    tableCtr = new TableController(tableConf, ureq, getWindowControl(), resourceTrans, this);
    DialogPropertyElements elements = DialogElementsPropertyManager.getInstance().findDialogElements(this.course.getCourseEnvironment().getCoursePropertyManager(), courseNode);
    List list = new ArrayList();
    DialogElementsTableModel tableModel = new DialogElementsTableModel(getTranslator(), null, null);
    if (elements != null) list = elements.getDialogPropertyElements();
    tableModel.setEntries(list);
    tableModel.addColumnDescriptors(tableCtr);
    tableCtr.setTableDataModel(tableModel);
    tableCtr.modelChanged();
    tableCtr.setSortColumn(1, true);
    content.contextPut("overview", Boolean.TRUE);
    content.put("dialogElementsTable", tableCtr.getInitialComponent());
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
   */
  protected void doDispose() {
    //child controllers registered with listenTo() get disposed in BasicController
    if (tableCtr != null) {
      tableCtr.dispose();
      tableCtr = null;
    }
  }

  /**
   * @see org.olat.core.gui.control.generic.tabbable.TabbableController#addTabs(org.olat.core.gui.components.tabbedpane.TabbedPane)
   */
  public void addTabs(TabbedPane tabbedPane) {
    tabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessContent);
    tabbedPane.addTab(translate(PANE_TAB_DIALOGCONFIG), content);
  }

}
TOP

Related Classes of org.olat.course.nodes.dialog.DialogCourseNodeEditController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.