From 6a0d1dde0b5c15e9ad7a46ee0f376a64d16529cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Ross=C3=A9?= <stephane.rosse@frentix.com>
Date: Wed, 3 Dec 2014 14:28:27 +0100
Subject: [PATCH] OO-1241: use the multiselect tree to choose the page to print
 in a CP

---
 .../gui/components/tree/MenuTreeItem.java     |  30 ++--
 .../org/olat/core/util/tree/TreeHelper.java   |  10 ++
 .../olat/modules/cp/CPDisplayController.java  |   4 +-
 .../org/olat/modules/cp/CPPrintMapper.java    |   1 -
 .../cp/CPSelectPrintPagesController.java      | 143 ++++--------------
 .../org/olat/modules/cp/_content/cpprint.html |   2 +
 6 files changed, 57 insertions(+), 133 deletions(-)

diff --git a/src/main/java/org/olat/core/gui/components/tree/MenuTreeItem.java b/src/main/java/org/olat/core/gui/components/tree/MenuTreeItem.java
index e36fa545547..0593714134f 100644
--- a/src/main/java/org/olat/core/gui/components/tree/MenuTreeItem.java
+++ b/src/main/java/org/olat/core/gui/components/tree/MenuTreeItem.java
@@ -22,16 +22,13 @@ package org.olat.core.gui.components.tree;
 import static org.olat.core.gui.components.tree.MenuTreeEvent.DESELECT;
 import static org.olat.core.gui.components.tree.MenuTreeEvent.SELECT;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.ComponentEventListener;
 import org.olat.core.gui.components.form.flexible.impl.FormItemImpl;
 import org.olat.core.util.tree.INodeFilter;
+import org.olat.core.util.tree.TreeHelper;
 import org.olat.course.tree.TreePosition;
 
 /**
@@ -54,16 +51,6 @@ public class MenuTreeItem extends FormItemImpl {
 	protected MenuTree getFormItemComponent() {
 		return treeCmp;
 	}
-
-	@Override
-	public void doDispatchFormRequest(UserRequest ureq) {
-		super.doDispatchFormRequest(ureq);
-	}
-
-	@Override
-	protected void dispatchFormRequest(UserRequest ureq) {
-		super.dispatchFormRequest(ureq);
-	}
 	
 	@Override
 	public void evalFormRequest(UserRequest ureq) {
@@ -132,6 +119,19 @@ public class MenuTreeItem extends FormItemImpl {
 		}
 		return false;
 	}
+
+	public void selectAll() {
+		TreeModel model = getTreeModel();
+		List<String> nodeIdentifiers = new ArrayList<>();
+ 		TreeHelper.collectNodeIdentifiersRecursive(model.getRootNode(), nodeIdentifiers);
+		treeCmp.setSelectedNodeIds(nodeIdentifiers);
+		treeCmp.setDirty(true);
+	}
+
+	public void deselectAll() {
+		treeCmp.setSelectedNodeIds(Collections.<String>emptyList());
+		treeCmp.setDirty(true);
+	}
 	
 	public void setFilter(INodeFilter filter) {
 		treeCmp.setFilter(filter);
diff --git a/src/main/java/org/olat/core/util/tree/TreeHelper.java b/src/main/java/org/olat/core/util/tree/TreeHelper.java
index d968c5088a6..0cc9bd8c59a 100644
--- a/src/main/java/org/olat/core/util/tree/TreeHelper.java
+++ b/src/main/java/org/olat/core/util/tree/TreeHelper.java
@@ -163,6 +163,16 @@ public class TreeHelper {
 		}
 		return false;
 	}
+
+	public static void collectNodeIdentifiersRecursive(INode node, List<String> nodeIdentifiers) {
+		if(node != null) {
+			nodeIdentifiers.add(node.getIdent());
+			int numOfChildren = node.getChildCount();
+			for (int i = 0; i < numOfChildren; i++) {
+				collectNodeIdentifiersRecursive(node.getChildAt(i), nodeIdentifiers);
+			}
+		}
+	}
 	
 	/**
 	 * from tree structure to a flat list
diff --git a/src/main/java/org/olat/modules/cp/CPDisplayController.java b/src/main/java/org/olat/modules/cp/CPDisplayController.java
index ed84d80fa94..d9c397db4c8 100644
--- a/src/main/java/org/olat/modules/cp/CPDisplayController.java
+++ b/src/main/java/org/olat/modules/cp/CPDisplayController.java
@@ -339,7 +339,7 @@ public class CPDisplayController extends BasicController implements Activateable
 			//fxdiff VCRP-14: print cp
 			} else if (source == printController) {
 				if(Event.DONE_EVENT == event) {
-					List<String> nodeToPrint = printController.getSelectedNodeIdents();
+					List<String> nodeToPrint = printController.getSelectedNodeIdentifiers();
 					printPages(nodeToPrint);
 				}
 				
@@ -352,7 +352,6 @@ public class CPDisplayController extends BasicController implements Activateable
 	}
 	
 	@Override
-	//fxdiff BAKS-7 Resume function
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
 		if(entries == null || entries.isEmpty()) return;
 		
@@ -371,7 +370,6 @@ public class CPDisplayController extends BasicController implements Activateable
 		}
 	}
 
-	//fxdiff VCRP-14: print cp
 	private void printPages(final List<String> selectedNodeIds) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("window.open('" + mapperBaseURL + "/print.html', '_print','height=800,left=100,top=100,width=800,toolbar=no,titlebar=0,status=0,menubar=yes,location= no,scrollbars=1');");
diff --git a/src/main/java/org/olat/modules/cp/CPPrintMapper.java b/src/main/java/org/olat/modules/cp/CPPrintMapper.java
index 51e56b78dc4..bdc8b09ccc4 100644
--- a/src/main/java/org/olat/modules/cp/CPPrintMapper.java
+++ b/src/main/java/org/olat/modules/cp/CPPrintMapper.java
@@ -64,7 +64,6 @@ import org.xml.sax.SAXException;
  * Initial Date:  18 mars 2011 <br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-//fxdiff VCRP-14: print cp
 public class CPPrintMapper implements Mapper {
 	
 	private static final OLog log = Tracing.createLoggerFor(CPPrintMapper.class);
diff --git a/src/main/java/org/olat/modules/cp/CPSelectPrintPagesController.java b/src/main/java/org/olat/modules/cp/CPSelectPrintPagesController.java
index 86809d48dd4..c6554a57d5f 100644
--- a/src/main/java/org/olat/modules/cp/CPSelectPrintPagesController.java
+++ b/src/main/java/org/olat/modules/cp/CPSelectPrintPagesController.java
@@ -19,11 +19,7 @@
  */
 package org.olat.modules.cp;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
