Package org.olat.repository.controllers

Source Code of org.olat.repository.controllers.RepositoryMainController

/**
* 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.repository.controllers;
import org.olat.catalog.CatalogEntry;
import org.olat.catalog.ui.CatalogController;
import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.tree.GenericTreeModel;
import org.olat.core.gui.components.tree.GenericTreeNode;
import org.olat.core.gui.components.tree.MenuTree;
import org.olat.core.gui.components.tree.TreeEvent;
import org.olat.core.gui.components.tree.TreeModel;
import org.olat.core.gui.components.tree.TreeNode;
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.MainLayoutBasicController;
import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.dtabs.Activateable;
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.portal.PortletFactory;
import org.olat.core.gui.control.generic.tool.ToolController;
import org.olat.core.gui.control.generic.tool.ToolFactory;
import org.olat.core.gui.control.generic.wizard.WizardController;
import org.olat.core.gui.control.state.ControllerState;
import org.olat.core.logging.AssertException;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.Util;
import org.olat.core.util.tree.TreeHelper;
import org.olat.course.CourseModule;
import org.olat.fileresource.types.BlogFileResource;
import org.olat.fileresource.types.GlossaryResource;
import org.olat.fileresource.types.ImsCPFileResource;
import org.olat.fileresource.types.PodcastFileResource;
import org.olat.fileresource.types.ScormCPFileResource;
import org.olat.fileresource.types.SharedFolderFileResource;
import org.olat.fileresource.types.SurveyFileResource;
import org.olat.fileresource.types.TestFileResource;
import org.olat.fileresource.types.WikiResource;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.olat.repository.RepositoryTableModel;
import org.olat.repository.delete.TabbedPaneController;
import org.olat.repository.handlers.RepositoryHandler;
import org.olat.repository.handlers.RepositoryHandlerFactory;

import de.bps.olat.repository.controllers.WizardAddOwnersController;

/**
* Description: <br>
*
* Activatable:<br>
* Supported commands are:
* "search.home": root entry point
* "search.catalog": catalog view
* "search.generic": search form
* "search.my": list of owned resources
* "search.REPOTYPE": list of all resources of given type, where
* REPOTYPE is something like course, test, survey, cp, scorm, sharedfolder
*
* @date Initial Date: Oct 21, 2004 <br>
* @author Felix Jost
*/
public class RepositoryMainController extends MainLayoutBasicController implements Activateable {

  OLog log = Tracing.createLoggerFor(this.getClass());
  private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(RepositoryManager.class);

  public static final String JUMPFROMEXTERN = "jumpfromextern";
  public static final String JUMPFROMCOURSE = "jumpfromcourse";
  static final String ACTION_NEW_CREATECOURSE = "cco";
  static final String ACTION_NEW_CREATETEST = "cte";
  static final String ACTION_NEW_CREATESURVEY = "csu";
  static final String ACTION_NEW_CREATESHAREDFOLDER = "csf";
  static final String ACTION_NEW_CREATECP = "ccp";
  static final String ACTION_NEW_WIKI = "wiki";
  static final String ACTION_NEW_PODCAST = "podcast";
  static final String ACTION_NEW_BLOG = "blog";
  static final String ACTION_NEW_GLOSSARY = "glossary";
  private static final String ACTION_DELETE_RESOURCE = "deleteresource";
  private static final String ACTION_ADD_OWNERS = "addowners";

  private Panel mainPanel;
  private VelocityContainer main;
  private LayoutMain3ColsController columnsLayoutCtr;
  private ToolController mainToolC;
  private MenuTree menuTree;

  private String myEntriesNodeId;

  private RepositoryAddController addController;
  private RepositorySearchController searchController;
  private RepositoryDetailsController detailsController;
  private DialogBoxController launchEditorDialog;
  private boolean isAuthor;
  private CatalogController catalogCntrllr;
  // REVIEW:pb:concept for jumping between activateables, instead of hardcoding
  // each dependency
  // REVIEW:pb:like jumpfromcourse, backtocatalog, etc.
  private boolean backtocatalog = false;
  private TabbedPaneController deleteTabPaneCtr;
  private CloseableModalController cmc;
  private String lastUserObject = null; // to detect double click on catalog
                                        // menu item
  private WizardController wc;

