/**
* 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.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
* <p>
*/
package org.olat.ims.cp.ui;
import org.olat.core.commons.editor.htmleditor.HTMLEditorController;
import org.olat.core.commons.editor.htmleditor.WysiwygFactory;
import org.olat.core.commons.fullWebApp.LayoutMain3ColsPreviewController;
import org.olat.core.commons.services.help.HelpLinkSPI;
import org.olat.core.commons.services.help.HelpModule;
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.SimpleStackedPanel;
import org.olat.core.gui.components.panel.StackedPanel;
import org.olat.core.gui.components.stack.TooledStackedPanel;
import org.olat.core.gui.components.stack.TooledStackedPanel.Align;
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.closablewrapper.CloseableModalController;
import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
import org.olat.core.gui.control.generic.iframe.IFrameDisplayController;
import org.olat.core.gui.control.generic.iframe.NewIframeUriEvent;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
import org.olat.core.util.vfs.VFSLeaf;
import org.olat.ims.cp.CPManager;
import org.olat.ims.cp.CPManagerImpl;
import org.olat.ims.cp.ContentPackage;
import org.olat.modules.cp.CPUIFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class CPContentController extends BasicController {
private static final String FILE_SUFFIX_HTM = "htm";
private IFrameDisplayController iframeCtr;
private HTMLEditorController mceCtr; // WYSIWYG
private ContentPackage cp;
private CPPage currentPage;
private CPMetadataEditController editMetadataCtr;
private CloseableModalController dialogCtr;
private LayoutMain3ColsPreviewController previewCtr;
private Link editMetadataLink, previewLink;
private Component helpLink;
private DeliveryOptions deliveryOptions;
private StackedPanel mainPanel;
@Autowired
private HelpModule helpModule;
protected CPContentController(UserRequest ureq, WindowControl control, ContentPackage cp) {
super(ureq, control);
this.cp = cp;
CPPackageConfig packageConfig = CPManager.getInstance().getCPPackageConfig(cp.getResourcable());
if(packageConfig != null) {
deliveryOptions = packageConfig.getDeliveryOptions();
}
// init help link, can't do this in initToolbar because ureq is missing
if (helpModule.isHelpEnabled()) {
HelpLinkSPI provider = helpModule.getHelpProvider();
helpLink = provider.getHelpPageLink(ureq, translate("help"), translate("helpbutton"), "o_icon o_icon-lg o_icon_help", null, "CP Editor");
}
// set initial page to display
iframeCtr = new IFrameDisplayController(ureq, control, cp.getRootDir());
listenTo(iframeCtr);
}
protected void init(UserRequest ureq) {
mainPanel = putInitialPanel(new SimpleStackedPanel("cpContent"));
CPManagerImpl cpMgm = (CPManagerImpl) CPManager.getInstance();
currentPage = cpMgm.getFirstPageToDisplay(cp);
displayPage(ureq, currentPage.getIdentifier());
}
void initToolbar(TooledStackedPanel toolbar) {
editMetadataLink = LinkFactory.createToolLink("contentcontroller.editlink", "contentcontroller.editlink",
translate("contentcontroller.editlink_title"), this);
editMetadataLink.setIconLeftCSS("o_icon o_icon-lg o_icon_edit");
editMetadataLink.setElementCssClass("o_sel_cp_edit_metadata");
editMetadataLink.setTooltip(translate("contentcontroller.editlink_title"));
toolbar.addTool(editMetadataLink, Align.right);
previewLink = LinkFactory.createToolLink("contentcontroller.previewlink", "contentcontroller.previewlink",
translate("contentcontroller.previewlink_title"), this);
previewLink.setIconLeftCSS("o_icon o_icon-lg o_icon_preview");
previewLink.setElementCssClass("o_sel_cp_preview");
previewLink.setTooltip(translate("contentcontroller.previewlink_title"));
toolbar.addTool(previewLink, Align.right);
if (helpLink != null) {
toolbar.addTool(helpLink, Align.right);
}
}
/**
* Displays the correct edit page when node with the given id is selected.
*
* @param ureq
* @param nodeID
*/
protected void displayPage(UserRequest ureq, String nodeID) {
CPManager cpMgm = CPManager.getInstance();
currentPage = new CPPage(nodeID, cp);
String filePath = cpMgm.getPageByItemId(cp, currentPage.getIdentifier());
logInfo("I display the page with id: " + currentPage.getIdentifier(), null);
VFSItem f = cp.getRootDir().resolve(filePath);
if (filePath == null) {
displayInfoPage();
} else if (f == null) {
displayNotFoundPage();
} else {
currentPage.setFile((VFSLeaf) f);
setContent(ureq, filePath);
}
fireEvent(ureq, new Event("Page loaded"));
}
/**
* Displays the page editor and shows the metadata editor to rename the page
* @param ureq
* @param nodeID
*/
protected void displayPageWithMetadataEditor(UserRequest ureq, String nodeID) {
displayPage(ureq, nodeID);
displayMetadataEditor(ureq);
}
/**
* Set the content to display given the file path
*
* @param ureq
* @param filePath
*/
private void setContent(UserRequest ureq, String filePath) {
if (filePath.toLowerCase().lastIndexOf(FILE_SUFFIX_HTM) >= (filePath.length() - 4)) {
if (mceCtr != null) mceCtr.dispose();
VFSContainer rootDir = currentPage.getRootDir();
String virtualRootFolderName = translate("cpfileuploadcontroller.virtual.root");
VFSContainer pseudoContainer = new VFSRootCPContainer(virtualRootFolderName, cp, rootDir, getTranslator());
mceCtr = WysiwygFactory.createWysiwygController(ureq, getWindowControl(), pseudoContainer, filePath, false, false);
if(mceCtr.isEditable()) {
mceCtr.setCancelButtonEnabled(false);
mceCtr.setSaveCloseButtonEnabled(false);
mceCtr.setShowMetadataEnabled(false);
}
listenTo(mceCtr);
mainPanel.setContent(mceCtr.getInitialComponent());
} else {
iframeCtr.setCurrentURI(filePath);
mainPanel.setContent(iframeCtr.getInitialComponent());
}
}
/**
* displays a info page in the "content-area" of the cpEditor
*
* see: ../_content/infoPage.html
*
*/
protected void displayInfoPage() {
if (currentPage != null) currentPage.setFile(null);
VelocityContainer infoVC = createVelocityContainer("infoPage");
infoVC.contextPut("infoChapterpage", translate("contentcontroller.infoChapterpage"));
mainPanel.setContent(infoVC);
}
/**
* displays a info page in the "content-area" of the cpEditor
*
* see: ../_content/infoPage.html
*
*/
protected void displayNotFoundPage() {
currentPage.setFile(null);
VelocityContainer nfVC = createVelocityContainer("notFoundPage");
// Don't display the file name. It's too much information.
nfVC.contextPut("not_found_message", translate("contentcontroller.page.not.found"));
mainPanel.setContent(nfVC);
}
/**
* Displays the editPageEditor
*
* @param ureq
*/
private void displayMetadataEditor(UserRequest ureq) {
editMetadataCtr = new CPMetadataEditController(ureq, getWindowControl(), currentPage);
listenTo(editMetadataCtr);
String title = translate("cpmd.flexi.formtitle");
dialogCtr = new CloseableModalController(getWindowControl(), getTranslator().translate("close"),
editMetadataCtr.getInitialComponent(), true, title);
listenTo(dialogCtr);
dialogCtr.activate();
}
/**
* @return The current page
*/
protected CPPage getCurrentPage() {
return currentPage;
}
/**
* this function is used to return the new nodeID of the just added page back
* to the pageEditController
*/
protected void newPageAdded(String newNodeID) {
editMetadataCtr.newPageAdded(newNodeID);
}
@Override
protected void doDispose() {
// Nothing to implement since this controller listens to iframeCtr and
// dialogCtr.
}
@Override
protected void event(UserRequest ureq, Component source, Event event) {
if (source == editMetadataLink) {
displayMetadataEditor(ureq);
} else if (source == previewLink) {
displayPreview(ureq);
}
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if (source == editMetadataCtr) {
// event from editPage controller, such as "Save", "Save and Close",
// "Cancel"
if (event.equals(Event.CANCELLED_EVENT)) {
dialogCtr.deactivate();
} else if (event.equals(Event.DONE_EVENT)) {
// close and save
dialogCtr.deactivate();
fireEvent(ureq, new NewCPPageEvent("Page Saved", editMetadataCtr.getPage()));
} else if (event.getCommand().equals("saved")) {
// save but do not close
fireEvent(ureq, new NewCPPageEvent("Page Saved", editMetadataCtr.getPage()));
}
} else if (source == dialogCtr) {
if (event.getCommand().equals("CLOSE_MODAL_EVENT")) {
// close (x) button clicked in modal dialog
// System.out.println("modal dialog closed (x)");
}
} else if (source == mceCtr) {
if (event.getCommand().equals("CLOSE_MODAL_EVENT")) {
// close (x) button clicked in modal dialog
// System.out.println("modal dialog closed (x)");
}
} else if (source == iframeCtr) {
if (event instanceof NewIframeUriEvent) {
// html link clicked in content (iframe)
fireEvent(ureq, event);
}
}
}
/**
* Displays the preview
*
* @param ureq
*/
private void displayPreview(UserRequest ureq) {
if (previewCtr != null) previewCtr.dispose();
previewCtr = CPUIFactory.getInstance().createMainLayoutPreviewController(ureq, getWindowControl(), cp.getRootDir(), true, deliveryOptions);
previewCtr.activate();
}
}