This improves form submit support in the HtmlDemo. Now when a GET form
is submitted, the location field and history is updated correctly.

I also added some examples for the new select box support.

2006-12-06  Roman Kennke  <[EMAIL PROTECTED]>

        * examples/gnu/classpath/examples/swing/BrowserEditorKit.java:
        New class.
        * examples/gnu/classpath/examples/swing/HtmlDemo.java
        (LoadActionListener): Call setPage() helper method.
        (createContent): Register tweaked editor kit. For FormSubmitEvents
        call submitForm(), otherwise setPage().
        (postData): Helper method for posting form data.
        (setPage): Helper method for navigating to a new URL.
        (submitForm): Helper method for submitting a form.
        * examples/gnu/classpath/examples/swing/forms.html:
        Added text/password fields and select boxes.
        * examples/gnu/classpath/examples/swing/welcome.html: Fixed typo.

/Roman
Index: examples/gnu/classpath/examples/swing/BrowserEditorKit.java
===================================================================
RCS file: examples/gnu/classpath/examples/swing/BrowserEditorKit.java
diff -N examples/gnu/classpath/examples/swing/BrowserEditorKit.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ examples/gnu/classpath/examples/swing/BrowserEditorKit.java	7 Dec 2006 14:49:49 -0000
@@ -0,0 +1,57 @@
+/* BrowserEditorKit.java -- A tweaked editor kit for the browser
+   Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.examples.swing;
+
+import javax.swing.text.html.HTMLEditorKit;
+
+/**
+ * A tweaked editor kit for out browser.
+ */
+public class BrowserEditorKit
+  extends HTMLEditorKit
+{
+  public BrowserEditorKit()
+  {
+    super();
+    // Turn off automatic form submission so that we can receive notification
+    // instead and can update out location field.
+    setAutoFormSubmission(false);
+  }
+}
+
Index: examples/gnu/classpath/examples/swing/HtmlDemo.java
===================================================================
RCS file: /cvsroot/classpath/classpath/examples/gnu/classpath/examples/swing/HtmlDemo.java,v
retrieving revision 1.9
diff -u -1 -5 -r1.9 HtmlDemo.java
--- examples/gnu/classpath/examples/swing/HtmlDemo.java	6 Dec 2006 22:02:26 -0000	1.9
+++ examples/gnu/classpath/examples/swing/HtmlDemo.java	7 Dec 2006 14:49:49 -0000
@@ -31,69 +31,75 @@
 independent module, the terms and conditions of the license of that
 module.  An independent module is a module which is not derived from
 or based on this library.  If you modify this library, you may extend
 this exception to your version of the library, but you are not
 obligated to do so.  If you do not wish to do so, delete this
 exception statement from your version. */
 
 
 package gnu.classpath.examples.swing;
 
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLConnection;
 import java.util.LinkedList;
 
 import javax.swing.BoxLayout;
 import javax.swing.Icon;
 import javax.swing.JButton;
 import javax.swing.JComponent;
+import javax.swing.JEditorPane;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
 import javax.swing.JTextPane;
 import javax.swing.JToolBar;
 import javax.swing.SwingUtilities;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
