From 02d7bde371c2ae659f3d6653f35d63e12402de1c Mon Sep 17 00:00:00 2001
From: gnaegi <none@none>
Date: Fri, 8 Apr 2016 11:35:12 +0200
Subject: [PATCH] OO-1976 implement activateable2 interface for single page
 nodes to load the page from the path

---
 .../singlepage/SinglePageController.java       | 15 ++++++++++++++-
 .../iframe/IFrameDisplayController.java        | 18 +++++++++++++++++-
 .../olat/course/nodes/sp/SPRunController.java  | 15 ++++++++++++++-
 .../org/olat/course/run/RunMainController.java | 12 +++++++++++-
 4 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/modules/singlepage/SinglePageController.java b/src/main/java/org/olat/core/commons/modules/singlepage/SinglePageController.java
index 05275d806fb..ac7fb62fced 100644
--- a/src/main/java/org/olat/core/commons/modules/singlepage/SinglePageController.java
+++ b/src/main/java/org/olat/core/commons/modules/singlepage/SinglePageController.java
@@ -26,6 +26,8 @@
 
 package org.olat.core.commons.modules.singlepage;
 
+import java.util.List;
+
 import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel;
 import org.olat.core.commons.editor.htmleditor.WysiwygFactory;
 import org.olat.core.gui.UserRequest;
@@ -41,12 +43,14 @@ 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.clone.CloneableController;
+import org.olat.core.gui.control.generic.dtabs.Activateable2;
 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.id.OLATResourceable;
 import org.olat.core.id.context.BusinessControl;
 import org.olat.core.id.context.ContextEntry;
+import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.logging.activity.CoreLoggingResourceable;
@@ -67,7 +71,7 @@ import org.olat.core.util.vfs.VFSContainer;
  *
  * @author gnaegi 
  */
-public class SinglePageController extends BasicController implements CloneableController {
+public class SinglePageController extends BasicController implements CloneableController, Activateable2 {
 
 	private static final OLog log = Tracing.createLoggerFor(SinglePageController.class);
 	
@@ -168,6 +172,7 @@ public class SinglePageController extends BasicController implements CloneableCo
 		}
 		
 		// adjust root folder if security does not allow using ../.. etc.
+		// *** IF YOU CHANGE THIS LOGIC, do also change it in SPCourseNodeIndexer! ***
 		if (!allowRelativeLinks && !jumpIn) {
 			// start uri is filename without relative path.
 			// the relative path of the file is added to the vfs rootcontainer
@@ -302,6 +307,14 @@ public class SinglePageController extends BasicController implements CloneableCo
 		return new SinglePageController(ureq, control, g_rootContainer, g_fileName, g_allowRelativeLinks, frameId, null, deliveryOptions);
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		if(entries == null || entries.isEmpty() || idc == null) return;
+		// delegate to iframe controller
+		idc.activate(ureq, entries, state);
+	}
+
+	
 	/**
 	 * Set a scale factor to enlarge / shrink the entire page. This is handy when
 	 * a preview of a page should be displayed.
diff --git a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
index 146b055a13a..32a66a681f2 100644
--- a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDisplayController.java
@@ -27,6 +27,7 @@
 package org.olat.core.gui.control.generic.iframe;
 
 import java.io.File;
+import java.util.List;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -39,9 +40,13 @@ 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.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.textmarker.TextMarkerManagerImpl;
 import org.olat.core.gui.media.MediaResource;
 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.util.StringHelper;
 import org.olat.core.util.event.GenericEventListener;
 import org.olat.core.util.event.MultiUserEvent;
@@ -60,7 +65,7 @@ import org.olat.core.util.vfs.VFSMediaResource;
  *         
  * @author guido
  */
-public class IFrameDisplayController extends BasicController implements GenericEventListener {
+public class IFrameDisplayController extends BasicController implements GenericEventListener, Activateable2 {
 	private static final String NEW_URI_EVENT = "newUriEvent";
 	protected static final String FILE_SUFFIX_HTM = "htm";
 	protected static final String FILE_SUFFIX_JS = ".js";
@@ -433,4 +438,15 @@ public class IFrameDisplayController extends BasicController implements GenericE
 			getWindowControl().getWindowBackOffice().removeCycleListener(this);
 		}
 	}
+	
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		if(entries == null || entries.isEmpty()) return;
+		Long id = entries.get(0).getOLATResourceable().getResourceableId();
+		if(id == 0) {
+			String path = BusinessControlFactory.getInstance().getPath(entries.get(0));
+			changeCurrentURI(path, false);
+		}
+	}
+
 }
diff --git a/src/main/java/org/olat/course/nodes/sp/SPRunController.java b/src/main/java/org/olat/course/nodes/sp/SPRunController.java
index 081e90966d7..a9080b46412 100644
--- a/src/main/java/org/olat/course/nodes/sp/SPRunController.java
+++ b/src/main/java/org/olat/course/nodes/sp/SPRunController.java
@@ -25,6 +25,7 @@
 
 package org.olat.course.nodes.sp;
 
+import java.util.List;
 import java.util.UUID;
 
 import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel;
@@ -44,9 +45,12 @@ import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.clone.CloneController;
 import org.olat.core.gui.control.generic.clone.CloneLayoutControllerCreatorCallback;
 import org.olat.core.gui.control.generic.clone.CloneableController;
+import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
+import org.olat.core.id.context.ContextEntry;
+import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.AssertException;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
@@ -75,7 +79,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  * 
  * @author Felix Jost
  */
-public class SPRunController extends BasicController {
+public class SPRunController extends BasicController implements Activateable2 {
 	
 	private SPCourseNode courseNode;
 	private Panel main;
@@ -233,6 +237,15 @@ public class SPRunController extends BasicController {
 		}
 	}
 	
+	
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		if(entries == null || entries.isEmpty() || spCtr == null) return;
+		// delegate to single page controller
+		spCtr.activate(ureq, entries, state);
+	}
+
+	
 	/**
 	 * 
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java
index b1c3c6c58a7..1368902d409 100644
--- a/src/main/java/org/olat/course/run/RunMainController.java
+++ b/src/main/java/org/olat/course/run/RunMainController.java
@@ -833,11 +833,21 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 				if (cn != null) {
 					addLoggingResourceable(LoggingResourceable.wrap(cn));
 				}
-				
+				// consume our entry
 				if(entries.size() > 1) {
 					entries = entries.subList(1, entries.size());
 				}
 				updateTreeAndContent(ureq, cn, null, entries, firstEntry.getTransientState());
+			} else if (currentCourseNode.equals(cn)) {
+				// consume our entry
+				if(entries.size() > 1) {
+					entries = entries.subList(1, entries.size());
+				}
+				// the node to be activated is the one that is already on the screen
+				if (currentNodeController instanceof Activateable2) {
+					Activateable2 activateable = (Activateable2) currentNodeController;
+					activateable.activate(ureq, entries, state);
+				}
 			}
 		}
 	}
-- 
GitLab