From 8910a3131544c2cd48aac0dc981b179d37055adc Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 28 Sep 2012 09:32:04 +0200
Subject: [PATCH] OO-291: implement back button in members management

---
 .../components/stack/StackedController.java   |  6 ++
 .../stack/StackedControllerImpl.java          |  8 ++-
 .../generic/layout/GenericMainController.java | 21 +++++++
 .../member/AbstractMemberListController.java  | 10 +++-
 .../MembersManagementMainController.java      | 58 +++++++++++++------
 .../member/MembersOverviewController.java     | 45 +++++++++++---
 .../olat/course/run/RunMainController.java    | 26 +++++++--
 7 files changed, 139 insertions(+), 35 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/components/stack/StackedController.java b/src/main/java/org/olat/core/gui/components/stack/StackedController.java
index a1b2fb0d6d2..f348389f339 100644
--- a/src/main/java/org/olat/core/gui/components/stack/StackedController.java
+++ b/src/main/java/org/olat/core/gui/components/stack/StackedController.java
@@ -19,6 +19,7 @@
  */
 package org.olat.core.gui.components.stack;
 
+import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 
 /**
@@ -27,6 +28,11 @@ import org.olat.core.gui.control.Controller;
  */
 public interface StackedController extends Controller {
 	
+	/**
+	 * Dissmiss all controllers but the root
+	 */
+	public void popUpToRootController(UserRequest ureq);
+	
 	public void pushController(String displayName, Controller controller);
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java b/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java
index 02465320023..fc32bffa744 100644
--- a/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java
+++ b/src/main/java/org/olat/core/gui/components/stack/StackedControllerImpl.java
@@ -64,7 +64,8 @@ public class StackedControllerImpl extends DefaultController implements StackedC
 		}
 	}
 
-	public void popControllers(UserRequest ureq) {
+	@Override
+	public void popUpToRootController(UserRequest ureq) {
 		if(stack.size() > 1) {
 			Controller popedCtrl = null;
 			for(int i=stack.size(); i-->1; ) {
@@ -72,6 +73,11 @@ public class StackedControllerImpl extends DefaultController implements StackedC
 				popedCtrl = (Controller)link.getUserObject();
 				popedCtrl.dispose();
 			}
+			
+			//set the root controller
+			Link rootLink = stack.get(0);
+			Controller rootController  = (Controller)rootLink.getUserObject();
+			setContent(rootController); 
 			fireEvent(ureq, new PopEvent(popedCtrl));
 		}
 	}
diff --git a/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java b/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java
index 90a1481004c..9a4b1b1278f 100644
--- a/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/layout/GenericMainController.java
@@ -286,6 +286,27 @@ public abstract class GenericMainController extends MainLayoutBasicController im
 		return gtm;
 	}
 
