From 3c2b90b654842499a30e3a001000c61b70d6271d Mon Sep 17 00:00:00 2001 From: jamsonchan Date: Tue, 2 Jan 2024 21:16:10 +0800 Subject: [PATCH] ZK-3853: Tree supports 3-states selection(WIP) --- zkdoc/release-note | 3 + .../zktest/test2/F100_ZK_3853Composer.java | 149 ++++++++ .../zktest/test2/F100_ZK_3853_2Composer.java | 70 ++++ .../src/main/webapp/test2/F100-ZK-3853-1.zul | 104 ++++++ .../src/main/webapp/test2/F100-ZK-3853-2.zul | 28 ++ .../src/main/webapp/test2/F100-ZK-3853-3.zul | 125 +++++++ zktest/src/main/webapp/test2/F100-ZK-3853.zul | 219 ++++++++++++ .../zktest/zats/test2/F100_ZK_3853_1Test.java | 182 ++++++++++ .../zktest/zats/test2/F100_ZK_3853_2Test.java | 46 +++ .../zktest/zats/test2/F100_ZK_3853_3Test.java | 132 +++++++ .../java/org/zkoss/zul/AbstractTreeModel.java | 198 ++++++++++- zul/src/main/java/org/zkoss/zul/Tree.java | 322 +++++++++++++++++- .../org/zkoss/zul/event/TreeDataEvent.java | 18 +- .../org/zkoss/zul/ext/PartialSelectable.java | 82 +++++ .../zul/ext/TreePartialSelectableModel.java | 113 ++++++ zul/src/main/resources/metainfo/xml/zul.xsd | 1 + zul/src/main/resources/web/js/zul/sel/Tree.ts | 117 +++++++ .../main/resources/web/js/zul/sel/Treecell.ts | 4 +- .../main/resources/web/js/zul/sel/Treecol.ts | 6 +- .../main/resources/web/js/zul/sel/Treeitem.ts | 31 ++ .../main/resources/web/js/zul/sel/Treerow.ts | 10 +- .../resources/web/js/zul/sel/less/tree.less | 19 ++ 22 files changed, 1938 insertions(+), 41 deletions(-) create mode 100644 zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853Composer.java create mode 100644 zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853_2Composer.java create mode 100644 zktest/src/main/webapp/test2/F100-ZK-3853-1.zul create mode 100644 zktest/src/main/webapp/test2/F100-ZK-3853-2.zul create mode 100644 zktest/src/main/webapp/test2/F100-ZK-3853-3.zul create mode 100644 zktest/src/main/webapp/test2/F100-ZK-3853.zul create mode 100644 zktest/src/test/java/org/zkoss/zktest/zats/test2/F100_ZK_3853_1Test.java create mode 100644 zktest/src/test/java/org/zkoss/zktest/zats/test2/F100_ZK_3853_2Test.java create mode 100644 zktest/src/test/java/org/zkoss/zktest/zats/test2/F100_ZK_3853_3Test.java create mode 100644 zul/src/main/java/org/zkoss/zul/ext/PartialSelectable.java create mode 100644 zul/src/main/java/org/zkoss/zul/ext/TreePartialSelectableModel.java diff --git a/zkdoc/release-note b/zkdoc/release-note index 89e47469b28..05ebf37dcd9 100644 --- a/zkdoc/release-note +++ b/zkdoc/release-note @@ -9,6 +9,7 @@ ZK 10.0.0 ZK-5596: Simplify the JavaScript url when enable embedded mode ZK-5590: Reimplement sourcemap in ZK 10 ZK-5512: Support for Listening to Space Key Pressed + ZK-3853: Tree supports 3-states selection * Bugs ZK-5393: Update ZK jars to jakarta-friendly uploads @@ -38,6 +39,8 @@ ZK 10.0.0 simplifying the source to enable embedded mode. + The setContent() method of Comboitem, Menu, and Navitem now only accepts a safe HTML content. i.e. The content will be sanitized before rendering, please don't use JavaScript content. + + Tree support tri-state selection, use new boolean attribute `indeterminate` to enable. + -------- ZK 10.0.0-Beta Oct 17, 2023 diff --git a/zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853Composer.java b/zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853Composer.java new file mode 100644 index 00000000000..056dfc6e05c --- /dev/null +++ b/zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853Composer.java @@ -0,0 +1,149 @@ +/* F100_ZK_3853Composer.java + + Purpose: + + Description: + + History: + Fri Dec 15 17:53:26 CST 2023, Created by jamson + +Copyright (C) 2023 Potix Corporation. All Rights Reserved. +*/ +package org.zkoss.zktest.test2; + +import org.zkoss.zk.ui.select.SelectorComposer; +import org.zkoss.zk.ui.select.annotation.Listen; +import org.zkoss.zk.ui.select.annotation.Wire; +import org.zkoss.zul.Button; +import org.zkoss.zul.DefaultTreeModel; +import org.zkoss.zul.DefaultTreeNode; +import org.zkoss.zul.Tree; +import org.zkoss.zul.TreeNode; +import org.zkoss.zul.Treechildren; +import org.zkoss.zul.Treeitem; +import org.zkoss.zul.Window; + +public class F100_ZK_3853Composer extends SelectorComposer { + + DefaultTreeModel model; + @Wire + Tree tree, tree2; + @Wire + Button b6, b13; + @Override + public void doAfterCompose(Window component) throws Exception { + super.doAfterCompose(component); + model = new DefaultTreeModel( + new DefaultTreeNode(null, + new DefaultTreeNode[] { + new DefaultTreeNode("1", + new DefaultTreeNode[] { + new DefaultTreeNode("2"), + new DefaultTreeNode("3") + }), + new DefaultTreeNode("4"), + new DefaultTreeNode("5", + new DefaultTreeNode[] { + new DefaultTreeNode("6", + new DefaultTreeNode[] { + new DefaultTreeNode("7"), + new DefaultTreeNode("8"), + new DefaultTreeNode("9", + new DefaultTreeNode[] { + new DefaultTreeNode("10"), + new DefaultTreeNode("11"), + new DefaultTreeNode("12"), + } + ) + } + ), + new DefaultTreeNode("13"), + new DefaultTreeNode("14") + } + ) + } + ) + ); + tree.setModel(model); + tree.setIndeterminate(true); + } + + @Listen("onClick=#b1") + public void b1() { + tree.setModel(tree.getModel() == null ? model : null); + } + + @Listen("onClick=#b2") + public void b2() { + tree.setIndeterminate(!tree.isIndeterminate()); + } + + @Listen("onClick=#b3") + public void b3() { + model.setIndeterminate(!model.isIndeterminate()); + } + + @Listen("onClick=#b4") + public void b4() { + tree.setMultiple(!tree.isMultiple()); + } + + @Listen("onClick=#b5") + public void b5() { + model.setMultiple(!model.isMultiple()); + } + + @Listen("onClick=#b6") + public void b6() { + b6.setLabel("sel:" + String.valueOf(tree.getSelectedCount()) + " par:" + String.valueOf(tree.getPartialCount())); + } + + @Listen("onClick=#b7") + public void b7() { + TreeNode root = (TreeNode) model.getRoot(), + targetParent = root.getChildAt(2).getChildAt(0).getChildAt(2), + newNode = new DefaultTreeNode("Model inserted"); + targetParent.insert(newNode, 1); + } + + @Listen("onClick=#b8") + public void b8() { + TreeNode root = (TreeNode) model.getRoot(), + targetParent = root.getChildAt(2).getChildAt(0).getChildAt(2); + targetParent.remove(1); + } + + @Listen("onClick=#b11") + public void b11() { + tree2.setIndeterminate(!tree2.isIndeterminate()); + } + + @Listen("onClick=#b12") + public void b12() { + tree2.setMultiple(!tree2.isMultiple()); + } + + @Listen("onClick=#b13") + public void b13() { + b13.setLabel("sel:" + String.valueOf(tree2.getSelectedCount()) + " par:" + String.valueOf(tree2.getPartialCount())); + } + + @Listen("onClick=#b14") + public void b14() { + Treechildren treechildren = tree2.getTreechildren(); + Treeitem t1 = (Treeitem) treechildren.getFirstChild(), + t4 = (Treeitem) t1.getNextSibling(), + t5 = (Treeitem) t4.getNextSibling(); + + Treeitem ti = new Treeitem(); + ti.setLabel("inserted"); + ti.setSelected(true); + treechildren.insertBefore(ti, treechildren.getFirstChild()); + } + + @Listen("onClick=#b15") + public void b15() { + Treechildren treechildren = tree2.getTreechildren(); + treechildren.removeChild(treechildren.getFirstChild()); + } +} \ No newline at end of file diff --git a/zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853_2Composer.java b/zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853_2Composer.java new file mode 100644 index 00000000000..98237bb85f4 --- /dev/null +++ b/zktest/src/main/java/org/zkoss/zktest/test2/F100_ZK_3853_2Composer.java @@ -0,0 +1,70 @@ +/* F100_ZK_3853_2Composer.java + + Purpose: + + Description: + + History: + Tue Jan 02 18:48:59 CST 2024, Created by jamson + +Copyright (C) 2024 Potix Corporation. All Rights Reserved. +*/ +package org.zkoss.zktest.test2; + +import org.zkoss.zk.ui.select.SelectorComposer; +import org.zkoss.zk.ui.select.annotation.Listen; +import org.zkoss.zk.ui.select.annotation.Wire; +import org.zkoss.zul.DefaultTreeModel; +import org.zkoss.zul.DefaultTreeNode; +import org.zkoss.zul.Tree; +import org.zkoss.zul.Window; + +public class F100_ZK_3853_2Composer extends SelectorComposer { + DefaultTreeModel model; + @Wire + Tree tree; + @Override + public void doAfterCompose(Window component) throws Exception { + super.doAfterCompose(component); + model = + new DefaultTreeModel( + new DefaultTreeNode(null, + new DefaultTreeNode[] { + new DefaultTreeNode("0", + new DefaultTreeNode[] { + new DefaultTreeNode("1"), + new DefaultTreeNode("2") + } + ), + new DefaultTreeNode("3"), + new DefaultTreeNode("4", + new DefaultTreeNode[] { + new DefaultTreeNode("5", + new DefaultTreeNode[] { + new DefaultTreeNode("6"), + new DefaultTreeNode("7"), + new DefaultTreeNode("8", + new DefaultTreeNode[] { + new DefaultTreeNode("9"), + new DefaultTreeNode("10"), + new DefaultTreeNode("11"), + } + ) + } + ), + new DefaultTreeNode("12"), + new DefaultTreeNode("13") + } + ) + } + ) + ); + tree.setModel(model); + tree.setIndeterminate(true); + } + + @Listen("onClick=#btn") + public void toogleModel() { + tree.setModel(tree.getModel() == null ? model : null); + } +} diff --git a/zktest/src/main/webapp/test2/F100-ZK-3853-1.zul b/zktest/src/main/webapp/test2/F100-ZK-3853-1.zul new file mode 100644 index 00000000000..b944634a5eb --- /dev/null +++ b/zktest/src/main/webapp/test2/F100-ZK-3853-1.zul @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zktest/src/main/webapp/test2/F100-ZK-3853-2.zul b/zktest/src/main/webapp/test2/F100-ZK-3853-2.zul new file mode 100644 index 00000000000..20b6a999eb9 --- /dev/null +++ b/zktest/src/main/webapp/test2/F100-ZK-3853-2.zul @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zktest/src/main/webapp/test2/F100-ZK-3853.zul b/zktest/src/main/webapp/test2/F100-ZK-3853.zul new file mode 100644 index 00000000000..b93a3241cc5 --- /dev/null +++ b/zktest/src/main/webapp/test2/F100-ZK-3853.zul @@ -0,0 +1,219 @@ + + + + + +