/** * <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.modules.portfolio.ui; import java.util.ArrayList; import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; 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.panel.SimpleStackedPanel; import org.olat.core.gui.components.panel.StackedPanel; import org.olat.core.gui.components.stack.ButtonGroupComponent; import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.stack.TooledController; import org.olat.core.gui.components.stack.TooledStackedPanel; 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.dtabs.Activateable2; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.resource.OresHelper; import org.olat.modules.portfolio.Binder; import org.olat.modules.portfolio.BinderConfiguration; import org.olat.modules.portfolio.BinderSecurityCallback; import org.olat.modules.portfolio.BinderStatus; import org.olat.modules.portfolio.PortfolioV2Module; import org.olat.modules.portfolio.ui.event.DeleteBinderEvent; import org.olat.modules.portfolio.ui.event.RestoreBinderEvent; import org.olat.modules.portfolio.ui.event.SectionSelectionEvent; import org.olat.modules.portfolio.ui.model.PortfolioElementRow; import org.olat.util.logging.activity.LoggingResourceable; import org.springframework.beans.factory.annotation.Autowired; /** * * Initial date: 07.06.2016<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class BinderController extends BasicController implements TooledController, Activateable2 { private Link assessmentLink, publishLink; private final Link overviewLink, entriesLink, historyLink; private final ButtonGroupComponent segmentButtonsCmp; private final TooledStackedPanel stackPanel; private StackedPanel mainPanel; private HistoryController historyCtrl; private PublishController publishCtrl; private BinderPageListController entriesCtrl; private TableOfContentController overviewCtrl; private BinderAssessmentController assessmentCtrl; private Binder binder; private final BinderConfiguration config; private final BinderSecurityCallback secCallback; @Autowired private PortfolioV2Module portfolioModule; public BinderController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, BinderSecurityCallback secCallback, Binder binder, BinderConfiguration config) { super(ureq, wControl); this.binder = binder; this.config = config; this.stackPanel = stackPanel; this.secCallback = secCallback; ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrap(binder)); segmentButtonsCmp = new ButtonGroupComponent("segments"); segmentButtonsCmp.setElementCssClass("o_sel_pf_binder_navigation"); overviewLink = LinkFactory.createLink("portfolio.overview", getTranslator(), this); overviewLink.setElementCssClass("o_sel_pf_toc"); segmentButtonsCmp.addButton(overviewLink, false); entriesLink = LinkFactory.createLink("portfolio.entries", getTranslator(), this); entriesLink.setElementCssClass("o_sel_pf_entries"); segmentButtonsCmp.addButton(entriesLink, false); historyLink = LinkFactory.createLink("portfolio.history", getTranslator(), this); historyLink.setElementCssClass("o_sel_pf_history"); segmentButtonsCmp.addButton(historyLink, false); if(config.isShareable() && secCallback.canViewAccessRights()) { publishLink = LinkFactory.createLink("portfolio.publish", getTranslator(), this); publishLink.setElementCssClass("o_sel_pf_publication"); segmentButtonsCmp.addButton(publishLink, false); } if(config.isAssessable() && secCallback.canViewAssessment()) { assessmentLink = LinkFactory.createLink("portfolio.assessment", getTranslator(), this); assessmentLink.setElementCssClass("o_sel_pf_assessment"); segmentButtonsCmp.addButton(assessmentLink, false); } mainPanel = putInitialPanel(new SimpleStackedPanel("portfolioSegments")); if (secCallback.canNewAssignment()) { // in template mode, add editor class to toolbar mainPanel.setCssClass("o_edit_mode"); } mainPanel.setContent(new Panel("empty")); stackPanel.addListener(this); } @Override public void initTools() { stackPanel.addTool(segmentButtonsCmp, true); if(segmentButtonsCmp.getSelectedButton() == overviewLink) { if(overviewCtrl != null) { overviewCtrl.initTools(); } } } protected void setSegmentButtonsVisible(boolean enabled) { if(segmentButtonsCmp != null) { segmentButtonsCmp.setVisible(enabled); } } @Override protected void doDispose() { // } @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) { String ePoint = portfolioModule.getBinderEntryPoint(); if(binder != null && binder.getBinderStatus() == BinderStatus.deleted) { doOpenOverview(ureq); } else if(PortfolioV2Module.ENTRY_POINT_TOC.equals(ePoint)) { int numOfSections = doOpenOverview(ureq).getNumOfSections(); if(numOfSections == 0 && !secCallback.canEditBinder()) { activateEntries(ureq); } } else { activateEntries(ureq); } return; } String resName = entries.get(0).getOLATResourceable().getResourceableTypeName(); if("Page".equalsIgnoreCase(resName) || "Entry".equalsIgnoreCase(resName) || "Section".equalsIgnoreCase(resName)) { doOpenOverview(ureq).activate(ureq, entries, state); } else if("Entries".equalsIgnoreCase(resName)) { List<ContextEntry> subEntries = entries.subList(1, entries.size()); doOpenEntries(ureq).activate(ureq, subEntries, entries.get(0).getTransientState()); } else if("Publish".equalsIgnoreCase(resName)) { if(config.isShareable()) { doOpenPublish(ureq); } } else if("Assessment".equalsIgnoreCase(resName)) { if(config.isAssessable()) { doOpenAssessment(ureq); } } else if("History".equalsIgnoreCase(resName)) { doOpenHistory(ureq); } else if("Toc".equalsIgnoreCase(resName)) { doOpenOverview(ureq); } } private void activateEntries(UserRequest ureq) { int numOfPages = doOpenEntries(ureq).getNumOfPages(); if(numOfPages == 1 && !secCallback.canEditBinder()) { PortfolioElementRow firstPage = entriesCtrl.getFirstPage(); if(firstPage != null) { OLATResourceable ores = OresHelper.createOLATResourceableInstance("Page", firstPage.getPage().getKey()); List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromString(ores); entriesCtrl.activate(ureq, entries, null); } } } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(entriesCtrl == source) { if(event == Event.CHANGED_EVENT) { if(overviewCtrl != null) { overviewCtrl.loadModel(); } } } else if(overviewCtrl == source) { if(event == Event.CHANGED_EVENT) { removeAsListenerAndDispose(entriesCtrl); entriesCtrl = null; } else if(event instanceof SectionSelectionEvent) { SectionSelectionEvent sse = (SectionSelectionEvent)event; List<ContextEntry> entries = new ArrayList<>(); entries.add(BusinessControlFactory.getInstance().createContextEntry(OresHelper.createOLATResourceableInstance("Section", sse.getSection().getKey()))); doOpenEntries(ureq).activate(ureq, entries, null); } else if(event instanceof DeleteBinderEvent || event instanceof RestoreBinderEvent) { fireEvent(ureq, event); } } } @Override protected void event(UserRequest ureq, Component source, Event event) { if (overviewLink == source) { doOpenOverview(ureq); } else if(entriesLink == source) { doOpenEntries(ureq); } else if(publishLink == source) { doOpenPublish(ureq); } else if(assessmentLink == source) { doOpenAssessment(ureq); } else if(historyLink == source) { doOpenHistory(ureq); } else if(stackPanel == source) { if(event instanceof PopEvent) { if(stackPanel.getLastController() == this) { doOpenOverview(ureq); } } } } private void popUpToBinderController(UserRequest ureq) { if(stackPanel.getRootController() == this) { stackPanel.popUpToRootController(ureq); } else { stackPanel.popUpToController(this); } } private TableOfContentController doOpenOverview(UserRequest ureq) { popUpToBinderController(ureq); if(overviewCtrl == null) { OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("Toc", 0l); WindowControl swControl = addToHistory(ureq, bindersOres, null); overviewCtrl = new TableOfContentController(ureq, swControl, stackPanel, secCallback, binder, config); overviewCtrl.initTools();//because it will not end in the stackPanel as a pushed controller listenTo(overviewCtrl); } else { overviewCtrl.loadModel(); } segmentButtonsCmp.setSelectedButton(overviewLink); mainPanel.setContent(overviewCtrl.getInitialComponent()); return overviewCtrl; } private BinderPageListController doOpenEntries(UserRequest ureq) { OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("Entries", 0l); WindowControl swControl = addToHistory(ureq, bindersOres, null); entriesCtrl = new BinderPageListController(ureq, swControl, stackPanel, secCallback, binder, config); listenTo(entriesCtrl); popUpToBinderController(ureq); stackPanel.pushController(translate("portfolio.entries"), entriesCtrl); segmentButtonsCmp.setSelectedButton(entriesLink); return entriesCtrl; } private PublishController doOpenPublish(UserRequest ureq) { OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("Publish", 0l); WindowControl swControl = addToHistory(ureq, bindersOres, null); publishCtrl = new PublishController(ureq, swControl, stackPanel, secCallback, binder, config); listenTo(publishCtrl); popUpToBinderController(ureq); stackPanel.pushController(translate("portfolio.publish"), publishCtrl); segmentButtonsCmp.setSelectedButton(publishLink); return publishCtrl; } private BinderAssessmentController doOpenAssessment(UserRequest ureq) { OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("Assessment", 0l); WindowControl swControl = addToHistory(ureq, bindersOres, null); assessmentCtrl = new BinderAssessmentController(ureq, swControl, secCallback, binder, config); listenTo(assessmentCtrl); popUpToBinderController(ureq); stackPanel.pushController(translate("portfolio.assessment"), assessmentCtrl); segmentButtonsCmp.setSelectedButton(assessmentLink); return assessmentCtrl; } private HistoryController doOpenHistory(UserRequest ureq) { OLATResourceable bindersOres = OresHelper.createOLATResourceableInstance("History", 0l); WindowControl swControl = addToHistory(ureq, bindersOres, null); historyCtrl = new HistoryController(ureq, swControl, secCallback, binder); listenTo(historyCtrl); popUpToBinderController(ureq); stackPanel.pushController(translate("portfolio.history"), historyCtrl); segmentButtonsCmp.setSelectedButton(historyLink); return historyCtrl; } }