+	@Override
+	public void popUpToRootController(UserRequest ureq) {
+		if(stack.size() > 1) {
+			Controller popedCtrl = null;
+			for(int i=stack.size(); i-->1; ) {
+				Link link = stack.remove(i);
+				popedCtrl = (Controller)link.getUserObject();
+				popedCtrl.dispose();
+			}
+			
+			//set the root controller
+			Link rootLink = stack.get(0);
+			Controller rootController  = (Controller)rootLink.getUserObject();
+			if(rootController == this) {
+				content.setContent(contentCtr.getInitialComponent());
+			} else {
+				content.setContent(rootController.getInitialComponent());
+			}
+		}
+	}
+
 	@Override
 	public void pushController(String displayName, Controller controller) {
 		Link link = LinkFactory.createLink("gcrumb_" + stack.size(), stackVC, this);
diff --git a/src/main/java/org/olat/course/member/AbstractMemberListController.java b/src/main/java/org/olat/course/member/AbstractMemberListController.java
index 6a0c65ed144..02ee30a8016 100644
--- a/src/main/java/org/olat/course/member/AbstractMemberListController.java
+++ b/src/main/java/org/olat/course/member/AbstractMemberListController.java
@@ -50,9 +50,12 @@ 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.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.id.Identity;
+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.Util;
 import org.olat.core.util.mail.ContactList;
@@ -80,7 +83,7 @@ import org.olat.user.propertyhandlers.UserPropertyHandler;
  * 
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-public abstract class AbstractMemberListController extends BasicController {
+public abstract class AbstractMemberListController extends BasicController implements Activateable2 {
 
 	protected static final String USER_PROPS_ID = MemberListController.class.getCanonicalName();
 	
@@ -161,6 +164,11 @@ public abstract class AbstractMemberListController extends BasicController {
 		memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_REMOVE, "table.header.remove", translate("table.header.remove")));
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		//
+	}
+
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
 		//
diff --git a/src/main/java/org/olat/course/member/MembersManagementMainController.java b/src/main/java/org/olat/course/member/MembersManagementMainController.java
index a3ef70a4cd8..105e6b87651 100644
--- a/src/main/java/org/olat/course/member/MembersManagementMainController.java
+++ b/src/main/java/org/olat/course/member/MembersManagementMainController.java
@@ -30,13 +30,18 @@ import org.olat.core.gui.components.tree.GenericTreeNode;
 import org.olat.core.gui.components.tree.MenuTree;
 import org.olat.core.gui.components.tree.TreeNode;
 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.MainLayoutBasicController;
 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.ActionType;
+import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.tree.TreeHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
@@ -52,10 +57,10 @@ import org.olat.util.logging.activity.LoggingResourceable;
  */
 public class MembersManagementMainController extends MainLayoutBasicController  implements Activateable2 {
 	
-	private static final String CMD_MEMBERS = "cmd.members";
-	private static final String CMD_GROUPS = "cmd.groups";
-	private static final String CMD_BOOKING = "cmd.booking";
-	private static final String CMD_RIGHTS = "cmd.rights";
+	private static final String CMD_MEMBERS = "Members";
+	private static final String CMD_GROUPS = "Groups";
+	private static final String CMD_BOOKING = "Booking";
+	private static final String CMD_RIGHTS = "Rights";
 
 	private final MenuTree menuTree;
 	private final VelocityContainer mainVC;
@@ -131,52 +136,67 @@ public class MembersManagementMainController extends MainLayoutBasicController
 		if (source == menuTree) {
 			if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) {
 				TreeNode selTreeNode = menuTree.getSelectedNode();				
-				Object cmd = selTreeNode.getUserObject();
+				String cmd = (String)selTreeNode.getUserObject();
 				selectMenuItem(ureq, cmd);
 			}
 		}
 	}
 	
-	private void selectMenuItem(UserRequest ureq, Object cmd) {
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		if(entries == null || entries.isEmpty()) return;
+		
+		ContextEntry currentEntry = entries.get(0);
+		String cmd = currentEntry.getOLATResourceable().getResourceableTypeName();
+		Controller selectedCtrl = selectMenuItem(ureq, cmd);
+		if(selectedCtrl instanceof Activateable2) {
+			List<ContextEntry> subEntries = entries.subList(1, entries.size());
+			((Activateable2)selectedCtrl).activate(ureq, subEntries, currentEntry.getTransientState());
+		}
+	}
+	
+	private Controller selectMenuItem(UserRequest ureq, String cmd) {
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance(cmd, 0l);
+		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+		WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+		addToHistory(ureq, bwControl);
+		
+		Controller selectedCtrl = null;
 		if(CMD_MEMBERS.equals(cmd)) {
 			if(membersOverviewCtrl == null) {
-				membersOverviewCtrl = new MembersOverviewController(ureq, getWindowControl(), repoEntry);
+				membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, repoEntry);
 				listenTo(membersOverviewCtrl);
 			}
 			mainVC.put("content", membersOverviewCtrl.getInitialComponent());
+			selectedCtrl = membersOverviewCtrl;
 		} else if(CMD_GROUPS.equals(cmd)) {
 			if(groupsCtrl == null) {
-				groupsCtrl = new CourseBusinessGroupListController(ureq, getWindowControl(), repoEntry);
+				groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry);
 				listenTo(groupsCtrl);
 			}
 			groupsCtrl.reloadModel();
 			mainVC.put("content", groupsCtrl.getInitialComponent());
+			selectedCtrl = groupsCtrl;
 		} else if(CMD_BOOKING.equals(cmd)) {
 			if(ordersController == null) {
-				ordersController = new OrdersAdminController(ureq, getWindowControl(), repoEntry.getOlatResource());
+				ordersController = new OrdersAdminController(ureq, bwControl, repoEntry.getOlatResource());
 				listenTo(ordersController);
 			}
 			mainVC.put("content", ordersController.getInitialComponent());
+			selectedCtrl = ordersController;
 		} else if(CMD_RIGHTS.equals(cmd)) {
 			if(rightsController == null) {
-				rightsController = new GroupsAndRightsController(ureq, getWindowControl(), repoEntry.getOlatResource());
+				rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry.getOlatResource());
 				listenTo(rightsController);
 			}
 			mainVC.put("content", rightsController.getInitialComponent());