  /**
   * The check for author rights is executed on construction time and then
   * cached during the objects lifetime.
   *
   * @param ureq
   * @param wControl
   */
  public RepositoryMainController(UserRequest ureq, WindowControl wControl) {
    super(ureq, wControl);

    if (log.isDebug()) {
      log.debug("Constructing ReposityMainController for user::" + ureq.getIdentity());
    }

    // use i18n from RepositoryManager level
    setTranslator(Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()));

    // main component layed out in panel
    // use veloctiy pages from RepositoryManager level
    main = new VelocityContainer("vc_index", RepositoryManager.class, "index", getTranslator(), this);

    isAuthor = ureq.getUserSession().getRoles().isAuthor();
    // if the user has the role InstitutionalResourceManager (and has the same
    // university like the author)
    // then set isAuthor to true
    isAuthor = isAuthor | (ureq.getUserSession().getRoles().isInstitutionalResourceManager());
    main.contextPut("isAuthor", Boolean.valueOf(isAuthor));

    mainPanel = new Panel("repopanel");
    mainPanel.setContent(main);

    searchController = new RepositorySearchController(translate("details.header"), ureq, getWindowControl(), false, true);
    listenTo(searchController);
    main.put("searchcomp", searchController.getInitialComponent());

    detailsController = new RepositoryDetailsController(ureq, getWindowControl());
    listenTo(detailsController);
    detailsController.addControllerListener(searchController); // to catch
    // delete
    // events

    createRepoToolController(isAuthor, ureq.getUserSession().getRoles().isOLATAdmin());

    menuTree = new MenuTree("repoTree");
    menuTree.setTreeModel(buildTreeModel(isAuthor));
    menuTree.setSelectedNodeId(menuTree.getTreeModel().getRootNode().getIdent());
    setState("search.home");
    menuTree.addListener(this);