@@ -35,11 +31,14 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
 import org.olat.core.gui.components.link.Link;
+import org.olat.core.gui.components.tree.MenuTreeItem;
 import org.olat.core.gui.components.tree.TreeNode;
 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.util.nodes.INode;
+import org.olat.core.util.tree.Visitor;
+import org.olat.core.util.tree.TreeVisitor;
 
 /**
  * 
@@ -51,37 +50,29 @@ import org.olat.core.util.nodes.INode;
  * Initial Date:  9 mars 2011 <br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
-//fxdiff VCRP-14: print cp
 public class CPSelectPrintPagesController extends FormBasicController {
-	
-	private final Map<String,MultipleSelectionElement> identToSelectionMap = new HashMap<String,MultipleSelectionElement>();
-	private final List<MultipleSelectionElement> nodeSelections = new ArrayList<MultipleSelectionElement>();
 
 	private final  CPManifestTreeModel ctm;
 	
-	private FormLink selectAll;
-	private FormLink deselectAll;
+	private FormLink selectAll, deselectAll;
 	private FormSubmit submit;
+	private MenuTreeItem cpTree;
 	
 	public CPSelectPrintPagesController(UserRequest ureq, WindowControl wControl, CPManifestTreeModel ctm) {
 		super(ureq, wControl, "cpprint");
-		
 		this.ctm = ctm;
-		
 		initForm(ureq);
 	}
 	
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		//setFormTitle("print.node.list.title");
 		setFormDescription("print.node.list.desc");
-		
-		if(formLayout instanceof FormLayoutContainer) {
-			FormLayoutContainer layoutContainer = (FormLayoutContainer)formLayout;
-			TreeNode rootNode = ctm.getRootNode();
-			initTreeRec(0, rootNode, layoutContainer);
-			layoutContainer.contextPut("nodeSelections", nodeSelections);
-		}
+
+		cpTree = uifactory.addTreeMultiselect("cpprint", null, formLayout, ctm, this);
+		cpTree.setMultiSelect(true);
+		cpTree.setTreeModel(ctm);
+		cpTree.selectAll();
+		formLayout.add("cpprint", cpTree);
 
 		selectAll = uifactory.addFormLink("checkall", "form.checkall", null, formLayout, Link.LINK);
 		deselectAll = uifactory.addFormLink("uncheckall", "form.uncheckall", null, formLayout, Link.LINK);
@@ -93,38 +84,20 @@ public class CPSelectPrintPagesController extends FormBasicController {
 		uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl());
 	}
 	
-	private void initTreeRec(int level, TreeNode node, FormLayoutContainer layoutcont) {
-		String[] singleKey = new String[]{node.getIdent()};
-		String[] singleValue = new String[]{node.getTitle()};
-		MultipleSelectionElement nodeSelection = uifactory.addCheckboxesVertical("print.node.list." + nodeSelections.size(), layoutcont, singleKey, singleValue, 1);
-		nodeSelection.setLabel("print.node.list", null);
-		nodeSelection.setUserObject(new SelectNodeObject(node, level));
-		nodeSelection.addActionListener(FormEvent.ONCLICK);
-		nodeSelection.select(node.getIdent(), true); 		
-		nodeSelections.add(nodeSelection);
-		identToSelectionMap.put(node.getIdent(), nodeSelection);
-		layoutcont.add(nodeSelection.getComponent().getComponentName(), nodeSelection);
-		
-		int numOfChildren = node.getChildCount();
-		for(int i=0; i<numOfChildren; i++) {
-			initTreeRec(level + 1, (TreeNode)node.getChildAt(i), layoutcont);
-		}
-	}
-	
-	public List<String> getSelectedNodeIdents() {
-		if(nodeSelections == null || nodeSelections.isEmpty()) {
-			return Collections.emptyList();
-		}
-		
-		List<String> selectedNodeIdents = new ArrayList<String>();
-		for(MultipleSelectionElement nodeSelection:nodeSelections) {
-			if(nodeSelection.isMultiselect() &&nodeSelection.isSelected(0)) {
-				SelectNodeObject treeNode = (SelectNodeObject)nodeSelection.getUserObject();
-				String ident = treeNode.getNode().getIdent();
-				selectedNodeIdents.add(ident);
+	public List<String> getSelectedNodeIdentifiers() {
+		final Set<String> selectedKeys = cpTree.getSelectedKeys();
+		final List<String> orderedIdentifiers = new ArrayList<>();
+		TreeVisitor visitor = new TreeVisitor(new Visitor() {
+			@Override
+			public void visit(INode node) {
+				if(selectedKeys.contains(node.getIdent())) {
+					orderedIdentifiers.add(node.getIdent());
+				}
 			}
-		}
-		return selectedNodeIdents;
+		}, ctm.getRootNode(), false);
+
+		visitor.visitAll();
+		return orderedIdentifiers;
 	}
 	
 	@Override
@@ -134,54 +107,14 @@ public class CPSelectPrintPagesController extends FormBasicController {
 
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(nodeSelections.contains(source)) {
-			MultipleSelectionElement nodeSelection = (MultipleSelectionElement)source;
-			if(nodeSelection.isMultiselect()) {
-				selectRec(nodeSelection, nodeSelection.isSelected(0));
-			}
-			// check for at least one selected node
-			submit.setEnabled(false);
-			for(MultipleSelectionElement selection:nodeSelections) {
-				if (selection.isSelected(0)) {
-					submit.setEnabled(true);
-					break;
-				}
-			}
-		} else if (source == selectAll) {
-			for(MultipleSelectionElement nodeSelection:nodeSelections) {
-				if(nodeSelection.isMultiselect() && !nodeSelection.isSelected(0)) {
-					SelectNodeObject treeNode = (SelectNodeObject)nodeSelection.getUserObject();
-					String ident = treeNode.getNode().getIdent();
-					nodeSelection.select(ident, true);
-				}
-			} 
+		if (source == selectAll) {
+			cpTree.selectAll();
 			submit.setEnabled(true);
 		} else if (source == deselectAll) {
-			for(MultipleSelectionElement nodeSelection:nodeSelections) {
-				if(nodeSelection.isMultiselect() && nodeSelection.isSelected(0)) {
-					SelectNodeObject treeNode = (SelectNodeObject)nodeSelection.getUserObject();
-					String ident = treeNode.getNode().getIdent();
-					nodeSelection.select(ident, false);
-				}
-			}
+			cpTree.deselectAll();
 			submit.setEnabled(false);
 		} else {
-				super.formInnerEvent(ureq, source, event);	
-		}
-	}
-	
-	private void selectRec(MultipleSelectionElement nodeSelection, boolean select) {
-		SelectNodeObject userObject = (SelectNodeObject)nodeSelection.getUserObject();
-		TreeNode node = userObject.getNode();
-		if(nodeSelection.isMultiselect()) {
-			nodeSelection.select(node.getIdent(), select);
-		}
-
-		for(int i=node.getChildCount(); i-->0; ) {
-			INode child = node.getChildAt(i);
-			String ident = child.getIdent();
-			MultipleSelectionElement childNodeSelection = identToSelectionMap.get(ident);
-			selectRec(childNodeSelection, select);
+			super.formInnerEvent(ureq, source, event);
 		}
 	}
 
@@ -194,22 +127,4 @@ public class CPSelectPrintPagesController extends FormBasicController {
 	protected void formCancelled(UserRequest ureq) {
 		fireEvent(ureq, Event.CANCELLED_EVENT);
 	}
-	
-	public class SelectNodeObject {
-		private final int indentation;
-		private final TreeNode node;
-		
-		public SelectNodeObject(TreeNode node, int indentation) {
-			this.node = node;
-			this.indentation = indentation;
-		}
-
-		public String getIndentation() {
-			return Integer.toString(indentation);
-		}
-
-		public TreeNode getNode() {
-			return node;
-		}
-	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/cp/_content/cpprint.html b/src/main/java/org/olat/modules/cp/_content/cpprint.html
index 8dd8cb671e0..af87d1c6b6d 100644
--- a/src/main/java/org/olat/modules/cp/_content/cpprint.html
+++ b/src/main/java/org/olat/modules/cp/_content/cpprint.html
@@ -8,6 +8,8 @@
 			$r.render($nodeSelection.getComponent().getComponentName())
 		</div>
 	#end
+
+	$r.render("cpprint")
 	
 	<br/>
 	<div class="o_togglecheck">
-- 
GitLab