+			selectedCtrl = rightsController;
 		}
 		
 		TreeNode selTreeNode = TreeHelper.findNodeByUserObject(cmd, menuTree.getTreeModel().getRootNode());
 		if (selTreeNode != null && !selTreeNode.getIdent().equals(menuTree.getSelectedNodeId())) {
 			menuTree.setSelectedNodeId(selTreeNode.getIdent());
 		}
+		return selectedCtrl;
 	}
-
-
-
-	@Override
-	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
-
-	}
-	
-
 }
diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java
index c2c1ad17778..7f358c9834b 100644
--- a/src/main/java/org/olat/course/member/MembersOverviewController.java
+++ b/src/main/java/org/olat/course/member/MembersOverviewController.java
@@ -69,6 +69,13 @@ import org.olat.util.logging.activity.LoggingResourceable;
  */
 public class MembersOverviewController extends BasicController implements Activateable2 {
 	
+	private static final String SEG_ALL_MEMBERS = "All";
+	private static final String SEG_OWNERS_MEMBERS = "Owners";
+	private static final String SEG_TUTORS_MEMBERS = "Coaches";
+	private static final String SEG_PARTICIPANTS_MEMBERS = "Participants";
+	private static final String SEG_WAITING_MEMBERS = "Waiting";
+	private static final String SEG_SEARCH_MEMBERS = "Search";
+	
 	private final Link allMembersLink, ownersLink, tutorsLink, participantsLink, waitingListLink, searchLink;
 	private final SegmentViewComponent segmentView;
 	private final VelocityContainer mainVC;
@@ -117,7 +124,6 @@ public class MembersOverviewController extends BasicController implements Activa
 		importMemberLink = LinkFactory.createButton("import.member", mainVC, this);
 		mainVC.put("importMembers", importMemberLink);
 		
-		
 		putInitialPanel(mainVC);
 	}
 	
@@ -128,7 +134,30 @@ public class MembersOverviewController extends BasicController implements Activa
 
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
-		//
+		if(entries == null || entries.isEmpty()) return;
+		
+		ContextEntry currentEntry = entries.get(0);
+		String segment = currentEntry.getOLATResourceable().getResourceableTypeName();
+		List<ContextEntry> subEntries = entries.subList(1, entries.size());
+		if(SEG_ALL_MEMBERS.equals(segment)) {
+			updateAllMembers(ureq).activate(ureq, subEntries, currentEntry.getTransientState());
+			segmentView.select(allMembersLink);
+		} else if(SEG_OWNERS_MEMBERS.equals(segment)) {
+			updateOwners(ureq).activate(ureq, subEntries, currentEntry.getTransientState());
+			segmentView.select(ownersLink);
+		} else if(SEG_TUTORS_MEMBERS.equals(segment)) {
+			updateTutors(ureq).activate(ureq, subEntries, currentEntry.getTransientState());
+			segmentView.select(tutorsLink);
+		} else if(SEG_PARTICIPANTS_MEMBERS.equals(segment)) {
+			updateParticipants(ureq).activate(ureq, subEntries, currentEntry.getTransientState());
+			segmentView.select(participantsLink);
+		} else if(SEG_WAITING_MEMBERS.equals(segment)) {
+			updateWaitingList(ureq).activate(ureq, subEntries, currentEntry.getTransientState());
+			segmentView.select(waitingListLink);
+		} else if(SEG_SEARCH_MEMBERS.equals(segment)) {
+			updateSearch(ureq).activate(ureq, subEntries, currentEntry.getTransientState());
+			segmentView.select(searchLink);
+		}
 	}
 
 	@Override
