From 3b004e7922727ff75abb76be974affd358528263 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 21 Aug 2014 11:40:03 +0200
Subject: [PATCH] OO-990: fix CP editor, reimplement active tool...

---
 .../glossary/GlossaryRuntimeController.java   |   2 +
 .../java/org/olat/course/CourseFactory.java   |   5 +-
 .../course/editor/EditorMainController.java   | 251 ++++++++----------
 .../course/nodes/iq/IQEditController.java     |   2 +-
 .../course/run/CourseRuntimeController.java   |  36 ++-
 .../olat/ims/cp/ui/CPEditMainController.java  |  19 +-
 .../olat/ims/cp/ui/CPRuntimeController.java   |   4 +-
 .../repository/handlers/QTISurveyHandler.java |   2 +-
 .../repository/handlers/QTITestHandler.java   |   2 +-
 .../modules/scorm/ScormRuntimeController.java |   1 +
 .../webFeed/ui/FeedRuntimeController.java     |   1 +
 .../olat/repository/handlers/BlogHandler.java |   2 +-
 .../repository/handlers/CourseHandler.java    |   4 +-
 .../repository/handlers/GlossaryHandler.java  |   2 +-
 .../repository/handlers/ImsCPHandler.java     |   4 +-
 .../repository/handlers/PodcastHandler.java   |   2 +-
 .../repository/handlers/PortfolioHandler.java |   2 +-
 .../handlers/RepositoryHandler.java           |   4 +-
 .../repository/handlers/SCORMCPHandler.java   |   2 +-
 .../handlers/SharedFolderHandler.java         |   2 +-
 .../handlers/WebDocumentHandler.java          |   3 +-
 .../olat/repository/handlers/WikiHandler.java |   2 +-
 .../ui/RepositoryEntryRuntimeController.java  |  36 ++-
 23 files changed, 211 insertions(+), 179 deletions(-)

diff --git a/src/main/java/org/olat/core/commons/modules/glossary/GlossaryRuntimeController.java b/src/main/java/org/olat/core/commons/modules/glossary/GlossaryRuntimeController.java
index 786752724a7..5dbaac7f13d 100644
--- a/src/main/java/org/olat/core/commons/modules/glossary/GlossaryRuntimeController.java
+++ b/src/main/java/org/olat/core/commons/modules/glossary/GlossaryRuntimeController.java
@@ -76,6 +76,7 @@ public class GlossaryRuntimeController extends RepositoryEntryRuntimeController
 		GlossaryRegisterSettingsController glossRegisterSetCtr
 			= new GlossaryRegisterSettingsController(ureq, getWindowControl(), glossary.getOlatResource());
 		pushController(ureq, translate("tab.glossary.register"), glossRegisterSetCtr);
+		setActiveTool(registerLink);
 	}
 	
 	private void doPermission(UserRequest ureq) {
@@ -83,5 +84,6 @@ public class GlossaryRuntimeController extends RepositoryEntryRuntimeController
 		GlossaryEditSettingsController glossEditCtr
 			= new GlossaryEditSettingsController(ureq, getWindowControl(), glossary.getOlatResource());
 		pushController(ureq, translate("tab.glossary.edit"), glossEditCtr);
+		setActiveTool(permissionLink);
 	}
 }
diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index 92692c262b4..e31f3ff426e 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -58,7 +58,6 @@ import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.commons.services.taskexecutor.TaskExecutorManager;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.htmlheader.jscss.CustomCSS;
-import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.components.tree.TreeNode;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
@@ -181,10 +180,10 @@ public class CourseFactory extends BasicManager {
 	 * @return editor controller for the given course resourceable; if the editor
 	 *         is already locked, it returns a controller with a lock message
 	 */
-	public static EditorMainController createEditorController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stack,
+	public static EditorMainController createEditorController(UserRequest ureq, WindowControl wControl,
 			OLATResourceable olatResource, CourseNode selectedNode) {
 		ICourse course = loadCourse(olatResource);
-		EditorMainController emc = new EditorMainController(ureq, wControl, course, stack, selectedNode);
+		EditorMainController emc = new EditorMainController(ureq, wControl, course, selectedNode);
 		if (emc.getLockEntry() == null) {
 			Translator translator = Util.createPackageTranslator(RunMainController.class, ureq.getLocale());
 			wControl.setWarning(translator.translate("error.editoralreadylocked", new String[] { "?" }));
diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java
index 83b17370f39..c1439d97352 100644
--- a/src/main/java/org/olat/course/editor/EditorMainController.java
+++ b/src/main/java/org/olat/course/editor/EditorMainController.java
@@ -104,6 +104,7 @@ import org.olat.course.tree.CourseEditorTreeModel;
 import org.olat.course.tree.CourseEditorTreeNode;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.ui.RepositoryEntryRuntimeController.ToolbarAware;
 import org.olat.util.logging.activity.LoggingResourceable;
 
 /**
@@ -119,7 +120,7 @@ import org.olat.util.logging.activity.LoggingResourceable;
  * @author Felix Jost
  * @author BPS (<a href="http://www.bps-system.de/">BPS Bildungsportal Sachsen GmbH</a>)
  */
-public class EditorMainController extends MainLayoutBasicController implements GenericEventListener {
+public class EditorMainController extends MainLayoutBasicController implements GenericEventListener, ToolbarAware {
 	private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(EditorMainController.class);
 	
 	protected static final String TB_ACTION = "o_tb_do_";
@@ -127,7 +128,6 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	private static final String CMD_COPYNODE = "copyn";
 	private static final String CMD_MOVENODE = "moven";
 	private static final String CMD_DELNODE = "deln";
-	private static final String CMD_CLOSEEDITOR = "cmd.close";
 	private static final String CMD_PUBLISH = "pbl";
 	private static final String CMD_COURSEPREVIEW = "cprev";
 	protected static final String CMD_MULTI_SP = "cmp.multi.sp";
@@ -139,7 +139,6 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	private static final String NLS_PUBLISHED_LATEST = "published.latest";
 	private static final String NLS_COMMAND_COURSEPREVIEW = "command.coursepreview";
 	private static final String NLS_COMMAND_PUBLISH = "command.publish";
-	private static final String NLS_COMMAND_CLOSEEDITOR = "command.closeeditor";
 	private static final String NLS_HEADER_INSERTNODES = "header.insertnodes";
 	private static final String NLS_COMMAND_DELETENODE_HEADER = "command.deletenode.header";
 	private static final String NLS_COMMAND_DELETENODE = "command.deletenode";
@@ -176,6 +175,7 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	private HtmlHeaderComponent hc;
 	private EditorUserCourseEnvironmentImpl euce;
 	
+	private Dropdown nodeTools;
 	private Link undelButton, alternativeLink, statusLink;
 	private Link previewLink, publishLink, closeLink;
 	private Link createNodeLink, deleteNodeLink, moveNodeLink, copyNodeLink;
@@ -183,8 +183,8 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	private CloseableModalController cmc;
 	private CloseableCalloutWindowController calloutCtrl;
 	
+	private TooledStackedPanel stackPanel;
 	private MultiSPController multiSPChooserCtr;
-	private final TooledStackedPanel stackPanel;
 
 	private final OLATResourceable ores;
 	
@@ -198,14 +198,9 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	 * @param wControl The window controller
 	 * @param course The course
 	 */
-	public EditorMainController(UserRequest ureq, WindowControl wControl, OLATResourceable ores,
-			TooledStackedPanel externStack, CourseNode selectedNode) {
+	public EditorMainController(UserRequest ureq, WindowControl wControl, OLATResourceable ores, CourseNode selectedNode) {
 		super(ureq,wControl);
-		this.ores = ores;
-		stackPanel = externStack == null
-				? new TooledStackedPanel("courseEditorStackPanel", getTranslator(), this)
-				: externStack;
-				
+		this.ores = ores;		
 
 		// OLAT-4955: setting the stickyActionType here passes it on to any controller defined in the scope of the editor,
 		//            basically forcing any logging action called within the course editor to be of type 'admin'
@@ -225,139 +220,128 @@ public class EditorMainController extends MainLayoutBasicController implements G
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, getIdentity(), lockEntryOres);
 		
 		try {			
-		ThreadLocalUserActivityLogger.log(CourseLoggingAction.COURSE_EDITOR_OPEN, getClass());
-
-		if (!lockEntry.isSuccess()) {
-			MainPanel empty = new MainPanel("empty");
-			putInitialPanel(empty);
-			return;
-		} else {
-			ICourse course = CourseFactory.openCourseEditSession(ores.getResourceableId());
-			main = createVelocityContainer("index");
-			main.setDomReplacementWrapperRequired(false);
-			
-			OLATResourceable courseOres = OresHelper.createOLATResourceableInstance("CourseModule", ores.getResourceableId());
-			RepositoryEntry repo = RepositoryManager.getInstance().lookupRepositoryEntry(courseOres, false);
-			Controller courseCloser = new DisposedCourseRestartController(ureq, wControl, repo);
-			Controller disposedRestartController = new LayoutMain3ColsController(ureq, wControl, courseCloser);
-			setDisposedMsgController(disposedRestartController);
-			
-			undelButton = LinkFactory.createButton("undeletenode.button", main, this);
-			
-			// set the custom course css
-			enableCustomCss(ureq);
-
-			menuTree = new MenuTree("luTree");
-			menuTree.setExpandSelectedNode(false);
-			menuTree.setDragEnabled(true);
-			menuTree.setDropEnabled(true);
-			menuTree.setDropSiblingEnabled(true);	
-			menuTree.setDndAcceptJSMethod("treeAcceptDrop_notWithChildren");	
-			menuTree.setElementCssClass("o_editor_menu");
-
-			/*
-			 * create editor user course environment for enhanced syntax/semantic
-			 * checks. Initialize it with the current course node id, which is not set
-			 * yet. Furthermore the course is refreshed, e.g. as it get's loaded by
-			 * XSTREAM constructors are not called, but transient data must be
-			 * caculated and initialized
-			 */
-			cetm = CourseFactory.getCourseEditSession(ores.getResourceableId()).getEditorTreeModel();
-			CourseEditorEnv cev = new CourseEditorEnvImpl(cetm, course.getCourseEnvironment().getCourseGroupManager(), ureq.getLocale());
-			euce = new EditorUserCourseEnvironmentImpl(cev);
-			euce.getCourseEditorEnv().setCurrentCourseNodeId(null);
-			
+			ThreadLocalUserActivityLogger.log(CourseLoggingAction.COURSE_EDITOR_OPEN, getClass());
+	
+			if (!lockEntry.isSuccess()) {
+				MainPanel empty = new MainPanel("empty");
+				putInitialPanel(empty);
+			} else {
+				ICourse course = CourseFactory.openCourseEditSession(ores.getResourceableId());
+				main = createVelocityContainer("index");
+				main.setDomReplacementWrapperRequired(false);
+				
+				OLATResourceable courseOres = OresHelper.createOLATResourceableInstance("CourseModule", ores.getResourceableId());
+				RepositoryEntry repo = RepositoryManager.getInstance().lookupRepositoryEntry(courseOres, false);
+				Controller courseCloser = new DisposedCourseRestartController(ureq, wControl, repo);
+				Controller disposedRestartController = new LayoutMain3ColsController(ureq, wControl, courseCloser);
+				setDisposedMsgController(disposedRestartController);
+				
+				undelButton = LinkFactory.createButton("undeletenode.button", main, this);
+				
+				// set the custom course css
+				enableCustomCss(ureq);
+	
+				menuTree = new MenuTree("luTree");
+				menuTree.setExpandSelectedNode(false);
+				menuTree.setDragEnabled(true);
+				menuTree.setDropEnabled(true);
+				menuTree.setDropSiblingEnabled(true);	
+				menuTree.setDndAcceptJSMethod("treeAcceptDrop_notWithChildren");	
+				menuTree.setElementCssClass("o_editor_menu");
+	
+				/*
+				 * create editor user course environment for enhanced syntax/semantic
+				 * checks. Initialize it with the current course node id, which is not set
+				 * yet. Furthermore the course is refreshed, e.g. as it get's loaded by
+				 * XSTREAM constructors are not called, but transient data must be
+				 * caculated and initialized
+				 */
+				cetm = CourseFactory.getCourseEditSession(ores.getResourceableId()).getEditorTreeModel();
+				CourseEditorEnv cev = new CourseEditorEnvImpl(cetm, course.getCourseEnvironment().getCourseGroupManager(), ureq.getLocale());
+				euce = new EditorUserCourseEnvironmentImpl(cev);
+				euce.getCourseEditorEnv().setCurrentCourseNodeId(null);
+				
+	
+				long lpTimeStamp = cetm.getLatestPublishTimestamp();
+				if (lpTimeStamp == -1) {				
+					showInfo(NLS_PUBLISHED_NEVER_YET);
+				} else { // course has been published before
+					Date d = new Date(lpTimeStamp);
+					getWindowControl().setInfo(translate(NLS_PUBLISHED_LATEST, Formatter.getInstance(ureq.getLocale()).formatDateAndTime(d)));
+				}
+				menuTree.setTreeModel(cetm);
+				menuTree.setOpenNodeIds(Collections.singleton(cetm.getRootNode().getIdent()));
+				menuTree.addListener(this);
+	
+				tabbedNodeConfig = new TabbedPane("tabbedNodeConfig", ureq.getLocale());
+				tabbedNodeConfig.setElementCssClass("o_node_config");
+				main.put(tabbedNodeConfig.getComponentName(), tabbedNodeConfig);
+				
+				alternativeLink = LinkFactory.createButton("alternative", main, this);
+				main.put("alternative", alternativeLink);
+	
+				columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, main, "course" + course.getResourceableId());			
+				columnLayoutCtr.addCssClassToMain("o_editor");
+				listenTo(columnLayoutCtr);
+				putInitialPanel(columnLayoutCtr.getInitialComponent());
+				
+				//tools
+				statusLink = LinkFactory.createToolLink("status", translate("status"), this, null);
+				statusLink.setUserObject(new EditedCourseStatus());
+				
+				createNodeLink = LinkFactory.createToolLink(NLS_HEADER_INSERTNODES, translate(NLS_HEADER_INSERTNODES), this, "o_icon_add");
+				createNodeLink.setElementCssClass("o_sel_course_editor_create_node");
+				createNodeLink.setDomReplacementWrapperRequired(false);
 
-			long lpTimeStamp = cetm.getLatestPublishTimestamp();
-			if (lpTimeStamp == -1) {				
-				showInfo(NLS_PUBLISHED_NEVER_YET);
-			} else { // course has been published before
-				Date d = new Date(lpTimeStamp);
-				getWindowControl().setInfo(translate(NLS_PUBLISHED_LATEST, Formatter.getInstance(ureq.getLocale()).formatDateAndTime(d)));
-			}
-			menuTree.setTreeModel(cetm);
-			menuTree.setOpenNodeIds(Collections.singleton(cetm.getRootNode().getIdent()));
-			menuTree.addListener(this);
+				nodeTools = new Dropdown("insertNodes", NLS_COMMAND_DELETENODE_HEADER, false, getTranslator());
+				nodeTools.setIconCSS("o_icon o_icon_customize");
 
-			tabbedNodeConfig = new TabbedPane("tabbedNodeConfig", ureq.getLocale());
-			tabbedNodeConfig.setElementCssClass("o_node_config");
-			main.put(tabbedNodeConfig.getComponentName(), tabbedNodeConfig);
-			
-			alternativeLink = LinkFactory.createButton("alternative", main, this);
-			main.put("alternative", alternativeLink);
+				deleteNodeLink = LinkFactory.createToolLink(CMD_DELNODE, translate(NLS_COMMAND_DELETENODE), this, "o_icon_delete_item");
+				nodeTools.addComponent(deleteNodeLink);
+				moveNodeLink = LinkFactory.createToolLink(CMD_MOVENODE, translate(NLS_COMMAND_MOVENODE), this, "o_icon_move");
+				nodeTools.addComponent(moveNodeLink);
+				copyNodeLink = LinkFactory.createToolLink(CMD_COPYNODE, translate(NLS_COMMAND_COPYNODE), this, "o_icon_copy");
+				nodeTools.addComponent(copyNodeLink);
 
-			columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, main, "course" + course.getResourceableId());			
-			columnLayoutCtr.addCssClassToMain("o_editor");
-			listenTo(columnLayoutCtr);
-			
-			if(externStack == null) {
-				stackPanel.pushController(course.getCourseTitle(), columnLayoutCtr);
-				putInitialPanel(stackPanel);
-			} else {
-				putInitialPanel(columnLayoutCtr.getInitialComponent());
-			}
+				previewLink = LinkFactory.createToolLink(CMD_COURSEPREVIEW, translate(NLS_COMMAND_COURSEPREVIEW), this, "o_icon_preview");
+				publishLink = LinkFactory.createToolLink(CMD_PUBLISH, translate(NLS_COMMAND_PUBLISH), this, "o_icon_publish");
+				publishLink.setElementCssClass("o_sel_course_editor_publish");
+				
+				// validate course and update course status
+				euce.getCourseEditorEnv().validateCourse();
+				StatusDescription[] courseStatus = euce.getCourseEditorEnv().getCourseStatus();
+				updateCourseStatusMessages(ureq.getLocale(), courseStatus);
 	
-			stackPanel.pushController("Editor", this);
-			initToolbar(externStack == null);
-			
-			// validate course and update course status
-			euce.getCourseEditorEnv().validateCourse();
-			StatusDescription[] courseStatus = euce.getCourseEditorEnv().getCourseStatus();
-			updateCourseStatusMessages(ureq.getLocale(), courseStatus);
-
-			// add as listener to course so we are being notified about course events:
-			// - deleted events
-			CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), course);
-			// activate course root node
-			String nodeIdent = cetm.getRootNode().getIdent();
-			if(selectedNode != null) {
-				CourseEditorTreeNode editorNode = cetm.getCourseEditorNodeContaining(selectedNode);
-				if(editorNode != null) {
-					nodeIdent = editorNode.getIdent();
+				// add as listener to course so we are being notified about course events:
+				// - deleted events
+				CoordinatorManager.getInstance().getCoordinator().getEventBus().registerFor(this, ureq.getIdentity(), course);
+				// activate course root node
+				String nodeIdent = cetm.getRootNode().getIdent();
+				if(selectedNode != null) {
+					CourseEditorTreeNode editorNode = cetm.getCourseEditorNodeContaining(selectedNode);
+					if(editorNode != null) {
+						nodeIdent = editorNode.getIdent();
+					}
 				}
+				menuTree.setSelectedNodeId(nodeIdent);
+				updateViewForSelectedNodeId(ureq, nodeIdent);
 			}
-			menuTree.setSelectedNodeId(nodeIdent);
-			updateViewForSelectedNodeId(ureq, nodeIdent);
-		}
 		} catch (RuntimeException e) {
 			log.warn(RELEASE_LOCK_AT_CATCH_EXCEPTION+" [in <init>]", e);		
 			dispose();
 			throw e;
 		}
 	}
-	
-	private void initToolbar(boolean closeEditor) {
-		createNodeLink = LinkFactory.createToolLink(NLS_HEADER_INSERTNODES, translate(NLS_HEADER_INSERTNODES), this, "o_icon_add");
-		createNodeLink.setElementCssClass("o_sel_course_editor_create_node");
-		createNodeLink.setDomReplacementWrapperRequired(false);
-		stackPanel.addTool(createNodeLink, Align.left);
 
-		Dropdown nodeTools = new Dropdown("insertNodes", NLS_COMMAND_DELETENODE_HEADER, false, getTranslator());
-		nodeTools.setIconCSS("o_icon o_icon_customize");
-		stackPanel.addTool(nodeTools, Align.left);
-		
-		deleteNodeLink = LinkFactory.createToolLink(CMD_DELNODE, translate(NLS_COMMAND_DELETENODE), this, "o_icon_delete_item");
-		nodeTools.addComponent(deleteNodeLink);
-		moveNodeLink = LinkFactory.createToolLink(CMD_MOVENODE, translate(NLS_COMMAND_MOVENODE), this, "o_icon_move");
-		nodeTools.addComponent(moveNodeLink);
-		copyNodeLink = LinkFactory.createToolLink(CMD_COPYNODE, translate(NLS_COMMAND_COPYNODE), this, "o_icon_copy");
-		nodeTools.addComponent(copyNodeLink);
-		
-		statusLink = LinkFactory.createToolLink("status", translate("status"), this, null);
-		statusLink.setUserObject(new EditedCourseStatus());
-		stackPanel.addTool(statusLink, Align.right);
-
-		previewLink = LinkFactory.createToolLink(CMD_COURSEPREVIEW, translate(NLS_COMMAND_COURSEPREVIEW), this, "o_icon_preview");
-		stackPanel.addTool(previewLink, Align.right);
-		publishLink = LinkFactory.createToolLink(CMD_PUBLISH, translate(NLS_COMMAND_PUBLISH), this, "o_icon_publish");
-		publishLink.setElementCssClass("o_sel_course_editor_publish");
-		stackPanel.addTool(publishLink, Align.right);
+	@Override
+	public void initToolbar(TooledStackedPanel toolbar) {
+		this.stackPanel = toolbar;
 		
-		if(closeEditor) {
-			closeLink = LinkFactory.createToolLink(CMD_CLOSEEDITOR, translate(NLS_COMMAND_CLOSEEDITOR), this, "o_icon_close_tool");
-			stackPanel.addTool(closeLink, Align.right);
-		}
-
+		toolbar.addTool(createNodeLink, Align.left);
+		toolbar.addTool(nodeTools, Align.left);
+		toolbar.addTool(statusLink, Align.right);
+		toolbar.addTool(previewLink, Align.right);
+		toolbar.addTool(publishLink, Align.right);
 	}
 	
 	/**
@@ -463,8 +447,7 @@ public class EditorMainController extends MainLayoutBasicController implements G
 		//set all dirty
 		TreeVisitor tv = new TreeVisitor( new Visitor() {
 			public void visit(INode node) {
-				CourseEditorTreeNode cetn = (CourseEditorTreeNode)node;
-				cetn.setDirty(true);
+				((CourseEditorTreeNode)node).setDirty(true);
 			}
 		}, newCetn, true);
 		tv.visitAll();
@@ -556,8 +539,8 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	private void jumpToNodeEditor(String activatorIdent, UserRequest ureq, CourseNode chosenNode) {
 		initNodeEditor(ureq, chosenNode);
 		if (nodeEditCntrllr instanceof ActivateableTabbableDefaultController) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstanceWithoutCheck(activatorIdent, 0l);
-			List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromString(ores);
+			OLATResourceable activeOres = OresHelper.createOLATResourceableInstanceWithoutCheck(activatorIdent, 0l);
+			List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromString(activeOres);
 			((ActivateableTabbableDefaultController) nodeEditCntrllr).activate(ureq, entries, null);
 		}
 	}
diff --git a/src/main/java/org/olat/course/nodes/iq/IQEditController.java b/src/main/java/org/olat/course/nodes/iq/IQEditController.java
index 632100026c3..1a0729b3a52 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQEditController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQEditController.java
@@ -455,7 +455,7 @@ public class IQEditController extends ActivateableTabbableDefaultController impl
 					//not found
 				} else {
 					RepositoryHandler typeToEdit = RepositoryHandlerFactory.getInstance().getRepositoryHandler(re);
-					correctQTIcontroller = typeToEdit.createEditorController(re, ureq, getWindowControl(), null);
+					correctQTIcontroller = typeToEdit.createEditorController(re, ureq, getWindowControl());
 					getWindowControl().pushToMainArea(correctQTIcontroller.getInitialComponent());					
 					listenTo(correctQTIcontroller);
 				}
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index 07961838d44..6d55ca0d856 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -91,6 +91,7 @@ import org.olat.course.config.ui.CourseOptionsController;
 import org.olat.course.config.ui.courselayout.CourseLayoutGeneratorController;
 import org.olat.course.db.CourseDBManager;
 import org.olat.course.db.CustomDBMainController;
+import org.olat.course.editor.EditorMainController;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.groupsandrights.CourseRights;
 import org.olat.course.member.MembersManagementMainController;
@@ -572,6 +573,14 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		}
 	}
 
+	@Override
+	public void setActiveTool(Link tool) {
+		if(myCourse != null) {
+			myCourse.setActiveLink(tool);
+		}
+		super.setActiveTool(tool);
+	}
+
 	@Override
 	protected void doDispose() {
 		super.doDispose();
@@ -625,9 +634,9 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		} else if(courseStatisticLink == source) {
 			doCourseStatistics(ureq);
 		} else if(testStatisticLink == source) {
-			doAssessmentStatistics(ureq, "command.openteststatistic", "TestStatistics", QTIType.test, QTIType.onyx);
+			doAssessmentStatistics(ureq, "command.openteststatistic", "TestStatistics", testStatisticLink, QTIType.test, QTIType.onyx);
 		} else if(surveyStatisticLink == source) {
-			doAssessmentStatistics(ureq, "command.opensurveystatistic", "SurveyStatistics", QTIType.survey);
+			doAssessmentStatistics(ureq, "command.opensurveystatistic", "SurveyStatistics", surveyStatisticLink, QTIType.survey);
 		} else if(assessmentLink == source) {
 			doAssessmentTool(ureq);
 		} else if(calendarLink == source) {
@@ -756,9 +765,9 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 					try {
 						Activateable2 assessmentCtrl = null;
 						if("TestStatistics".equalsIgnoreCase(type)) {
-							assessmentCtrl = doAssessmentStatistics(ureq, "command.openteststatistic", "TestStatistics", QTIType.test, QTIType.onyx);
+							assessmentCtrl = doAssessmentStatistics(ureq, "command.openteststatistic", "TestStatistics", testStatisticLink, QTIType.test, QTIType.onyx);
 						} else {
-							assessmentCtrl = doAssessmentStatistics(ureq, "command.opensurveystatistic", "SurveyStatistics", QTIType.survey);
+							assessmentCtrl = doAssessmentStatistics(ureq, "command.opensurveystatistic", "SurveyStatistics", surveyStatisticLink, QTIType.survey);
 						}
 						
 						List<ContextEntry> subEntries;
@@ -778,8 +787,6 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(getRunMainController() != null) {
 			getRunMainController().activate(ureq, entries, state);
 		}
-
-		//super.activate(ureq, entries, state);
 	}
 
 	@Override
@@ -799,12 +806,14 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			
 			ICourse course = CourseFactory.loadCourse(getRepositoryEntry().getOlatResource());
 			CourseNode currentCourseNode = getCurrentCourseNode();
-			editorCtrl = CourseFactory.createEditorController(ureq, getWindowControl(), toolbarPanel, course, currentCourseNode);
+			EditorMainController ctrl = CourseFactory.createEditorController(ureq, getWindowControl(), course, currentCourseNode);
+			editorCtrl = pushController(ureq, "Editor", ctrl);
 			//user activity logger which was initialized with course run
 			if(editorCtrl != null){
 				listenTo(editorCtrl);
 				setIsInEditor(true);
 				currentToolCtr = editorCtrl;
+				setActiveTool(editLink);
 			}
 		}
 	}
@@ -827,6 +836,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			MembersManagementMainController ctrl = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), getRepositoryEntry());
 			listenTo(ctrl);
 			membersCtrl = pushController(ureq, translate("command.opensimplegroupmngt"), ctrl);
+			setActiveTool(membersLink);
 			currentToolCtr = membersCtrl;
 		}
 		return membersCtrl;
@@ -849,6 +859,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			  		course.getCourseEnvironment(), !managedLayout);
 			listenTo(ctrl);
 			courseLayoutCtrl = pushController(ureq, translate("command.layout"), ctrl);
+			setActiveTool(layoutLink);
 			currentToolCtr = courseLayoutCtrl;
 		}
 	}
@@ -860,6 +871,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			CourseConfig courseConfig = course.getCourseEnvironment().getCourseConfig().clone();
 			CourseOptionsController ctrl = new CourseOptionsController(ureq, getWindowControl(), getRepositoryEntry(), courseConfig, true);
 			optionsToolCtr = pushController(ureq, translate("command.options"), ctrl);
+			setActiveTool(optionsLink);
 			currentToolCtr = optionsToolCtr;
 		}
 	}
@@ -872,6 +884,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			listenTo(ctrl);
 			archiverCtrl = pushController(ureq, translate("command.openarchiver"), ctrl);
 			currentToolCtr = archiverCtrl;
+			setActiveTool(archiverLink);
 		}
 	}
 	
@@ -885,6 +898,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		FolderRunController ctrl = new FolderRunController(namedCourseFolder, true, true, true, ureq, getWindowControl(), null, customLinkTreeModel);
 		ctrl.addLoggingResourceable(LoggingResourceable.wrap(course));
 		courseFolderCtrl = pushController(ureq, translate("command.coursefolder"), ctrl);
+		setActiveTool(folderLink);
 		currentToolCtr = courseFolderCtrl;
 	}
 	
@@ -894,6 +908,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		CourseAreasController ctrl = new CourseAreasController(ureq, getWindowControl(), getRepositoryEntry().getOlatResource());
 		ctrl.addLoggingResourceable(LoggingResourceable.wrap(course));
 		areasCtrl = pushController(ureq, translate("command.courseareas"), ctrl);
+		setActiveTool(areaLink);
 		currentToolCtr = areasCtrl;
 	}
 	
@@ -904,6 +919,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			CustomDBMainController ctrl = new CustomDBMainController(ureq, getWindowControl(), course);
 			listenTo(ctrl);
 			databasesCtrl = pushController(ureq, translate("command.opendb"), ctrl);
+			setActiveTool(dbLink);
 			currentToolCtr = databasesCtrl;
 		}
 	}
@@ -915,11 +931,12 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			StatisticMainController ctrl = new StatisticMainController(ureq, getWindowControl(), course);
 			listenTo(ctrl);
 			statisticsCtrl = pushController(ureq, translate("command.openstatistic"), ctrl);
+			setActiveTool(courseStatisticLink);
 			currentToolCtr = statisticsCtrl;
 		}
 	}
 	
-	private Activateable2 doAssessmentStatistics(UserRequest ureq, String i18nCrumbKey, String typeName, QTIType... types) {
+	private Activateable2 doAssessmentStatistics(UserRequest ureq, String i18nCrumbKey, String typeName, Link tool, QTIType... types) {
 		OLATResourceable ores = OresHelper.createOLATResourceableType(typeName);
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 		WindowControl swControl = addToHistory(ureq, ores, null);
@@ -930,6 +947,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			listenTo(ctrl);
 			statsToolCtr = pushController(ureq, translate(i18nCrumbKey), ctrl);
 			currentToolCtr = statsToolCtr;
+			setActiveTool(tool);
 			return statsToolCtr;
 		}
 		return null;
@@ -949,6 +967,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			listenTo(ctrl);
 			assessmentToolCtr = pushController(ureq, translate("command.openassessment"), ctrl);
 			currentToolCtr = assessmentToolCtr;
+			setActiveTool(assessmentLink);
 			return assessmentToolCtr;
 		}
 		// 2) users with coach right: limited access to coached groups
@@ -960,6 +979,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 			listenTo(ctrl);
 			assessmentToolCtr = pushController(ureq, translate("command.openassessment"), ctrl);
 			currentToolCtr = assessmentToolCtr;
+			setActiveTool(assessmentLink);
 			return assessmentToolCtr;
 		}
 		return null;
diff --git a/src/main/java/org/olat/ims/cp/ui/CPEditMainController.java b/src/main/java/org/olat/ims/cp/ui/CPEditMainController.java
index 91a49c89bb4..73cd80a3215 100644
--- a/src/main/java/org/olat/ims/cp/ui/CPEditMainController.java
+++ b/src/main/java/org/olat/ims/cp/ui/CPEditMainController.java
@@ -44,11 +44,12 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.ims.cp.CPManager;
 import org.olat.ims.cp.ContentPackage;
 import org.olat.modules.cp.CPUIFactory;
+import org.olat.repository.ui.RepositoryEntryRuntimeController.ToolbarAware;
 
 /**
  * The content packaging main edit controller.
  */
-public class CPEditMainController extends BasicController {
+public class CPEditMainController extends BasicController implements ToolbarAware {
 
 	private CPContentController contentCtr;
 	private CPTreeController treeCtr;
@@ -56,7 +57,7 @@ public class CPEditMainController extends BasicController {
 	private LockResult lock;
 	private DeliveryOptions deliveryOptions;
 
-	public CPEditMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
+	public CPEditMainController(UserRequest ureq, WindowControl wControl,
 			VFSContainer cpContainer, OLATResourceable ores) {
 		super(ureq, wControl);
 
@@ -86,10 +87,6 @@ public class CPEditMainController extends BasicController {
 				listenTo(columnLayoutCtr);
 				
 				putInitialPanel(columnLayoutCtr.getInitialComponent());
-				
-				stackPanel.pushController("Editor", this);
-				treeCtr.initToolbar(stackPanel);
-				contentCtr.initToolbar(stackPanel);
 
 				if (!cp.isOLATContentPackage()) {
 					showWarning("maincontroller.cp.created.with.third.party.editor");
@@ -108,6 +105,16 @@ public class CPEditMainController extends BasicController {
 		logAudit("cp editor started. oresId: " + ores.getResourceableId(), null);
 	}
 
+	@Override
+	public void initToolbar(TooledStackedPanel stackPanel) {
+		if(stackPanel != null && treeCtr != null) {
+			treeCtr.initToolbar(stackPanel);
+		}
+		if(stackPanel != null && contentCtr != null) {
+			contentCtr.initToolbar(stackPanel);
+		}
+	}
+
 	@Override
 	protected void doDispose() {
 		Long oresId = cp.getResourcable().getResourceableId();
diff --git a/src/main/java/org/olat/ims/cp/ui/CPRuntimeController.java b/src/main/java/org/olat/ims/cp/ui/CPRuntimeController.java
index ba45c46ca5f..d038f6bc3e4 100644
--- a/src/main/java/org/olat/ims/cp/ui/CPRuntimeController.java
+++ b/src/main/java/org/olat/ims/cp/ui/CPRuntimeController.java
@@ -91,7 +91,7 @@ public class CPRuntimeController extends RepositoryEntryRuntimeController {
 			super.event(ureq, source, event);
 		}
 	}
-	
+
 	private void doQuota(UserRequest ureq) {
 		if (quotaManager.hasQuotaEditRights(ureq.getIdentity())) {
 			RepositoryEntry entry = getRepositoryEntry();
@@ -99,6 +99,7 @@ public class CPRuntimeController extends RepositoryEntryRuntimeController {
 			OlatRootFolderImpl cpRoot = FileResourceManager.getInstance().unzipContainerResource(resource);
 			Controller quotaCtrl = quotaManager.getQuotaEditorInstance(ureq, getWindowControl(), cpRoot.getRelPath(), false);
 			pushController(ureq, translate("tab.quota.edit"), quotaCtrl);
+			setActiveTool(quotaLink);
 		}
 	}
 	
@@ -127,5 +128,6 @@ public class CPRuntimeController extends RepositoryEntryRuntimeController {
 		});
 		
 		pushController(ureq, translate("tab.layout"), deliveryOptionsCtrl);
+		setActiveTool(deliveryOptionsLink);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
index c1be91128e8..6fb4d7eef1d 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
@@ -159,7 +159,7 @@ public class QTISurveyHandler extends QTIHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		OLATResource res = re.getOlatResource();
 		if (OnyxModule.isOnyxTest(res)) {
 			return null;
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
index eb5273c2427..03ddd3dca9f 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
@@ -160,7 +160,7 @@ public class QTITestHandler extends QTIHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		OLATResource res = re.getOlatResource();
 		if(OnyxModule.isOnyxTest(res)) {
 			return null;
diff --git a/src/main/java/org/olat/modules/scorm/ScormRuntimeController.java b/src/main/java/org/olat/modules/scorm/ScormRuntimeController.java
index c290ab07187..43f0b9a82b8 100644
--- a/src/main/java/org/olat/modules/scorm/ScormRuntimeController.java
+++ b/src/main/java/org/olat/modules/scorm/ScormRuntimeController.java
@@ -102,5 +102,6 @@ public class ScormRuntimeController extends RepositoryEntryRuntimeController {
 		});
 		
 		pushController(ureq, translate("tab.layout"), deliveryOptionsCtrl);
+		setActiveTool(deliveryOptionsLink);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/webFeed/ui/FeedRuntimeController.java b/src/main/java/org/olat/modules/webFeed/ui/FeedRuntimeController.java
index 92ee7c219d8..4dfd5622dac 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/FeedRuntimeController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/FeedRuntimeController.java
@@ -84,6 +84,7 @@ public class FeedRuntimeController extends RepositoryEntryRuntimeController {
 			OlatRootFolderImpl feedRoot = FileResourceManager.getInstance().getFileResourceRootImpl(entry.getOlatResource());
 			Controller quotaCtrl = quotaManager.getQuotaEditorInstance(ureq, getWindowControl(), feedRoot.getRelPath(), false);
 			pushController(ureq, translate("tab.quota.edit"), quotaCtrl);
+			setActiveTool(quotaLink);
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java
index f90b19d37bb..175f1dd093a 100644
--- a/src/main/java/org/olat/repository/handlers/BlogHandler.java
+++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java
@@ -165,7 +165,7 @@ public class BlogHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl control, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl control) {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index b930dbf8741..f92be1451e7 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -461,8 +461,8 @@ public class CourseHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
-		return CourseFactory.createEditorController(ureq, wControl, panel, re.getOlatResource(), null);
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
+		return CourseFactory.createEditorController(ureq, wControl, re.getOlatResource(), null);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
index b215fdca270..3da3b2b3397 100644
--- a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java
@@ -208,7 +208,7 @@ public class GlossaryHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		VFSContainer glossaryFolder = GlossaryManager.getInstance().getGlossaryRootFolder(re.getOlatResource());
 
 		Properties glossProps = GlossaryItemManager.getInstance().getGlossaryConfig(glossaryFolder);
diff --git a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
index 28f62657fa2..65be451b0e3 100644
--- a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
+++ b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java
@@ -231,7 +231,7 @@ public class ImsCPHandler extends FileHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		// only unzips, if not already unzipped
 		OlatRootFolderImpl cpRoot = FileResourceManager.getInstance().unzipContainerResource(re.getOlatResource());
 
@@ -243,7 +243,7 @@ public class ImsCPHandler extends FileHandler {
 		VFSSecurityCallback secCallback = new FullAccessWithQuotaCallback(quota);
 		cpRoot.setLocalSecurityCallback(secCallback);
 
-		return new CPEditMainController(ureq, wControl, panel, cpRoot, re.getOlatResource());
+		return new CPEditMainController(ureq, wControl, cpRoot, re.getOlatResource());
 	}
 	
 	protected String getDeletedFilePrefix() {
diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
index b3476274972..3d67d2d3d1c 100644
--- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java
@@ -165,7 +165,7 @@ public class PodcastHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl control, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl control) {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
index beed593903a..8cf52d86932 100644
--- a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
+++ b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java
@@ -234,7 +234,7 @@ public class PortfolioHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl control, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl control) {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
index 01ae541295f..47d720a4c6d 100644
--- a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
+++ b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java
@@ -29,7 +29,6 @@ import java.io.File;
 import java.util.Locale;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.layout.MainLayoutController;
@@ -151,11 +150,10 @@ public interface RepositoryHandler {
 	 * can only be called when the current user is either olat admin or in the owning group of this resource
 	 * @param ureq
 	 * @param wControl
-	 * @param panel TODO
 	 * @param res
 	 * @return Controler able to edit resourceable.
 	 */
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel);
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl);
 	
 	/**
 	 * Called if a user wants to create a Resourceable via wizard.
diff --git a/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java b/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java
index 558835a4be6..9b14f9d7a8d 100644
--- a/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java
+++ b/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java
@@ -174,7 +174,7 @@ public class SCORMCPHandler extends FileHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		throw new AssertException("Trying to get editor for an SCORM CP type where no editor is provided for this type.");
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
index 6b5281b416d..196c4ef18af 100644
--- a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
+++ b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java
@@ -205,7 +205,7 @@ public class SharedFolderHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		Controller sharedFolderCtr = new SharedFolderEditorController(re, ureq, wControl);
 		// use on column layout
 		LayoutMain3ColsController layoutCtr = new LayoutMain3ColsController(ureq, wControl, sharedFolderCtr);
diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
index ee32addb622..068470d0f2b 100644
--- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
@@ -34,7 +34,6 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.layout.MainLayoutController;
@@ -215,7 +214,7 @@ public class WebDocumentHandler extends FileHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		throw new AssertException("a web document is not editable!!! res-id:"+re.getResourceableId());
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java
index f2d258557cb..0d45bee576f 100644
--- a/src/main/java/org/olat/repository/handlers/WikiHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java
@@ -268,7 +268,7 @@ public class WikiHandler implements RepositoryHandler {
 	}
 
 	@Override
-	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel panel) {
+	public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl) {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index 922c91ee1e1..c4e6ff69db9 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -53,6 +53,7 @@ import org.olat.core.util.UserSession;
 import org.olat.core.util.Util;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryEntryManagedFlag;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.handlers.EditionSupport;
@@ -220,12 +221,10 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	}
 	
 	protected void initToolbar(Dropdown toolsDropdown, Dropdown settingsDropdown) {
-		
-		boolean managed = false;
-		
 		if (isEntryAdmin) {
 			//tools
 			if(handler.supportsEdit(re) == EditionSupport.yes) {
+				boolean managed = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.editcontent);
 				editLink = LinkFactory.createToolLink("edit.cmd", translate("details.openeditor"), this, "o_sel_repository_editor");
 				editLink.setIconLeftCSS("o_icon o_icon-lg o_icon_edit");
 				editLink.setEnabled(!managed);
@@ -239,23 +238,21 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 			ordersLink = LinkFactory.createToolLink("bookings", translate("details.orders"), this, "o_sel_repo_booking");
 			ordersLink.setIconLeftCSS("o_icon o_icon-fw o_icon_booking");
 			boolean booking = acService.isResourceAccessControled(re.getOlatResource(), null);
-			ordersLink.setEnabled(!corrupted && booking);
+			ordersLink.setEnabled(booking);
 			toolsDropdown.addComponent(ordersLink);
 			
 			//settings
 			editDescriptionLink = LinkFactory.createToolLink("settings.cmd", translate("details.chprop"), this, "o_icon_settings");
 			editDescriptionLink.setElementCssClass("o_sel_course_settings");
-			editDescriptionLink.setEnabled(!managed);
+			editDescriptionLink.setEnabled(!corrupted);
 			settingsDropdown.addComponent(editDescriptionLink);
 			
 			accessLink = LinkFactory.createToolLink("access.cmd", translate("tab.accesscontrol"), this, "o_icon_password");
 			accessLink.setElementCssClass("o_sel_course_access");
-			accessLink.setEnabled(!managed);
 			settingsDropdown.addComponent(accessLink);
 			
 			catalogLink = LinkFactory.createToolLink("cat", translate("details.categoriesheader"), this, "o_icon_catalog");
 			catalogLink.setElementCssClass("o_sel_repo_add_to_catalog");
-			catalogLink.setEnabled(!managed);
 			settingsDropdown.addComponent(catalogLink);
 		}
 		
@@ -280,6 +277,15 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		toolbarPanel.addTool(bookmarkLink, Align.right);
 	}
 	
+	public void setActiveTool(Link tool) {
+		if(tools != null) {
+			tools.setActiveLink(tool);
+		}
+		if(settings != null) {
+			settings.setActiveLink(tool);
+		}
+	}
+	
 	@Override
 	public CustomCSS getCustomCSS() {
 		return runtimeController instanceof MainLayoutController ? ((MainLayoutController)runtimeController).getCustomCSS() : null;
@@ -415,6 +421,9 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	protected <T extends Controller> T pushController(UserRequest ureq, String name, T controller) {
 		popToRoot(ureq).cleanUp();
 		toolbarPanel.pushController(name, controller);
+		if(controller instanceof ToolbarAware) {
+			((ToolbarAware)controller).initToolbar(toolbarPanel);
+		}
 		return controller;
 	}
 	
@@ -426,6 +435,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		AuthoringEditAccessController ctrl = new AuthoringEditAccessController(ureq, getWindowControl(), re);
 		listenTo(ctrl);
 		accessCtrl = pushController(ureq, translate("tab.accesscontrol"), ctrl);
+		setActiveTool(accessLink);
 		currentToolCtr = accessCtrl;
 	}
 	
@@ -454,10 +464,11 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	protected void doEdit(UserRequest ureq) {
 		if(!isEntryAdmin) return;
 		
-		Controller ctrl = handler.createEditorController(re, ureq, getWindowControl(), toolbarPanel);
+		Controller ctrl = handler.createEditorController(re, ureq, getWindowControl());
 		listenTo(ctrl);
 		editorCtrl = pushController(ureq, translate("resource.editor"), ctrl);
 		currentToolCtr = editorCtrl;
+		setActiveTool(editLink);
 	}
 	
 	protected void doDetails(UserRequest ureq) {
@@ -478,6 +489,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		listenTo(ctrl);
 		descriptionCtrl = pushController(ureq, translate("settings.editor"), ctrl);
 		currentToolCtr = descriptionCtrl;
+		setActiveTool(editDescriptionLink);
 	}
 	
 	/**
@@ -492,6 +504,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		listenTo(catalogCtlr);
 		catalogCtlr.initToolbar();
 		currentToolCtr = catalogCtlr;
+		setActiveTool(catalogLink);
 	}
 	
 	protected Activateable2 doMembers(UserRequest ureq) {
@@ -501,6 +514,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		listenTo(ctrl);
 		membersEditController = pushController(ureq, translate("details.members"), ctrl);
 		currentToolCtr = membersEditController;
+		setActiveTool(membersLink);
 		return membersEditController;
 	}
 	
@@ -511,6 +525,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		listenTo(ctrl);
 		ordersCtlr = pushController(ureq, translate("details.orders"), ctrl);
 		currentToolCtr = ordersCtlr;
+		setActiveTool(ordersLink);
 	}
 	
 	private void doRun(UserRequest ureq, RepositoryEntrySecurity reSecurity) {
@@ -566,4 +581,9 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 		public Controller create(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry entry);
 		
 	}
+	
+	public interface ToolbarAware {
+		
+		public void initToolbar(TooledStackedPanel toolbar);
+	}
 }
\ No newline at end of file
-- 
GitLab