You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by wo...@apache.org on 2005/08/27 05:40:45 UTC

cvs commit: jakarta-jmeter/src/reports/org/apache/jmeter/gui/util ReportMenuBar.java

woolfel     2005/08/26 20:40:45

  Modified:    src/reports/org/apache/jmeter/report/gui/action
                        ReportSaveGraphics.java ReportCopy.java
                        ReportCheckDirty.java ReportActionRouter.java
                        ReportClose.java ReportDragNDrop.java
                        ReportCut.java ReportPaste.java ReportStart.java
               src/reports/org/apache/jmeter/gui ReportGuiPackage.java
                        ReportMainFrame.java
               src/reports/org/apache/jmeter/report/gui/tree
                        ReportTreeNode.java ReportTreeModel.java
                        ReportTreeListener.java
               src/reports/org/apache/jmeter JMeterReport.java
  Added:       src/reports/org/apache/jmeter/report/gui/action
                        AbstractAction.java
               src/reports/org/apache/jmeter/report/engine
                        ValueReplacer.java
               src/reports/org/apache/jmeter/gui/util ReportMenuBar.java
  Log:
  made a bunch of updates and changes. the GUI has basic functionality now
  making steady progress
  peter lin
  
  Revision  Changes    Path
  1.2       +4 -4      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportSaveGraphics.java
  
  Index: ReportSaveGraphics.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportSaveGraphics.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportSaveGraphics.java	25 Aug 2005 22:35:06 -0000	1.1
  +++ ReportSaveGraphics.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -28,7 +28,7 @@
   import org.apache.jmeter.exceptions.IllegalUserActionException;
   import org.apache.jmeter.gui.action.Command;
   import org.apache.jmeter.gui.JMeterGUIComponent;
  -import org.apache.jmeter.gui.GuiPackage;
  +import org.apache.jmeter.gui.ReportGuiPackage;
   import org.apache.jmeter.gui.util.FileDialoger;
   import org.apache.jmeter.save.SaveGraphicsService;
   import org.apache.jmeter.visualizers.Printable;
  @@ -77,13 +77,13 @@
   			throw new IllegalUserActionException("Invalid user command:" + e.getActionCommand());
   		}
   		if (e.getActionCommand().equals(SAVE_GRAPHICS)) {
  -			component = GuiPackage.getInstance().getCurrentGui();
  +			component = ReportGuiPackage.getInstance().getCurrentGui();
   			// get the JComponent from the visualizer
   			if (component instanceof Printable) {
   				comp = ((Printable) component).getPrintableComponent();
   
   				String filename;
  -				JFileChooser chooser = FileDialoger.promptToSaveFile(GuiPackage.getInstance().getTreeListener()
  +				JFileChooser chooser = FileDialoger.promptToSaveFile(ReportGuiPackage.getInstance().getTreeListener()
   						.getCurrentNode().getName(), extensions);
   				if (chooser == null) {
   					return;
  
  
  
  1.2       +2 -2      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCopy.java
  
  Index: ReportCopy.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCopy.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportCopy.java	17 Aug 2005 04:22:29 -0000	1.1
  +++ ReportCopy.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -23,7 +23,7 @@
   import java.util.Set;
   
   import org.apache.jmeter.gui.ReportGuiPackage;
  -import org.apache.jmeter.gui.action.AbstractAction;
  +import org.apache.jmeter.report.gui.action.AbstractAction;
   import org.apache.jmeter.report.gui.tree.ReportTreeListener;
   import org.apache.jmeter.report.gui.tree.ReportTreeNode;
   import org.apache.jmeter.testelement.TestElement;
  
  
  
  1.2       +2 -2      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCheckDirty.java
  
  Index: ReportCheckDirty.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCheckDirty.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportCheckDirty.java	17 Aug 2005 04:22:32 -0000	1.1
  +++ ReportCheckDirty.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -25,7 +25,7 @@
   import java.util.Set;
   
   import org.apache.jmeter.gui.ReportGuiPackage;
  -import org.apache.jmeter.gui.action.AbstractAction;
  +import org.apache.jmeter.report.gui.action.AbstractAction;
   import org.apache.jmeter.report.gui.action.ReportActionRouter;
   import org.apache.jmeter.gui.action.Command;
   import org.apache.jmeter.report.gui.action.ReportExitCommand;
  
  
  
  1.2       +2 -2      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportActionRouter.java
  
  Index: ReportActionRouter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportActionRouter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportActionRouter.java	17 Aug 2005 04:22:30 -0000	1.1
  +++ ReportActionRouter.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -268,7 +268,7 @@
   			while (iterClasses.hasNext()) {
   				String strClassName = (String) iterClasses.next();
                   if (strClassName.startsWith("org.apache.jmeter.report.gui.action")) {
  -                    log.info("classname:: " + strClassName);
  +                    // log.info("classname:: " + strClassName);
                       commandClass = Class.forName(strClassName);
                       if (!Modifier.isAbstract(commandClass.getModifiers())) {
                           command = (Command) commandClass.newInstance();
  
  
  
  1.2       +3 -3      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportClose.java
  
  Index: ReportClose.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportClose.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportClose.java	17 Aug 2005 04:22:30 -0000	1.1
  +++ ReportClose.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -24,7 +24,7 @@
   import javax.swing.JOptionPane;
   
   import org.apache.jmeter.gui.ReportGuiPackage;
  -import org.apache.jmeter.gui.action.ActionRouter;
  +import org.apache.jmeter.report.gui.action.ReportActionRouter;
   import org.apache.jmeter.gui.action.CheckDirty;
   import org.apache.jmeter.gui.action.Command;
   import org.apache.jmeter.gui.action.Save;
  @@ -66,7 +66,7 @@
   	 *            the generic UI action event
   	 */
   	public void doAction(ActionEvent e) {
  -		ActionRouter.getInstance().doActionNow(
  +		ReportActionRouter.getInstance().doActionNow(
   				new ActionEvent(e.getSource(), e.getID(),
   						ReportCheckDirty.CHECK_DIRTY));
   		ReportGuiPackage guiPackage = ReportGuiPackage.getInstance();
  
  
  
  1.2       +2 -2      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportDragNDrop.java
  
  Index: ReportDragNDrop.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportDragNDrop.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportDragNDrop.java	17 Aug 2005 04:22:33 -0000	1.1
  +++ ReportDragNDrop.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -23,7 +23,7 @@
   
   import org.apache.jmeter.control.Controller;
   import org.apache.jmeter.gui.ReportGuiPackage;
  -import org.apache.jmeter.gui.action.AbstractAction;
  +import org.apache.jmeter.report.gui.action.AbstractAction;
   import org.apache.jmeter.gui.action.Command;
   import org.apache.jmeter.report.gui.tree.ReportTreeListener;
   import org.apache.jmeter.report.gui.tree.ReportTreeNode;
  
  
  
  1.2       +2 -2      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCut.java
  
  Index: ReportCut.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCut.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportCut.java	17 Aug 2005 04:22:34 -0000	1.1
  +++ ReportCut.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -22,7 +22,7 @@
   import java.util.Set;
   
   import org.apache.jmeter.gui.ReportGuiPackage;
  -import org.apache.jmeter.gui.action.AbstractAction;
  +import org.apache.jmeter.report.gui.action.AbstractAction;
   import org.apache.jmeter.gui.action.Command;
   import org.apache.jmeter.report.gui.tree.ReportTreeNode;
   
  
  
  
  1.2       +3 -3      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportPaste.java
  
  Index: ReportPaste.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportPaste.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportPaste.java	25 Aug 2005 22:35:06 -0000	1.1
  +++ ReportPaste.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -23,7 +23,7 @@
   import java.util.Set;
   
   import org.apache.jmeter.gui.ReportGuiPackage;
  -import org.apache.jmeter.gui.action.AbstractAction;
  +import org.apache.jmeter.report.gui.action.AbstractAction;
   import org.apache.jmeter.report.gui.tree.ReportTreeListener;
   import org.apache.jmeter.report.gui.tree.ReportTreeNode;
   
  
  
  
  1.2       +3 -3      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportStart.java
  
  Index: ReportStart.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportStart.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportStart.java	25 Aug 2005 22:35:06 -0000	1.1
  +++ ReportStart.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -25,7 +25,7 @@
   import javax.swing.JOptionPane;
   
   import org.apache.jmeter.engine.StandardJMeterEngine;
  -import org.apache.jmeter.gui.action.AbstractAction;
  +import org.apache.jmeter.report.gui.action.AbstractAction;
   import org.apache.jmeter.gui.ReportGuiPackage;
   import org.apache.jmeter.gui.util.JMeterMenuBar;
   import org.apache.jorphan.logging.LoggingManager;
  
  
  
  1.1                  jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/AbstractAction.java
  
  Index: AbstractAction.java
  ===================================================================
  // $Header: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/AbstractAction.java,v 1.1 2005/08/27 03:40:45 woolfel Exp $
  /*
   * Copyright 2001-2004 The Apache Software Foundation.
   *
   * Licensed 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.report.gui.action;
  
  import java.awt.event.ActionEvent;
  import java.util.Iterator;
  import java.util.LinkedList;
  import java.util.Set;
  
  import javax.swing.JOptionPane;
  
  import org.apache.jmeter.control.ReplaceableController;
  import org.apache.jmeter.gui.action.Command;
  import org.apache.jmeter.gui.ReportGuiPackage;
  import org.apache.jmeter.report.gui.tree.ReportTreeNode;
  import org.apache.jmeter.testelement.TestElement;
  import org.apache.jmeter.util.JMeterUtils;
  import org.apache.jorphan.collections.HashTree;
  import org.apache.jorphan.logging.LoggingManager;
  import org.apache.log.Logger;
  
  /**
   * @author mstover
   * @version $Revision: 1.1 $
   */
  public abstract class AbstractAction implements Command {
  	private static final Logger log = LoggingManager.getLoggerForClass();
  
  	/**
  	 * @see Command#doAction(ActionEvent)
  	 */
  	public void doAction(ActionEvent e) {
  	}
  
  	/**
  	 * @see Command#getActionNames()
  	 */
  	abstract public Set getActionNames();
  
  	protected void convertSubTree(HashTree tree) {
  		Iterator iter = new LinkedList(tree.list()).iterator();
  		while (iter.hasNext()) {
  			Object o = iter.next();
  			if(o instanceof TestElement)
  				continue; //hey, no need to convert
  			ReportTreeNode item = (ReportTreeNode) o;
  			if (item.isEnabled()) {
  				if (item.getUserObject() instanceof ReplaceableController) {
  					ReplaceableController rc = (ReplaceableController) item.getTestElement();
  					HashTree subTree = tree.getTree(item);
  
  					if (subTree != null) {
  						HashTree replacementTree = rc.getReplacementSubTree();
  						convertSubTree(replacementTree);
  						tree.replace(item,rc);
  						tree.set(rc,replacementTree);
  					}
  				} else {
  					convertSubTree(tree.getTree(item));
  					TestElement testElement = item.getTestElement();
  					tree.replace(item, testElement);
  				}
  			} else {
  				tree.remove(item);
  			}
  
  		}
  	}
  
  	/**
  	 * @param e
  	 */
  	protected void popupShouldSave(ActionEvent e) {
  		log.debug("popupShouldSave");
  		if (ReportGuiPackage.getInstance().getTestPlanFile() == null) {
  			if (JOptionPane.showConfirmDialog(ReportGuiPackage.getInstance().getMainFrame(), JMeterUtils
  					.getResString("should_save"), JMeterUtils.getResString("warning"), JOptionPane.YES_NO_OPTION,
  					JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
  				ReportActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ReportSave.SAVE));
  			}
  		}
  	}
  }
  
  
  
  1.3       +9 -9      jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportGuiPackage.java
  
  Index: ReportGuiPackage.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportGuiPackage.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ReportGuiPackage.java	17 Aug 2005 04:22:45 -0000	1.2
  +++ ReportGuiPackage.java	27 Aug 2005 03:40:45 -0000	1.3
  @@ -27,16 +27,16 @@
   
   import javax.swing.JPopupMenu;
   
  -import org.apache.jmeter.engine.util.ValueReplacer;
   import org.apache.jmeter.exceptions.IllegalUserActionException;
  +import org.apache.jmeter.report.engine.ValueReplacer;
   import org.apache.jmeter.report.gui.tree.ReportTreeListener;
   import org.apache.jmeter.report.gui.tree.ReportTreeModel;
   import org.apache.jmeter.report.gui.tree.ReportTreeNode;
   import org.apache.jmeter.services.FileServer;
   import org.apache.jmeter.testbeans.TestBean;
   import org.apache.jmeter.testbeans.gui.TestBeanGUI;
  +import org.apache.jmeter.testelement.ReportPlan;
   import org.apache.jmeter.testelement.TestElement;
  -import org.apache.jmeter.testelement.TestPlan;
   import org.apache.jmeter.util.JMeterUtils;
   import org.apache.jmeter.util.LocaleChangeEvent;
   import org.apache.jmeter.util.LocaleChangeListener;
  @@ -488,7 +488,7 @@
   	 * @return a ValueReplacer configured for the test tree
   	 */
   	public ValueReplacer getReplacer() {
  -		return new ValueReplacer((TestPlan) ((ReportTreeNode) getTreeModel().getTestPlan().getArray()[0])
  +		return new ValueReplacer((ReportPlan) ((ReportTreeNode) getTreeModel().getTestPlan().getArray()[0])
   				.getTestElement());
   	}
   
  @@ -499,7 +499,7 @@
   	 *            the new JMeter main frame
   	 */
   	public void setMainFrame(ReportMainFrame newMainFrame) {
  -		mainFrame = newMainFrame;
  +		this.mainFrame = newMainFrame;
   	}
   
   	/**
  @@ -507,8 +507,8 @@
   	 * 
   	 * @return the main JMeter frame
   	 */
  -	public MainFrame getMainFrame() {
  -		return mainFrame;
  +	public ReportMainFrame getMainFrame() {
  +		return this.mainFrame;
   	}
   
   	/**
  @@ -589,7 +589,7 @@
   		// EditCommand action -- we can't just trigger the action because that
   		// would populate the current node with the contents of the new GUI --
   		// which is empty.]
  -		MainFrame mf = getMainFrame(); // Fetch once
  +		ReportMainFrame mf = getMainFrame(); // Fetch once
   		if (mf == null) // Probably caused by unit testing on headless system
   		{
   			log.warn("Mainframe is null");
  
  
  
  1.3       +150 -36   jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportMainFrame.java
  
  Index: ReportMainFrame.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportMainFrame.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ReportMainFrame.java	17 Aug 2005 04:22:45 -0000	1.2
  +++ ReportMainFrame.java	27 Aug 2005 03:40:45 -0000	1.3
  @@ -37,6 +37,7 @@
   import javax.swing.JButton;
   import javax.swing.JComponent;
   import javax.swing.JDialog;
  +import javax.swing.JFrame;
   import javax.swing.JLabel;
   import javax.swing.JMenu;
   import javax.swing.JPanel;
  @@ -52,11 +53,12 @@
   
   import org.apache.jmeter.engine.event.LoopIterationEvent;
   import org.apache.jmeter.gui.action.GlobalMouseListener;
  -import org.apache.jmeter.gui.util.JMeterMenuBar;
  +import org.apache.jmeter.gui.util.ReportMenuBar;
   import org.apache.jmeter.report.gui.action.ReportActionRouter;
   import org.apache.jmeter.report.gui.tree.ReportCellRenderer;
   import org.apache.jmeter.report.gui.tree.ReportTreeListener;
  -import org.apache.jmeter.threads.JMeterContextService;
  +import org.apache.jmeter.samplers.Remoteable;
  +import org.apache.jmeter.testelement.TestListener;
   import org.apache.jmeter.util.JMeterUtils;
   import org.apache.jorphan.gui.ComponentUtil;
   
  @@ -67,15 +69,33 @@
    * @author Michael Stover
    * @version $Revision$
    */
  -public class ReportMainFrame extends MainFrame {
  +public class ReportMainFrame extends JFrame implements TestListener, Remoteable {
   
  -	/** An image which is displayed when a test is running. */
  +    /** The menu bar. */
  +    protected ReportMenuBar menuBar;
  +
  +    /** The main panel where components display their GUIs. */
  +    protected JScrollPane mainPanel;
  +
  +    /** The panel where the test tree is shown. */
  +    protected JScrollPane treePanel;
  +
  +    /** The test tree. */
  +    protected JTree tree;
  +
  +    /** An image which is displayed when a test is running. */
   	private ImageIcon runningIcon = JMeterUtils.getImage("thread.enabled.gif");
   
   	/** An image which is displayed when a test is not currently running. */
   	private ImageIcon stoppedIcon = JMeterUtils.getImage("thread.disabled.gif");
   
  -	/** The button used to display the running/stopped image. */
  +    /** The x coordinate of the last location where a component was dragged. */
  +    private int previousDragXLocation = 0;
  +
  +    /** The y coordinate of the last location where a component was dragged. */
  +    private int previousDragYLocation = 0;
  +
  +    /** The button used to display the running/stopped image. */
   	private JButton runningIndicator;
   
   	/** The set of currently running hosts. */
  @@ -84,7 +104,7 @@
   	/** A message dialog shown while JMeter threads are stopping. */
   	private JDialog stoppingMessage;
   
  -	/**
  +    /**
   	 * Create a new JMeter frame.
   	 * 
   	 * @param actionHandler
  @@ -96,16 +116,16 @@
   	 */
   	public ReportMainFrame(ActionListener actionHandler, TreeModel treeModel,
               ReportTreeListener treeListener) {
  -        super.tree = this.makeTree(treeModel,treeListener);
  -	}
  +        runningIndicator = new JButton(stoppedIcon);
  +        runningIndicator.setMargin(new Insets(0, 0, 0, 0));
  +        runningIndicator.setBorder(BorderFactory.createEmptyBorder());
   
  -	/**
  -	 * Default constructor for the JMeter frame. This constructor will not
  -	 * properly initialize the tree, so don't use it.
  -	 */
  -	public ReportMainFrame() {
  -		// TODO: Can we remove this constructor? JMeter won't behave properly
  -		// if it used.
  +        this.tree = this.makeTree(treeModel,treeListener);
  +
  +        ReportGuiPackage.getInstance().setMainFrame(this);
  +        init();
  +
  +        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
   	}
   
   	// MenuBar related methods
  @@ -119,7 +139,7 @@
   	 *            true if the menu item should be enabled, false otherwise
   	 */
   	public void setFileLoadEnabled(boolean enabled) {
  -        super.setFileLoadEnabled(enabled);
  +        menuBar.setFileLoadEnabled(enabled);
   	}
   
   	/**
  @@ -129,7 +149,7 @@
   	 *            true if the menu item should be enabled, false otherwise
   	 */
   	public void setFileSaveEnabled(boolean enabled) {
  -		super.setFileSaveEnabled(enabled);
  +        menuBar.setFileSaveEnabled(enabled);
   	}
   
   	/**
  @@ -139,7 +159,7 @@
   	 *            the new Edit menu
   	 */
   	public void setEditMenu(JPopupMenu menu) {
  -		super.setEditMenu(menu);
  +        menuBar.setEditMenu(menu);
   	}
   
   	/**
  @@ -149,7 +169,7 @@
   	 *            true if the menu item should be enabled, false otherwise
   	 */
   	public void setEditEnabled(boolean enabled) {
  -		super.setEditEnabled(enabled);
  +		menuBar.setEditEnabled(enabled);
   	}
   
   	/**
  @@ -159,7 +179,7 @@
   	 *            the new Edit|Add menu
   	 */
   	public void setEditAddMenu(JMenu menu) {
  -		super.setEditAddMenu(menu);
  +		menuBar.setEditAddMenu(menu);
   	}
   
   	/**
  @@ -169,7 +189,7 @@
   	 *            true if the menu item should be enabled, false otherwise
   	 */
   	public void setEditAddEnabled(boolean enabled) {
  -		super.setEditAddEnabled(enabled);
  +		menuBar.setEditAddEnabled(enabled);
   	}
   
   	/**
  @@ -179,16 +199,61 @@
   	 *            true if the menu item should be enabled, false otherwise
   	 */
   	public void setEditRemoveEnabled(boolean enabled) {
  -		super.setEditRemoveEnabled(enabled);
  +		menuBar.setEditRemoveEnabled(enabled);
   	}
   
  +    /**
  +     * Close the currently selected menu.
  +     */
  +    public void closeMenu() {
  +        if (menuBar.isSelected()) {
  +            MenuElement[] menuElement = menuBar.getSubElements();
  +            if (menuElement != null) {
  +                for (int i = 0; i < menuElement.length; i++) {
  +                    JMenu menu = (JMenu) menuElement[i];
  +                    if (menu.isSelected()) {
  +                        menu.setPopupMenuVisible(false);
  +                        menu.setSelected(false);
  +                        break;
  +                    }
  +                }
  +            }
  +        }
  +    }
  +    /**
  +     * Show a dialog indicating that JMeter threads are stopping on a particular
  +     * host.
  +     * 
  +     * @param host
  +     *            the host where JMeter threads are stopping
  +     */
  +    public void showStoppingMessage(String host) {
  +        stoppingMessage = new JDialog(this, JMeterUtils.getResString("stopping_test_title"), true);
  +        JLabel stopLabel = new JLabel(JMeterUtils.getResString("stopping_test") + ": " + host);
  +        stopLabel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
  +        stoppingMessage.getContentPane().add(stopLabel);
  +        stoppingMessage.pack();
  +        ComponentUtil.centerComponentInComponent(this, stoppingMessage);
  +        SwingUtilities.invokeLater(new Runnable() {
  +            public void run() {
  +                if (stoppingMessage != null) {
  +                    stoppingMessage.show();
  +                }
  +            }
  +        });
  +    }
  +
  +    public void setMainPanel(JComponent comp) {
  +        mainPanel.setViewportView(comp);
  +    }
  +
   	/***************************************************************************
   	 * !ToDoo (Method description)
   	 * 
   	 * @return !ToDo (Return description)
   	 **************************************************************************/
   	public JTree getTree() {
  -		return super.getTree();
  +		return this.tree;
   	}
   
   	// TestListener implementation
  @@ -242,8 +307,7 @@
   	 * Create the GUI components and layout.
   	 */
   	protected void init() {
  -        super.init();
  -		menuBar = new JMeterMenuBar();
  +		menuBar = new ReportMenuBar();
   		setJMenuBar(menuBar);
   
   		JPanel all = new JPanel(new BorderLayout());
  @@ -268,16 +332,41 @@
   		addMouseListener(new GlobalMouseListener());
       }
   
  -	/**
  -	 * Create the JMeter tool bar pane containing the running indicator.
  -	 * 
  -	 * @return a panel containing the running indicator
  -	 */
  -	protected Component createToolBar() {
  -        return super.createToolBar();
  -	}
  +    /**
  +     * Create the JMeter tool bar pane containing the running indicator.
  +     * 
  +     * @return a panel containing the running indicator
  +     */
  +    protected Component createToolBar() {
  +        Box toolPanel = new Box(BoxLayout.X_AXIS);
  +        toolPanel.add(Box.createRigidArea(new Dimension(10, 15)));
  +        toolPanel.add(Box.createGlue());
  +        toolPanel.add(runningIndicator);
  +        return toolPanel;
  +    }
   
  -	/**
  +    /**
  +     * Create the panel where the GUI representation of the test tree is
  +     * displayed. The tree should already be created before calling this method.
  +     * 
  +     * @return a scroll pane containing the test tree GUI
  +     */
  +    protected JScrollPane createTreePanel() {
  +        JScrollPane treeP = new JScrollPane(tree);
  +        treeP.setMinimumSize(new Dimension(100, 0));
  +        return treeP;
  +    }
  +
  +    /**
  +     * Create the main panel where components can display their GUIs.
  +     * 
  +     * @return the main scroll pane
  +     */
  +    protected JScrollPane createMainPanel() {
  +        return new JScrollPane();
  +    }
  +
  +    /**
   	 * Create and initialize the GUI representation of the test tree.
   	 * 
   	 * @param treeModel
  @@ -313,4 +402,29 @@
           return rend;
       }
   
  +    public void drawDraggedComponent(Component dragIcon, int x, int y) {
  +        Dimension size = dragIcon.getPreferredSize();
  +        treePanel.paintImmediately(previousDragXLocation, previousDragYLocation, size.width, size.height);
  +        this.getLayeredPane().setLayer(dragIcon, 400);
  +        SwingUtilities.paintComponent(treePanel.getGraphics(), dragIcon, treePanel, x, y, size.width, size.height);
  +        previousDragXLocation = x;
  +        previousDragYLocation = y;
  +    }
  +    
  +    /**
  +     * A window adapter used to detect when the main JMeter frame is being
  +     * closed.
  +     */
  +    protected class WindowHappenings extends WindowAdapter {
  +        /**
  +         * Called when the main JMeter frame is being closed. Sends a
  +         * notification so that JMeter can react appropriately.
  +         * 
  +         * @param event
  +         *            the WindowEvent to handle
  +         */
  +        public void windowClosing(WindowEvent event) {
  +            ReportActionRouter.getInstance().actionPerformed(new ActionEvent(this, event.getID(), "exit"));
  +        }
  +    }
   }
  
  
  
  1.2       +6 -6      jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeNode.java
  
  Index: ReportTreeNode.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeNode.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportTreeNode.java	17 Aug 2005 04:22:39 -0000	1.1
  +++ ReportTreeNode.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -28,7 +28,7 @@
   import javax.swing.tree.DefaultMutableTreeNode;
   
   import org.apache.jmeter.gui.GUIFactory;
  -import org.apache.jmeter.gui.GuiPackage;
  +import org.apache.jmeter.gui.ReportGuiPackage;
   import org.apache.jmeter.gui.tree.NamedTreeNode;
   import org.apache.jmeter.testbeans.TestBean;
   import org.apache.jmeter.testelement.AbstractTestElement;
  @@ -114,7 +114,7 @@
   
   	public Collection getMenuCategories() {
   		try {
  -			return GuiPackage.getInstance().getGui(getTestElement())
  +			return ReportGuiPackage.getInstance().getGui(getTestElement())
   					.getMenuCategories();
   		} catch (Exception e) {
   			log.error("Can't get popup menu for gui", e);
  @@ -124,7 +124,7 @@
   
   	public JPopupMenu createPopupMenu() {
   		try {
  -			return GuiPackage.getInstance().getGui(getTestElement())
  +			return ReportGuiPackage.getInstance().getGui(getTestElement())
   					.createPopupMenu();
   		} catch (Exception e) {
   			log.error("Can't get popup menu for gui", e);
  @@ -137,12 +137,12 @@
   	}
   
   	public String getStaticLabel() {
  -		return GuiPackage.getInstance().getGui((TestElement) getUserObject())
  +		return ReportGuiPackage.getInstance().getGui((TestElement) getUserObject())
   				.getStaticLabel();
   	}
   
   	public String getDocAnchor() {
  -		return GuiPackage.getInstance().getGui((TestElement) getUserObject())
  +		return ReportGuiPackage.getInstance().getGui((TestElement) getUserObject())
   				.getDocAnchor();
   	}
   
  
  
  
  1.2       +3 -13     jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeModel.java
  
  Index: ReportTreeModel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeModel.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportTreeModel.java	17 Aug 2005 04:22:38 -0000	1.1
  +++ ReportTreeModel.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -25,7 +25,6 @@
   import javax.swing.tree.DefaultTreeModel;
   
   import org.apache.jmeter.config.gui.AbstractConfigGui;
  -import org.apache.jmeter.control.gui.TestPlanGui;
   import org.apache.jmeter.control.gui.ReportGui;
   import org.apache.jmeter.exceptions.IllegalUserActionException;
   import org.apache.jmeter.gui.GuiPackage;
  @@ -33,7 +32,6 @@
   import org.apache.jmeter.report.gui.tree.ReportTreeNode;
   import org.apache.jmeter.testelement.TestElement;
   import org.apache.jmeter.testelement.ReportPlan;
  -import org.apache.jmeter.testelement.WorkBench;
   import org.apache.jmeter.testelement.property.NullProperty;
   import org.apache.jmeter.util.NameUpdater;
   import org.apache.jorphan.collections.HashTree;
  @@ -130,8 +128,7 @@
   	}
   
   	public void removeNodeFromParent(ReportTreeNode node) {
  -		if (!(node.getUserObject() instanceof ReportPlan)
  -				&& !(node.getUserObject() instanceof WorkBench)) {
  +		if (!(node.getUserObject() instanceof ReportPlan)) {
   			super.removeNodeFromParent(node);
   		}
   	}
  @@ -183,15 +180,8 @@
   	}
   
   	private void initTree() {
  -		TestElement tp = new TestPlanGui().createTestElement();
   		TestElement wb = new ReportGui().createTestElement();
  -		this.insertNodeInto(new ReportTreeNode(tp, this),
  -				(ReportTreeNode) getRoot(), 0);
  -		try {
  -			super.removeNodeFromParent((ReportTreeNode) getChild(getRoot(), 1));
  -		} catch (RuntimeException e) {
  -		}
   		this.insertNodeInto(new ReportTreeNode(wb, this),
  -				(ReportTreeNode) getRoot(), 1);
  +				(ReportTreeNode) getRoot(), 0);
   	}
   }
  
  
  
  1.2       +9 -11     jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeListener.java
  
  Index: ReportTreeListener.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeListener.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ReportTreeListener.java	17 Aug 2005 04:22:39 -0000	1.1
  +++ ReportTreeListener.java	27 Aug 2005 03:40:45 -0000	1.2
  @@ -35,10 +35,9 @@
   import javax.swing.tree.TreeNode;
   import javax.swing.tree.TreePath;
   
  -import org.apache.jmeter.control.gui.TestPlanGui;
  -import org.apache.jmeter.control.gui.WorkBenchGui;
  -import org.apache.jmeter.gui.GuiPackage;
  -import org.apache.jmeter.gui.MainFrame;
  +import org.apache.jmeter.control.gui.ReportGui;
  +import org.apache.jmeter.gui.ReportGuiPackage;
  +import org.apache.jmeter.gui.ReportMainFrame;
   import org.apache.jmeter.report.gui.action.ReportDragNDrop;
   import org.apache.jmeter.util.JMeterUtils;
   import org.apache.jorphan.logging.LoggingManager;
  @@ -189,7 +188,7 @@
   			dragNdrop.add(item);
   			displayPopUp(e, dragNdrop);
   		} else {
  -			GuiPackage.getInstance().getMainFrame().repaint();
  +			ReportGuiPackage.getInstance().getMainFrame().repaint();
   		}
   		dragging = false;
   	}
  @@ -218,7 +217,7 @@
   
   	private void changeSelectionIfDragging(MouseEvent e) {
   		if (dragging) {
  -			GuiPackage.getInstance().getMainFrame().drawDraggedComponent(dragIcon, e.getX(), e.getY());
  +			ReportGuiPackage.getInstance().getMainFrame().drawDraggedComponent(dragIcon, e.getX(), e.getY());
   			if (tree.getPathForLocation(e.getX(), e.getY()) != null) {
   				currentPath = tree.getPathForLocation(e.getX(), e.getY());
   				if (!contains(draggedNodes, getCurrentNode())) {
  @@ -239,7 +238,7 @@
   
   	public void mousePressed(MouseEvent e) {
   		// Get the Main Frame.
  -		MainFrame mainFrame = GuiPackage.getInstance().getMainFrame();
  +		ReportMainFrame mainFrame = ReportGuiPackage.getInstance().getMainFrame();
   		// Close any Main Menu that is open
   		mainFrame.closeMenu();
   		int selRow = tree.getRowForLocation(e.getX(), e.getY());
  @@ -266,8 +265,7 @@
   		if (!dragging) {
   			dragging = true;
   			draggedNodes = getSelectedNodes();
  -			if (draggedNodes[0].getUserObject() instanceof TestPlanGui
  -					|| draggedNodes[0].getUserObject() instanceof WorkBenchGui) {
  +			if (draggedNodes[0].getUserObject() instanceof ReportGui) {
   				dragging = false;
   			}
   
  @@ -304,7 +302,7 @@
   
   	private void displayPopUp(MouseEvent e) {
   		JPopupMenu pop = getCurrentNode().createPopupMenu();
  -		GuiPackage.getInstance().displayPopUp(e, pop);
  +		ReportGuiPackage.getInstance().displayPopUp(e, pop);
   	}
   
   	private void displayPopUp(MouseEvent e, JPopupMenu popup) {
  
  
  
  1.1                  jakarta-jmeter/src/reports/org/apache/jmeter/report/engine/ValueReplacer.java
  
  Index: ValueReplacer.java
  ===================================================================
  // $Header: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/engine/ValueReplacer.java,v 1.1 2005/08/27 03:40:45 woolfel Exp $
  /*
   * Copyright 2003-2004 The Apache Software Foundation.
   *
   * Licensed 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.report.engine;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.LinkedList;
  import java.util.List;
  import java.util.Map;
  
  import junit.framework.TestCase;
  
  import org.apache.jmeter.functions.InvalidVariableException;
  import org.apache.jmeter.testelement.ReportPlan;
  import org.apache.jmeter.testelement.TestElement;
  import org.apache.jmeter.testelement.property.CollectionProperty;
  import org.apache.jmeter.testelement.property.JMeterProperty;
  import org.apache.jmeter.testelement.property.MultiProperty;
  import org.apache.jmeter.testelement.property.PropertyIterator;
  import org.apache.jmeter.testelement.property.StringProperty;
  import org.apache.jmeter.threads.JMeterContextService;
  import org.apache.jmeter.threads.JMeterVariables;
  import org.apache.jorphan.logging.LoggingManager;
  import org.apache.log.Logger;
  
  /**
   * @author Michael Stover
   * @author <a href="mailto:jsalvata@apache.org">Jordi Salvat i Alabart</a>
   * @version $Revision: 1.1 $ updated on $Date: 2005/08/27 03:40:45 $
   */
  public class ValueReplacer {
  	transient private static Logger log = LoggingManager.getLoggerForClass();
  
  	Map variables = new HashMap();
  
  	public ValueReplacer() {
  	}
  
  	public ValueReplacer(ReportPlan tp) {
  		setUserDefinedVariables(tp.getUserDefinedVariables());
  	}
  
  	public void setUserDefinedVariables(Map variables) {
  		this.variables = variables;
  	}
  
  	public void replaceValues(TestElement el) throws InvalidVariableException {
          /**
  		Collection newProps = replaceValues(el.propertyIterator(), new ReplaceStringWithFunctions(masterFunction,
  				variables));
  		setProperties(el, newProps);
          **/
  	}
  
  	private void setProperties(TestElement el, Collection newProps) {
  		Iterator iter = newProps.iterator();
  		el.clear();
  		while (iter.hasNext()) {
  			el.setProperty((JMeterProperty) iter.next());
  		}
  	}
  
  	public void reverseReplace(TestElement el) throws InvalidVariableException {
          /**
  		Collection newProps = replaceValues(el.propertyIterator(), new ReplaceFunctionsWithStrings(masterFunction,
  				variables));
  		setProperties(el, newProps);
          **/
  	}
  
  	public void reverseReplace(TestElement el, boolean regexMatch) throws InvalidVariableException {
          /**
  		Collection newProps = replaceValues(el.propertyIterator(), new ReplaceFunctionsWithStrings(masterFunction,
  				variables, regexMatch));
  		setProperties(el, newProps);
          **/
  	}
  
  	public void undoReverseReplace(TestElement el) throws InvalidVariableException {
          /**
  		Collection newProps = replaceValues(el.propertyIterator(), new UndoVariableReplacement(masterFunction,
  				variables));
  		setProperties(el, newProps);
          **/
  	}
  
  	public void addVariable(String name, String value) {
  		variables.put(name, value);
  	}
  
  	/**
  	 * Add all the given variables to this replacer's variables map.
  	 * 
  	 * @param vars
  	 *            A map of variable name-value pairs (String-to-String).
  	 */
  	public void addVariables(Map vars) {
  		variables.putAll(vars);
  	}
  
      /**
  	private Collection replaceValues(PropertyIterator iter, ValueTransformer transform) throws InvalidVariableException {
  		List props = new LinkedList();
  		while (iter.hasNext()) {
  			JMeterProperty val = iter.next();
  			if (log.isDebugEnabled()) {
  				log.debug("About to replace in property of type: " + val.getClass() + ": " + val);
  			}
  			if (val instanceof StringProperty) {
  				// Must not convert TestElement.gui_class etc
  				if (!val.getName().equals(TestElement.GUI_CLASS) &&
                          !val.getName().equals(TestElement.TEST_CLASS)) {
  					val = transform.transformValue(val);
  					if (log.isDebugEnabled()) {
  						log.debug("Replacement result: " + val);
  					}
  				}
  			} else if (val instanceof MultiProperty) {
  				MultiProperty multiVal = (MultiProperty) val;
  				Collection newValues = replaceValues(multiVal.iterator(), transform);
  				multiVal.clear();
  				Iterator propIter = newValues.iterator();
  				while (propIter.hasNext()) {
  					multiVal.addProperty((JMeterProperty) propIter.next());
  				}
  				if (log.isDebugEnabled()) {
  					log.debug("Replacement result: " + multiVal);
  				}
  			} else {
  				if (log.isDebugEnabled()) {
  					log.debug("Won't replace " + val);
  				}
  			}
  			props.add(val);
  		}
  		return props;
  	}
      **/
  }
  
  
  
  1.5       +188 -15   jakarta-jmeter/src/reports/org/apache/jmeter/JMeterReport.java
  
  Index: JMeterReport.java
  ===================================================================
  RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/JMeterReport.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- JMeterReport.java	25 Aug 2005 22:35:07 -0000	1.4
  +++ JMeterReport.java	27 Aug 2005 03:40:45 -0000	1.5
  @@ -22,6 +22,8 @@
   import java.io.FileNotFoundException;
   import java.io.IOException;
   import java.util.Enumeration;
  +import java.util.Iterator;
  +import java.util.LinkedList;
   import java.util.List;
   import java.util.Properties;
   
  @@ -32,15 +34,16 @@
   import org.apache.jmeter.config.gui.AbstractConfigGui;
   import org.apache.jmeter.control.gui.AbstractControllerGui;
   import org.apache.jmeter.control.gui.ReportGui;
  -import org.apache.jmeter.control.gui.TestPlanGui;
  -import org.apache.jmeter.control.gui.WorkBenchGui;
  +import org.apache.jmeter.engine.event.LoopIterationEvent;
   import org.apache.jmeter.gui.ReportGuiPackage;
   import org.apache.jmeter.plugin.JMeterPlugin;
   import org.apache.jmeter.plugin.PluginManager;
  -import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
  +import org.apache.jmeter.samplers.Remoteable;
   import org.apache.jmeter.save.SaveService;
  -import org.apache.jmeter.threads.gui.ThreadGroupGui;
  -import org.apache.jmeter.timers.gui.AbstractTimerGui;
  +import org.apache.jmeter.services.FileServer;
  +import org.apache.jmeter.testelement.TestElement;
  +import org.apache.jmeter.testelement.TestListener;
  +import org.apache.jmeter.testelement.ReportPlan;
   import org.apache.jmeter.report.gui.AbstractReportPageGui;
   import org.apache.jmeter.report.gui.action.ReportLoad;
   import org.apache.jmeter.report.gui.action.ReportActionRouter;
  @@ -48,6 +51,8 @@
   import org.apache.jmeter.report.gui.tree.ReportTreeListener;
   import org.apache.jmeter.report.gui.tree.ReportTreeModel;
   import org.apache.jmeter.report.writers.gui.AbstractReportWriterGui;
  +import org.apache.jmeter.reporters.ResultCollector;
  +import org.apache.jmeter.reporters.Summariser;
   import org.apache.jmeter.util.JMeterUtils;
   import org.apache.jmeter.visualizers.gui.AbstractVisualizer;
   import org.apache.jorphan.collections.HashTree;
  @@ -141,6 +146,8 @@
               new CLOptionDescriptor("homedir", CLOptionDescriptor.ARGUMENT_REQUIRED, JMETER_HOME_OPT,
                       "the jmeter home directory to use"), };
       
  +    transient boolean testEnded = false;
  +
       /**
   	 * 
   	 */
  @@ -152,14 +159,9 @@
        * The default icons for the report GUI.
        */
       private static final String[][] DEFAULT_ICONS = {
  -            { TestPlanGui.class.getName(), "org/apache/jmeter/images/beaker.gif" },
  -            { AbstractTimerGui.class.getName(), "org/apache/jmeter/images/timer.gif" },
  -            { ThreadGroupGui.class.getName(), "org/apache/jmeter/images/thread.gif" },
               { AbstractVisualizer.class.getName(), "org/apache/jmeter/images/meter.png" },
               { AbstractConfigGui.class.getName(), "org/apache/jmeter/images/testtubes.png" },
               { AbstractControllerGui.class.getName(), "org/apache/jmeter/images/knob.gif" },
  -            { WorkBenchGui.class.getName(), "org/apache/jmeter/images/clipboard.gif" },
  -            { AbstractSamplerGui.class.getName(), "org/apache/jmeter/images/pipet.png" },
               { AbstractReportWriterGui.class.getName(), "org/apache/jmeter/images/new/pencil.png" },
               { AbstractReportPageGui.class.getName(), "org/apache/jmeter/images/new/book.png" },
               { ReportGui.class.getName(), "org/apache/jmeter/images/new/book.png" }
  @@ -219,9 +221,7 @@
           main.setIconImage(JMeterUtils.getImage("jmeter.jpg").getImage());
           ComponentUtil.centerComponentInWindow(main, 80);
           main.show();
  -        /**
  -         * 
  -         * for now I'm commenting it out to test
  +
           ReportActionRouter.getInstance().actionPerformed(new ActionEvent(main, 1, ReportCheckDirty.ADD_ALL));
           if (testFile != null) {
               try {
  @@ -232,15 +232,82 @@
   
                   ReportGuiPackage.getInstance().setTestPlanFile(f.getAbsolutePath());
   
  -                new LoadReport().insertLoadedTree(1, tree);
  +                new ReportLoad().insertLoadedTree(1, tree);
               } catch (Exception e) {
                   log.error("Failure loading test file", e);
                   JMeterUtils.reportErrorToUser(e.toString());
               }
           }
  -         */
       }
   
  +	private void run(String testFile, String logFile, boolean remoteStart) {
  +		FileInputStream reader = null;
  +		try {
  +			File f = new File(testFile);
  +			if (!f.exists() || !f.isFile()) {
  +				System.out.println("Could not open " + testFile);
  +				return;
  +			}
  +			FileServer.getFileServer().setBasedir(f.getAbsolutePath());
  +
  +			reader = new FileInputStream(f);
  +			log.info("Loading file: " + f);
  +
  +			HashTree tree = SaveService.loadTree(reader);
  +
  +			// Remove the disabled items
  +			// For GUI runs this is done in Start.java
  +			convertSubTree(tree);
  +
  +			if (logFile != null) {
  +				ResultCollector logger = new ResultCollector();
  +				logger.setFilename(logFile);
  +				tree.add(tree.getArray()[0], logger);
  +			}
  +			String summariserName = JMeterUtils.getPropDefault(
  +					"summariser.name", "");//$NON-NLS-1$
  +			if (summariserName.length() > 0) {
  +				log.info("Creating summariser <" + summariserName + ">");
  +				System.out.println("Creating summariser <" + summariserName + ">");
  +				Summariser summer = new Summariser(summariserName);
  +				tree.add(tree.getArray()[0], summer);
  +			}
  +			tree.add(tree.getArray()[0], new ListenToTest(parent));
  +			System.out.println("Created the tree successfully");
  +            /**
  +			JMeterEngine engine = null;
  +			if (!remoteStart) {
  +				engine = new StandardJMeterEngine();
  +				engine.configure(tree);
  +				System.out.println("Starting the test");
  +				engine.runTest();
  +			} else {
  +				String remote_hosts_string = JMeterUtils.getPropDefault(
  +						"remote_hosts", "127.0.0.1");
  +				java.util.StringTokenizer st = new java.util.StringTokenizer(
  +						remote_hosts_string, ",");
  +				List engines = new LinkedList();
  +				while (st.hasMoreElements()) {
  +					String el = (String) st.nextElement();
  +					System.out.println("Configuring remote engine for " + el);
  +					// engines.add(doRemoteInit(el.trim(), tree));
  +				}
  +				System.out.println("Starting remote engines");
  +				Iterator iter = engines.iterator();
  +				while (iter.hasNext()) {
  +					engine = (JMeterEngine) iter.next();
  +					engine.runTest();
  +				}
  +				System.out.println("Remote engines have been started");
  +			}
  +            **/
  +		} catch (Exception e) {
  +			System.out.println("Error in NonGUIDriver " + e.toString());
  +			log.error("", e);
  +		}
  +	}
  +
  +    
       /**
        * 
        * @param args
  @@ -344,4 +411,110 @@
   
       }
       
  +    /**
  +     * Code copied from AbstractAction.java and modified to suit TestElements
  +     * 
  +     * @param tree
  +     */
  +    private void convertSubTree(HashTree tree) {// TODO check build dependencies
  +        Iterator iter = new LinkedList(tree.list()).iterator();
  +        while (iter.hasNext()) {
  +            TestElement item = (TestElement) iter.next();
  +            if (item.isEnabled()) {
  +                // This is done for GUI runs in JMeterTreeModel.addSubTree()
  +                if (item instanceof ReportPlan) {
  +                    ReportPlan tp = (ReportPlan) item;
  +                    tp.setSerialized(tp.isSerialized());
  +                }
  +                // TODO handle ReplaceableControllers
  +                // if (item instanceof ReplaceableController)
  +                // {
  +                // System.out.println("Replaceable "+item.getClass().getName());
  +                // HashTree subTree = tree.getTree(item);
  +                //
  +                // if (subTree != null)
  +                // {
  +                // ReplaceableController rc =
  +                // (ReplaceableController) item;//.createTestElement();
  +                // rc.replace(subTree);
  +                // convertSubTree(subTree);
  +                // tree.replace(item, rc.getReplacement());
  +                // }
  +                // }
  +                // else
  +                {
  +                    // System.out.println("NonReplaceable
  +                    // "+item.getClass().getName());
  +                    convertSubTree(tree.getTree(item));
  +                    // TestElement testElement = item.createTestElement();
  +                    // tree.replace(item, testElement);
  +                }
  +            } else {
  +                // System.out.println("Disabled "+item.getClass().getName());
  +                tree.remove(item);
  +            }
  +        }
  +    }
  +    
  +    /**
  +     * Listen to test and exit program after test completes, after a 5 second
  +     * delay to give listeners a chance to close out their files.
  +     */
  +    private class ListenToTest implements TestListener, Runnable, Remoteable {
  +        int started = 0;
  +
  +        private JMeterReport _parent;
  +
  +        private ListenToTest(JMeterReport parent) {
  +            _parent = parent;
  +        }
  +
  +        public synchronized void testEnded(String host) {
  +            started--;
  +            log.info("Remote host " + host + " finished");
  +            if (started == 0) {
  +                testEnded();
  +            }
  +        }
  +
  +        public void testEnded() {
  +            Thread stopSoon = new Thread(this);
  +            stopSoon.start();
  +        }
  +
  +        public synchronized void testStarted(String host) {
  +            started++;
  +            log.info("Started remote host: " + host);
  +        }
  +
  +        public void testStarted() {
  +            log.info(JMeterUtils.getResString("running_test"));
  +        }
  +
  +        /**
  +         * This is a hack to allow listeners a chance to close their files. Must
  +         * implement a queue for sample responses tied to the engine, and the
  +         * engine won't deliver testEnded signal till all sample responses have
  +         * been delivered. Should also improve performance of remote JMeter
  +         * testing.
  +         */
  +        public void run() {
  +            System.out.println("Tidying up ...");
  +            try {
  +                Thread.sleep(5000);
  +            } catch (InterruptedException e) {
  +                // ignored
  +            }
  +            System.out.println("... end of run");
  +            _parent.testEnded = true;
  +        }
  +
  +        /**
  +         * @see TestListener#testIterationStart(LoopIterationEvent)
  +         */
  +        public void testIterationStart(LoopIterationEvent event) {
  +            // ignored
  +        }
  +    }
  +
   }
  \ No newline at end of file
  
  
  
  1.1                  jakarta-jmeter/src/reports/org/apache/jmeter/gui/util/ReportMenuBar.java
  
  Index: ReportMenuBar.java
  ===================================================================
  // $Header: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/gui/util/ReportMenuBar.java,v 1.1 2005/08/27 03:40:45 woolfel Exp $
  /*
   * Copyright 2001-2004 The Apache Software Foundation.
   *
   * Licensed 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.util;
  
  import java.awt.Component;
  import java.awt.event.KeyEvent;
  import java.util.Collection;
  import java.util.Iterator;
  import java.util.LinkedList;
  import java.util.Locale;
  
  import javax.swing.JMenu;
  import javax.swing.JMenuBar;
  import javax.swing.JMenuItem;
  import javax.swing.JPopupMenu;
  import javax.swing.KeyStroke;
  import javax.swing.MenuElement;
  import javax.swing.UIManager;
  
  import org.apache.jmeter.report.gui.action.ReportActionRouter;
  import org.apache.jmeter.gui.action.ChangeLanguage;
  import org.apache.jmeter.util.JMeterUtils;
  import org.apache.jmeter.util.LocaleChangeEvent;
  import org.apache.jmeter.util.LocaleChangeListener;
  import org.apache.jmeter.util.SSLManager;
  import org.apache.jorphan.util.JOrphanUtils;
  import org.apache.jorphan.logging.LoggingManager;
  import org.apache.log.Logger;
  
  /**
   * @author Michael Stover
   * @author <a href="mailto:klancast@swbell.net">Keith Lancaster</a>
   * @version $Revision: 1.1 $ updated on $Date: 2005/08/27 03:40:45 $
   */
  public class ReportMenuBar extends JMenuBar implements LocaleChangeListener {
  	transient private static Logger log = LoggingManager.getLoggerForClass();
  
  	JMenu fileMenu;
  
  	JMenuItem file_save_as;
  
  	JMenuItem file_load;
  
  	JMenuItem file_merge;
  
  	JMenuItem file_exit;
  
  	JMenuItem file_close;
  
  	JMenu editMenu;
  
  	JMenu edit_add;
  
  	// JMenu edit_add_submenu;
  	JMenuItem edit_remove; // TODO - should this be created?
  
  	JMenu runMenu;
  
  	JMenuItem run_start;
  
  	JMenu remote_start;
  
  	JMenuItem remote_start_all;
  
  	Collection remote_engine_start;
  
  	JMenuItem run_stop;
  
  	private JMenuItem run_shut; // all the others could be private too?
  
  	JMenu remote_stop;
  
  	JMenuItem remote_stop_all;
  
  	Collection remote_engine_stop;
  
  	JMenuItem run_clear;
  
  	JMenuItem run_clearAll;
  
  	// JMenu reportMenu;
  	// JMenuItem analyze;
  	JMenu optionsMenu;
  
  	JMenu lafMenu;
  
  	JMenuItem sslManager;
  
  	JMenu helpMenu;
  
  	JMenuItem help_about;
  
  	String[] remoteHosts;
  
  	private JMenu remote_exit;
  
  	private JMenuItem remote_exit_all;
  
  	private Collection remote_engine_exit;
  
  	public ReportMenuBar() {
  		remote_engine_start = new LinkedList();
  		remote_engine_stop = new LinkedList();
  		remote_engine_exit = new LinkedList();
  		remoteHosts = JOrphanUtils.split(JMeterUtils.getPropDefault("remote_hosts", ""), ",");
  		if (remoteHosts.length == 1 && remoteHosts[0].equals("")) {
  			remoteHosts = new String[0];
  		}
  		this.getRemoteItems();
  		createMenuBar();
  	}
  
  	public void setFileSaveEnabled(boolean enabled) {
  		file_save_as.setEnabled(enabled);
  	}
  
  	public void setFileLoadEnabled(boolean enabled) {
  		if (file_load != null) {
  			file_load.setEnabled(enabled);
  		}
  		if (file_merge != null) {
  			file_merge.setEnabled(enabled);
  		}
  	}
  
  	public void setEditEnabled(boolean enabled) {
  		if (editMenu != null) {
  			editMenu.setEnabled(enabled);
  		}
  	}
  
  	public void setEditAddMenu(JMenu menu) {
  		// If the Add menu already exists, remove it.
  		if (edit_add != null) {
  			editMenu.remove(edit_add);
  		}
  		// Insert the Add menu as the first menu item in the Edit menu.
  		edit_add = menu;
  		editMenu.insert(edit_add, 0);
  	}
  
  	public void setEditMenu(JPopupMenu menu) {
  		if (menu != null) {
  			editMenu.removeAll();
  			Component[] comps = menu.getComponents();
  			for (int i = 0; i < comps.length; i++) {
  				editMenu.add(comps[i]);
  			}
  			editMenu.setEnabled(true);
  		} else {
  			editMenu.setEnabled(false);
  		}
  	}
  
  	public void setEditAddEnabled(boolean enabled) {
  		// There was a NPE being thrown without the null check here.. JKB
  		if (edit_add != null) {
  			edit_add.setEnabled(enabled);
  		}
  		// If we are enabling the Edit-->Add menu item, then we also need to
  		// enable the Edit menu. The Edit menu may already be enabled, but
  		// there's no harm it trying to enable it again.
  		if (enabled) {
  			setEditEnabled(true);
  		} else {
  			// If we are disabling the Edit-->Add menu item and the
  			// Edit-->Remove menu item is disabled, then we also need to
  			// disable the Edit menu.
  			// The Java Look and Feel Guidelines say to disable a menu if all
  			// menu items are disabled.
  			if (!edit_remove.isEnabled()) {
  				editMenu.setEnabled(false);
  			}
  		}
  	}
  
  	public void setEditRemoveEnabled(boolean enabled) {
  		edit_remove.setEnabled(enabled);
  		// If we are enabling the Edit-->Remove menu item, then we also need to
  		// enable the Edit menu. The Edit menu may already be enabled, but
  		// there's no harm it trying to enable it again.
  		if (enabled) {
  			setEditEnabled(true);
  		} else {
  			// If we are disabling the Edit-->Remove menu item and the
  			// Edit-->Add menu item is disabled, then we also need to disable
  			// the Edit menu.
  			// The Java Look and Feel Guidelines say to disable a menu if all
  			// menu items are disabled.
  			if (!edit_add.isEnabled()) {
  				editMenu.setEnabled(false);
  			}
  		}
  	}
  
  	/**
  	 * Creates the MenuBar for this application. I believe in my heart that this
  	 * should be defined in a file somewhere, but that is for later.
  	 */
  	public void createMenuBar() {
  		makeFileMenu();
  		makeEditMenu();
  		makeRunMenu();
  		makeOptionsMenu();
  		makeHelpMenu();
  		this.add(fileMenu);
  		this.add(editMenu);
  		this.add(runMenu);
  		this.add(optionsMenu);
  		this.add(helpMenu);
  	}
  
  	private void makeHelpMenu() {
  		// HELP MENU
  		helpMenu = new JMenu(JMeterUtils.getResString("help"));
  		helpMenu.setMnemonic('H');
  		JMenuItem contextHelp = new JMenuItem(JMeterUtils.getResString("help"), 'H');
  		contextHelp.setActionCommand("help");
  		contextHelp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_MASK));
  		contextHelp.addActionListener(ReportActionRouter.getInstance());
  		help_about = new JMenuItem(JMeterUtils.getResString("about"), 'A');
  		help_about.setActionCommand("about");
  		help_about.addActionListener(ReportActionRouter.getInstance());
  		helpMenu.add(contextHelp);
  		helpMenu.add(help_about);
  	}
  
  	private void makeOptionsMenu() {
  		// OPTIONS MENU
  		optionsMenu = new JMenu(JMeterUtils.getResString("option"));
  		JMenuItem functionHelper = new JMenuItem(JMeterUtils.getResString("function_dialog_menu_item"), 'F');
  		functionHelper.addActionListener(ReportActionRouter.getInstance());
  		functionHelper.setActionCommand("functions");
  		functionHelper.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_MASK));
  		lafMenu = new JMenu(JMeterUtils.getResString("appearance"));
  		UIManager.LookAndFeelInfo lafs[] = UIManager.getInstalledLookAndFeels();
  		for (int i = 0; i < lafs.length; ++i) {
  			JMenuItem laf = new JMenuItem(lafs[i].getName());
  			laf.addActionListener(ReportActionRouter.getInstance());
  			laf.setActionCommand("laf:" + lafs[i].getClassName());
  			lafMenu.setMnemonic('L');
  			lafMenu.add(laf);
  		}
  		optionsMenu.setMnemonic('O');
  		optionsMenu.add(functionHelper);
  		optionsMenu.add(lafMenu);
  		if (SSLManager.isSSLSupported()) {
  			sslManager = new JMenuItem(JMeterUtils.getResString("sslManager"));
  			sslManager.addActionListener(ReportActionRouter.getInstance());
  			sslManager.setActionCommand("sslManager");
  			sslManager.setMnemonic('S');
  			sslManager.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK));
  			optionsMenu.add(sslManager);
  		}
  		optionsMenu.add(makeLanguageMenu());
  	}
  
  	// TODO fetch list of languages from a file?
  	// N.B. Changes to language list need to be reflected in
  	// resources/PackageTest.java
  	private JMenu makeLanguageMenu() {
  		/*
  		 * Note: the item name is used by ChangeLanguage to create a Locale for
  		 * that language, so need to ensure that the language strings are valid
  		 * If they exist, use the Locale language constants
  		 */
  		// TODO: do accelerator keys make sense? The key may not be present in
  		// translations
  		JMenu languageMenu = new JMenu(JMeterUtils.getResString("choose_language"));
  		languageMenu.setMnemonic('C');
  		// add english
  		JMenuItem english = new JMenuItem(JMeterUtils.getResString("en"), 'E');
  		english.addActionListener(ReportActionRouter.getInstance());
  		english.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		english.setName(Locale.ENGLISH.getLanguage());
  		languageMenu.add(english);
  		// add Japanese
  		JMenuItem japanese = new JMenuItem(JMeterUtils.getResString("jp"), 'J');
  		japanese.addActionListener(ReportActionRouter.getInstance());
  		japanese.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		japanese.setName(Locale.JAPANESE.getLanguage());
  		languageMenu.add(japanese);
  		// add Norwegian
  		JMenuItem norway = new JMenuItem(JMeterUtils.getResString("no"), 'N');
  		norway.addActionListener(ReportActionRouter.getInstance());
  		norway.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		norway.setName("no"); // No default for Norwegian
  		languageMenu.add(norway);
  		// add German
  		JMenuItem german = new JMenuItem(JMeterUtils.getResString("de"), 'G');
  		german.addActionListener(ReportActionRouter.getInstance());
  		german.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		german.setName(Locale.GERMAN.getLanguage());
  		languageMenu.add(german);
  		// add French
  		JMenuItem french = new JMenuItem(JMeterUtils.getResString("fr"), 'F');
  		french.addActionListener(ReportActionRouter.getInstance());
  		french.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		french.setName(Locale.FRENCH.getLanguage());
  		languageMenu.add(french);
  		// add chinese (simple)
  		JMenuItem chineseSimple = new JMenuItem(JMeterUtils.getResString("zh_cn"));
  		chineseSimple.addActionListener(ReportActionRouter.getInstance());
  		chineseSimple.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		chineseSimple.setName(Locale.SIMPLIFIED_CHINESE.toString());
  		languageMenu.add(chineseSimple);
  		// add chinese (traditional)
  		JMenuItem chineseTrad = new JMenuItem(JMeterUtils.getResString("zh_TW"));
  		chineseTrad.addActionListener(ReportActionRouter.getInstance());
  		chineseTrad.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		chineseTrad.setName(Locale.TRADITIONAL_CHINESE.toString());
  		languageMenu.add(chineseTrad);
  		// add spanish
  		JMenuItem spanish = new JMenuItem(JMeterUtils.getResString("es"));
  		spanish.addActionListener(ReportActionRouter.getInstance());
  		spanish.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
  		spanish.setName("es");
  		languageMenu.add(spanish);
  		return languageMenu;
  	}
  
  	/*
  	 * Strings used to set up and process actions in this menu The strings need
  	 * to agree with the those in the Action routines
  	 */
  	public static final String ACTION_SHUTDOWN = "shutdown";
  
  	public static final String ACTION_STOP = "stop";
  
  	public static final String ACTION_START = "start";
  
  	private void makeRunMenu() {
  		// RUN MENU
  		runMenu = new JMenu(JMeterUtils.getResString("run"));
  		runMenu.setMnemonic('R');
  		run_start = new JMenuItem(JMeterUtils.getResString("start"), 'S');
  		run_start.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK));
  		run_start.addActionListener(ReportActionRouter.getInstance());
  		run_start.setActionCommand(ACTION_START);
  		run_stop = new JMenuItem(JMeterUtils.getResString("stop"), 'T');
  		run_stop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, KeyEvent.CTRL_MASK));
  		run_stop.setEnabled(false);
  		run_stop.addActionListener(ReportActionRouter.getInstance());
  		run_stop.setActionCommand(ACTION_STOP);
  
  		run_shut = new JMenuItem(JMeterUtils.getResString("shutdown"), 'Y');
  		run_shut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_COMMA, KeyEvent.CTRL_MASK));
  		run_shut.setEnabled(false);
  		run_shut.addActionListener(ReportActionRouter.getInstance());
  		run_shut.setActionCommand(ACTION_SHUTDOWN);
  
  		run_clear = new JMenuItem(JMeterUtils.getResString("clear"), 'C');
  		run_clear.addActionListener(ReportActionRouter.getInstance());
  		run_clear.setActionCommand(org.apache.jmeter.gui.action.Clear.CLEAR);
  		run_clearAll = new JMenuItem(JMeterUtils.getResString("clear_all"), 'a');
  		run_clearAll.addActionListener(ReportActionRouter.getInstance());
  		run_clearAll.setActionCommand(org.apache.jmeter.gui.action.Clear.CLEAR_ALL);
  		run_clearAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK));
  		runMenu.add(run_start);
  		if (remote_start != null) {
  			runMenu.add(remote_start);
  		}
  		remote_start_all = new JMenuItem(JMeterUtils.getResString("remote_start_all"), 'Z');
  		remote_start_all.setName("remote_start_all");
  		remote_start_all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_MASK));
  		remote_start_all.addActionListener(ReportActionRouter.getInstance());
  		remote_start_all.setActionCommand("remote_start_all");
  		runMenu.add(remote_start_all);
  		runMenu.add(run_stop);
  		runMenu.add(run_shut);
  		if (remote_stop != null) {
  			runMenu.add(remote_stop);
  		}
  		remote_stop_all = new JMenuItem(JMeterUtils.getResString("remote_stop_all"), 'X');
  		remote_stop_all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.ALT_MASK));
  		remote_stop_all.addActionListener(ReportActionRouter.getInstance());
  		remote_stop_all.setActionCommand("remote_stop_all");
  		runMenu.add(remote_stop_all);
  
  		if (remote_exit != null) {
  			runMenu.add(remote_exit);
  		}
  		remote_exit_all = new JMenuItem(JMeterUtils.getResString("remote_exit_all"));
  		remote_exit_all.addActionListener(ReportActionRouter.getInstance());
  		remote_exit_all.setActionCommand("remote_exit_all");
  		runMenu.add(remote_exit_all);
  
  		runMenu.addSeparator();
  		runMenu.add(run_clear);
  		runMenu.add(run_clearAll);
  	}
  
  	private void makeEditMenu() {
  		// EDIT MENU
  		editMenu = new JMenu(JMeterUtils.getResString("edit"));
  		// From the Java Look and Feel Guidelines: If all items in a menu
  		// are disabled, then disable the menu. Makes sense.
  		editMenu.setEnabled(false);
  	}
  
  	private void makeFileMenu() {
  		// FILE MENU
  		fileMenu = new JMenu(JMeterUtils.getResString("file"));
  		fileMenu.setMnemonic('F');
  		JMenuItem file_save = new JMenuItem(JMeterUtils.getResString("save"), 'S');
  		file_save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
  		file_save.setActionCommand("save");
  		file_save.addActionListener(ReportActionRouter.getInstance());
  		file_save.setEnabled(true);
  
  		file_save_as = new JMenuItem(JMeterUtils.getResString("save_all_as"), 'A');
  		file_save_as.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
  		file_save_as.setActionCommand("save_all_as");
  		file_save_as.addActionListener(ReportActionRouter.getInstance());
  		file_save_as.setEnabled(true);
  
  		file_load = new JMenuItem(JMeterUtils.getResString("menu_open"), 'O');
  		file_load.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
  		file_load.addActionListener(ReportActionRouter.getInstance());
  		// Set default SAVE menu item to disabled since the default node that
  		// is selected is ROOT, which does not allow items to be inserted.
  		file_load.setEnabled(false);
  		file_load.setActionCommand("open");
  
  		file_close = new JMenuItem(JMeterUtils.getResString("menu_close"), 'C');
  		file_close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_MASK));
  		file_close.setActionCommand("close");
  		file_close.addActionListener(ReportActionRouter.getInstance());
  
  		file_exit = new JMenuItem(JMeterUtils.getResString("exit"), 'X');
  		file_exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK));
  		file_exit.setActionCommand("exit");
  		file_exit.addActionListener(ReportActionRouter.getInstance());
  
  		file_merge = new JMenuItem(JMeterUtils.getResString("menu_merge"), 'M');
  		// file_merge.setAccelerator(
  		// KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
  		file_merge.addActionListener(ReportActionRouter.getInstance());
  		// Set default SAVE menu item to disabled since the default node that
  		// is selected is ROOT, which does not allow items to be inserted.
  		file_merge.setEnabled(false);
  		file_merge.setActionCommand("merge");
  
  		fileMenu.add(file_close);
  		fileMenu.add(file_load);
  		fileMenu.add(file_merge);
  		fileMenu.add(file_save);
  		fileMenu.add(file_save_as);
  		fileMenu.addSeparator();
  		fileMenu.add(file_exit);
  	}
  
  	public void setRunning(boolean running, String host) {
  		log.info("setRunning(" + running + "," + host + ")");
  
  		Iterator iter = remote_engine_start.iterator();
  		Iterator iter2 = remote_engine_stop.iterator();
  		Iterator iter3 = remote_engine_exit.iterator();
  		while (iter.hasNext() && iter2.hasNext() && iter3.hasNext()) {
  			JMenuItem start = (JMenuItem) iter.next();
  			JMenuItem stop = (JMenuItem) iter2.next();
  			JMenuItem exit = (JMenuItem) iter3.next();
  			if (start.getText().equals(host)) {
  				log.info("Found start host: " + start.getText());
  				start.setEnabled(!running);
  			}
  			if (stop.getText().equals(host)) {
  				log.info("Found stop  host: " + stop.getText());
  				stop.setEnabled(running);
  			}
  			if (exit.getText().equals(host)) {
  				log.info("Found exit  host: " + exit.getText());
  				exit.setEnabled(true);
  			}
  		}
  	}
  
  	public void setEnabled(boolean enable) {
  		run_start.setEnabled(!enable);
  		run_stop.setEnabled(enable);
  		run_shut.setEnabled(enable);
  	}
  
  	private void getRemoteItems() {
  		if (remoteHosts.length > 0) {
  			remote_start = new JMenu(JMeterUtils.getResString("remote_start"));
  			remote_stop = new JMenu(JMeterUtils.getResString("remote_stop"));
  			remote_exit = new JMenu(JMeterUtils.getResString("remote_exit"));
  
  			for (int i = 0; i < remoteHosts.length; i++) {
  				remoteHosts[i] = remoteHosts[i].trim();
  				JMenuItem item = new JMenuItem(remoteHosts[i]);
  				item.setActionCommand("remote_start");
  				item.setName(remoteHosts[i]);
  				item.addActionListener(ReportActionRouter.getInstance());
  				remote_engine_start.add(item);
  				remote_start.add(item);
  				item = new JMenuItem(remoteHosts[i]);
  				item.setActionCommand("remote_stop");
  				item.setName(remoteHosts[i]);
  				item.addActionListener(ReportActionRouter.getInstance());
  				item.setEnabled(false);
  				remote_engine_stop.add(item);
  				remote_stop.add(item);
  				item = new JMenuItem(remoteHosts[i]);
  				item.setActionCommand("remote_exit");
  				item.setName(remoteHosts[i]);
  				item.addActionListener(ReportActionRouter.getInstance());
  				item.setEnabled(false);
  				remote_engine_exit.add(item);
  				remote_exit.add(item);
  			}
  		}
  	}
  
  	/**
  	 * Processes a locale change notification. Changes the texts in all menus to
  	 * the new language.
  	 */
  	public void localeChanged(LocaleChangeEvent event) {
  		updateMenuElement(fileMenu);
  		updateMenuElement(editMenu);
  		updateMenuElement(runMenu);
  		updateMenuElement(optionsMenu);
  		updateMenuElement(helpMenu);
  	}
  
  	/**
  	 * Refreshes all texts in the menu and all submenus to a new locale.
  	 */
  	private void updateMenuElement(MenuElement menu) {
  		Component component = menu.getComponent();
  
  		if (component.getName() != null) {
  			if (component instanceof JMenu) {
  				((JMenu) component).setText(JMeterUtils.getResString(component.getName()));
  			} else {
  				((JMenuItem) component).setText(JMeterUtils.getResString(component.getName()));
  			}
  		}
  
  		MenuElement[] subelements = menu.getSubElements();
  
  		for (int i = 0; i < subelements.length; i++) {
  			updateMenuElement(subelements[i]);
  		}
  	}
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org