@@ -245,7 +274,7 @@ public class MembersOverviewController extends BasicController implements Activa
 	
 	private AbstractMemberListController updateAllMembers(UserRequest ureq) {
 		if(allMemberListCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("AllMembers", 0l);
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_ALL_MEMBERS, 0l);
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			SearchMembersParams searchParams = new SearchMembersParams(true, true, true, true, true, false);
@@ -261,7 +290,7 @@ public class MembersOverviewController extends BasicController implements Activa
 	
 	private AbstractMemberListController updateOwners(UserRequest ureq) {
 		if(ownersCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Owners", 0l);
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_OWNERS_MEMBERS, 0l);
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			SearchMembersParams searchParams = new SearchMembersParams(true, false, false, false, false, false);
@@ -278,7 +307,7 @@ public class MembersOverviewController extends BasicController implements Activa
 
 	private AbstractMemberListController updateTutors(UserRequest ureq) {
 		if(tutorsCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Tutors", 0l);
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_TUTORS_MEMBERS, 0l);
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			SearchMembersParams searchParams = new SearchMembersParams(false, true, false, true, false, false);
@@ -295,7 +324,7 @@ public class MembersOverviewController extends BasicController implements Activa
 	
 	private AbstractMemberListController updateParticipants(UserRequest ureq) {
 		if(participantsCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Tutors", 0l);
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_PARTICIPANTS_MEMBERS, 0l);
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			SearchMembersParams searchParams = new SearchMembersParams(false, false, true, false, true, false);
@@ -312,7 +341,7 @@ public class MembersOverviewController extends BasicController implements Activa
 	
 	private AbstractMemberListController updateWaitingList(UserRequest ureq) {
 		if(waitingCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("WaitingList", 0l);
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_WAITING_MEMBERS, 0l);
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			SearchMembersParams searchParams = new SearchMembersParams(false, false, false, false, false, true);
@@ -329,7 +358,7 @@ public class MembersOverviewController extends BasicController implements Activa
 	
 	private AbstractMemberListController updateSearch(UserRequest ureq) {
 		if(searchCtrl == null) {
-			OLATResourceable ores = OresHelper.createOLATResourceableInstance("Search", 0l);
+			OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_SEARCH_MEMBERS, 0l);
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			searchCtrl = new MemberSearchController(ureq, bwControl, repoEntry);
diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java
index e6e9ad45586..1f8e6e06388 100644
--- a/src/main/java/org/olat/course/run/RunMainController.java
+++ b/src/main/java/org/olat/course/run/RunMainController.java
@@ -720,11 +720,7 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 			} else throw new OLATSecurityException("wanted to activate editor, but no according right");
 
 		} else if (cmd.equals("unifiedusermngt")) {
-			if (hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || isCourseAdmin) {
-				currentToolCtr = new MembersManagementMainController(ureq, getWindowControl(), courseRepositoryEntry);
-				listenTo(currentToolCtr);
-				all.pushController(translate("command.opensimplegroupmngt"), currentToolCtr);
-			} else throw new OLATSecurityException("clicked groupmanagement, but no according right");
+			launchMembersManagement(ureq);
 			
 		} else if (cmd.equals("statistic")) {
 			if (hasCourseRight(CourseRights.RIGHT_STATISTICS) || isCourseAdmin) {
@@ -786,7 +782,6 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 
 		} else if (cmd.equals("assessment")) {
 			launchAssessmentTool(ureq, null);
-
 		} else if (cmd.equals("efficiencystatement")) {
 			// will not be disposed on course run dispose, popus up as new
 			// browserwindow
@@ -850,6 +845,22 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 			//
 		} 
 	}
+	
+	private MembersManagementMainController launchMembersManagement(UserRequest ureq) {
+		if (hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || isCourseAdmin) {
+			if(!(currentToolCtr instanceof MembersManagementMainController)) {
+				OLATResourceable ores = OresHelper.createOLATResourceableInstance("MembersMgmt", 0l);
+				ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
+				WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
+				currentToolCtr = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), courseRepositoryEntry);
+				listenTo(currentToolCtr);
+				
+				all.popUpToRootController(ureq);
+				all.pushController(translate("command.opensimplegroupmngt"), currentToolCtr);
+			}
+			return (MembersManagementMainController)currentToolCtr;
+		} else throw new OLATSecurityException("clicked groupmanagement, but no according right");
+	}
 
 	private Activateable2 launchAssessmentTool(UserRequest ureq, List<ContextEntry> entries) {
 		OLATResourceable ores = OresHelper.createOLATResourceableType("assessmentTool");
@@ -1264,6 +1275,9 @@ public class RunMainController extends MainLayoutBasicController implements Gene
 					//the wrong link to the wrong person
 				}
 			}
+		} else if("MembersMgmt".equals(type)) {
+			List<ContextEntry> subEntries = entries.subList(1, entries.size());
+			launchMembersManagement(ureq).activate(ureq, subEntries, firstEntry.getTransientState());
 		}
 	}
 
-- 
GitLab