1*cdf0e10cSrcweir import javax.swing.JFrame;
2*cdf0e10cSrcweir import javax.swing.JScrollPane;
3*cdf0e10cSrcweir import javax.swing.JEditorPane;
4*cdf0e10cSrcweir import javax.swing.JButton;
5*cdf0e10cSrcweir import java.net.URL;
6*cdf0e10cSrcweir import javax.swing.event.HyperlinkListener;
7*cdf0e10cSrcweir import javax.swing.event.HyperlinkEvent;
8*cdf0e10cSrcweir import java.net.MalformedURLException;
9*cdf0e10cSrcweir import java.io.IOException;
10*cdf0e10cSrcweir import java.io.File;
11*cdf0e10cSrcweir import java.awt.event.WindowAdapter;
12*cdf0e10cSrcweir import java.awt.event.WindowEvent;
13*cdf0e10cSrcweir import java.awt.GridBagLayout;
14*cdf0e10cSrcweir import java.awt.GridBagConstraints;
15*cdf0e10cSrcweir import java.awt.event.ActionListener;
16*cdf0e10cSrcweir import java.util.LinkedList;
17*cdf0e10cSrcweir 
18*cdf0e10cSrcweir class HelpWindow
19*cdf0e10cSrcweir     implements ActionListener
20*cdf0e10cSrcweir {
21*cdf0e10cSrcweir     public static synchronized HelpWindow Instance ()
22*cdf0e10cSrcweir     {
23*cdf0e10cSrcweir         if (maInstance == null)
24*cdf0e10cSrcweir             maInstance = new HelpWindow();
25*cdf0e10cSrcweir         return maInstance;
26*cdf0e10cSrcweir     }
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir     public void loadFile (String sFilename)
29*cdf0e10cSrcweir     {
30*cdf0e10cSrcweir         File aFile = new File (sFilename);
31*cdf0e10cSrcweir         try
32*cdf0e10cSrcweir         {
33*cdf0e10cSrcweir             loadURL (aFile.toURL());
34*cdf0e10cSrcweir         }
35*cdf0e10cSrcweir         catch (MalformedURLException e)
36*cdf0e10cSrcweir         {
37*cdf0e10cSrcweir             e.printStackTrace (System.err);
38*cdf0e10cSrcweir         }
39*cdf0e10cSrcweir     }
40*cdf0e10cSrcweir     public void loadURL (String sURL)
41*cdf0e10cSrcweir     {
42*cdf0e10cSrcweir         try
43*cdf0e10cSrcweir         {
44*cdf0e10cSrcweir             loadURL (new URL (sURL));
45*cdf0e10cSrcweir         }
46*cdf0e10cSrcweir         catch (MalformedURLException e)
47*cdf0e10cSrcweir         {
48*cdf0e10cSrcweir             e.printStackTrace (System.err);
49*cdf0e10cSrcweir         }
50*cdf0e10cSrcweir     }
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir 
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir     public void loadURL (URL aURL)
56*cdf0e10cSrcweir     {
57*cdf0e10cSrcweir         maHistory.addLast (aURL);
58*cdf0e10cSrcweir         selectHistoryPage (maHistory.size()-1);
59*cdf0e10cSrcweir         maFrame.toFront ();
60*cdf0e10cSrcweir     }
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir     private HelpWindow ()
66*cdf0e10cSrcweir     {
67*cdf0e10cSrcweir         try
68*cdf0e10cSrcweir         {
69*cdf0e10cSrcweir             maCurrentHistoryEntry = -1;
70*cdf0e10cSrcweir             maHistory = new LinkedList();
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir             maFrame = new JFrame ();
73*cdf0e10cSrcweir             maFrame.addWindowListener (new WindowAdapter ()
74*cdf0e10cSrcweir                 {
75*cdf0e10cSrcweir                     public void windowClosing (WindowEvent e)
76*cdf0e10cSrcweir                     {
77*cdf0e10cSrcweir                         maInstance = null;
78*cdf0e10cSrcweir                     }
79*cdf0e10cSrcweir                 });
80*cdf0e10cSrcweir             maContent = createContentWidget();
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir             maFrame.getContentPane().setLayout (new GridBagLayout());
83*cdf0e10cSrcweir             GridBagConstraints aConstraints = new GridBagConstraints ();
84*cdf0e10cSrcweir             aConstraints.gridx = 0;
85*cdf0e10cSrcweir             aConstraints.gridy = 0;
86*cdf0e10cSrcweir             aConstraints.gridwidth = 3;
87*cdf0e10cSrcweir             aConstraints.weightx = 1;
88*cdf0e10cSrcweir             aConstraints.weighty = 1;
89*cdf0e10cSrcweir             aConstraints.fill = GridBagConstraints.BOTH;
90*cdf0e10cSrcweir             maFrame.getContentPane().add (new JScrollPane (maContent), aConstraints);
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir             aConstraints = new GridBagConstraints();
93*cdf0e10cSrcweir             aConstraints.gridx = 0;
94*cdf0e10cSrcweir             aConstraints.gridy = 1;
95*cdf0e10cSrcweir             maPrevButton = new JButton ("Prev");
96*cdf0e10cSrcweir             maFrame.getContentPane().add (maPrevButton, aConstraints);
97*cdf0e10cSrcweir             maPrevButton.addActionListener (this);
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir             aConstraints = new GridBagConstraints();
100*cdf0e10cSrcweir             aConstraints.gridx = 1;
101*cdf0e10cSrcweir             aConstraints.gridy = 1;
102*cdf0e10cSrcweir             maNextButton = new JButton ("Next");
103*cdf0e10cSrcweir             maFrame.getContentPane().add (maNextButton, aConstraints);
104*cdf0e10cSrcweir             maNextButton.addActionListener (this);
105*cdf0e10cSrcweir 
106*cdf0e10cSrcweir             aConstraints = new GridBagConstraints();
107*cdf0e10cSrcweir             aConstraints.gridx = 2;
108*cdf0e10cSrcweir             aConstraints.gridy = 1;
109*cdf0e10cSrcweir             aConstraints.anchor = GridBagConstraints.EAST;
110*cdf0e10cSrcweir             JButton aButton = new JButton ("Close");
111*cdf0e10cSrcweir             maFrame.getContentPane().add (aButton, aConstraints);
112*cdf0e10cSrcweir             aButton.addActionListener (this);
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir             maFrame.setSize (600,400);
115*cdf0e10cSrcweir             maFrame.setVisible (true);
116*cdf0e10cSrcweir         }
117*cdf0e10cSrcweir         catch (Exception e)
118*cdf0e10cSrcweir         {}
119*cdf0e10cSrcweir     }
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir     public void actionPerformed (java.awt.event.ActionEvent e)
122*cdf0e10cSrcweir     {
123*cdf0e10cSrcweir         if (e.getActionCommand().equals("Prev"))
124*cdf0e10cSrcweir         {
125*cdf0e10cSrcweir             selectHistoryPage (maCurrentHistoryEntry - 1);
126*cdf0e10cSrcweir         }
127*cdf0e10cSrcweir         else if (e.getActionCommand().equals("Next"))
128*cdf0e10cSrcweir         {
129*cdf0e10cSrcweir             selectHistoryPage (maCurrentHistoryEntry + 1);
130*cdf0e10cSrcweir         }
131*cdf0e10cSrcweir         else if (e.getActionCommand().equals("Close"))
132*cdf0e10cSrcweir         {
133*cdf0e10cSrcweir             maFrame.dispose ();
134*cdf0e10cSrcweir             maInstance = null;
135*cdf0e10cSrcweir         }
136*cdf0e10cSrcweir     }
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir     private JEditorPane createContentWidget ()
139*cdf0e10cSrcweir     {
140*cdf0e10cSrcweir         JEditorPane aContent = new JEditorPane ();
141*cdf0e10cSrcweir         aContent.setEditable (false);
142*cdf0e10cSrcweir         aContent.addHyperlinkListener (new HyperlinkListener()
143*cdf0e10cSrcweir             {
144*cdf0e10cSrcweir                 public void hyperlinkUpdate (HyperlinkEvent e)
145*cdf0e10cSrcweir                 {
146*cdf0e10cSrcweir                     if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
147*cdf0e10cSrcweir                         HelpWindow.Instance().loadURL (e.getURL());
148*cdf0e10cSrcweir                 }
149*cdf0e10cSrcweir             });
150*cdf0e10cSrcweir         return aContent;
151*cdf0e10cSrcweir     }
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir     private void selectHistoryPage (int i)
154*cdf0e10cSrcweir     {
155*cdf0e10cSrcweir         if (i < 0)
156*cdf0e10cSrcweir             i = 0;
157*cdf0e10cSrcweir         else if (i >= maHistory.size()-1)
158*cdf0e10cSrcweir             i = maHistory.size()-1;
159*cdf0e10cSrcweir         if (i != maCurrentHistoryEntry)
160*cdf0e10cSrcweir         {
161*cdf0e10cSrcweir             URL aURL = (URL)maHistory.get (i);
162*cdf0e10cSrcweir             try
163*cdf0e10cSrcweir             {
164*cdf0e10cSrcweir                 maContent.setPage (aURL);
165*cdf0e10cSrcweir             }
166*cdf0e10cSrcweir             catch (java.io.IOException ex)
167*cdf0e10cSrcweir             {
168*cdf0e10cSrcweir                 ex.printStackTrace(System.err);
169*cdf0e10cSrcweir             }
170*cdf0e10cSrcweir 
171*cdf0e10cSrcweir             maCurrentHistoryEntry = i;
172*cdf0e10cSrcweir         }
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir         maPrevButton.setEnabled (maCurrentHistoryEntry > 0);
175*cdf0e10cSrcweir         maNextButton.setEnabled (maCurrentHistoryEntry < maHistory.size()-1);
176*cdf0e10cSrcweir     }
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir     private static HelpWindow maInstance = null;
179*cdf0e10cSrcweir     private JFrame maFrame;
180*cdf0e10cSrcweir     private JEditorPane maContent;
181*cdf0e10cSrcweir     private LinkedList maHistory;
182*cdf0e10cSrcweir     private int maCurrentHistoryEntry;
183*cdf0e10cSrcweir     private JButton maPrevButton;
184*cdf0e10cSrcweir     private JButton maNextButton;
185*cdf0e10cSrcweir }
186