1*1b0aaa91SAndrew Rist /**************************************************************
2*1b0aaa91SAndrew Rist  *
3*1b0aaa91SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*1b0aaa91SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*1b0aaa91SAndrew Rist  * distributed with this work for additional information
6*1b0aaa91SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*1b0aaa91SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*1b0aaa91SAndrew Rist  * "License"); you may not use this file except in compliance
9*1b0aaa91SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*1b0aaa91SAndrew Rist  *
11*1b0aaa91SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*1b0aaa91SAndrew Rist  *
13*1b0aaa91SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*1b0aaa91SAndrew Rist  * software distributed under the License is distributed on an
15*1b0aaa91SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*1b0aaa91SAndrew Rist  * KIND, either express or implied.  See the License for the
17*1b0aaa91SAndrew Rist  * specific language governing permissions and limitations
18*1b0aaa91SAndrew Rist  * under the License.
19*1b0aaa91SAndrew Rist  *
20*1b0aaa91SAndrew Rist  *************************************************************/
21*1b0aaa91SAndrew Rist 
22cdf0e10cSrcweir import javax.swing.JFrame;
23cdf0e10cSrcweir import javax.swing.JScrollPane;
24cdf0e10cSrcweir import javax.swing.JEditorPane;
25cdf0e10cSrcweir import javax.swing.JButton;
26cdf0e10cSrcweir import java.net.URL;
27cdf0e10cSrcweir import javax.swing.event.HyperlinkListener;
28cdf0e10cSrcweir import javax.swing.event.HyperlinkEvent;
29cdf0e10cSrcweir import java.net.MalformedURLException;
30cdf0e10cSrcweir import java.io.IOException;
31cdf0e10cSrcweir import java.io.File;
32cdf0e10cSrcweir import java.awt.event.WindowAdapter;
33cdf0e10cSrcweir import java.awt.event.WindowEvent;
34cdf0e10cSrcweir import java.awt.GridBagLayout;
35cdf0e10cSrcweir import java.awt.GridBagConstraints;
36cdf0e10cSrcweir import java.awt.event.ActionListener;
37cdf0e10cSrcweir import java.util.LinkedList;
38cdf0e10cSrcweir 
39cdf0e10cSrcweir class HelpWindow
40cdf0e10cSrcweir     implements ActionListener
41cdf0e10cSrcweir {
Instance()42cdf0e10cSrcweir     public static synchronized HelpWindow Instance ()
43cdf0e10cSrcweir     {
44cdf0e10cSrcweir         if (maInstance == null)
45cdf0e10cSrcweir             maInstance = new HelpWindow();
46cdf0e10cSrcweir         return maInstance;
47cdf0e10cSrcweir     }
48cdf0e10cSrcweir 
loadFile(String sFilename)49cdf0e10cSrcweir     public void loadFile (String sFilename)
50cdf0e10cSrcweir     {
51cdf0e10cSrcweir         File aFile = new File (sFilename);
52cdf0e10cSrcweir         try
53cdf0e10cSrcweir         {
54cdf0e10cSrcweir             loadURL (aFile.toURL());
55cdf0e10cSrcweir         }
56cdf0e10cSrcweir         catch (MalformedURLException e)
57cdf0e10cSrcweir         {
58cdf0e10cSrcweir             e.printStackTrace (System.err);
59cdf0e10cSrcweir         }
60cdf0e10cSrcweir     }
loadURL(String sURL)61cdf0e10cSrcweir     public void loadURL (String sURL)
62cdf0e10cSrcweir     {
63cdf0e10cSrcweir         try
64cdf0e10cSrcweir         {
65cdf0e10cSrcweir             loadURL (new URL (sURL));
66cdf0e10cSrcweir         }
67cdf0e10cSrcweir         catch (MalformedURLException e)
68cdf0e10cSrcweir         {
69cdf0e10cSrcweir             e.printStackTrace (System.err);
70cdf0e10cSrcweir         }
71cdf0e10cSrcweir     }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
75cdf0e10cSrcweir 
loadURL(URL aURL)76cdf0e10cSrcweir     public void loadURL (URL aURL)
77cdf0e10cSrcweir     {
78cdf0e10cSrcweir         maHistory.addLast (aURL);
79cdf0e10cSrcweir         selectHistoryPage (maHistory.size()-1);
80cdf0e10cSrcweir         maFrame.toFront ();
81cdf0e10cSrcweir     }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 
HelpWindow()86cdf0e10cSrcweir     private HelpWindow ()
87cdf0e10cSrcweir     {
88cdf0e10cSrcweir         try
89cdf0e10cSrcweir         {
90cdf0e10cSrcweir             maCurrentHistoryEntry = -1;
91cdf0e10cSrcweir             maHistory = new LinkedList();
92cdf0e10cSrcweir 
93cdf0e10cSrcweir             maFrame = new JFrame ();
94cdf0e10cSrcweir             maFrame.addWindowListener (new WindowAdapter ()
95cdf0e10cSrcweir                 {
96cdf0e10cSrcweir                     public void windowClosing (WindowEvent e)
97cdf0e10cSrcweir                     {
98cdf0e10cSrcweir                         maInstance = null;
99cdf0e10cSrcweir                     }
100cdf0e10cSrcweir                 });
101cdf0e10cSrcweir             maContent = createContentWidget();
102cdf0e10cSrcweir 
103cdf0e10cSrcweir             maFrame.getContentPane().setLayout (new GridBagLayout());
104cdf0e10cSrcweir             GridBagConstraints aConstraints = new GridBagConstraints ();
105cdf0e10cSrcweir             aConstraints.gridx = 0;
106cdf0e10cSrcweir             aConstraints.gridy = 0;
107cdf0e10cSrcweir             aConstraints.gridwidth = 3;
108cdf0e10cSrcweir             aConstraints.weightx = 1;
109cdf0e10cSrcweir             aConstraints.weighty = 1;
110cdf0e10cSrcweir             aConstraints.fill = GridBagConstraints.BOTH;
111cdf0e10cSrcweir             maFrame.getContentPane().add (new JScrollPane (maContent), aConstraints);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir             aConstraints = new GridBagConstraints();
114cdf0e10cSrcweir             aConstraints.gridx = 0;
115cdf0e10cSrcweir             aConstraints.gridy = 1;
116cdf0e10cSrcweir             maPrevButton = new JButton ("Prev");
117cdf0e10cSrcweir             maFrame.getContentPane().add (maPrevButton, aConstraints);
118cdf0e10cSrcweir             maPrevButton.addActionListener (this);
119cdf0e10cSrcweir 
120cdf0e10cSrcweir             aConstraints = new GridBagConstraints();
121cdf0e10cSrcweir             aConstraints.gridx = 1;
122cdf0e10cSrcweir             aConstraints.gridy = 1;
123cdf0e10cSrcweir             maNextButton = new JButton ("Next");
124cdf0e10cSrcweir             maFrame.getContentPane().add (maNextButton, aConstraints);
125cdf0e10cSrcweir             maNextButton.addActionListener (this);
126cdf0e10cSrcweir 
127cdf0e10cSrcweir             aConstraints = new GridBagConstraints();
128cdf0e10cSrcweir             aConstraints.gridx = 2;
129cdf0e10cSrcweir             aConstraints.gridy = 1;
130cdf0e10cSrcweir             aConstraints.anchor = GridBagConstraints.EAST;
131cdf0e10cSrcweir             JButton aButton = new JButton ("Close");
132cdf0e10cSrcweir             maFrame.getContentPane().add (aButton, aConstraints);
133cdf0e10cSrcweir             aButton.addActionListener (this);
134cdf0e10cSrcweir 
135cdf0e10cSrcweir             maFrame.setSize (600,400);
136cdf0e10cSrcweir             maFrame.setVisible (true);
137cdf0e10cSrcweir         }
138cdf0e10cSrcweir         catch (Exception e)
139cdf0e10cSrcweir         {}
140cdf0e10cSrcweir     }
141cdf0e10cSrcweir 
actionPerformed(java.awt.event.ActionEvent e)142cdf0e10cSrcweir     public void actionPerformed (java.awt.event.ActionEvent e)
143cdf0e10cSrcweir     {
144cdf0e10cSrcweir         if (e.getActionCommand().equals("Prev"))
145cdf0e10cSrcweir         {
146cdf0e10cSrcweir             selectHistoryPage (maCurrentHistoryEntry - 1);
147cdf0e10cSrcweir         }
148cdf0e10cSrcweir         else if (e.getActionCommand().equals("Next"))
149cdf0e10cSrcweir         {
150cdf0e10cSrcweir             selectHistoryPage (maCurrentHistoryEntry + 1);
151cdf0e10cSrcweir         }
152cdf0e10cSrcweir         else if (e.getActionCommand().equals("Close"))
153cdf0e10cSrcweir         {
154cdf0e10cSrcweir             maFrame.dispose ();
155cdf0e10cSrcweir             maInstance = null;
156cdf0e10cSrcweir         }
157cdf0e10cSrcweir     }
158cdf0e10cSrcweir 
createContentWidget()159cdf0e10cSrcweir     private JEditorPane createContentWidget ()
160cdf0e10cSrcweir     {
161cdf0e10cSrcweir         JEditorPane aContent = new JEditorPane ();
162cdf0e10cSrcweir         aContent.setEditable (false);
163cdf0e10cSrcweir         aContent.addHyperlinkListener (new HyperlinkListener()
164cdf0e10cSrcweir             {
165cdf0e10cSrcweir                 public void hyperlinkUpdate (HyperlinkEvent e)
166cdf0e10cSrcweir                 {
167cdf0e10cSrcweir                     if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
168cdf0e10cSrcweir                         HelpWindow.Instance().loadURL (e.getURL());
169cdf0e10cSrcweir                 }
170cdf0e10cSrcweir             });
171cdf0e10cSrcweir         return aContent;
172cdf0e10cSrcweir     }
173cdf0e10cSrcweir 
selectHistoryPage(int i)174cdf0e10cSrcweir     private void selectHistoryPage (int i)
175cdf0e10cSrcweir     {
176cdf0e10cSrcweir         if (i < 0)
177cdf0e10cSrcweir             i = 0;
178cdf0e10cSrcweir         else if (i >= maHistory.size()-1)
179cdf0e10cSrcweir             i = maHistory.size()-1;
180cdf0e10cSrcweir         if (i != maCurrentHistoryEntry)
181cdf0e10cSrcweir         {
182cdf0e10cSrcweir             URL aURL = (URL)maHistory.get (i);
183cdf0e10cSrcweir             try
184cdf0e10cSrcweir             {
185cdf0e10cSrcweir                 maContent.setPage (aURL);
186cdf0e10cSrcweir             }
187cdf0e10cSrcweir             catch (java.io.IOException ex)
188cdf0e10cSrcweir             {
189cdf0e10cSrcweir                 ex.printStackTrace(System.err);
190cdf0e10cSrcweir             }
191cdf0e10cSrcweir 
192cdf0e10cSrcweir             maCurrentHistoryEntry = i;
193cdf0e10cSrcweir         }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir         maPrevButton.setEnabled (maCurrentHistoryEntry > 0);
196cdf0e10cSrcweir         maNextButton.setEnabled (maCurrentHistoryEntry < maHistory.size()-1);
197cdf0e10cSrcweir     }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir     private static HelpWindow maInstance = null;
200cdf0e10cSrcweir     private JFrame maFrame;
201cdf0e10cSrcweir     private JEditorPane maContent;
202cdf0e10cSrcweir     private LinkedList maHistory;
203cdf0e10cSrcweir     private int maCurrentHistoryEntry;
204cdf0e10cSrcweir     private JButton maPrevButton;
205cdf0e10cSrcweir     private JButton maNextButton;
206cdf0e10cSrcweir }
207