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 e36fa545547afb78b62b953de010ab9d15597b4c..0593714134f7a2c43d3759904da934ab14ee475f 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 d968c5088a643376bf08c17750d43367a335b069..0cc9bd8c59a372f5aea933d11d79e27a2beb68cf 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 ed84d80fa94204098585fdcf7eccc9bc4d361bba..d9c397db4c8937bfeaf776f1314f3ef38eba8bb4 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 51e56b78dc44a44007df5117b7b63f8c25e2b241..bdc8b09ccc42cfc9923bc461341041157cf0d7a3 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 86809d48dd42d67e5adbd6918de94c9d81c53a39..c6554a57d5f282b05a1341595e22df5fa0a025a1 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 8dd8cb671e01dba920b1392c21b45a5004c40389..af87d1c6b6d6ea7545f64890cb4bcb55d65e47a7 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">