summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStas Negara <snegara@google.com>2015-06-04 16:59:23 -0700
committerStas Negara <snegara@google.com>2015-06-04 17:00:48 -0700
commit0f7953d6a06a89e905102eca60832569f4dff7fb (patch)
tree1966cb6e1c0232283bbaef8301acd888d1e93b27
parent416a792ddffa75ca2f4604d48974a65ca5ccff19 (diff)
downloadtesting-0f7953d6a06a89e905102eca60832569f4dff7fb.tar.gz
Click on a non-toggable tree group expands/collapses it.
Change-Id: I139297cee596a183532969ac85107324377a968a
-rw-r--r--src/com/google/gct/testing/TwoPanelTree.java61
1 files changed, 50 insertions, 11 deletions
diff --git a/src/com/google/gct/testing/TwoPanelTree.java b/src/com/google/gct/testing/TwoPanelTree.java
index 97c4a98..c2ac3e4 100644
--- a/src/com/google/gct/testing/TwoPanelTree.java
+++ b/src/com/google/gct/testing/TwoPanelTree.java
@@ -15,6 +15,7 @@
*/
package com.google.gct.testing;
+import com.google.api.client.util.Maps;
import com.google.common.base.Function;
import com.google.gct.testing.dimension.CloudConfigurationDimension;
import com.google.gct.testing.dimension.CloudTestingType;
@@ -34,11 +35,10 @@ import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
+import javax.swing.event.TreeExpansionEvent;
+import javax.swing.event.TreeWillExpandListener;
import javax.swing.plaf.basic.BasicTreeUI;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeCellRenderer;
-import javax.swing.tree.TreeNode;
+import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
@@ -75,7 +75,9 @@ public class TwoPanelTree extends MouseAdapter implements ListSelectionListener,
private final JPanel bottomPanel;
// Trees
- private Map<CloudConfigurationDimension,CheckboxTree> treeMap;
+ private Map<CloudConfigurationDimension, CheckboxTree> treeMap;
+ private final Map<CheckboxTree, Boolean> userToggledTrees = Maps.newHashMap();
+ private boolean isAutoToggled = false;
private JBList list;
// The configuration which we need to keep in sync with this view
@@ -250,12 +252,28 @@ public class TwoPanelTree extends MouseAdapter implements ListSelectionListener,
CheckedTreeNode rootNode = new CheckedTreeNode(dimension); // Not really necessary since parent not visible
CheckPolicy radioButtonsCheckPolicy = new CheckPolicy(false, false, false, false);
// Create a new tree with root node for this dimension.
- CheckboxTree tree = configuration.getKind() == SINGLE_DEVICE
- ? new CheckboxTree(new CheckboxTree.CheckboxTreeCellRenderer(){}, rootNode, radioButtonsCheckPolicy)
- : new CheckboxTree();
+ final CheckboxTree tree = configuration.getKind() == SINGLE_DEVICE
+ ? new CheckboxTree(new CheckboxTree.CheckboxTreeCellRenderer(){}, rootNode, radioButtonsCheckPolicy)
+ : new CheckboxTree();
DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
tree.setModel(treeModel);
+ tree.addTreeWillExpandListener(new TreeWillExpandListener() {
+ @Override
+ public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
+ if (!isAutoToggled) {
+ userToggledTrees.put(tree, true);
+ }
+ }
+
+ @Override
+ public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
+ if (!isAutoToggled) {
+ userToggledTrees.put(tree, true);
+ }
+ }
+ });
+
// Tweak tree appearence
tree.setRootVisible(false);
updateUI(tree);
@@ -271,7 +289,7 @@ public class TwoPanelTree extends MouseAdapter implements ListSelectionListener,
} else {
CheckedTreeNode groupNode = new CheckedTreeNode(group);
rootNode.add(groupNode);
- groupNode.setEnabled(dimension.isEditable());
+ groupNode.setEnabled(dimension.isEditable() && configuration.getKind() != SINGLE_DEVICE);
for (CloudTestingType type : types) {
addChildNode(groupNode, type, dimension);
}
@@ -323,6 +341,27 @@ public class TwoPanelTree extends MouseAdapter implements ListSelectionListener,
@Override
public void mouseClicked(MouseEvent e) {
+ CheckboxTree currentTree = treeMap.get(getSelectedDimension());
+
+ if (currentTree == null || currentTree.getSelectionPath() == null) {
+ return;
+ }
+
+ CheckedTreeNode selectedNode = (CheckedTreeNode) currentTree.getSelectionPath().getLastPathComponent();
+ if (!selectedNode.isEnabled() && selectedNode.getUserObject() instanceof CloudTestingTypeGroup) {
+ if (userToggledTrees.get(currentTree) != Boolean.TRUE) {
+ isAutoToggled = true;
+ TreePath selectedPath = new TreePath(selectedNode.getPath());
+ if (currentTree.isExpanded(selectedPath)) {
+ currentTree.collapsePath(selectedPath);
+ } else {
+ currentTree.expandPath(selectedPath);
+ }
+ isAutoToggled = false;
+ }
+ }
+ userToggledTrees.put(currentTree, false);
+
updateState();
}
@@ -392,7 +431,7 @@ public class TwoPanelTree extends MouseAdapter implements ListSelectionListener,
Object userObject = selectedNode.getUserObject();
if (userObject instanceof CloudTestingType) {
CloudTestingType clickedType = (CloudTestingType)userObject;
- if (selectedNode.isEnabled() && (selectedNode.isChecked() || !isAnythingChecked(currentTree))) {
+ if (selectedNode.isEnabled() && (selectedNode.isChecked() || !isAnyLeafChecked(currentTree))) {
uncheckAll(currentTree);
selectedNode.setChecked(true);
currentDimension.disableAll();
@@ -423,7 +462,7 @@ public class TwoPanelTree extends MouseAdapter implements ListSelectionListener,
}
}
- private boolean isAnythingChecked(CheckboxTree currentTree) {
+ private boolean isAnyLeafChecked(CheckboxTree currentTree) {
TreeNode root = (TreeNode)currentTree.getModel().getRoot();
for (int i = 0; i < root.getChildCount(); i++) {
CheckedTreeNode firstLevelChild = (CheckedTreeNode)root.getChildAt(i);