    Component toolComp = (mainToolC == null ? null : mainToolC.getInitialComponent());
    columnsLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, toolComp, mainPanel, "repomain");
    listenTo(columnsLayoutCtr);
    putInitialPanel(columnsLayoutCtr.getInitialComponent());
  }

  /**
   */
  private void createRepoToolController(boolean isAuthor, boolean bIsAdmin) {
    if (isAuthor) {
      mainToolC = ToolFactory.createToolController(getWindowControl());
      listenTo(mainToolC);

      mainToolC.addHeader(translate("tools.add.header"));
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_COURSE, translate("tools.add.course"), RepositoryAddController.ACTION_ADD_COURSE, "o_toolbox_course");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_CP, translate("tools.add.cp"), RepositoryAddController.ACTION_ADD_CP, "o_toolbox_content");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_SCORM, translate("tools.add.scorm"), RepositoryAddController.ACTION_ADD_SCORM, "o_toolbox_scorm");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_TEST, translate("tools.add.test"), RepositoryAddController.ACTION_ADD_TEST, "o_toolbox_test");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_SURVEY, translate("tools.add.survey"), RepositoryAddController.ACTION_ADD_SURVEY, "o_toolbox_questionnaire");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_WIKI, translate("tools.add.wiki"), RepositoryAddController.ACTION_ADD_WIKI, "o_toolbox_wiki");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_PODCAST, translate("tools.add.podcast"), RepositoryAddController.ACTION_ADD_PODCAST, "o_toolbox_podcast");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_BLOG, translate("tools.add.blog"), RepositoryAddController.ACTION_ADD_BLOG, "o_toolbox_blog");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_GLOSSARY, translate("tools.add.glossary"), RepositoryAddController.ACTION_ADD_GLOSSARY, "o_toolbox_glossary");
      mainToolC.addLink(RepositoryAddController.ACTION_ADD_DOC, translate("tools.add.webdoc"), RepositoryAddController.ACTION_ADD_DOC, "b_toolbox_doc");

      mainToolC.addHeader(translate("tools.new.header"));
      mainToolC.addLink(ACTION_NEW_CREATECOURSE, translate("tools.new.createcourse"), ACTION_NEW_CREATECOURSE, "o_toolbox_course");
      mainToolC.addLink(ACTION_NEW_CREATECP, translate("tools.new.createcp"), ACTION_NEW_CREATECP, "o_toolbox_content");
      mainToolC.addLink(ACTION_NEW_CREATETEST, translate("tools.new.createtest"), ACTION_NEW_CREATETEST, "o_toolbox_test");
      mainToolC.addLink(ACTION_NEW_CREATESURVEY, translate("tools.new.createsurvey"), ACTION_NEW_CREATESURVEY, "o_toolbox_questionnaire");
      mainToolC.addLink(ACTION_NEW_CREATESHAREDFOLDER, translate("tools.new.createsharedfolder"), ACTION_NEW_CREATESHAREDFOLDER,
          "o_toolbox_sharedfolder");
      mainToolC.addLink(ACTION_NEW_WIKI, translate("tools.new.wiki"), ACTION_NEW_WIKI, "o_toolbox_wiki");
      mainToolC.addLink(ACTION_NEW_PODCAST, translate("tools.new.podcast"), ACTION_NEW_PODCAST, "o_toolbox_podcast");
      mainToolC.addLink(ACTION_NEW_BLOG, translate("tools.new.blog"), ACTION_NEW_BLOG, "o_toolbox_blog");
      mainToolC.addLink(ACTION_NEW_GLOSSARY, translate("tools.new.glossary"), ACTION_NEW_GLOSSARY, "o_toolbox_glossary");
      if (bIsAdmin || isAuthor) {
        mainToolC.addHeader(translate("tools.administration.header"));
        if (bIsAdmin) {
          mainToolC.addLink(ACTION_DELETE_RESOURCE, translate("tools.delete.resource"));
        }
        mainToolC.addLink(ACTION_ADD_OWNERS, translate("tools.add.owners"));
      }
    } else {
      mainToolC = null;
    }
  }

  private TreeModel buildTreeModel(boolean bIsAuthor) {
    GenericTreeModel gtm = new GenericTreeModel();
    GenericTreeNode rootNode = new GenericTreeNode(translate("search.home"), "search.home");
    gtm.setRootNode(rootNode);

    // TODO:catalog not yet finished :
    rootNode.addChild(new GenericTreeNode(translate("search.catalog"), "search.catalog"));

    // check if repository portlet is configured in olat_portals.xml
    boolean repoPortletOn = PortletFactory.getInstance().containsPortlet("RepositoryPortlet");
    // add default searches
    rootNode.addChild(new GenericTreeNode(translate("search.generic"), "search.generic"));
    if (bIsAuthor) {
      GenericTreeNode myEntriesTn = new GenericTreeNode(translate("search.my"), "search.my");
      myEntriesNodeId = myEntriesTn.getIdent();
      rootNode.addChild(myEntriesTn);
    }
    // add repository search also used by portlets
    if (repoPortletOn) {
      rootNode.addChild(new GenericTreeNode(translate("search.mycourses.student"), "search.mycourses.student"));
      if (bIsAuthor) {
        rootNode.addChild(new GenericTreeNode(translate("search.mycourses.teacher"), "search.mycourses.teacher"));
      }
    }
    rootNode.addChild(new GenericTreeNode(translate("search.course"), "search.course"));
    if (bIsAuthor) {
      rootNode.addChild(new GenericTreeNode(translate("search.test"), "search.test"));
      rootNode.addChild(new GenericTreeNode(translate("search.survey"), "search.survey"));
      rootNode.addChild(new GenericTreeNode(translate("search.cp"), "search.cp"));
      rootNode.addChild(new GenericTreeNode(translate("search.scorm"), "search.scorm"));
      rootNode.addChild(new GenericTreeNode(translate("search.sharedfolder"), "search.sharedfolder"));
      rootNode.addChild(new GenericTreeNode(translate("search.wiki"), "search.wiki"));
      rootNode.addChild(new GenericTreeNode(translate("search.podcast"), "search.podcast" ));
      rootNode.addChild(new GenericTreeNode(translate("search.blog"), "search.blog" ));
      rootNode.addChild(new GenericTreeNode(translate("search.glossary"), "search.glossary"));
    }

    return gtm;
  }

  /**
   * @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)
   */
  @Override
  public void event(UserRequest ureq, Component source, Event event) {
    if (source == menuTree) {
      if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) {
        Component toolComp = (mainToolC == null ? null : mainToolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
        mainPanel.setContent(main);
        TreeEvent te = (TreeEvent) event;
        TreeNode clickedNode = menuTree.getTreeModel().getNodeById(te.getNodeId());
        Object userObject = clickedNode.getUserObject();
        activateContent(ureq, userObject, null);
      }
    }
  }

  @Override
  protected void adjustState(ControllerState cstate, UserRequest ureq) {
    String cmd = cstate.getSerializedState();
    // sub view identifyers are attached to user object with ":"
    String[] cmdArray = cmd.split(":");
    activateContent(ureq, cmdArray[0], (cmdArray.length > 1 ? cmdArray[1] : null));
    // adjust the menu
    TreeNode rootNode = this.menuTree.getTreeModel().getRootNode();
    TreeNode activatedNode = TreeHelper.findNodeByUserObject(cmdArray[0], rootNode);
    this.menuTree.setSelectedNode(activatedNode);
  }

  /**
   * Activate the content in the content area based on a user object
   * representing the identifyer of the content
   *
   * @param ureq
   * @param uObj
   * @param subViewIdentifyer optional view identifyer for a sub controller
   */
  private void activateContent(UserRequest ureq, Object userObject, String subViewIdentifyer) {
    if (userObject.equals("search.home")) { // the
      // home
      main.setPage(VELOCITY_ROOT + "/index.html");
      mainPanel.setContent(main);
    } else if (userObject.equals("search.generic")) { // new
      // search
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.displaySearchForm();
      searchController.enableBackToSearchFormLink(true);
    } else if (userObject.equals("search.catalog")) {
      // enter catalog browsing
      activateCatalogController(ureq, subViewIdentifyer);
      mainPanel.setContent(catalogCntrllr.getInitialComponent());
    } else if (userObject.equals("search.my")) { // search
      // own resources
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByOwner(ureq.getIdentity());
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.course")) { // search
      // courses
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(CourseModule.getCourseTypeName(), ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.test")) { // search
      // tests
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(TestFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);

    } else if (userObject.equals("search.survey")) { // search
      // surveys
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(SurveyFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.cp")) { // search
      // cp
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(ImsCPFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.scorm")) { // search
      // scorm
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(ScormCPFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.sharedfolder")) { // search
      // shared folder
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(SharedFolderFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.wiki")) { // search
      // wiki
      main.setPage(VELOCITY_ROOT + "/index2.html");
       mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(WikiResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.podcast")) { // search
      // podcast
      main.setPage(VELOCITY_ROOT + "/index2.html");
       mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(PodcastFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.blog")) { // search
      // blog
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(BlogFileResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.glossary")) { // search
      // glossary
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchByTypeLimitAccess(GlossaryResource.TYPE_NAME, ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.mycourses.student")) {
      // my courses as student
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchMyCoursesStudent(ureq);
      searchController.enableBackToSearchFormLink(false);
    } else if (userObject.equals("search.mycourses.teacher")) {
      // my courses as student
      main.setPage(VELOCITY_ROOT + "/index2.html");
      mainPanel.setContent(main);
      searchController.doSearchMyCoursesTeacher(ureq);
      searchController.enableBackToSearchFormLink(false);
    }
    // encode sub view identifyer into state, attach separated by ":"
    lastUserObject = userObject.toString();
    String state = lastUserObject + (subViewIdentifyer != null ? ":" + subViewIdentifyer : null);
    setState(state);
    removeAsListenerAndDispose(deleteTabPaneCtr);
  }

  private void activateCatalogController(UserRequest ureq, String nodeId) {
    // create new catalog controller with given node if none exists
    // create also new catalog controller when the user clicked twice on the
    // catalog link in the menu
    if (catalogCntrllr == null || lastUserObject.equals("search.catalog")) {
      removeAsListenerAndDispose(catalogCntrllr);
      catalogCntrllr = new CatalogController(ureq, getWindowControl(), nodeId);
      listenTo(catalogCntrllr);
    } else {
      // just activate the existing catalog
      if (nodeId != null) {
        catalogCntrllr.activate(ureq, nodeId);
      }
    }
    // set correct tool controller
    ToolController ccToolCtr = catalogCntrllr.createCatalogToolController();
    Component toolComp = (ccToolCtr == null ? null : ccToolCtr.getInitialComponent());
    columnsLayoutCtr.setCol2(toolComp);
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
   *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
   */
  @Override
  public void event(UserRequest urequest, Controller source, Event event) {
    if (source == addController) { // process add controller finished()
      if (event.equals(Event.DONE_EVENT)) {
        // default to myEntries search
        cmc.deactivate();
        ToolController toolC = detailsController.setEntry(addController.getAddedEntry(), urequest, false);
        Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
        mainPanel.setContent(detailsController.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
        menuTree.setSelectedNodeId(myEntriesNodeId);

        // ask if we should start the editor right now.
        RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(addController.getAddedEntry());
        if (handler.supportsEdit()) { // start Editor
          removeAsListenerAndDispose(launchEditorDialog); // cleanup old                                                          // instance
          launchEditorDialog = activateYesNoDialog(urequest, null, translate("add.launchedit.msg"), launchEditorDialog);
          launchEditorDialog.setUserObject(addController.getAddedEntry());
          return;
        }
      } else if (event.equals(Event.CANCELLED_EVENT)) {
        cmc.deactivate();
      } else if (event.equals(Event.FAILED_EVENT)) {
        getWindowControl().setError(translate("add.failed"));
        mainPanel.setContent(main);
      }
    } else if (source == searchController) {
      RepositoryEntry selectedEntry = RepositoryManager.getInstance().lookupRepositoryEntry(searchController.getSelectedEntry().getKey());
      if (selectedEntry == null) {
        getWindowControl().setWarning(translate("warn.entry.meantimedeleted"));
        main.setPage(VELOCITY_ROOT + "/index.html");
        return;
      }
      if (event.getCommand().equals(RepositoryTableModel.TABLE_ACTION_SELECT_ENTRY)) {
        // entry has been selected to be launched in the
        // searchController
        ToolController toolC = detailsController.setEntry(selectedEntry, urequest, false);
        if (selectedEntry.getCanLaunch()) detailsController.doLaunch(urequest);
        else if (selectedEntry.getCanDownload()) detailsController.doDownload(urequest);
        else { // offer details view
          Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
          columnsLayoutCtr.setCol2(toolComp);
          mainPanel.setContent(detailsController.getInitialComponent());
        }
      } else if (event.getCommand().equals(RepositoryTableModel.TABLE_ACTION_SELECT_LINK)) {
        // entry has been selected in the searchController
        ToolController toolC = detailsController.setEntry(selectedEntry, urequest, false);
        Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
        mainPanel.setContent(detailsController.getInitialComponent());
      }
    } else if (source == detailsController) { // back from details
      if (event.equals(Event.DONE_EVENT)) {
        if (backtocatalog) {
          backtocatalog = false;
          ToolController toolC = catalogCntrllr.createCatalogToolController();
          Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
          columnsLayoutCtr.setCol2(toolComp);
          mainPanel.setContent(catalogCntrllr.getInitialComponent());

        } else {
          Component toolComp = (mainToolC == null ? null : mainToolC.getInitialComponent());
          columnsLayoutCtr.setCol2(toolComp);
          mainPanel.setContent(main);
        }
      } else if (event instanceof EntryChangedEvent) {
        Component toolComp = (mainToolC == null ? null : mainToolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
        mainPanel.setContent(main);
      } else if (event.equals(Event.CHANGED_EVENT)) {
        ToolController toolC = detailsController.getDetailsToolController();
        Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
      }
    } else if (source == mainToolC) {
      // handles the tools events for the Repository Actions
      handleToolEvents(urequest, event);
    } else if (source == launchEditorDialog) {
      if (DialogBoxUIFactory.isYesEvent(event)) {
        // do
        // launch
        // editor
        ToolController toolC = detailsController.setEntry((RepositoryEntry) launchEditorDialog.getUserObject(), urequest, false);
        Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
        mainPanel.setContent(detailsController.getInitialComponent());
        detailsController.doEdit(urequest);
      } else {
        // no, don't launch editor }
      }
    }
    /*
     * from the catalog controller its sending change events if the tools
     * available have changed, e.g. no longer localTreeAdmin
     */
    else if (source == catalogCntrllr) {
      if (event == Event.CHANGED_EVENT) {
        ToolController toolC = catalogCntrllr.createCatalogToolController();
        Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
      } else if (event instanceof EntryChangedEvent) {
        // REVIEW:pb:signal from the catalog to show Detail!
        // REVIEW:pb:the first event is also a change event, signalling a change
        // in the tools
        // REVIEW:pb:the EntryChangedEvent is misused to signal "show details"
        EntryChangedEvent entryChangedEvent = (EntryChangedEvent) event;
        RepositoryEntry e = RepositoryManager.getInstance().lookupRepositoryEntry(entryChangedEvent.getChangedEntryKey());
        if (e != null) {
          backtocatalog = true;
          ToolController toolC = detailsController.setEntry(e, urequest, false);
          Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
          columnsLayoutCtr.setCol2(toolComp);
          mainPanel.setContent(detailsController.getInitialComponent());
        }
      }

    } else if (source == wc) {
      if (event == Event.CANCELLED_EVENT) {
        wc.dispose();
        cmc.deactivate();
      }
      if (event == Event.DONE_EVENT) {
        wc.dispose();
        cmc.deactivate();
      }
    }
  }

  /**
   * @param urequest
   * @param event
   */
  private void handleToolEvents(UserRequest urequest, Event event) {
    /*
     * Repository Tools
     */
    if (event.getCommand().startsWith(RepositoryAddController.ACTION_ADD_PREFIX)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), event.getCommand());
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_CREATECOURSE)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_COURSE);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_CREATETEST)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_TEST);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_CREATESURVEY)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_SURVEY);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_CREATESHAREDFOLDER)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_SHAREDFOLDER);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_WIKI)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_WIKI);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_PODCAST)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_PODCAST);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_BLOG)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_BLOG);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_NEW_GLOSSARY)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_GLOSSARY);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_DELETE_RESOURCE)) {
      removeAsListenerAndDispose(deleteTabPaneCtr);
      deleteTabPaneCtr = new TabbedPaneController(urequest, getWindowControl());
      listenTo(deleteTabPaneCtr);
      mainPanel.setContent(deleteTabPaneCtr.getInitialComponent());
    } else if (event.getCommand().equals(ACTION_NEW_CREATECP)) {
      removeAsListenerAndDispose(addController);
      addController = new RepositoryAddController(urequest, getWindowControl(), RepositoryAddController.ACTION_NEW_CP);
      listenTo(addController);
      removeAsListenerAndDispose(cmc);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), addController.getInitialComponent());
      listenTo(cmc);
      cmc.activate();
      return;
    } else if (event.getCommand().equals(ACTION_ADD_OWNERS)) {
      removeAsListenerAndDispose(wc);
      wc = new WizardAddOwnersController(urequest, getWindowControl());
      wc.addControllerListener(this);
      cmc = new CloseableModalController(getWindowControl(), translate("close"), wc.getInitialComponent());
      cmc.activate();
      return;
    }
  }

  @Override
  protected void doDispose() {
    // controllers are disposed in BasicController
    // nulling controller to help GC
    columnsLayoutCtr = null;
    mainToolC = null;
    addController = null;
    searchController = null;
    detailsController = null;
    launchEditorDialog = null;
    catalogCntrllr = null;

    if (wc != null) {
      wc.dispose();
      wc = null;
    }
    if (cmc != null) {
      cmc.dispose();
      cmc = null;
    }

  }

  /**
   * @see org.olat.core.gui.control.generic.dtabs.Activateable#activate(org.olat.core.gui.UserRequest,
   *      java.lang.String)
   */
  public void activate(UserRequest ureq, String viewIdentifier) {
    // REVIEW:pb: activate is now also used for course details activation
    // REVIEW:pb:concept for jumping between activateables, instead of
    // hardcoding each dependency
    // REVIEW:pb:like jumpfromcourse, backtocatalog, etc.
    if (viewIdentifier.startsWith(JUMPFROMEXTERN)) {
      viewIdentifier = viewIdentifier.replaceFirst(JUMPFROMEXTERN, "").trim();
      boolean jumpfromcourse = false;

      if (viewIdentifier.startsWith(JUMPFROMCOURSE)) {
        viewIdentifier = viewIdentifier.replaceFirst(JUMPFROMCOURSE, "").trim();
        jumpfromcourse = true;
      }

      Long key = new Long(0);
      try {
        key = Long.valueOf(viewIdentifier);
      } catch (NumberFormatException e) {
        throw new AssertException(e.getMessage());
      }
      RepositoryEntry selectedEntry = RepositoryManager.getInstance().lookupRepositoryEntry(key);
      if (selectedEntry != null) {
        ToolController toolC = detailsController.setEntry(selectedEntry, ureq, jumpfromcourse);
        Component toolComp = (toolC == null ? null : toolC.getInitialComponent());
        columnsLayoutCtr.setCol2(toolComp);
        mainPanel.setContent(detailsController.getInitialComponent());
      }
    } else if (viewIdentifier.startsWith(CatalogEntry.class.getSimpleName())) {
      String catId = viewIdentifier.substring(viewIdentifier.indexOf(':') + 1);
      TreeNode rootNode = menuTree.getTreeModel().getRootNode();
      TreeNode activatedNode = TreeHelper.findNodeByUserObject("search.catalog", rootNode);
      if (activatedNode != null) {
        menuTree.setSelectedNodeId(activatedNode.getIdent());
        activateContent(ureq, "search.catalog", catId);
      }
    } else {
      // find the menu node that has the user object that represents the
      // viewIdentifyer
      // sub view identifyers are separated with ":" characters
      String[] parsedViewIdentifyers = viewIdentifier.split(":");

      TreeNode rootNode = this.menuTree.getTreeModel().getRootNode();
      TreeNode activatedNode = TreeHelper.findNodeByUserObject(parsedViewIdentifyers[0], rootNode);
      if (activatedNode != null) {
        this.menuTree.setSelectedNodeId(activatedNode.getIdent());
        activateContent(ureq, parsedViewIdentifyers[0], (parsedViewIdentifyers.length > 1 ? parsedViewIdentifyers[1] : null));
      } else {
        // not found, activate the root node
        this.menuTree.setSelectedNodeId(rootNode.getIdent());
        activateContent(ureq, parsedViewIdentifyers[0], null);
      }
    }
  }
}
TOP

Related Classes of org.olat.repository.controllers.RepositoryMainController

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.