+import javax.swing.text.html.FormSubmitEvent;
 
 /**
  * Parses and displays HTML content.
  * 
  * @author Audrius Meskauskas ([EMAIL PROTECTED])
  */
 public class HtmlDemo extends JPanel
 { 
 
   private class LoadActionListener
     implements ActionListener
   {
 
     public void actionPerformed(ActionEvent event)
     {
       String urlStr = url.getText();
       try
         {
-          html.setPage(url.getText());
+          setPage(new URL(url.getText()));
         }
-      catch (IOException ex)
+      catch (MalformedURLException ex)
         {
-          System.err.println("exception while loading: " + ex);
+          // Do something more useful here.
           ex.printStackTrace();
         }
     }
   }
 
   /**
    * Setting this to true causes the parsed element structure to be dumped.
    */
   private static final boolean DEBUG = true;
 
   /**
    * The URL entry field.
    */
   JTextField url = new JTextField(); 
 
@@ -113,48 +119,48 @@
     super();
     history = new LinkedList();
     createContent();
   }
 
   /**
    * Returns a panel with the demo content. The panel uses a BorderLayout(), and
    * the BorderLayout.SOUTH area is empty, to allow callers to add controls to
    * the bottom of the panel if they want to (a close button is added if this
    * demo is being run as a standalone demo).
    */
   private void createContent()
   {
     setLayout(new BorderLayout());
 
+    JEditorPane.registerEditorKitForContentType("text/html",
+                                             BrowserEditorKit.class.getName());
     html.setEditable(false);
     html.addHyperlinkListener(new HyperlinkListener()
     {
 
       public void hyperlinkUpdate(HyperlinkEvent event)
       {
-        URL u = event.getURL();
-        if (u != null)
+        if (event instanceof FormSubmitEvent)
           {
-            try
-              {
-                url.setText(u.toString());
-                html.setPage(u.toString());
-                history.addLast(u);
-              }
-            catch (IOException ex)
+            submitForm((FormSubmitEvent) event);
+          }
+        else
+          {
+            URL u = event.getURL();
+            if (u != null)
               {
-                ex.printStackTrace();
+                setPage(u);
               }
           }
       }
       
     });
 
     JScrollPane scroller = new JScrollPane(html);
     JPanel urlPanel = new JPanel();
     urlPanel.setLayout(new BoxLayout(urlPanel, BoxLayout.X_AXIS));
     url.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
     LoadActionListener action = new LoadActionListener();
     url.addActionListener(action);
     urlPanel.add(url);
     JButton loadButton = new JButton("go");
     urlPanel.add(loadButton);
@@ -257,30 +263,117 @@
     SwingUtilities.invokeLater
     (new Runnable()
      {
        public void run()
        {
          HtmlDemo demo = new HtmlDemo();
          JFrame frame = new JFrame();
          frame.getContentPane().add(demo);
          frame.setSize(new Dimension(750, 480));
          frame.setVisible(true);
        }
      });
   }
 
   /**
+   * Helper method to navigate to a new URL.
+   *
+   * @param u the new URL to navigate to
+   */
+  void setPage(URL u)
+  {
+    try
+      {
+        url.setText(u.toString());
+        html.setPage(u.toString());
+        history.addLast(u);
+      }
+    catch (IOException ex)
+      {
+        // Do something more useful here.
+        ex.printStackTrace();
+      }
+  }
+
+  /**
+   * Submits a form when a FormSubmitEvent is received. The HTML API
+   * provides automatic form submit but when this is enabled we don't
+   * receive any notification and can't update our location field.
+   *
+   * @param ev the form submit event
+   */
+  void submitForm(FormSubmitEvent ev)
+  {
+    URL url = ev.getURL();
+    String data = ev.getData();
+    FormSubmitEvent.MethodType method = ev.getMethod();
+    if (method == FormSubmitEvent.MethodType.POST)
+      {
+        try
+          {
+            URLConnection conn = url.openConnection();
+            postData(conn, data);
+          }
+        catch (IOException ex)
+          {
+            // Deal with this.
+            ex.printStackTrace();
+          }
+      }
+    else
+      {
+        try
+          {
+            url = new URL(url.toString() + "?" + data);
+          }
+        catch (MalformedURLException ex)
+          {
+            ex.printStackTrace();
+          }
+      }
+    setPage(url);
+  }
+
+  /**
+   * Posts the form data for forms with HTTP POST method.
+   *
+   * @param conn the connection
+   * @param data the form data
+   */
+  private void postData(URLConnection conn, String data)
+  {
+    conn.setDoOutput(true);
+    PrintWriter out = null;
+    try
+      {
+        out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
+        out.print(data);
+        out.flush();
+      }
+    catch (IOException ex)
+      {
+        // Deal with this!
+        ex.printStackTrace();
+      }
+    finally
+      {
+        if (out != null)
+          out.close();
+      }
+  }
+
+  /**
    * Returns a DemoFactory that creates a HtmlDemo.
    *
    * @return a DemoFactory that creates a HtmlDemo
    */
   public static DemoFactory createDemoFactory()
   {
     return new DemoFactory()
     {
       public JComponent createDemo()
       {
         return new HtmlDemo();
       }
     };
   }
 }
