// File: VertPanel.java // Classes: VertPanel // Author: Kedar Patankar package edu.neu.ccs.demeter.tools.apstudio.graphedit; import java.awt.Panel; import java.awt.Cursor; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.event.HyperlinkListener; import javax.swing.event.HyperlinkEvent; import javax.swing.JEditorPane; import javax.swing.SwingUtilities; import javax.swing.JScrollPane; import javax.swing.JViewport; import java.net.URL; import java.net.MalformedURLException; import java.io.IOException; /* Purpose : Display the help in html style */ public class HtmlPanel extends Panel implements HyperlinkListener { JEditorPane html; public HtmlPanel(String basePage) { setLayout(new BorderLayout()); try { URL url = new URL(basePage); html = new JEditorPane(url); html.setEditable(false); html.addHyperlinkListener(this); JScrollPane scroller = new JScrollPane(); JViewport vp = scroller.getViewport(); vp.add(html); vp.setScrollMode(JViewport.BLIT_SCROLL_MODE); add(scroller, BorderLayout.CENTER); } catch (MalformedURLException e) { System.out.println("Malformed URL: " + e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } } /** * 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 { javax.swing.text.Document doc = html.getDocument(); try { html.setPage(url); } catch (IOException ioe) { html.setDocument(doc); getToolkit().beep(); System.err.println(ioe); } finally { // schedule the cursor to revert after // the paint has happended. url = null; SwingUtilities.invokeLater(this); } } } URL url; Cursor cursor; } } /* end class HtmlPanel */