Coverage Report - kg.apc.jmeter.vizualizers.JCompositeRowsSelectorPanel
 
Classes in this File Line Coverage Branch Coverage Complexity
JCompositeRowsSelectorPanel
67%
210/312
17%
16/90
2.808
JCompositeRowsSelectorPanel$1
33%
1/3
N/A
2.808
JCompositeRowsSelectorPanel$2
33%
1/3
N/A
2.808
JCompositeRowsSelectorPanel$3
33%
1/3
N/A
2.808
JCompositeRowsSelectorPanel$4
33%
1/3
N/A
2.808
JCompositeRowsSelectorPanel$5
33%
1/3
N/A
2.808
 
 1  
 package kg.apc.jmeter.vizualizers;
 2  
 
 3  
 import java.awt.event.InputEvent;
 4  
 import java.util.Enumeration;
 5  
 import java.util.Iterator;
 6  
 import java.util.concurrent.ConcurrentLinkedQueue;
 7  
 import javax.swing.Icon;
 8  
 import javax.swing.ImageIcon;
 9  
 import javax.swing.JPanel;
 10  
 import javax.swing.JTree;
 11  
 import javax.swing.tree.*;
 12  
 
 13  
 import kg.apc.charting.AbstractGraphRow;
 14  
 import kg.apc.jmeter.JMeterPluginsUtils;
 15  
 import kg.apc.jmeter.graphs.CompositeNotifierInterface;
 16  
 import kg.apc.jmeter.graphs.GraphRendererInterface;
 17  
 
 18  0
 public class JCompositeRowsSelectorPanel extends javax.swing.JPanel implements GraphRendererInterface, CompositeNotifierInterface {
 19  
     private CompositeModel compositeModel;
 20  
 
 21  
     private DefaultMutableTreeNode root1;
 22  
     private DefaultMutableTreeNode root2;
 23  
     private DefaultTreeModel model1;
 24  
     private DefaultTreeModel model2;
 25  43
     private Icon folderIcon = new ImageIcon(JCompositeRowsSelectorPanel.class.getResource("folder.png"));
 26  43
     private Icon folderLinkIcon = new ImageIcon(JCompositeRowsSelectorPanel.class.getResource("folderLink.png"));
 27  43
     private Icon leafIcon = new ImageIcon(JCompositeRowsSelectorPanel.class.getResource("treeLeaf.png"));
 28  
 
 29  1
     private static String tree1RootName = "Test Plan";
 30  1
     private static String tree2RootName = "Composite Graph";
 31  
 
 32  
     private CompositeGraphGui gui;
 33  
 
 34  
     /**
 35  
      * Creates new form JRowsSelectorPanel
 36  
      */
 37  43
     public JCompositeRowsSelectorPanel(CompositeModel compositeModel, CompositeGraphGui gui) {
 38  43
         this.compositeModel = compositeModel;
 39  43
         this.gui = gui;
 40  43
         initComponents();
 41  43
         root1 = new DefaultMutableTreeNode(tree1RootName, true);
 42  43
         model1 = new DefaultTreeModel(root1);
 43  43
         root2 = new DefaultMutableTreeNode(tree2RootName, true);
 44  43
         model2 = new DefaultTreeModel(root2);
 45  43
         jTreeGraph1.setModel(model1);
 46  43
         jTreeGraph2.setModel(model2);
 47  
 
 48  43
         DefaultTreeCellRenderer renderer1 = new DefaultTreeCellRenderer();
 49  43
         renderer1.setOpenIcon(folderIcon);
 50  43
         renderer1.setClosedIcon(folderIcon);
 51  43
         renderer1.setLeafIcon(leafIcon);
 52  43
         jTreeGraph1.setCellRenderer(renderer1);
 53  
 
 54  43
         DefaultTreeCellRenderer renderer2 = new DefaultTreeCellRenderer();
 55  43
         renderer2.setOpenIcon(folderLinkIcon);
 56  43
         renderer2.setClosedIcon(folderLinkIcon);
 57  43
         renderer2.setLeafIcon(leafIcon);
 58  43
         jTreeGraph2.setCellRenderer(renderer2);
 59  43
     }
 60  
 
 61  
     public void updateGraph() {
 62  2
         gui.updateGui();
 63  2
     }
 64  
 
 65  
     public Iterator<String[]> getItems() {
 66  11
         ConcurrentLinkedQueue<String[]> tmp = new ConcurrentLinkedQueue<String[]>();
 67  11
         for (int i = 0; i < root2.getChildCount(); i++) {
 68  0
             TreeNode nodeChart = root2.getChildAt(i);
 69  0
             String chart = nodeChart.toString();
 70  0
             for (int j = 0; j < nodeChart.getChildCount(); j++) {
 71  0
                 String[] item = new String[2];
 72  0
                 item[0] = chart;
 73  0
                 item[1] = nodeChart.getChildAt(j).toString();
 74  0
                 tmp.add(item);
 75  
             }
 76  
         }
 77  11
         return tmp.iterator();
 78  
     }
 79  
 
 80  
     private void expandAll(JTree tree, boolean expand) {
 81  1
         TreeNode root = (TreeNode) tree.getModel().getRoot();
 82  
 
 83  
         // Traverse tree from root
 84  1
         expandAll(tree, new TreePath(root), expand);
 85  1
     }
 86  
 
 87  
     private void expandAll(JTree tree, TreePath parent, boolean expand) {
 88  
         // Traverse children
 89  3
         TreeNode node = (TreeNode) parent.getLastPathComponent();
 90  3
         if (node.getChildCount() >= 0) {
 91  3
             for (Enumeration e = node.children(); e.hasMoreElements(); ) {
 92  2
                 TreeNode n = (TreeNode) e.nextElement();
 93  2
                 TreePath path = parent.pathByAddingChild(n);
 94  2
                 expandAll(tree, path, expand);
 95  2
             }
 96  
         }
 97  
 
 98  
         // Expansion or collapse must be done bottom-up
 99  3
         if (expand) {
 100  3
             tree.expandPath(parent);
 101  
         } else {
 102  0
             tree.collapsePath(parent);
 103  
         }
 104  3
     }
 105  
 
 106  
     private boolean isNodeContained(String nodeName, DefaultMutableTreeNode root) {
 107  2
         Enumeration children = root.children();
 108  2
         while (children.hasMoreElements()) {
 109  0
             DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
 110  0
             if (nodeName.equals(child.toString())) {
 111  0
                 return true;
 112  
             }
 113  0
         }
 114  2
         return false;
 115  
     }
 116  
 
 117  
     private DefaultMutableTreeNode getNode(String nodeName, DefaultMutableTreeNode root) {
 118  0
         if (root != null) {
 119  0
             Enumeration children = root.children();
 120  0
             while (children.hasMoreElements()) {
 121  0
                 DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
 122  0
                 if (nodeName.equals(child.toString())) {
 123  0
                     return child;
 124  
                 }
 125  0
             }
 126  
         }
 127  0
         return null;
 128  
     }
 129  
 
 130  
     public void clearData() {
 131  1
         gui.updateGui();
 132  1
     }
 133  
 
 134  
     private synchronized void updateTree() {
 135  
         //get previous selection
 136  4
         TreePath selection = jTreeGraph1.getSelectionPath();
 137  
 
 138  
         //rows will not disapear, only chart if cleared...
 139  4
         boolean chartsUpdated = false;
 140  
 
 141  
         //first, check if we need to remove some visualizers
 142  4
         for (int i = 0; i < root1.getChildCount(); i++) {
 143  0
             TreeNode node = root1.getChildAt(i);
 144  0
             if (!compositeModel.containsVisualizer(node.toString())) {
 145  0
                 chartsUpdated = true;
 146  0
                 model1.removeNodeFromParent((MutableTreeNode) node);
 147  0
                 i--;
 148  
             }
 149  
         }
 150  
 
 151  4
         Iterator<String> chartsIter = compositeModel.getVizualizerNamesIterator();
 152  4
         while (chartsIter.hasNext()) {
 153  0
             String chartName = chartsIter.next();
 154  0
             if (!isNodeContained(chartName, root1)) {
 155  0
                 chartsUpdated = true;
 156  0
                 DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(chartName, true);
 157  0
                 root1.add(node1);
 158  0
                 Iterator<AbstractGraphRow> rowsIter = compositeModel.getRowsIterator(chartName);
 159  0
                 while (rowsIter.hasNext()) {
 160  0
                     AbstractGraphRow row = rowsIter.next();
 161  0
                     node1.add(new DefaultMutableTreeNode(row.getLabel(), false));
 162  0
                 }
 163  0
             } else {
 164  0
                 Iterator<AbstractGraphRow> rowsIter = compositeModel.getRowsIterator(chartName);
 165  0
                 DefaultMutableTreeNode chartNode1 = getNode(chartName, root1);
 166  
 
 167  0
                 while (rowsIter.hasNext()) {
 168  0
                     String rowName = rowsIter.next().getLabel();
 169  0
                     if (!isNodeContained(rowName, chartNode1)) {
 170  0
                         chartsUpdated = true;
 171  0
                         chartNode1.add(new DefaultMutableTreeNode(rowName, false));
 172  
                     }
 173  0
                 }
 174  
             }
 175  0
         }
 176  
 
 177  4
         if (chartsUpdated) {
 178  0
             model1.nodeStructureChanged(root1);
 179  0
             expandAll(jTreeGraph1, true);
 180  
             //restore selection
 181  0
             jTreeGraph1.setSelectionPath(selection);
 182  
         }
 183  4
     }
 184  
 
 185  
     /**
 186  
      * This method is called from within the constructor to
 187  
      * initialize the form.
 188  
      * WARNING: Do NOT modify this code. The content of this method is
 189  
      * always regenerated by the Form Editor.
 190  
      */
 191  
     @SuppressWarnings("unchecked")
 192  
     // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
 193  
     private void initComponents() {
 194  
         java.awt.GridBagConstraints gridBagConstraints;
 195  
 
 196  43
         jPanelLogo = new javax.swing.JPanel();
 197  43
         jLabelLogo = new javax.swing.JLabel();
 198  43
         jPanel1 = new javax.swing.JPanel();
 199  43
         jPanelMain = new javax.swing.JPanel();
 200  43
         jPanelRowsTable = new javax.swing.JPanel();
 201  43
         jLabelGraph1 = new javax.swing.JLabel();
 202  43
         jLabelGraph2 = new javax.swing.JLabel();
 203  43
         jScrollPaneGraph1 = new javax.swing.JScrollPane();
 204  43
         jTreeGraph1 = new javax.swing.JTree();
 205  43
         jScrollPaneGraph = new javax.swing.JScrollPane();
 206  43
         jTreeGraph2 = new javax.swing.JTree();
 207  43
         jPanelButtons = new javax.swing.JPanel();
 208  43
         jButtonAdd = new javax.swing.JButton();
 209  43
         jButtonRemove = new javax.swing.JButton();
 210  43
         jPanelGraphPreview = new javax.swing.JPanel();
 211  43
         jLabelPreview = new javax.swing.JLabel();
 212  
 
 213  43
         setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
 214  43
         setLayout(new java.awt.BorderLayout());
 215  
 
 216  43
         jPanelLogo.setLayout(new java.awt.GridBagLayout());
 217  
 
 218  43
         jLabelLogo.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
 219  43
         jLabelLogo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/kg/apc/jmeter/vizualizers/logoSimple.png"))); // NOI18N
 220  43
         jLabelLogo.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
 221  43
         jLabelLogo.addMouseListener(new java.awt.event.MouseAdapter() {
 222  
             public void mouseClicked(java.awt.event.MouseEvent evt) {
 223  0
                 jLabelLogoMouseClicked(evt);
 224  0
             }
 225  
         });
 226  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 227  43
         gridBagConstraints.gridx = 1;
 228  43
         gridBagConstraints.gridy = 0;
 229  43
         jPanelLogo.add(jLabelLogo, gridBagConstraints);
 230  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 231  43
         gridBagConstraints.gridx = 0;
 232  43
         gridBagConstraints.gridy = 0;
 233  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 234  43
         gridBagConstraints.weightx = 1.0;
 235  43
         jPanelLogo.add(jPanel1, gridBagConstraints);
 236  
 
 237  43
         add(jPanelLogo, java.awt.BorderLayout.PAGE_END);
 238  
 
 239  43
         jPanelMain.setLayout(new java.awt.GridBagLayout());
 240  
 
 241  43
         jPanelRowsTable.setMaximumSize(new java.awt.Dimension(206, 23));
 242  43
         jPanelRowsTable.setPreferredSize(new java.awt.Dimension(206, 23));
 243  43
         jPanelRowsTable.setLayout(new java.awt.GridBagLayout());
 244  
 
 245  43
         jLabelGraph1.setText("Available Sources:");
 246  43
         jLabelGraph1.setMaximumSize(new java.awt.Dimension(120, 14));
 247  43
         jLabelGraph1.setMinimumSize(new java.awt.Dimension(120, 14));
 248  43
         jLabelGraph1.setPreferredSize(new java.awt.Dimension(120, 14));
 249  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 250  43
         gridBagConstraints.gridx = 0;
 251  43
         gridBagConstraints.gridy = 0;
 252  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 253  43
         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
 254  43
         gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
 255  43
         jPanelRowsTable.add(jLabelGraph1, gridBagConstraints);
 256  
 
 257  43
         jLabelGraph2.setText("Composed Graph:");
 258  43
         jLabelGraph2.setMaximumSize(new java.awt.Dimension(120, 14));
 259  43
         jLabelGraph2.setMinimumSize(new java.awt.Dimension(120, 14));
 260  43
         jLabelGraph2.setPreferredSize(new java.awt.Dimension(120, 14));
 261  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 262  43
         gridBagConstraints.gridx = 2;
 263  43
         gridBagConstraints.gridy = 0;
 264  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 265  43
         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
 266  43
         gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2);
 267  43
         jPanelRowsTable.add(jLabelGraph2, gridBagConstraints);
 268  
 
 269  43
         jScrollPaneGraph1.setMaximumSize(new java.awt.Dimension(72, 64));
 270  43
         jScrollPaneGraph1.setMinimumSize(new java.awt.Dimension(72, 64));
 271  43
         jScrollPaneGraph1.setPreferredSize(new java.awt.Dimension(72, 64));
 272  
 
 273  43
         jTreeGraph1.addMouseListener(new java.awt.event.MouseAdapter() {
 274  
             public void mouseClicked(java.awt.event.MouseEvent evt) {
 275  0
                 jTreeGraph1MouseClicked(evt);
 276  0
             }
 277  
         });
 278  43
         jScrollPaneGraph1.setViewportView(jTreeGraph1);
 279  
 
 280  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 281  43
         gridBagConstraints.gridx = 0;
 282  43
         gridBagConstraints.gridy = 1;
 283  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 284  43
         gridBagConstraints.weightx = 1.0;
 285  43
         gridBagConstraints.weighty = 1.0;
 286  43
         gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
 287  43
         jPanelRowsTable.add(jScrollPaneGraph1, gridBagConstraints);
 288  
 
 289  43
         jTreeGraph2.addMouseListener(new java.awt.event.MouseAdapter() {
 290  
             public void mouseClicked(java.awt.event.MouseEvent evt) {
 291  0
                 jTreeGraph2MouseClicked(evt);
 292  0
             }
 293  
         });
 294  43
         jScrollPaneGraph.setViewportView(jTreeGraph2);
 295  
 
 296  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 297  43
         gridBagConstraints.gridx = 2;
 298  43
         gridBagConstraints.gridy = 1;
 299  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 300  43
         gridBagConstraints.weightx = 1.0;
 301  43
         gridBagConstraints.weighty = 1.0;
 302  43
         gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 2);
 303  43
         jPanelRowsTable.add(jScrollPaneGraph, gridBagConstraints);
 304  
 
 305  43
         jPanelButtons.setFocusable(false);
 306  43
         jPanelButtons.setLayout(new java.awt.GridLayout(0, 1, 0, 6));
 307  
 
 308  43
         jButtonAdd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/kg/apc/jmeter/vizualizers/rightArrow.png"))); // NOI18N
 309  43
         jButtonAdd.setFocusable(false);
 310  43
         jButtonAdd.setMaximumSize(new java.awt.Dimension(30, 25));
 311  43
         jButtonAdd.setMinimumSize(new java.awt.Dimension(30, 25));
 312  43
         jButtonAdd.setPreferredSize(new java.awt.Dimension(30, 25));
 313  43
         jButtonAdd.addActionListener(new java.awt.event.ActionListener() {
 314  
             public void actionPerformed(java.awt.event.ActionEvent evt) {
 315  0
                 jButtonAddActionPerformed(evt);
 316  0
             }
 317  
         });
 318  43
         jPanelButtons.add(jButtonAdd);
 319  
 
 320  43
         jButtonRemove.setIcon(new javax.swing.ImageIcon(getClass().getResource("/kg/apc/jmeter/vizualizers/leftArrow.png"))); // NOI18N
 321  43
         jButtonRemove.setFocusable(false);
 322  43
         jButtonRemove.setMaximumSize(new java.awt.Dimension(30, 25));
 323  43
         jButtonRemove.setMinimumSize(new java.awt.Dimension(30, 25));
 324  43
         jButtonRemove.setPreferredSize(new java.awt.Dimension(30, 25));
 325  43
         jButtonRemove.addActionListener(new java.awt.event.ActionListener() {
 326  
             public void actionPerformed(java.awt.event.ActionEvent evt) {
 327  0
                 jButtonRemoveActionPerformed(evt);
 328  0
             }
 329  
         });
 330  43
         jPanelButtons.add(jButtonRemove);
 331  
 
 332  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 333  43
         gridBagConstraints.gridx = 1;
 334  43
         gridBagConstraints.gridy = 1;
 335  43
         jPanelRowsTable.add(jPanelButtons, gridBagConstraints);
 336  
 
 337  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 338  43
         gridBagConstraints.gridx = 0;
 339  43
         gridBagConstraints.gridy = 0;
 340  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 341  43
         gridBagConstraints.weightx = 1.0;
 342  43
         gridBagConstraints.weighty = 1.0;
 343  43
         jPanelMain.add(jPanelRowsTable, gridBagConstraints);
 344  
 
 345  43
         jPanelGraphPreview.setLayout(new java.awt.BorderLayout());
 346  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 347  43
         gridBagConstraints.gridx = 0;
 348  43
         gridBagConstraints.gridy = 2;
 349  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 350  43
         gridBagConstraints.weightx = 1.0;
 351  43
         gridBagConstraints.weighty = 1.0;
 352  43
         gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
 353  43
         jPanelMain.add(jPanelGraphPreview, gridBagConstraints);
 354  
 
 355  43
         jLabelPreview.setText("Preview:");
 356  43
         gridBagConstraints = new java.awt.GridBagConstraints();
 357  43
         gridBagConstraints.gridx = 0;
 358  43
         gridBagConstraints.gridy = 1;
 359  43
         gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
 360  43
         gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
 361  43
         gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 0);
 362  43
         jPanelMain.add(jLabelPreview, gridBagConstraints);
 363  
 
 364  43
         add(jPanelMain, java.awt.BorderLayout.CENTER);
 365  43
     }// </editor-fold>//GEN-END:initComponents
 366  
 
 367  
     public void addItemsToComposite(String testplan, String row) {
 368  1
         String[] path = new String[3];
 369  1
         path[0] = tree2RootName;
 370  1
         path[1] = testplan;
 371  1
         path[2] = row;
 372  
 
 373  1
         TreePath[] tp = new TreePath[1];
 374  1
         tp[0] = new TreePath(path);
 375  1
         addItemsToComposite(tp);
 376  1
     }
 377  
 
 378  
     private void addItemsToComposite(TreePath[] paths) {
 379  2
         for (int i = 0; i < paths.length; i++) {
 380  1
             if (paths[i].getPath().length == 1) {
 381  
                 //do nothi8ng for now, root was selected
 382  1
             } else if (paths[i].getPath().length == 2) {
 383  
                 //a chart is selected, we add all nodes...
 384  0
                 String chartName = paths[i].getPath()[1].toString();
 385  0
                 DefaultMutableTreeNode chartNode = getNode(chartName, root1);
 386  
                 DefaultMutableTreeNode chartNode2;
 387  
 
 388  0
                 if (!isNodeContained(chartName, root2)) {
 389  0
                     chartNode2 = new DefaultMutableTreeNode(chartName, true);
 390  0
                     root2.add(chartNode2);
 391  
                 } else {
 392  0
                     chartNode2 = getNode(chartName, root2);
 393  
                 }
 394  
 
 395  0
                 for (int n = 0; n < chartNode.getChildCount(); n++) {
 396  0
                     if (!isNodeContained(chartNode.getChildAt(n).toString(), chartNode2)) {
 397  0
                         chartNode2.add(new DefaultMutableTreeNode(chartNode.getChildAt(n).toString(), false));
 398  0
                         model2.nodeStructureChanged(root2);
 399  0
                         expandAll(jTreeGraph2, true);
 400  
                     }
 401  
                 }
 402  
 
 403  0
             } else if (paths[i].getPath().length == 3) {
 404  1
                 String chartName = paths[i].getPath()[1].toString();
 405  
 
 406  
                 DefaultMutableTreeNode chartNode;
 407  
 
 408  1
                 if (!isNodeContained(chartName, root2)) {
 409  1
                     chartNode = new DefaultMutableTreeNode(chartName, true);
 410  1
                     root2.add(chartNode);
 411  
                 } else {
 412  0
                     chartNode = getNode(chartName, root2);
 413  
                 }
 414  
 
 415  1
                 if (!isNodeContained(paths[i].getPath()[2].toString(), chartNode)) {
 416  1
                     chartNode.add(new DefaultMutableTreeNode(paths[i].getPath()[2].toString(), false));
 417  1
                     model2.nodeStructureChanged(root2);
 418  1
                     expandAll(jTreeGraph2, true);
 419  
                 }
 420  
             }
 421  
         }
 422  1
         updateGraph();
 423  1
     }
 424  
 
 425  
     private void removeItemFromComposite(TreePath[] paths) {
 426  0
         for (int i = 0; i < paths.length; i++) {
 427  0
             if (paths[i].getPath().length == 1) {
 428  
                 //do nothing root was selected
 429  0
             } else if (paths[i].getPath().length == 2) {
 430  0
                 TreeNode node = getNode(paths[i].getPath()[1].toString(), root2);
 431  0
                 model2.removeNodeFromParent((MutableTreeNode) node);
 432  0
             } else if (paths[i].getPath().length == 3) {
 433  0
                 TreeNode chartNode = getNode(paths[i].getPath()[1].toString(), root2);
 434  0
                 TreeNode rowNode = getNode(paths[i].getPath()[2].toString(), (DefaultMutableTreeNode) chartNode);
 435  0
                 if (rowNode != null) {
 436  0
                     model2.removeNodeFromParent((MutableTreeNode) rowNode);
 437  
                 }
 438  0
                 if (chartNode != null) {
 439  0
                     if (chartNode.getChildCount() == 0) {
 440  0
                         model2.removeNodeFromParent((MutableTreeNode) chartNode);
 441  
                     }
 442  
                 }
 443  
             }
 444  
         }
 445  0
         model2.nodeStructureChanged(root2);
 446  0
         expandAll(jTreeGraph2, true);
 447  0
         updateGraph();
 448  0
     }
 449  
 
 450  
 
 451  
     private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonAddActionPerformed
 452  
     {//GEN-HEADEREND:event_jButtonAddActionPerformed
 453  0
         TreePath[] paths = jTreeGraph1.getSelectionPaths();
 454  0
         if (paths != null) {
 455  0
             addItemsToComposite(paths);
 456  
         }
 457  0
     }//GEN-LAST:event_jButtonAddActionPerformed
 458  
 
 459  
     private void jButtonRemoveActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButtonRemoveActionPerformed
 460  
     {//GEN-HEADEREND:event_jButtonRemoveActionPerformed
 461  0
         TreePath[] paths = jTreeGraph2.getSelectionPaths();
 462  0
         if (paths != null) {
 463  0
             removeItemFromComposite(paths);
 464  
         }
 465  0
     }//GEN-LAST:event_jButtonRemoveActionPerformed
 466  
 
 467  
     private void jTreeGraph1MouseClicked(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jTreeGraph1MouseClicked
 468  
     {//GEN-HEADEREND:event_jTreeGraph1MouseClicked
 469  0
         if (evt.getClickCount() == 2) {
 470  0
             TreePath[] paths = jTreeGraph1.getSelectionPaths();
 471  0
             if (paths != null && paths.length == 1) {
 472  0
                 if (paths[0].getPath().length == 3) {
 473  0
                     addItemsToComposite(paths);
 474  
                 }
 475  
             }
 476  
         }
 477  0
     }//GEN-LAST:event_jTreeGraph1MouseClicked
 478  
 
 479  
     private void jTreeGraph2MouseClicked(java.awt.event.MouseEvent evt)//GEN-FIRST:event_jTreeGraph2MouseClicked
 480  
     {//GEN-HEADEREND:event_jTreeGraph2MouseClicked
 481  0
         if (evt.getClickCount() == 2) {
 482  0
             TreePath[] paths = jTreeGraph2.getSelectionPaths();
 483  0
             if (paths != null && paths.length == 1) {
 484  0
                 if (paths[0].getPath().length == 3) {
 485  0
                     removeItemFromComposite(paths);
 486  
                 }
 487  
             }
 488  
         }
 489  0
     }//GEN-LAST:event_jTreeGraph2MouseClicked
 490  
 
 491  
     private void jLabelLogoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabelLogoMouseClicked
 492  0
         if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
 493  0
             JMeterPluginsUtils.openInBrowser(JMeterPluginsUtils.WIKI_BASE + "?utm_source=jmeter&utm_medium=logolink&utm_campaign=" + gui.getWikiPage());
 494  
         }
 495  0
     }//GEN-LAST:event_jLabelLogoMouseClicked
 496  
 
 497  
     // Variables declaration - do not modify//GEN-BEGIN:variables
 498  
     private javax.swing.JButton jButtonAdd;
 499  
     private javax.swing.JButton jButtonRemove;
 500  
     private javax.swing.JLabel jLabelGraph1;
 501  
     private javax.swing.JLabel jLabelGraph2;
 502  
     private javax.swing.JLabel jLabelLogo;
 503  
     private javax.swing.JLabel jLabelPreview;
 504  
     private javax.swing.JPanel jPanel1;
 505  
     private javax.swing.JPanel jPanelButtons;
 506  
     private javax.swing.JPanel jPanelGraphPreview;
 507  
     private javax.swing.JPanel jPanelLogo;
 508  
     private javax.swing.JPanel jPanelMain;
 509  
     private javax.swing.JPanel jPanelRowsTable;
 510  
     private javax.swing.JScrollPane jScrollPaneGraph;
 511  
     private javax.swing.JScrollPane jScrollPaneGraph1;
 512  
     private javax.swing.JTree jTreeGraph1;
 513  
     private javax.swing.JTree jTreeGraph2;
 514  
     // End of variables declaration//GEN-END:variables
 515  
 
 516  
     @Override
 517  
     public JPanel getGraphDisplayPanel() {
 518  1
         return jPanelGraphPreview;
 519  
     }
 520  
 
 521  
     @Override
 522  
     public boolean isPreview() {
 523  1
         return true;
 524  
     }
 525  
 
 526  
     @Override
 527  
     public void refresh() {
 528  4
         updateTree();
 529  4
     }
 530  
 }