import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JEditorPane; import javax.swing.JButton; import java.net.URL; import javax.swing.event.HyperlinkListener; import javax.swing.event.HyperlinkEvent; import java.net.MalformedURLException; import java.io.IOException; import java.io.File; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.event.ActionListener; import java.util.LinkedList; class HelpWindow implements ActionListener { public static synchronized HelpWindow Instance () { if (maInstance == null) maInstance = new HelpWindow(); return maInstance; } public void loadFile (String sFilename) { File aFile = new File (sFilename); try { loadURL (aFile.toURI().toURL()); } catch (MalformedURLException e) { e.printStackTrace (System.err); } } public void loadURL (String sURL) { try { loadURL (new URL (sURL)); } catch (MalformedURLException e) { e.printStackTrace (System.err); } } public void loadURL (URL aURL) { maHistory.addLast (aURL); selectHistoryPage (maHistory.size()-1); maFrame.toFront (); } private HelpWindow () { try { maCurrentHistoryEntry = -1; maHistory = new LinkedList(); maFrame = new JFrame (); maFrame.addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent e) { maInstance = null; } }); maContent = createContentWidget(); maFrame.getContentPane().setLayout (new GridBagLayout()); GridBagConstraints aConstraints = new GridBagConstraints (); aConstraints.gridx = 0; aConstraints.gridy = 0; aConstraints.gridwidth = 3; aConstraints.weightx = 1; aConstraints.weighty = 1; aConstraints.fill = GridBagConstraints.BOTH; maFrame.getContentPane().add (new JScrollPane (maContent), aConstraints); aConstraints = new GridBagConstraints(); aConstraints.gridx = 0; aConstraints.gridy = 1; maPrevButton = new JButton ("Prev"); maFrame.getContentPane().add (maPrevButton, aConstraints); maPrevButton.addActionListener (this); aConstraints = new GridBagConstraints(); aConstraints.gridx = 1; aConstraints.gridy = 1; maNextButton = new JButton ("Next"); maFrame.getContentPane().add (maNextButton, aConstraints); maNextButton.addActionListener (this); aConstraints = new GridBagConstraints(); aConstraints.gridx = 2; aConstraints.gridy = 1; aConstraints.anchor = GridBagConstraints.EAST; JButton aButton = new JButton ("Close"); maFrame.getContentPane().add (aButton, aConstraints); aButton.addActionListener (this); maFrame.setSize (600,400); maFrame.setVisible (true); } catch (Exception e) {} } public void actionPerformed (java.awt.event.ActionEvent e) { if (e.getActionCommand().equals("Prev")) { selectHistoryPage (maCurrentHistoryEntry - 1); } else if (e.getActionCommand().equals("Next")) { selectHistoryPage (maCurrentHistoryEntry + 1); } else if (e.getActionCommand().equals("Close")) { maFrame.dispose (); maInstance = null; } } private JEditorPane createContentWidget () { JEditorPane aContent = new JEditorPane (); aContent.setEditable (false); aContent.addHyperlinkListener (new HyperlinkListener() { public void hyperlinkUpdate (HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) HelpWindow.Instance().loadURL (e.getURL()); } }); return aContent; } private void selectHistoryPage (int i) { if (i < 0) i = 0; else if (i >= maHistory.size()-1) i = maHistory.size()-1; if (i != maCurrentHistoryEntry) { URL aURL = (URL)maHistory.get (i); try { maContent.setPage (aURL); } catch (java.io.IOException ex) { ex.printStackTrace(System.err); } maCurrentHistoryEntry = i; } maPrevButton.setEnabled (maCurrentHistoryEntry > 0); maNextButton.setEnabled (maCurrentHistoryEntry < maHistory.size()-1); } private static HelpWindow maInstance = null; private JFrame maFrame; private JEditorPane maContent; private LinkedList maHistory; private int maCurrentHistoryEntry; private JButton maPrevButton; private JButton maNextButton; }