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 se...@apache.org on 2009/12/01 02:51:29 UTC

svn commit: r885648 [2/2] - in /jakarta/jmeter/trunk/src: components/org/apache/jmeter/visualizers/ core/org/apache/jmeter/resources/ jorphan/org/apache/jorphan/gui/

Modified: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java?rev=885648&r1=885647&r2=885648&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (original)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java Tue Dec  1 01:51:15 2009
@@ -9,64 +9,39 @@
  *   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.
+ * 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.visualizers;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Component;
 import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.io.ByteArrayInputStream;
-import java.io.StringWriter;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonGroup;
-import javax.swing.Icon;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
 import javax.swing.ImageIcon;
-import javax.swing.JCheckBox;
-import javax.swing.JEditorPane;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
+import javax.swing.JComboBox;
 import javax.swing.JScrollPane;
 import javax.swing.JSplitPane;
 import javax.swing.JTabbedPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextPane;
 import javax.swing.JTree;
-import javax.swing.ToolTipManager;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.ComponentView;
-import javax.swing.text.Document;
-import javax.swing.text.EditorKit;
-import javax.swing.text.Element;
-import javax.swing.text.Style;
-import javax.swing.text.StyleConstants;
-import javax.swing.text.StyledDocument;
-import javax.swing.text.View;
-import javax.swing.text.ViewFactory;
-import javax.swing.text.html.HTML;
-import javax.swing.text.html.HTMLEditorKit;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeCellRenderer;
 import javax.swing.tree.DefaultTreeModel;
@@ -74,127 +49,49 @@
 import javax.swing.tree.TreeSelectionModel;
 
 import org.apache.jmeter.assertions.AssertionResult;
+import org.apache.jmeter.gui.util.VerticalPanel;
 import org.apache.jmeter.samplers.Clearable;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.util.JMeterUtils;
-import org.apache.jmeter.util.XPathUtil;
 import org.apache.jmeter.visualizers.gui.AbstractVisualizer;
 import org.apache.jorphan.logging.LoggingManager;
-import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.jorphan.reflect.ClassFinder;
 import org.apache.log.Logger;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.tidy.Tidy;
-import org.xml.sax.SAXException;
 
 /**
- * Allows the tester to view the textual response from sampling an Entry. This
- * also allows to "single step through" the sampling process via a nice
- * "Continue" button.
+ * Base for ViewResults
  *
- * Created 2001/07/25
  */
 public class ViewResultsFullVisualizer extends AbstractVisualizer
