Index: /src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java =================================================================== --- /src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (revision 810272) +++ /src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java (working copy) @@ -22,9 +22,12 @@ 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.awt.event.InputEvent; +import java.awt.event.KeyEvent; import java.io.ByteArrayInputStream; import java.io.StringWriter; import java.text.DateFormat; @@ -33,11 +36,17 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.swing.AbstractAction; +import javax.swing.ActionMap; import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.ImageIcon; +import javax.swing.InputMap; import javax.swing.JCheckBox; +import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -49,6 +58,7 @@ import javax.swing.JTextArea; import javax.swing.JTextPane; import javax.swing.JTree; +import javax.swing.KeyStroke; import javax.swing.ToolTipManager; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; @@ -182,6 +192,8 @@ private JRadioButton xmlButton; private JCheckBox downloadAll; + + private JLabel renderLabel; private JTree jTree; @@ -187,6 +199,10 @@ private JTabbedPane rightSide; + private SearchTextExtension searchTextExtension; + + private JPanel searchPanel = null; + private static final ImageIcon imageSuccess = JMeterUtils.getImage( JMeterUtils.getPropDefault("viewResultsTree.success", //$NON-NLS-1$ "icon_success_sml.gif")); //$NON-NLS-1$ @@ -408,6 +424,9 @@ 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 @@ -422,6 +441,9 @@ } else if (command.equals(XML_COMMAND)) { showRenderXMLResponse(res); } + if (!searchTextExtension.isEnabled()) { + searchTextExtension.setEnabled(true); + } } else { byte[] responseBytes = res.getResponseData(); if (responseBytes != null) { @@ -426,6 +448,9 @@ byte[] responseBytes = res.getResponseData(); if (responseBytes != null) { showImage(new ImageIcon(responseBytes)); //TODO implement other non-text types + if (searchTextExtension.isEnabled()) { + searchTextExtension.setEnabled(false); + } } } } @@ -457,10 +482,7 @@ private void showImage(Icon image) { imageLabel.setIcon(image); resultsScrollPane.setViewportView(imageLabel); - textButton.setEnabled(false); - htmlButton.setEnabled(false); - jsonButton.setEnabled(false); - xmlButton.setEnabled(false); + setEnabledButtons(false); } private void showTextResponse(String response) { @@ -469,10 +491,7 @@ results.setCaretPosition(0); resultsScrollPane.setViewportView(results); - textButton.setEnabled(true); - htmlButton.setEnabled(true); - jsonButton.setEnabled(true); - xmlButton.setEnabled(true); + setEnabledButtons(true); } // It might be useful also to make this available in the 'Request' tab, for @@ -536,10 +555,7 @@ results.setCaretPosition(0); resultsScrollPane.setViewportView(results); - textButton.setEnabled(true); - htmlButton.setEnabled(true); - jsonButton.setEnabled(true); - xmlButton.setEnabled(true); + setEnabledButtons(true); } private void showRenderXMLResponse(SampleResult res) { @@ -571,10 +587,7 @@ JPanel domTreePanel = new DOMTreePanel(document); view = domTreePanel; resultsScrollPane.setViewportView(view); - textButton.setEnabled(true); - htmlButton.setEnabled(true); - jsonButton.setEnabled(true); - xmlButton.setEnabled(true); + setEnabledButtons(true); } private static String getResponseAsString(SampleResult res) { @@ -623,7 +636,8 @@ results.setText(""); return; } - + searchTextExtension.resetTextToFind(); + SampleResult res = (SampleResult) node.getUserObject(); String response = getResponseAsString(res); @@ -688,10 +702,7 @@ results.setCaretPosition(0); resultsScrollPane.setViewportView(results); - textButton.setEnabled(true); - htmlButton.setEnabled(true); - jsonButton.setEnabled(true); - xmlButton.setEnabled(true); + setEnabledButtons(true); } private Component createHtmlOrTextPane() { @@ -696,8 +707,15 @@ 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); @@ -704,6 +722,7 @@ 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); @@ -710,6 +729,7 @@ 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); @@ -716,6 +736,7 @@ 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); @@ -722,8 +743,14 @@ 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); @@ -729,6 +756,7 @@ pane.add(xmlButton); pane.add(jsonButton); pane.add(downloadAll); + return pane; } @@ -751,6 +779,8 @@ JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftSide, rightSide); add(mainSplit, BorderLayout.CENTER); + + searchTextExtension.init(resultsPane); } private void setupTabPaneForSampleResult() { @@ -838,9 +868,18 @@ 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(createHtmlOrTextPane(), BorderLayout.SOUTH); + panel.add(panelSouth, BorderLayout.SOUTH); return panel; } @@ -845,6 +884,19 @@ return panel; } + 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, Index: /src/core/org/apache/jmeter/resources/messages.properties =================================================================== --- /src/core/org/apache/jmeter/resources/messages.properties (revision 810272) +++ /src/core/org/apache/jmeter/resources/messages.properties (working copy) @@ -719,6 +719,14 @@ search_base=Search base search_filter=Search Filter search_test=Search Test +search_text_button_close=Close +search_text_button_find=Find +search_text_button_next=Find next +search_text_chkbox_case=Case sensitive +search_text_chkbox_regexp=Regular exp. +search_text_field=Search: +search_text_msg_not_found=Text not found +search_text_title_not_found=Not found searchbase=Search base searchfilter=Search Filter searchtest=Search test @@ -872,11 +880,12 @@ view_results_in_table=View Results in Table 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=Render HTML -view_results_render_json=Render JSON -view_results_render_text=Show Text -view_results_render_xml=Render XML +view_results_render_html=HTML +view_results_render_json=JSON +view_results_render_text=Text +view_results_render_xml=XML view_results_request_headers=Request Headers: view_results_response_code=Response code: view_results_response_headers=Response headers: @@ -884,6 +893,7 @@ view_results_response_too_large_message=Response too large to be displayed. Size: view_results_sample_count=Sample Count: view_results_sample_start=Sample Start: +view_results_search_pane=Search pane view_results_size_in_bytes=Size in bytes: view_results_tab_assertion=Assertion result view_results_tab_request=Request Index: /src/core/org/apache/jmeter/resources/messages_fr.properties =================================================================== --- /src/core/org/apache/jmeter/resources/messages_fr.properties (revision 810272) +++ /src/core/org/apache/jmeter/resources/messages_fr.properties (working copy) @@ -579,6 +579,14 @@ search_base=Base de recherche search_filter=Filtre de recherche search_test=Recherche +search_text_button_close=Fermer +search_text_button_find=Rechercher +search_text_button_next=Suivant +search_text_chkbox_case=Consid\u00E9rer la casse +search_text_chkbox_regexp=Exp. reguli\u00E8re +search_text_field=Rechercher \: +search_text_msg_not_found=Text non trouv\u00E9 +search_text_title_not_found=Pas trouv\u00E9 second=seconde secure=S\u00E9curis\u00E9 \: send_file=Envoyer un fichier avec la requ\u00EAte \: @@ -719,11 +727,12 @@ view_results_in_table=Tableau de r\u00E9sultats view_results_latency=Latence \: view_results_load_time=Temps de r\u00E9ponse \: +view_results_render=Rendu \: view_results_render_embedded=T\u00E9l\u00E9charger les ressources incluses -view_results_render_html=Afficher en HTML -view_results_render_json=Afficher en JSON -view_results_render_text=Afficher en texte brut -view_results_render_xml=Afficher en XML +view_results_render_html=HTML +view_results_render_json=JSON +view_results_render_text=Texte brut +view_results_render_xml=XML view_results_request_headers=Ent\u00EAtes de requ\u00EAte \: view_results_response_code=Code HTTP de r\u00E9ponse \: view_results_response_headers=Ent\u00EAtes de r\u00E9ponse \: @@ -731,6 +740,7 @@ view_results_response_too_large_message=R\u00E9ponse d\u00E9passant la taille maximale d'affichage. Taille \: view_results_sample_count=Compteur \u00E9chantillon \: view_results_sample_start=Date d\u00E9but \u00E9chantillon \: +view_results_search_pane=Volet recherche view_results_size_in_bytes=Taille en octets \: view_results_tab_assertion=R\u00E9sultats d'assertion view_results_tab_request=Requ\u00EAte