diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java index a839876dff41ee538fd26413843b23d73ad7eb81..c3b1f4bf1b37e4b0b3a47e0a451662f6f7189efe 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java @@ -61,6 +61,9 @@ import org.olat.fileresource.types.XlsFileResource; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryService; import org.olat.repository.model.RepositoryEntrySecurity; +import org.olat.repository.ui.RepositoryEntryRuntimeController; +import org.olat.repository.ui.RepositoryEntryRuntimeController.RuntimeControllerCreator; +import org.olat.repository.ui.WebDocumentRunController; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; @@ -190,7 +193,7 @@ public class WebDocumentHandler extends FileHandler { @Override public boolean supportsLaunch() { - return false; + return true; } @Override @@ -210,7 +213,13 @@ public class WebDocumentHandler extends FileHandler { @Override public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl) { - return null; + return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, new RuntimeControllerCreator() { + @Override + public Controller create(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, + RepositoryEntry entry, RepositoryEntrySecurity reSecurity) { + return new WebDocumentRunController(ureq, wControl, entry); + } + }); } @Override diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java index 517c88e0ee7cc5522cc43a8e9c8d00dc56d6e0da..4daccd03c6e5c819c87ee06c7e370627791ceee5 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java @@ -582,9 +582,13 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController protected void launchContent(UserRequest ureq, RepositoryEntrySecurity security) { if(security.canLaunch()) { - runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity); - listenTo(runtimeController); - toolbarPanel.rootController(re.getDisplayname(), runtimeController); + if(handler.supportsLaunch()) { + runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity); + listenTo(runtimeController); + toolbarPanel.rootController(re.getDisplayname(), runtimeController); + } else { + doDetails(ureq); + } } else { runtimeController = new AccessRefusedController(ureq, getWindowControl()); listenTo(runtimeController); diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java new file mode 100644 index 0000000000000000000000000000000000000000..50e12c42acd869acd6bd7deb2dc0901dce34e1e1 --- /dev/null +++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java @@ -0,0 +1,119 @@ +package org.olat.repository.ui; + +import javax.servlet.http.HttpServletRequest; + +import org.olat.core.CoreSpringFactory; +import org.olat.core.commons.services.image.Size; +import org.olat.core.commons.services.video.MovieService; +import org.olat.core.dispatcher.mapper.Mapper; +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.velocity.VelocityContainer; +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.iframe.IFrameDisplayController; +import org.olat.core.gui.media.MediaResource; +import org.olat.core.gui.util.CSSHelper; +import org.olat.core.helpers.Settings; +import org.olat.core.util.FileUtils; +import org.olat.core.util.vfs.LocalFileImpl; +import org.olat.core.util.vfs.LocalImpl; +import org.olat.core.util.vfs.VFSContainer; +import org.olat.core.util.vfs.VFSItem; +import org.olat.core.util.vfs.VFSLeaf; +import org.olat.core.util.vfs.VFSMediaResource; +import org.olat.fileresource.FileResourceManager; +import org.olat.repository.RepositoryEntry; +import org.olat.resource.OLATResource; + +/** + * + * Initial date: 02.12.2014<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class WebDocumentRunController extends BasicController { + + public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) { + super(ureq, wControl); + + VelocityContainer mainVC = createVelocityContainer("web_content"); + mainVC.contextPut("displayName", entry.getDisplayname()); + putInitialPanel(mainVC); + + LocalFileImpl document = getWebDocument(entry); + if(document != null) { + String filename = document.getName(); + mainVC.contextPut("filename", filename); + String lowerFilename = filename.toLowerCase(); + String cssClass = CSSHelper.createFiletypeIconCssClassFor(lowerFilename); + mainVC.contextPut("cssClass", cssClass); + + String extension = FileUtils.getFileSuffix(filename); + if("png".equals(extension) || "jpg".equals(extension) || "jpeg".equals(extension) || "gif".equals(extension)) { + String mediaUrl = registerMapper(ureq, new MediaMapper(document)); + mainVC.contextPut("image", filename); + mainVC.contextPut("mediaUrl", mediaUrl); + } else if("mp4".equals(extension) || "m4v".equals(extension) || "mov".equals(extension)) { + String mediaUrl = registerMapper(ureq, new MediaMapper(document)); + mainVC.contextPut("movie", filename); + mainVC.contextPut("mediaUrl", Settings.createServerURI() + mediaUrl); + Size realSize = CoreSpringFactory.getImpl(MovieService.class).getSize(document, extension); + if(realSize != null) { + mainVC.contextPut("height", realSize.getHeight()); + mainVC.contextPut("width", realSize.getWidth()); + } else { + mainVC.contextPut("height", 480); + mainVC.contextPut("width", 640); + } + } else { + IFrameDisplayController idc = new IFrameDisplayController(ureq, getWindowControl(), document.getParentContainer(), null, null); + listenTo(idc); + idc.setCurrentURI(document.getName()); + mainVC.put("content", idc.getInitialComponent()); + } + } + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + // + } + + private LocalFileImpl getWebDocument(RepositoryEntry entry) { + OLATResource resource = entry.getOlatResource(); + VFSContainer fResourceFileroot = FileResourceManager.getInstance() + .getFileResourceRootImpl(resource); + + LocalFileImpl document = null; + for(VFSItem item:fResourceFileroot.getItems()) { + if(item instanceof VFSLeaf && item instanceof LocalImpl) { + LocalFileImpl localItem = (LocalFileImpl)item; + if(localItem != null && !localItem.getBasefile().isHidden()) { + document = (LocalFileImpl)item; + } + } + } + return document; + } + + private static class MediaMapper implements Mapper { + + private final VFSLeaf mediaFile; + + public MediaMapper(VFSLeaf mediaFile) { + this.mediaFile = mediaFile; + } + + @Override + public MediaResource handle(String relPath, HttpServletRequest request) { + return new VFSMediaResource(mediaFile); + } + } +} diff --git a/src/main/java/org/olat/repository/ui/_content/web_content.html b/src/main/java/org/olat/repository/ui/_content/web_content.html new file mode 100644 index 0000000000000000000000000000000000000000..abe13c528fcd85b539a0bc351bf91f51ccdf42fa --- /dev/null +++ b/src/main/java/org/olat/repository/ui/_content/web_content.html @@ -0,0 +1,14 @@ +<h2><i class="o_icon $cssClass"> </i> $displayName</h2> +#if($image) + <img src="$mediaUrl/$filename" /> +#elseif($movie) + <p><span id="olatFlashMovieViewer1" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:${width}px; height:${height}px;"> + <script defer="defer" type="text/javascript"> + // <![CDATA[ + BPlayer.insertPlayer('$mediaUrl/$filename','olatFlashMovieViewer1',$width,$height,0,0,'video',undefined,false,true,false); + // ]]> + </script> + </span></p> +#elseif($r.available("content")) + <div class="o_content clearfix">$r.render("content")</div> +#end \ No newline at end of file