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

