diff options
Diffstat (limited to 'examples/gnu/classpath/examples/swing/HtmlDemo.java')
-rw-r--r-- | examples/gnu/classpath/examples/swing/HtmlDemo.java | 215 |
1 files changed, 194 insertions, 21 deletions
diff --git a/examples/gnu/classpath/examples/swing/HtmlDemo.java b/examples/gnu/classpath/examples/swing/HtmlDemo.java index 4cbf3ce47..35a9df290 100644 --- a/examples/gnu/classpath/examples/swing/HtmlDemo.java +++ b/examples/gnu/classpath/examples/swing/HtmlDemo.java @@ -43,19 +43,28 @@ 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. @@ -74,11 +83,11 @@ public class HtmlDemo extends JPanel 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(); } } @@ -98,10 +107,17 @@ public class HtmlDemo extends JPanel int n; + /** + * The browsing history. + * + * Package private to avoid accessor method. + */ + LinkedList history; + public HtmlDemo() { super(); - html.setContentType("text/html"); // not now. + history = new LinkedList(); createContent(); } @@ -115,23 +131,24 @@ public class HtmlDemo extends JPanel { 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) { - url.setText(u.toString()); - try - { - html.setPage(u); - } - catch (IOException ex) + submitForm((FormSubmitEvent) event); + } + else + { + URL u = event.getURL(); + if (u != null) { - ex.printStackTrace(); + setPage(u); } } } @@ -148,24 +165,93 @@ public class HtmlDemo extends JPanel JButton loadButton = new JButton("go"); urlPanel.add(loadButton); loadButton.addActionListener(action); - add(urlPanel, BorderLayout.NORTH); - add(scroller, BorderLayout.CENTER); + + // Setup control panel. + JToolBar controlPanel = createToolBar(); + JPanel browserPanel = new JPanel(); + browserPanel.setLayout(new BorderLayout()); + browserPanel.add(urlPanel, BorderLayout.NORTH); + browserPanel.add(scroller, BorderLayout.CENTER); + add(controlPanel, BorderLayout.NORTH); + add(browserPanel, BorderLayout.CENTER); // Load start page. - URL startpage = getClass().getResource("welcome.html"); try { + URL startpage = getClass().getResource("welcome.html"); html.setPage(startpage); url.setText(startpage.toString()); + history.addLast(startpage); } - catch (IOException ex) + catch (Exception ex) { - System.err.println("couldn't load page: " + startpage); + System.err.println("couldn't load page: "/* + startpage*/); + ex.printStackTrace(); } - - setPreferredSize(new Dimension(600, 400)); + setPreferredSize(new Dimension(800, 600)); } + + /** + * Creates the toolbar with the control buttons. + * + * @return the toolbar with the control buttons + */ + JToolBar createToolBar() + { + JToolBar tb = new JToolBar(); + Icon backIcon = Demo.getIcon("/gnu/classpath/examples/icons/back.png", + "back"); + JButton back = new JButton(backIcon); + back.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent ev) + { + if (history.size() > 1) + { + URL last = (URL) history.removeLast(); + last = (URL) history.getLast(); + url.setText(last.toString()); + try + { + html.setPage(last); + } + catch (IOException ex) + { + // Do something more useful. + ex.printStackTrace(); + } + } + } + }); + tb.add(back); + Icon reloadIcon = Demo.getIcon("/gnu/classpath/examples/icons/reload.png", + "reload"); + JButton reload = new JButton(reloadIcon); + reload.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent ev) + { + if (history.size() > 0) + { + URL last = (URL) history.getLast(); + url.setText(last.toString()); + try + { + html.setPage(last); + } + catch (IOException ex) + { + // Do something more useful. + ex.printStackTrace(); + } + } + } + }); + tb.add(reload); + return tb; + } + /** * The executable method to display the editable table. * @@ -182,13 +268,100 @@ public class HtmlDemo extends JPanel HtmlDemo demo = new HtmlDemo(); JFrame frame = new JFrame(); frame.getContentPane().add(demo); - frame.setSize(new Dimension(700, 480)); + 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 |