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