/* * @(#)HtmlPanel.java 1.15 99/04/23 * * Copyright (c) 1997-1999 by Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */ import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import javax.accessibility.*; import java.awt.*; import java.net.URL; import java.net.MalformedURLException; import java.io.IOException; /* * @version 1.15 99/04/23 * @author Jeff Dinkins * @author Tim Prinzing * @author Peter Korn (accessibility support) */ public class HtmlPanel extends JPanel implements HyperlinkListener { SwingSet swing; JEditorPane html; public HtmlPanel(SwingSet swing) { this.swing = swing; setBorder(swing.emptyBorder10); setLayout(new BorderLayout()); getAccessibleContext().setAccessibleName("HTML panel"); getAccessibleContext().setAccessibleDescription("A panel for viewing HTML documents, and following their links"); try { URL url = null; String prefix = "file:" + System.getProperty("user.dir") + System.getProperty("file.separator"); try { url = new URL(prefix + "example.html"); } catch (java.net.MalformedURLException exc) { System.err.println("Attempted to open example.html " + "with a bad URL: " + url); url = null; } if(url != null) { html = new JEditorPane(url); html.setEditable(false); html.addHyperlinkListener(this); JScrollPane scroller = new JScrollPane(); scroller.setBorder(swing.loweredBorder); JViewport vp = scroller.getViewport(); vp.add(html); vp.setBackingStoreEnabled(true); add(scroller, BorderLayout.CENTER); } } catch (MalformedURLException e) { System.out.println("Malformed URL: " + e); } catch (IOException e) { System.out.println("IOException: " + e); } } /** * Notification of a change relative to a * hyperlink. */ public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { linkActivated(e.getURL()); } } /** * Follows the reference in an * link. The given url is the requested reference. * By default this calls setPage, * and if an exception is thrown the original previous * document is restored and a beep sounded. If an * attempt was made to follow a link, but it represented * a malformed url, this method will be called with a * null argument. * * @param u the URL to follow */ protected void linkActivated(URL u) { Cursor c = html.getCursor(); Cursor waitCursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); html.setCursor(waitCursor); SwingUtilities.invokeLater(new PageLoader(u, c)); } /** * temporary class that loads synchronously (although * later than the request so that a cursor change * can be done). */ class PageLoader implements Runnable { PageLoader(URL u, Cursor c) { url = u; cursor = c; } public void run() { if (url == null) { // restore the original cursor html.setCursor(cursor); // PENDING(prinz) remove this hack when // automatic validation is activated. Container parent = html.getParent(); parent.repaint(); } else { Document doc = html.getDocument(); try { html.setPage(url); } catch (IOException ioe) { html.setDocument(doc); getToolkit().beep(); } finally { // schedule the cursor to revert after // the paint has happended. url = null; SwingUtilities.invokeLater(this); } } } URL url; Cursor cursor; } }