Author: sebb
Date: Fri Sep 28 16:09:01 2007
New Revision: 580511

URL: http://svn.apache.org/viewvc?rev=580511&view=rev
Log:
Only permit items to be dropped/pasted where they are allowed.

Modified:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/DragNDrop.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Paste.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeListener.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/DragNDrop.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/DragNDrop.java?rev=580511&r1=580510&r2=580511&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/DragNDrop.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/DragNDrop.java 
Fri Sep 28 16:09:01 2007
@@ -18,23 +18,19 @@
 
 package org.apache.jmeter.gui.action;
 
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.jmeter.control.Controller;
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.gui.tree.JMeterTreeListener;
 import org.apache.jmeter.gui.tree.JMeterTreeNode;
-import org.apache.jmeter.samplers.Sampler;
+import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
 import org.apache.jmeter.testelement.WorkBench;
 
-/**
- * @author mstover
- * @version $Revision$
- */
 public class DragNDrop extends AbstractAction {
        private static Set commands = new HashSet();
        static {
@@ -59,19 +55,19 @@
                }
                // System.out.println(action+" "+te.getClass().getName());
 
-               if (ActionNames.DRAG_ADD.equals(action) && 
canAddTo(currentNode)) {
+               if (ActionNames.DRAG_ADD.equals(action) && 
canAddTo(currentNode,draggedNodes)) {
                        removeNodesFromParents(draggedNodes);
                        for (int i = 0; i < draggedNodes.length; i++) {
                                
GuiPackage.getInstance().getTreeModel().insertNodeInto(draggedNodes[i], 
currentNode,
                                                currentNode.getChildCount());
                        }
-               } else if (ActionNames.INSERT_BEFORE.equals(action) && 
canAddTo(parentNode)) {
+               } else if (ActionNames.INSERT_BEFORE.equals(action) && 
canAddTo(parentNode,draggedNodes)) {
                        removeNodesFromParents(draggedNodes);
                        for (int i = 0; i < draggedNodes.length; i++) {
                                int index = parentNode.getIndex(currentNode);
                                
GuiPackage.getInstance().getTreeModel().insertNodeInto(draggedNodes[i], 
parentNode, index);
                        }
-               } else if (ActionNames.INSERT_AFTER.equals(action) && 
canAddTo(parentNode)) {
+               } else if (ActionNames.INSERT_AFTER.equals(action) && 
canAddTo(parentNode,draggedNodes)) {
                        removeNodesFromParents(draggedNodes);
                        for (int i = 0; i < draggedNodes.length; i++) {
                                int index = parentNode.getIndex(currentNode) + 
1;
@@ -81,27 +77,12 @@
                GuiPackage.getInstance().getMainFrame().repaint();
        }
 
-       /**
-        * Determine whether or not dragged nodes can be added to this parent. 
Also
-        * used by Paste TODO tighten rules TODO move to MenuFactory?
-        * 
-        * @param parentNode
-        * @return whether it is OK to add the dragged nodes to this parent
-        */
-       static boolean canAddTo(JMeterTreeNode parentNode) {
-               if (null == parentNode)
-                       return false;
-               TestElement te = parentNode.getTestElement();
-               // System.out.println("Add to: "+te.getClass().getName());
-               if (te instanceof Controller)
-                       return true;
-               if (te instanceof Sampler)
-                       return true;
-               if (te instanceof WorkBench)
-                       return true;
-               if (te instanceof TestPlan)
-                       return true;
-               return false;
+       private static boolean canAddTo(JMeterTreeNode parentNode, 
JMeterTreeNode[] draggedNodes) {
+               boolean ok = MenuFactory.canAddTo(parentNode, draggedNodes);
+               if (!ok){
+                       Toolkit.getDefaultToolkit().beep();
+               }
+               return ok;
        }
 
        protected void removeNodesFromParents(JMeterTreeNode[] nodes) {

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Paste.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Paste.java?rev=580511&r1=580510&r2=580511&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Paste.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Paste.java Fri 
Sep 28 16:09:01 2007
@@ -18,6 +18,7 @@
 
 package org.apache.jmeter.gui.action;
 
+import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.util.HashSet;
 import java.util.Set;
@@ -26,6 +27,7 @@
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.gui.tree.JMeterTreeListener;
 import org.apache.jmeter.gui.tree.JMeterTreeNode;
+import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
@@ -57,12 +59,14 @@
                JMeterTreeNode draggedNodes[] = Copy.getCopiedNodes();
                JMeterTreeListener treeListener = 
GuiPackage.getInstance().getTreeListener();
                JMeterTreeNode currentNode = treeListener.getCurrentNode();
-               if (DragNDrop.canAddTo(currentNode)) {
+               if (MenuFactory.canAddTo(currentNode, draggedNodes)) {
                        for (int i = 0; i < draggedNodes.length; i++) {
                                if (draggedNodes[i] != null) {
                     addNode(currentNode, draggedNodes[i]);
                                }
                        }
+               } else {
+                       Toolkit.getDefaultToolkit().beep();
                }
                GuiPackage.getInstance().getMainFrame().repaint();
        }

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeListener.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeListener.java?rev=580511&r1=580510&r2=580511&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeListener.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeListener.java
 Fri Sep 28 16:09:01 2007
@@ -43,6 +43,7 @@
 import org.apache.jmeter.gui.action.ActionNames;
 import org.apache.jmeter.gui.action.ActionRouter;
 import org.apache.jmeter.gui.action.KeyStrokes;
+import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
@@ -177,10 +178,12 @@
                        item.addActionListener(actionHandler);
                        item.setActionCommand(ActionNames.INSERT_AFTER);
                        dragNdrop.add(item);
-                       item = new 
JMenuItem(JMeterUtils.getResString("add_as_child")); // $NON-NLS-1$
-                       item.addActionListener(actionHandler);
-                       item.setActionCommand(ActionNames.DRAG_ADD);
-                       dragNdrop.add(item);
+                       if (MenuFactory.canAddTo(getCurrentNode(), 
draggedNodes)){
+                               item = new 
JMenuItem(JMeterUtils.getResString("add_as_child")); // $NON-NLS-1$
+                               item.addActionListener(actionHandler);
+                               item.setActionCommand(ActionNames.DRAG_ADD);
+                               dragNdrop.add(item);
+                       }
                        dragNdrop.addSeparator();
                        item = new 
JMenuItem(JMeterUtils.getResString("cancel")); // $NON-NLS-1$
                        dragNdrop.add(item);

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java?rev=580511&r1=580510&r2=580511&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java 
Fri Sep 28 16:09:01 2007
@@ -35,13 +35,19 @@
 import javax.swing.KeyStroke;
 import javax.swing.MenuElement;
 
+import org.apache.jmeter.control.Controller;
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.gui.JMeterGUIComponent;
 import org.apache.jmeter.gui.action.ActionNames;
 import org.apache.jmeter.gui.action.ActionRouter;
 import org.apache.jmeter.gui.action.KeyStrokes;
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
+import org.apache.jmeter.samplers.Sampler;
 import org.apache.jmeter.testbeans.TestBean;
 import org.apache.jmeter.testbeans.gui.TestBeanGUI;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.testelement.TestPlan;
+import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jmeter.visualizers.Printable;
 import org.apache.jorphan.logging.LoggingManager;
@@ -445,6 +451,66 @@
                if ((elements.length > 0) && !(elements[elements.length - 1] 
instanceof JPopupMenu.Separator)) {
                        menu.addSeparator();
                }
+       }
+
+       /**
+        * Determine whether or not nodes can be added to this parent.
+        * 
+        * Used by DragNDrop and Paste.
+        * 
+        * @param parentNode
+        * @param nodes - array of nodes that are to be added
+        * 
+        * @return whether it is OK to add the dragged nodes to this parent
+        */
+       public static boolean canAddTo(JMeterTreeNode parentNode, 
JMeterTreeNode nodes[]) {
+               if (null == parentNode) {
+                       return false;
+               }
+               if (foundClass(nodes, new Class[]{WorkBench.class})){// Can't 
add a Workbench anywhere
+                       return false;
+               }
+               if (foundClass(nodes, new Class[]{TestPlan.class})){// Can't 
add a TestPlan anywhere
+                       return false;
+               }
+               TestElement parent = parentNode.getTestElement();
+               if (parent instanceof TestPlan) {// Samplers and Controllers 
need not apply ...
+                       if (foundClass(nodes, new Class[]{Sampler.class, 
Controller.class})){
+                               return false;
+                       }
+                       return true;
+               }
+               // ThreadGroup is only allowed under a TestPlan
+               if (foundClass(nodes, new 
Class[]{org.apache.jmeter.threads.ThreadGroup.class})){
+                       return false;
+               }
+               if (parent instanceof Controller) {// Includes thread group; 
anything goes
+                       return true;
+               }
+               if (parent instanceof Sampler) {// Samplers and Controllers 
need not apply ...
+                       if (foundClass(nodes, new Class[]{Sampler.class, 
Controller.class})){
+                               return false;
+                       }
+                       return true;
+               }
+               if (parent instanceof WorkBench) {// TODO are there any items 
that don't make sense here?
+                       return true;
+               }
+               // All other 
+               return false;
+       }
+
+       // Is any top-level node an instance of the class?
+       private static boolean foundClass(JMeterTreeNode nodes[],Class 
classes[]){
+               for (int i = 0; i < nodes.length; i++) {
+                       JMeterTreeNode node = nodes[i];
+                       for (int j=0; j < classes.length; j++) {
+                               if 
(classes[j].isInstance(node.getUserObject())){
+                                       return true;
+                               }                               
+                       }
+               }
+               return false;
        }
 
        // Methods used for Test cases

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=580511&r1=580510&r2=580511&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Fri Sep 28 16:09:01 2007
@@ -31,7 +31,6 @@
 
 <h4>Bug fixes</h4>
 <ul>
-<li>SaveService no longer needs to instantiate classes</li>
 <li>Bug 43430 - Count of active threads is incorrect for remote samples</li>
 </ul>
 
@@ -41,7 +40,10 @@
 <li>Add File->Revert to easily drop the current changes and reload the project 
file currently loaded</li>
 <li>Bug 31366 - Remember recently opened file(s)</li>
 <li>Bug 43351 - Add support for Parameters and script file to all BeanShell 
test elements</li>
+<li>SaveService no longer needs to instantiate classes</li>
 <li>New functions: __eval() and __evalVar()</li>
+<li>Menu items now appear in execution order</li>
+<li>Test Plan items can now only be dropped/pasted into parts of the tree 
where they are allowed</li>
 </ul>
 
 <!--  ===================  -->



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to