/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.jmeter.gui.action; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.util.HashSet; import java.util.Set; import javax.swing.JTree; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; 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.testelement.TestElement; import org.apache.jmeter.testelement.TestPlan; import org.apache.jmeter.testelement.WorkBench; /** * Move a node up/down/left/right * */ public class Move extends AbstractAction { private static final Set<String> commands = new HashSet<>(); static { commands.add(ActionNames.MOVE_DOWN); commands.add(ActionNames.MOVE_UP); commands.add(ActionNames.MOVE_LEFT); commands.add(ActionNames.MOVE_RIGHT); } /** * @see Command#doAction(ActionEvent) */ @Override public void doAction(ActionEvent e) { JMeterTreeListener treeListener = GuiPackage.getInstance() .getTreeListener(); if (treeListener.getSelectedNodes().length != 1) { // we can only move a single node return; } JMeterTreeNode currentNode = treeListener.getCurrentNode(); JMeterTreeNode parentNode = getParentNode(currentNode); if (parentNode != null) { String action = e.getActionCommand(); int index = parentNode.getIndex(currentNode); if (ActionNames.MOVE_UP.equals(action)) { if (index > 0) { // we stay within the same parent node int newIndx = index - 1; moveAndSelectNode(currentNode, parentNode, newIndx); } } else if (ActionNames.MOVE_DOWN.equals(action)) { if (index < parentNode.getChildCount() - 1) { // we stay within the same parent node int newIndx = index + 1; moveAndSelectNode(currentNode, parentNode, newIndx); } } else if (ActionNames.MOVE_LEFT.equals(action)) { JMeterTreeNode parentParentNode = getParentNode(parentNode); // move to the parent if (parentParentNode != null && canAddTo(parentParentNode, currentNode)) { moveAndSelectNode(currentNode, parentParentNode, parentParentNode.getIndex(parentNode)); } } else if (ActionNames.MOVE_RIGHT.equals(action)) { JMeterTreeNode after = (JMeterTreeNode) parentNode .getChildAfter(currentNode); if (after != null && canAddTo(after, currentNode)) { // move as a child of the next sibling moveAndSelectNode(currentNode, after, 0); } // Commented as per sebb // http://mail-archives.apache.org/mod_mbox/jmeter-dev/201307.mbox/%3CCAOGo0VZ0z3GMbfsq_gSB%2Bp7nTUqLng6Gy2ecvYbD8_AKb-Dt5w%40mail.gmail.com%3E /* else { // move as a sibling of the parent JMeterTreeNode parentParentNode = getParentNode(parentNode); after = (JMeterTreeNode) parentParentNode .getChildAfter(parentNode); if (after != null && canAddTo(parentParentNode, currentNode)) { moveAndSelectNode(currentNode, parentParentNode, parentParentNode.getIndex(after)); } } */ } } GuiPackage.getInstance().getMainFrame().repaint(); } private JMeterTreeNode getParentNode(JMeterTreeNode currentNode) { JMeterTreeNode parentNode = (JMeterTreeNode) currentNode.getParent(); TestElement te = currentNode.getTestElement(); if (te instanceof TestPlan || te instanceof WorkBench) { parentNode = null; // So elements can only be added as children } return parentNode; } private static boolean canAddTo(JMeterTreeNode parentNode, JMeterTreeNode node) { boolean ok = MenuFactory.canAddTo(parentNode, new JMeterTreeNode[] { node }); if (!ok) { Toolkit.getDefaultToolkit().beep(); } return ok; } private static void moveAndSelectNode(JMeterTreeNode currentNode, JMeterTreeNode parentNode, int newIndx) { GuiPackage guiInstance = GuiPackage.getInstance(); guiInstance.getTreeModel().removeNodeFromParent(currentNode); guiInstance.getTreeModel().insertNodeInto(currentNode, parentNode, newIndx); // select the node TreeNode[] nodes = guiInstance.getTreeModel() .getPathToRoot(currentNode); JTree jTree = guiInstance.getMainFrame().getTree(); jTree.setSelectionPath(new TreePath(nodes)); } /** * @see Command#getActionNames() */ @Override public Set<String> getActionNames() { return commands; } }