Index: examples/gnu/classpath/examples/swing/forms.html
===================================================================
RCS file: /cvsroot/classpath/classpath/examples/gnu/classpath/examples/swing/forms.html,v
retrieving revision 1.1
diff -u -1 -5 -r1.1 forms.html
--- examples/gnu/classpath/examples/swing/forms.html	6 Nov 2006 16:26:52 -0000	1.1
+++ examples/gnu/classpath/examples/swing/forms.html	7 Dec 2006 14:49:49 -0000
@@ -29,41 +29,70 @@
 modules, and to copy and distribute the resulting executable under
 terms of your choice, provided that you also meet, for each linked
 independent module, the terms and conditions of the license of that
 module.  An independent module is a module which is not derived from
 or based on this library.  If you modify this library, you may extend
 this exception to your version of the library, but you are not
 obligated to do so.  If you do not wish to do so, delete this
 exception statement from your version. -->
 
 <html>
 
   <head>
     <title>HTML text styles</title>
   </head>
   <body>
+  <form>
   <a href="welcome.html">Back to start page</a>
   <h1>Some form elements</h1>
   <h2>Textarea</h2>
   <textarea cols="30" rows="5">
   Hello GNU Classpath world. This text should show up in a text area
   that has a size of 30 columns and 5 rows
   </textarea>
 
+  <h2>Input fields</h2>
+  <p>
+  <input type="text" value="This is a normal textfield">
+  <input type="password" value="secret password">
+  </p>
+
   <h2>Buttons</h2>
   <p>
   <input type="submit"></input>
   <input type="reset"></input>
   <input type="button" value="Some button"></input>
   </p>
 
   <h2>Checkboxes and Radiobuttons</h2>
   <p>
-  <input type="checkbox">Check this!</input>
-  <input type="checkbox">Or this</input>
+  <input type="checkbox" name="2">Check this!</input>
+  <input type="checkbox" name="2">Or this</input>
+  </p>
+  <p>
+  <input type="radio" name="1">A radio button</input>
+  <input type="radio" name="1">Another radio</input>
+  </p>
+  <h2>Select lists and combo boxes</h2>
+  <p>
+  <select>
+    <option>Value1</option>
+    <option>Value2</option>
+    <option>Value3</option>
+    <option label="Labeled value 4">Value4</option>
+    <option>Value5</option>
+    <option>Value6</option>
+  </select>
   </p>
   <p>
-  <input type="radio">A radio button</input>
-  <input type="radio">Another radio</input>
+  <select size="3">
+    <option>Value1</option>
+    <option>Value2</option>
+    <option>Value3</option>
+    <option label="Labeled value 4">Value4</option>
+    <option>Value5</option>
+    <option>Value6</option>
+  </select>
   </p>
+  </form>
   </body>
 </html>
\ No newline at end of file
Index: examples/gnu/classpath/examples/swing/welcome.html
===================================================================
RCS file: /cvsroot/classpath/classpath/examples/gnu/classpath/examples/swing/welcome.html,v
retrieving revision 1.2
diff -u -1 -5 -r1.2 welcome.html
--- examples/gnu/classpath/examples/swing/welcome.html	6 Dec 2006 21:03:31 -0000	1.2
+++ examples/gnu/classpath/examples/swing/welcome.html	7 Dec 2006 14:49:49 -0000
@@ -43,21 +43,21 @@
   <img src="../icons/badge.png" width="100" height="100">
   <h1>Welcome to GNU Classpath</h1>
   <h2>A couple of websites that you might want to try out</h2>
   <ul>
     <li><a href="http://www.gnu.org/software/classpath/";>GNU Classpath homepage</a></li>
     <li><a href="http://planet.classpath.org";>Planet Classpath</a></li>
     <li><a href="http://developer.classpath.org";>GNU Classpath developer pages</a></li>
     <li><a href="http://www.google.com";>Google</a></li>
   </ul>
   
   <h2>Testpages</h2>
   <p>These few pages are here to demonstrate and test the HTML rendering
    capabilities of GNU Classpath's Swing.</p>
   <ul>
     <li><a href="textstyles.html">Text styles</li>
-    <li><a href="forms.html"><p>Form elements</li>
+    <li><a href="forms.html">Form elements</li>
     <li><a href="tables.html">Tables</li>
     <li><a href="frames.html">Frames</li>
   </ul>
   </body>
 </html>
\ No newline at end of file

Reply via email to