-        implements ActionListener, TreeSelectionListener, Clearable
-    {
+implements ActionListener, TreeSelectionListener, Clearable {
 
-    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 7338676747296593842L;
 
     private static final Logger log = LoggingManager.getLoggerForClass();
 
-    // Maximum size that we will display
-    private static final int MAX_DISPLAY_SIZE =
-        JMeterUtils.getPropDefault("view.results.tree.max_size", 200 * 1024); // $NON-NLS-1$
-
-    // N.B. these are not multi-threaded, so don't make it static
-    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); // ISO format $NON-NLS-1$
-
-    private static final String NL = "\n"; // $NON-NLS-1$
-
-    private static final byte[] XML_PFX = "<?xml ".getBytes(); // $NON-NLS-1$
-
     public static final Color SERVER_ERROR_COLOR = Color.red;
 
     public static final Color CLIENT_ERROR_COLOR = Color.blue;
 
     public static final Color REDIRECT_COLOR = Color.green;
 
-    private static final String TEXT_HTML = "text/html"; // $NON-NLS-1$
-
-    private static final String HTML_COMMAND = "html"; // $NON-NLS-1$
-
-    private static final String JSON_COMMAND = "json"; // $NON-NLS-1$
-
-    private static final String XML_COMMAND = "xml"; // $NON-NLS-1$
-
-    private static final String TEXT_COMMAND = "text"; // $NON-NLS-1$
-
-    private static final String STYLE_SERVER_ERROR = "ServerError"; // $NON-NLS-1$
-
-    private static final String STYLE_CLIENT_ERROR = "ClientError"; // $NON-NLS-1$
-
-    private static final String STYLE_REDIRECT = "Redirect"; // $NON-NLS-1$
-
-    private boolean textMode = true;
-
-    private static final String ESC_CHAR_REGEX = "\\\\[\"\\\\/bfnrt]|\\\\u[0-9A-Fa-f]{4}"; // $NON-NLS-1$
-
-    private static final String NORMAL_CHARACTER_REGEX = "[^\"\\\\]";  // $NON-NLS-1$
-
-    private static final String STRING_REGEX = "\"(" + ESC_CHAR_REGEX + "|" + NORMAL_CHARACTER_REGEX + ")*\""; // $NON-NLS-1$
-
-    // This 'other value' regex is deliberately weak, even accepting an empty string, to be useful when reporting malformed data.
-    private static final String OTHER_VALUE_REGEX = "[^\\{\\[\\]\\}\\,]*"; // $NON-NLS-1$
-
-    private static final String VALUE_OR_PAIR_REGEX = "((" + STRING_REGEX + "\\s*:)?\\s*(" + STRING_REGEX + "|" + OTHER_VALUE_REGEX + ")\\s*,?\\s*)"; // $NON-NLS-1$
-
-    private static final Pattern VALUE_OR_PAIR_PATTERN = Pattern.compile(VALUE_OR_PAIR_REGEX);
-
-    // set default command to Text
-    private String command = TEXT_COMMAND;
-
-    // Keep copies of the two editors needed
-    private static final EditorKit customisedEditor = new LocalHTMLEditorKit();
-
-    private static final EditorKit defaultHtmlEditor = JEditorPane.createEditorKitForContentType(TEXT_HTML);
+    private  JSplitPane mainSplit;
 
     private DefaultMutableTreeNode root;
 
     private DefaultTreeModel treeModel;
 
-    private JTextPane stats;
-
-    private JEditorPane results;
-
-    private JScrollPane resultsScrollPane;
-
-    private JPanel resultsPane;
-
-    private JLabel imageLabel;
-
-    private JTextArea sampleDataField;
-
-    private JPanel requestPane;
-
-    private JRadioButton textButton;
-
-    private JRadioButton htmlButton;
-
-    private JRadioButton jsonButton;
+    private JTree jTree;
 
-    private JRadioButton xmlButton;
+    private Component leftSide;
 
-    private JCheckBox downloadAll;
-    
-    private JLabel renderLabel;
+    private JTabbedPane rightSide;
 
-    private JTree jTree;
+    private JComboBox selectRenderPanel;
 
-    private JTabbedPane rightSide;
+    private int selectedTab;
 
-    private SearchTextExtension searchTextExtension;
-    
-    private JPanel searchPanel = null;
+    protected static final String COMBO_CHANGE_COMMAND = "change_combo"; // $NON-NLS-1$
 
     private static final ImageIcon imageSuccess = JMeterUtils.getImage(
             JMeterUtils.getPropDefault("viewResultsTree.success",  //$NON-NLS-1$
@@ -204,29 +101,31 @@
             JMeterUtils.getPropDefault("viewResultsTree.failure",  //$NON-NLS-1$
                     "icon_warning_sml.gif")); //$NON-NLS-1$
 
+    // Maximum size that we will display
+    private static final int MAX_DISPLAY_SIZE =
+        JMeterUtils.getPropDefault("view.results.tree.max_size", 200 * 1024); // $NON-NLS-1$
+
+    private ResultRenderer resultsRender = null;
+
+    private TreeSelectionEvent lastSelectionEvent;
+
+    /**
+     * Constructor
+     */
     public ViewResultsFullVisualizer() {
         super();
-        log.debug("Start : ViewResultsFullVisualizer1");
         init();
-        log.debug("End : ViewResultsFullVisualizer1");
-    }
-
-    public void add(SampleResult res) {
-        updateGui(res);
     }
 
-    public String getLabelResource() {
-        return "view_results_tree_title"; // $NON-NLS-1$
+    /** {@inheritDoc} */
+    public void add(SampleResult sample) {
+        updateGui(sample);
     }
 
     /**
      * Update the visualizer with new data.
      */
     private synchronized void updateGui(SampleResult res) {
-        log.debug("Start : updateGui1");
-        if (log.isDebugEnabled()) {
-            log.debug("updateGui1 : sample result - " + res);
-        }
         // Add sample
         DefaultMutableTreeNode currNode = new DefaultMutableTreeNode(res);
         treeModel.insertNodeInto(currNode, root, root.getChildCount());
@@ -246,7 +145,6 @@
         if (root.getChildCount() == 1) {
             jTree.expandPath(new TreePath(root));
         }
-        log.debug("End : updateGui1");
     }
 
     private void addSubResults(DefaultMutableTreeNode currNode, SampleResult res) {
@@ -278,314 +176,154 @@
         }
     }
 
-    /**
-     * Clears the visualizer.
-     */
-    public synchronized void clearData() {
-        log.debug("Start : clear1");
-
-        if (log.isDebugEnabled()) {
-            log.debug("clear1 : total child - " + root.getChildCount());
-        }
+    /** {@inheritDoc} */
+    public void clearData() {
         while (root.getChildCount() > 0) {
             // the child to be removed will always be 0 'cos as the nodes are
             // removed the nth node will become (n-1)th
             treeModel.removeNodeFromParent((DefaultMutableTreeNode) root.getChildAt(0));
         }
+        resultsRender.clearData();
+    }
 
-        results.setText("");// Response Data // $NON-NLS-1$
-        sampleDataField.setText("");// Request Data // $NON-NLS-1$
-        log.debug("End : clear1");
+    /** {@inheritDoc} */
+    public String getLabelResource() {
+        return "view_results_tree_title"; // $NON-NLS-1$
     }
 
     /**
-     * Returns the description of this visualizer.
-     *
-     * @return description of this visualizer
+     * Initialize this visualizer
      */
-    @Override
-    public String toString() {
-        String desc = JMeterUtils.getResString("view_results_desc"); //$NON-NLS-1$
+    protected void init() {
+        log.debug("init() - pass");
+        setLayout(new BorderLayout(0, 5));
+        setBorder(makeBorder());
+        add(makeTitlePanel(), BorderLayout.NORTH);
 
-        if (log.isDebugEnabled()) {
-            log.debug("toString1 : Returning description - " + desc);
-        }
-        return desc;
+        leftSide = createLeftPanel();
+        // Prepare the common tab
+        rightSide = new JTabbedPane();
+
+        // Create the split pane
+        mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftSide, rightSide);
+        add(mainSplit, BorderLayout.CENTER);
+        // init right side with first render
+        resultsRender.setRightSide(rightSide);
+        resultsRender.init();
     }
 
-    /**
-     * Sets the right pane to correspond to the selected node of the left tree.
-     */
+    /** {@inheritDoc} */
     public void valueChanged(TreeSelectionEvent e) {
-        log.debug("Start : valueChanged1");
+        lastSelectionEvent = e;
         DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
 
-        if (log.isDebugEnabled()) {
-            log.debug("valueChanged : selected node - " + node);
-        }
-
-        StyledDocument statsDoc = stats.getStyledDocument();
-        try {
-            statsDoc.remove(0, statsDoc.getLength());
-            sampleDataField.setText(""); // $NON-NLS-1$
-            results.setText(""); // $NON-NLS-1$
-            if (node != null) {
-                Object userObject = node.getUserObject();
-                if(userObject instanceof SampleResult) {
-                    SampleResult res = (SampleResult) userObject;
-
-                    // We are displaying a SampleResult
-                    setupTabPaneForSampleResult();
-
-                    if (log.isDebugEnabled()) {
-                        log.debug("valueChanged1 : sample result - " + res);
-                        log.debug("valueChanged1 : load time - " + res.getTime());
-                    }
-
-                    String sd = res.getSamplerData();
-                    if (sd != null) {
-                        String rh = res.getRequestHeaders();
-                        if (rh != null) {
-                            StringBuilder sb = new StringBuilder(sd.length() + rh.length()+20);
-                            sb.append(sd);
-                            sb.append("\n"); //$NON-NLS-1$
-                            sb.append(JMeterUtils.getResString("view_results_request_headers")); //$NON-NLS-1$
-                            sb.append("\n"); //$NON-NLS-1$
-                            sb.append(rh);
-                            sd = sb.toString();
-                        }
-                        sampleDataField.setText(sd);
+        if (node != null) {
+            // to restore last tab used
+            if (rightSide.getTabCount() > selectedTab) {
+                resultsRender.setLastSelectedTab(rightSide.getSelectedIndex());
+            }
+            Object userObject = node.getUserObject();
+            resultsRender.setSamplerResult(userObject);
+            resultsRender.setupTabPane();
+            // display a SampleResult
+            if (userObject instanceof SampleResult) {
+                SampleResult sampleResult = (SampleResult) userObject;
+                if ((SampleResult.TEXT).equals(sampleResult.getDataType())){
+                    resultsRender.renderResult(sampleResult);
+                } else {
+                    byte[] responseBytes = sampleResult.getResponseData();
+                    if (responseBytes != null) {
+                        resultsRender.renderImage(sampleResult);
                     }
-
-                    StringBuilder statsBuff = new StringBuilder(200);
-                    statsBuff.append(JMeterUtils.getResString("view_results_thread_name")).append(res.getThreadName()).append(NL); //$NON-NLS-1$
-                    String startTime = dateFormat.format(new Date(res.getStartTime()));
-                    statsBuff.append(JMeterUtils.getResString("view_results_sample_start")).append(startTime).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_load_time")).append(res.getTime()).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_latency")).append(res.getLatency()).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_size_in_bytes")).append(res.getBytes()).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_sample_count")).append(res.getSampleCount()).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_error_count")).append(res.getErrorCount()).append(NL); //$NON-NLS-1$
-                    statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
-                    statsBuff = new StringBuilder(); //reset for reuse
-
-                    String responseCode = res.getResponseCode();
-                    if (log.isDebugEnabled()) {
-                        log.debug("valueChanged1 : response code - " + responseCode);
-                    }
-                    int responseLevel = 0;
-                    if (responseCode != null) {
-                        try {
-                            responseLevel = Integer.parseInt(responseCode) / 100;
-                        } catch (NumberFormatException numberFormatException) {
-                            // no need to change the foreground color
-                        }
-                    }
-
-                    Style style = null;
-                    switch (responseLevel) {
-                    case 3:
-                        style = statsDoc.getStyle(STYLE_REDIRECT);
-                        break;
-                    case 4:
-                        style = statsDoc.getStyle(STYLE_CLIENT_ERROR);
-                        break;
-                    case 5:
-                        style = statsDoc.getStyle(STYLE_SERVER_ERROR);
-                        break;
-                    }
-
-                    statsBuff.append(JMeterUtils.getResString("view_results_response_code")).append(responseCode).append(NL); //$NON-NLS-1$
-                    statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), style);
-                    statsBuff = new StringBuilder(100); //reset for reuse
-
-                    // response message label
-                    String responseMsgStr = res.getResponseMessage();
-
-                    if (log.isDebugEnabled()) {
-                        log.debug("valueChanged1 : response message - " + responseMsgStr);
-                    }
-                    statsBuff.append(JMeterUtils.getResString("view_results_response_message")).append(responseMsgStr).append(NL); //$NON-NLS-1$
-
-                    statsBuff.append(NL);
-                    statsBuff.append(JMeterUtils.getResString("view_results_response_headers")).append(NL); //$NON-NLS-1$
-                    statsBuff.append(res.getResponseHeaders()).append(NL);
-                    statsBuff.append(NL);
-                    final String samplerClass = res.getClass().getName();
-                    statsBuff.append(samplerClass.substring(1+samplerClass.lastIndexOf('.'))).append(" " + JMeterUtils.getResString("view_results_fields")).append(NL); //$NON-NLS-1$
-                    statsBuff.append("ContentType: ").append(res.getContentType()).append(NL);
-                    statsBuff.append("DataEncoding: ").append(res.getDataEncodingNoDefault()).append(NL);
-                    statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
-                    statsBuff = null; // Done
-
-                    // Reset search
-                    searchTextExtension.resetTextToFind();
-                    
-                    // get the text response and image icon
-                    // to determine which is NOT null
-                    if ((SampleResult.TEXT).equals(res.getDataType())) // equals(null) is OK
-                    {
-                        String response = getResponseAsString(res);
-                        if (command.equals(TEXT_COMMAND)) {
-                            showTextResponse(response);
-                        } else if (command.equals(HTML_COMMAND)) {
-                            showRenderedResponse(response, res);
-                        } else if (command.equals(JSON_COMMAND)) {
-                            showRenderJSONResponse(response);
-                        } else if (command.equals(XML_COMMAND)) {
-                            showRenderXMLResponse(res);
-                        }
-                        if (!searchTextExtension.isEnabled()) {
-                            searchTextExtension.setEnabled(true);
-                        }
-                    } else {
-                        byte[] responseBytes = res.getResponseData();
-                        if (responseBytes != null) {
-                            showImage(new ImageIcon(responseBytes)); //TODO implement other non-text types
-                            if (searchTextExtension.isEnabled()) {
-                                searchTextExtension.setEnabled(false);
-                            }
-                        }
-                    }
-                }
-                else if(userObject instanceof AssertionResult) {
-                    AssertionResult res = (AssertionResult) userObject;
-
-                    // We are displaying an AssertionResult
-                    setupTabPaneForAssertionResult();
-
-                    if (log.isDebugEnabled()) {
-                        log.debug("valueChanged1 : sample result - " + res);
-                    }
-
-                    StringBuilder statsBuff = new StringBuilder(100);
-                    statsBuff.append(JMeterUtils.getResString("view_results_assertion_error")).append(res.isError()).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_assertion_failure")).append(res.isFailure()).append(NL); //$NON-NLS-1$
-                    statsBuff.append(JMeterUtils.getResString("view_results_assertion_failure_message")).append(res.getFailureMessage()).append(NL); //$NON-NLS-1$
-                    statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
-                    statsBuff = null;
                 }
             }
-        } catch (BadLocationException exc) {
-            log.error("Error setting statistics text", exc);
-            stats.setText("");
         }
-        log.debug("End : valueChanged1");
     }
 
-    private void showImage(Icon image) {
-        imageLabel.setIcon(image);
-        resultsScrollPane.setViewportView(imageLabel);
-        setEnabledButtons(false);
-    }
+    private Component createLeftPanel() {
+        SampleResult rootSampleResult = new SampleResult();
+        rootSampleResult.setSampleLabel("Root");
+        rootSampleResult.setSuccessful(true);
+        root = new DefaultMutableTreeNode(rootSampleResult);
+
+        treeModel = new DefaultTreeModel(root);
+        jTree = new JTree(treeModel);
+        jTree.setCellRenderer(new ResultsNodeRenderer());
+        jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+        jTree.addTreeSelectionListener(this);
+        jTree.setRootVisible(false);
+        jTree.setShowsRootHandles(true);
 
-    private void showTextResponse(String response) {
-        results.setContentType("text/plain"); // $NON-NLS-1$
-        results.setText(response == null ? "" : response); // $NON-NLS-1$
-        results.setCaretPosition(0);
-        resultsScrollPane.setViewportView(results);
+        JScrollPane treePane = new JScrollPane(jTree);
+        treePane.setPreferredSize(new Dimension(200, 300));
 
-        setEnabledButtons(true);
+        VerticalPanel leftPane = new VerticalPanel();
+        leftPane.add(treePane, BorderLayout.CENTER);
+        leftPane.add(createComboRender(), BorderLayout.SOUTH);
+
+        return leftPane;
     }
 
-    // It might be useful also to make this available in the 'Request' tab, for
-    // when posting JSON.
-    private static String prettyJSON(String json) {
-        StringBuilder pretty = new StringBuilder(json.length() * 2); // Educated guess
-
-        final String tab = ":   "; // $NON-NLS-1$
-        StringBuilder index = new StringBuilder();
-        String nl = ""; // $NON-NLS-1$
-
-        Matcher valueOrPair = VALUE_OR_PAIR_PATTERN.matcher(json);
-
-        boolean misparse = false;
-
-        for (int i = 0; i < json.length(); ) {
-            final char currentChar = json.charAt(i);
-            if ((currentChar == '{') || (currentChar == '[')) {
-                pretty.append(nl).append(index).append(currentChar);
-                i++;
-                index.append(tab);
-                misparse = false;
-            }
-            else if ((currentChar == '}') || (currentChar == ']')) {
-                if (index.length() > 0) {
-                    index.delete(0, tab.length());
-                }
-                pretty.append(nl).append(index).append(currentChar);
-                i++;
-                int j = i;
-                while ((j < json.length()) && Character.isWhitespace(json.charAt(j))) {
-                    j++;
-                }
-                if ((j < json.length()) && (json.charAt(j) == ',')) {
-                    pretty.append(","); // $NON-NLS-1$
-                    i=j+1;
-                }
-                misparse = false;
-            }
-            else if (valueOrPair.find(i) && valueOrPair.group().length() > 0) {
-                pretty.append(nl).append(index).append(valueOrPair.group());
-                i=valueOrPair.end();
-                misparse = false;
-            }
-            else {
-                if (!misparse) {
-                    pretty.append(nl).append("- Parse failed from:");
-                }
-                pretty.append(currentChar);
-                i++;
-                misparse = true;
+    /**
+     * Create the drop-down list to changer render
+     * @return List of all render (implement ResultsRender)
+     */
+    private Component createComboRender() {// TODO move to bottom of renderer
+        ComboBoxModel nodesModel = new DefaultComboBoxModel();
+        // drop-down list for renderer
+        selectRenderPanel = new JComboBox(nodesModel);
+        selectRenderPanel.setActionCommand(COMBO_CHANGE_COMMAND);
+        selectRenderPanel.addActionListener(this);
+
+        // if no results render in jmeter.properties, load Standard (default)
+        List<String> classesToAdd = Collections.<String>emptyList();
+        try {
+            classesToAdd = ClassFinder.findClassesThatExtend(ResultRenderer.class);
+        } catch (IOException e1) {
+            // ignored
+        }
+        for (String clazz : classesToAdd) {
+            try {
+                // Instantiate render classes
+                final ResultRenderer renderer = (ResultRenderer) Class.forName(clazz).newInstance();
+                renderer.setBackgroundColor(getBackground());
+                selectRenderPanel.addItem(renderer);
+            } catch (Exception e) {
+                log.warn("Error in load result render:" + clazz, e);
             }
-            nl = "\n"; // $NON-NLS-1$
         }
-        return pretty.toString();
+        return selectRenderPanel;
     }
 
-    private void showRenderJSONResponse(String response) {
-        results.setContentType("text/plain"); // $NON-NLS-1$
-        results.setText(response == null ? "" : prettyJSON(response));
-        results.setCaretPosition(0);
-        resultsScrollPane.setViewportView(results);
+    /** {@inheritDoc} */
+    public void actionPerformed(ActionEvent event) {
+        String command = event.getActionCommand();
+        if (COMBO_CHANGE_COMMAND.equals(command)) {
+            JComboBox jcb = (JComboBox) event.getSource();
 
-        setEnabledButtons(true);
-    }
+            if (jcb != null) {
+                resultsRender = (ResultRenderer) jcb.getSelectedItem();
+                if (rightSide != null) {
+                    // to restore last selected tab (better user-friendly)
+                    selectedTab = rightSide.getSelectedIndex();
+                    // Remove old right side
+                    mainSplit.remove(rightSide);
 
-    private void showRenderXMLResponse(SampleResult res) {
-        results.setContentType("text/xml"); // $NON-NLS-1$
-        results.setCaretPosition(0);
-        byte[] source = res.getResponseData();
-        final ByteArrayInputStream baIS = new ByteArrayInputStream(source);
-        for(int i=0; i<source.length-XML_PFX.length; i++){
-            if (JOrphanUtils.startsWith(source, XML_PFX, i)){
-                baIS.skip(i);// Skip the leading bytes (if any)
-                break;
+                    // create and add a new right side
+                    rightSide = new JTabbedPane();
+                    mainSplit.add(rightSide);
+                    resultsRender.setRightSide(rightSide);
+                    resultsRender.setLastSelectedTab(selectedTab);
+                    log.debug("selectedTab=" + selectedTab);
+                    resultsRender.init();
+                    // To display current sampler result before change
+                    this.valueChanged(lastSelectionEvent);
+                }
             }
         }
-        Component view = results;
-
-        // there is also a javax.swing.text.Document class.
-        org.w3c.dom.Document document = null;
-
-        StringWriter sw = new StringWriter();
-        Tidy tidy = XPathUtil.makeTidyParser(true, true, true, sw);
-        document = tidy.parseDOM(baIS, null);
-        document.normalize();
-        if (tidy.getParseErrors() > 0) {
-            showErrorMessageDialog(sw.toString(),
-                    "Tidy: " + tidy.getParseErrors() + " errors, " + tidy.getParseWarnings() + " warnings",
-                    JOptionPane.WARNING_MESSAGE);
-        }
-
-        JPanel domTreePanel = new DOMTreePanel(document);
-        view = domTreePanel;
-        resultsScrollPane.setViewportView(view);
-        setEnabledButtons(true);
     }
 
-    private static String getResponseAsString(SampleResult res) {
-
+    public static String getResponseAsString(SampleResult res) {
         String response = null;
         if ((SampleResult.TEXT).equals(res.getDataType())) {
             // Showing large strings can be VERY costly, so we will avoid
@@ -608,302 +346,21 @@
         return response;
     }
 
-    /**
-     * Display the response as text or as rendered HTML. Change the text on the
-     * button appropriate to the current display.
-     *
-     * @param e
-     *            the ActionEvent being processed
-     */
-    public void actionPerformed(ActionEvent e) {
-        command = e.getActionCommand();
-
-        if (command != null
-                && (command.equals(TEXT_COMMAND) || command.equals(HTML_COMMAND)
-                 || command.equals(JSON_COMMAND) || command.equals(XML_COMMAND))) {
-
-            textMode = command.equals(TEXT_COMMAND);
-
-            DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
-
-            if (node == null) {
-                results.setText("");
-                return;
-            }
-            searchTextExtension.resetTextToFind();
-            
-            SampleResult res = (SampleResult) node.getUserObject();
-            String response = getResponseAsString(res);
-
-            if (command.equals(TEXT_COMMAND)) {
-                showTextResponse(response);
-            } else if (command.equals(HTML_COMMAND)) {
-                showRenderedResponse(response, res);
-            } else if (command.equals(JSON_COMMAND)) {
-                showRenderJSONResponse(response);
-            } else if (command.equals(XML_COMMAND)) {
-                showRenderXMLResponse(res);
-            }
-        }
-    }
-
-    private void showRenderedResponse(String response, SampleResult res) {
-        if (response == null) {
-            results.setText("");
-            return;
-        }
-
-        int htmlIndex = response.indexOf("<HTML"); // could be <HTML lang=""> // $NON-NLS-1$
-
-        // Look for a case variation
-        if (htmlIndex < 0) {
-            htmlIndex = response.indexOf("<html"); // ditto // $NON-NLS-1$
-        }
-
-        // If we still can't find it, just try using all of the text
-        if (htmlIndex < 0) {
-            htmlIndex = 0;
-        }
-
-        String html = response.substring(htmlIndex);
-
-        /*
-         * To disable downloading and rendering of images and frames, enable the
-         * editor-kit. The Stream property can then be
-         */
-
-        // Must be done before setContentType
-        results.setEditorKitForContentType(TEXT_HTML, downloadAll.isSelected() ? defaultHtmlEditor : customisedEditor);
-
-        results.setContentType(TEXT_HTML);
-
-        if (downloadAll.isSelected()) {
-            // Allow JMeter to render frames (and relative images)
-            // Must be done after setContentType [Why?]
-            results.getDocument().putProperty(Document.StreamDescriptionProperty, res.getURL());
-        }
-
-        /*
-         * Get round problems parsing <META http-equiv='content-type'
-         * content='text/html; charset=utf-8'> See
-         * http://issues.apache.org/bugzilla/show_bug.cgi?id=23315
-         *
-         * Is this due to a bug in Java?
-         */
-        results.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE); // $NON-NLS-1$
-
-        results.setText(html);
-        results.setCaretPosition(0);
-        resultsScrollPane.setViewportView(results);
-
-        setEnabledButtons(true);
-    }
-
-    private Component createHtmlOrTextPane() {
-        ButtonGroup group = new ButtonGroup();
-        Font font = new Font("SansSerif", Font.PLAIN, 10);
-        Font fontBold = new Font("SansSerif", Font.BOLD, 10);
-
-        renderLabel = new JLabel(JMeterUtils
-                .getResString("view_results_render")); // $NON-NLS-1$
-        renderLabel.setFont(fontBold);
-
-        textButton = new JRadioButton(JMeterUtils.getResString("view_results_render_text")); // $NON-NLS-1$
-        textButton.setFont(font);
-        textButton.setActionCommand(TEXT_COMMAND);
-        textButton.addActionListener(this);
-        textButton.setSelected(textMode);
-        group.add(textButton);
-
-        htmlButton = new JRadioButton(JMeterUtils.getResString("view_results_render_html")); // $NON-NLS-1$
-        htmlButton.setFont(font);
-        htmlButton.setActionCommand(HTML_COMMAND);
-        htmlButton.addActionListener(this);
-        htmlButton.setSelected(!textMode);
-        group.add(htmlButton);
-
-        jsonButton = new JRadioButton(JMeterUtils.getResString("view_results_render_json")); // $NON-NLS-1$
-        jsonButton.setFont(font);
-        jsonButton.setActionCommand(JSON_COMMAND);
-        jsonButton.addActionListener(this);
-        jsonButton.setSelected(!textMode);
-        group.add(jsonButton);
-
-        xmlButton = new JRadioButton(JMeterUtils.getResString("view_results_render_xml")); // $NON-NLS-1$
-        xmlButton.setFont(font);
-        xmlButton.setActionCommand(XML_COMMAND);
-        xmlButton.addActionListener(this);
-        xmlButton.setSelected(!textMode);
-        group.add(xmlButton);
-
-        downloadAll = new JCheckBox(JMeterUtils.getResString("view_results_render_embedded")); // $NON-NLS-1$
-        downloadAll.setFont(font);
-        
-        JPanel pane = new JPanel();
-        pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
-        pane.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
-        pane.add(searchTextExtension.createShowSearchPanel());
-        pane.add(Box.createRigidArea(new Dimension(30, 0)));
-        pane.add(renderLabel);
-        pane.add(textButton);
-        pane.add(htmlButton);
-        pane.add(xmlButton);
-        pane.add(jsonButton);
-        pane.add(downloadAll);
-        
-        return pane;
-    }
-
-    /**
-     * Initialize this visualizer
-     */
-    private void init() {
-        setLayout(new BorderLayout(0, 5));
-        setBorder(makeBorder());
-
-        add(makeTitlePanel(), BorderLayout.NORTH);
-
-        Component leftSide = createLeftPanel();
-        rightSide = new JTabbedPane();
-        // Add the common tab
-        rightSide.addTab(JMeterUtils.getResString("view_results_tab_sampler"), createResponseMetadataPanel()); // $NON-NLS-1$
-        // Create the panels for the other tabs
-        requestPane = createRequestPanel();
-        resultsPane = createResponseDataPanel();
-
-        JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftSide, rightSide);
-        add(mainSplit, BorderLayout.CENTER);
-        
-        searchTextExtension.init(resultsPane);
-    }
-
-    private void setupTabPaneForSampleResult() {
-        // Set the title for the first tab
-        rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_sampler")); //$NON-NLS-1$
-        // Add the other tabs if not present
-        if(rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_request")) < 0) { // $NON-NLS-1$
-            rightSide.addTab(JMeterUtils.getResString("view_results_tab_request"), requestPane); // $NON-NLS-1$
-        }
-        if(rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_response")) < 0) { // $NON-NLS-1$
-            rightSide.addTab(JMeterUtils.getResString("view_results_tab_response"), resultsPane); // $NON-NLS-1$
-        }
-    }
-
-    private void setupTabPaneForAssertionResult() {
-        // Set the title for the first tab
-        rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_assertion")); //$NON-NLS-1$
-        // Remove the other tabs if present
-        int requestTabIndex = rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_request")); // $NON-NLS-1$
-        if(requestTabIndex >= 0) {
-            rightSide.removeTabAt(requestTabIndex);
-        }
-        int responseTabIndex = rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_response")); // $NON-NLS-1$
-        if(responseTabIndex >= 0) {
-            rightSide.removeTabAt(responseTabIndex);
-        }
-    }
-
-    private Component createLeftPanel() {
-        SampleResult rootSampleResult = new SampleResult();
-        rootSampleResult.setSampleLabel("Root");
-        rootSampleResult.setSuccessful(true);
-        root = new DefaultMutableTreeNode(rootSampleResult);
-
-        treeModel = new DefaultTreeModel(root);
-        jTree = new JTree(treeModel);
-        jTree.setCellRenderer(new ResultsNodeRenderer());
-        jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
-        jTree.addTreeSelectionListener(this);
-        jTree.setRootVisible(false);
-        jTree.setShowsRootHandles(true);
-
-        JScrollPane treePane = new JScrollPane(jTree);
-        treePane.setPreferredSize(new Dimension(200, 300));
-        return treePane;
-    }
-
-    private Component createResponseMetadataPanel() {
-        stats = new JTextPane();
-        stats.setEditable(false);
-        stats.setBackground(getBackground());
-
-        // Add styles to use for different types of status messages
-        StyledDocument doc = (StyledDocument) stats.getDocument();
-
-        Style style = doc.addStyle(STYLE_REDIRECT, null);
-        StyleConstants.setForeground(style, REDIRECT_COLOR);
-
-        style = doc.addStyle(STYLE_CLIENT_ERROR, null);
-        StyleConstants.setForeground(style, CLIENT_ERROR_COLOR);
-
-        style = doc.addStyle(STYLE_SERVER_ERROR, null);
-        StyleConstants.setForeground(style, SERVER_ERROR_COLOR);
-
-        JScrollPane pane = makeScrollPane(stats);
-        pane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
-        return pane;
-    }
-
-    private JPanel createRequestPanel() {
-        sampleDataField = new JTextArea();
-        sampleDataField.setEditable(false);
-        sampleDataField.setLineWrap(true);
-        sampleDataField.setWrapStyleWord(true);
-
-        JPanel pane = new JPanel(new BorderLayout(0, 5));
-        pane.add(makeScrollPane(sampleDataField));
-        return pane;
-    }
-
-    private JPanel createResponseDataPanel() {
-        results = new JEditorPane();
-        results.setEditable(false);
-
-        resultsScrollPane = makeScrollPane(results);
-        imageLabel = new JLabel();
-
-        // Add search text extension
-        searchTextExtension = new SearchTextExtension();
-        searchPanel = searchTextExtension.createSearchTextPanel();
-        searchTextExtension.setResults(results);
-        searchPanel.setVisible(false);
-        JPanel panelSouth = new JPanel(new BorderLayout());
-        panelSouth.add(createHtmlOrTextPane(), BorderLayout.CENTER);
-        panelSouth.add(searchPanel, BorderLayout.SOUTH);
-        
-        JPanel panel = new JPanel(new BorderLayout());
-        panel.add(resultsScrollPane, BorderLayout.CENTER);
-        panel.add(panelSouth, BorderLayout.SOUTH);
+    private static class ResultsNodeRenderer extends DefaultTreeCellRenderer {
 
-        return panel;
-    }
+        private static final long serialVersionUID = 4159626601097711565L;
 
-    private void setEnabledButtons(boolean b) {
-        renderLabel.setEnabled(b); 
-        textButton.setEnabled(b);
-        htmlButton.setEnabled(b);
-        jsonButton.setEnabled(b);
-        xmlButton.setEnabled(b);
-        if (b && command.equals(HTML_COMMAND)) {
-            downloadAll.setEnabled(b);
-        } else {
-            downloadAll.setEnabled(false);
-        }
-    }
-
-    private static class ResultsNodeRenderer extends DefaultTreeCellRenderer {
         @Override
-        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
-                boolean leaf, int row, boolean focus) {
+        public Component getTreeCellRendererComponent(JTree tree, Object value,
+                boolean sel, boolean expanded, boolean leaf, int row, boolean focus) {
             super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, focus);
             boolean failure = true;
             Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
-            if(userObject instanceof SampleResult) {
+            if (userObject instanceof SampleResult) {
                 failure = !(((SampleResult) userObject).isSuccessful());
-            }
-            else if(userObject instanceof AssertionResult) {
+            } else if (userObject instanceof AssertionResult) {
                 AssertionResult assertion = (AssertionResult) userObject;
-                failure =  assertion.isError() || assertion.isFailure();
+                failure = assertion.isError() || assertion.isFailure();
             }
 
             // Set the status for the node
@@ -917,154 +374,4 @@
         }
     }
 
-    private static class LocalHTMLEditorKit extends HTMLEditorKit {
-
-        private static final ViewFactory defaultFactory = new LocalHTMLFactory();
-
-        @Override
-        public ViewFactory getViewFactory() {
-            return defaultFactory;
-        }
-
-        private static class LocalHTMLFactory extends javax.swing.text.html.HTMLEditorKit.HTMLFactory {
-            /*
-             * Provide dummy implementations to suppress download and display of
-             * related resources: - FRAMEs - IMAGEs TODO create better dummy
-             * displays TODO suppress LINK somehow
-             */
-            @Override
-            public View create(Element elem) {
-                Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);
-                if (o instanceof HTML.Tag) {
-                    HTML.Tag kind = (HTML.Tag) o;
-                    if (kind == HTML.Tag.FRAME) {
-                        return new ComponentView(elem);
-                    } else if (kind == HTML.Tag.IMG) {
-                        return new ComponentView(elem);
-                    }
-                }
-                return super.create(elem);
-            }
-        }
-    }
-
-    /**
-     *
-     * A Dom tree panel for to display response as tree view author <a
-     * href="mailto:d.maung@mdl.com">Dave Maung</a> TODO implement to find any
-     * nodes in the tree using TreePath.
-     *
-     */
-    private static class DOMTreePanel extends JPanel {
-
-        private JTree domJTree;
-
-        public DOMTreePanel(org.w3c.dom.Document document) {
-            super(new GridLayout(1, 0));
-            try {
-                Node firstElement = getFirstElement(document);
-                DefaultMutableTreeNode top = new XMLDefaultMutableTreeNode(firstElement);
-                domJTree = new JTree(top);
-
-                domJTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
-                domJTree.setShowsRootHandles(true);
-                JScrollPane domJScrollPane = new JScrollPane(domJTree);
-                domJTree.setAutoscrolls(true);
-                this.add(domJScrollPane);
-                ToolTipManager.sharedInstance().registerComponent(domJTree);
-                domJTree.setCellRenderer(new DomTreeRenderer());
-            } catch (SAXException e) {
-                log.warn("", e);
-            }
-
-        }
-
-        /**
-         * Skip all DTD nodes, all prolog nodes. They dont support in tree view
-         * We let user to insert them however in DOMTreeView, we dont display it
-         *
-         * @param root
-         * @return
-         */
-        private Node getFirstElement(Node parent) {
-            NodeList childNodes = parent.getChildNodes();
-            Node toReturn = parent; // Must return a valid node, or may generate an NPE
-            for (int i = 0; i < childNodes.getLength(); i++) {
-                Node childNode = childNodes.item(i);
-                toReturn = childNode;
-                if (childNode.getNodeType() == Node.ELEMENT_NODE){
-                    break;
-                }
-
-            }
-            return toReturn;
-        }
-
-        /**
-         * This class is to view as tooltext. This is very useful, when the
-         * contents has long string and does not fit in the view. it will also
-         * automatically wrap line for each 100 characters since tool tip
-         * support html. author <a href="mailto:d.maung@mdl.com">Dave Maung</a>
-         */
-        private static class DomTreeRenderer extends DefaultTreeCellRenderer {
-            @Override
-            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
-                    boolean leaf, int row, boolean phasFocus) {
-                super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, phasFocus);
-
-                DefaultMutableTreeNode valueTreeNode = (DefaultMutableTreeNode) value;
-                setToolTipText(getHTML(valueTreeNode.toString(), "<br>", 100)); // $NON-NLS-1$
-                return this;
-            }
-
-            /**
-             * get the html
-             *
-             * @param str
-             * @param separator
-             * @param maxChar
-             * @return
-             */
-            private String getHTML(String str, String separator, int maxChar) {
-                StringBuilder strBuf = new StringBuilder("<html><body bgcolor=\"yellow\"><b>"); // $NON-NLS-1$
-                char[] chars = str.toCharArray();
-                for (int i = 0; i < chars.length; i++) {
-
-                    if (i % maxChar == 0 && i != 0) {
-                        strBuf.append(separator);
-                    }
-                    strBuf.append(encode(chars[i]));
-
-                }
-                strBuf.append("</b></body></html>"); // $NON-NLS-1$
-                return strBuf.toString();
-
-            }
-
-            private String encode(char c) {
-                String toReturn = String.valueOf(c);
-                switch (c) {
-                case '<': // $NON-NLS-1$
-                    toReturn = "&lt;"; // $NON-NLS-1$
-                    break;
-                case '>': // $NON-NLS-1$
-                    toReturn = "&gt;"; // $NON-NLS-1$
-                    break;
-                case '\'': // $NON-NLS-1$
-                    toReturn = "&apos;"; // $NON-NLS-1$
-                    break;
-                case '\"': // $NON-NLS-1$
-                    toReturn = "&quot;"; // $NON-NLS-1$
-                    break;
-
-                }
-                return toReturn;
-            }
-        }
-    }
-
-    private static void showErrorMessageDialog(String message, String title, int messageType) {
-        JOptionPane.showMessageDialog(null, message, title, messageType);
-    }
-
 }

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=885648&r1=885647&r2=885648&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Tue Dec  1 01:51:15 2009
@@ -624,6 +624,10 @@
 regexfunc_param_4=Between text.  If ALL is selected, the between text will be used to generate the results ([""])
 regexfunc_param_5=Default text.  Used instead of the template if the regular expression finds no matches ([""])
 regexfunc_param_7=Input variable name containing the text to be parsed ([previous sample])
+regexp_tester_button_test=Test
+regexp_tester_field=Regular expression\:
+regexp_render_no_text=Data response result isn't text.
+regexp_tester_title=RegExp Tester
 remote_error_init=Error initialising remote server
 remote_error_starting=Error starting remote server
 remote_exit=Remote Exit
@@ -895,8 +899,8 @@
 view_results_latency=Latency: 
 view_results_load_time=Load time: 
 view_results_render=Render: 
-view_results_render_embedded=Download embedded resources
 view_results_render_html=HTML
+view_results_render_html_embedded=HTML (download embedded resources)
 view_results_render_json=JSON
 view_results_render_text=Text
 view_results_render_xml=XML

Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=885648&r1=885647&r2=885648&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties Tue Dec  1 01:51:15 2009
@@ -528,6 +528,10 @@
 regexfunc_param_3=Quelle correspondance utiliser. Un entier 1 ou plus grand, RAND pour indiquer que JMeter doit choisir al\u00E9atoirement , A d\u00E9cimal, ou ALL indique que toutes les correspondances doivent \u00EAtre utilis\u00E9es
 regexfunc_param_4=Entre le texte. Si ALL est s\u00E9lectionn\u00E9, l'entre-texte sera utilis\u00E9 pour g\u00E9n\u00E9rer les r\u00E9sultats ([""])
 regexfunc_param_5=Text par d\u00E9faut. Utilis\u00E9 \u00E0 la place du canevas si l'expression r\u00E9guli\u00E8re ne trouve pas de correspondance
+regexp_tester_button_test=Tester
+regexp_tester_field=Expression r\u00E9guli\u00E8re \:
+regexp_render_no_text=Les donn\u00E9es de r\u00E9ponse ne sont pas du texte.
+regexp_tester_title=Testeur de RegExp
 remote_exit=Sortie distante
 remote_exit_all=Sortie distante de tous
 remote_start=D\u00E9marrage distant

Added: jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java (added)
+++ jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java Tue Dec  1 01:51:15 2009
@@ -0,0 +1,45 @@
+/*
+ * 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.jorphan.gui;
+
+import java.awt.Component;
+
+import javax.swing.JScrollPane;
+
+public class GuiUtils {
+
+    /**
+     * Create a scroll panel that sets its preferred size to its minimum size.
+     * Explicitly for scroll panes that live inside other scroll panes, or
+     * within containers that stretch components to fill the area they exist in.
+     * Use this for any component you would put in a scroll pane (such as
+     * TextAreas, tables, JLists, etc). It is here for convenience and to avoid
+     * duplicate code. JMeter displays best if you follow this custom.
+     *
+     * @param comp
+     *            the component which should be placed inside the scroll pane
+     * @return a JScrollPane containing the specified component
+     */
+    public static JScrollPane makeScrollPane(Component comp) {
+        JScrollPane pane = new JScrollPane(comp);
+        pane.setPreferredSize(pane.getMinimumSize());
+        return pane;
+    }
+
+}

Propchange: jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision



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