/**
*
*/
package statalign.ui;
import java.io.*;
import javax.swing.event.*;
import javax.swing.*;
import java.net.*;
import java.util.ArrayList;
import java.awt.event.*;
import java.awt.*;
/**
* This is a help window for displaying html pages.
*
* @author miklos
*
*/
public class HelpWindow extends JDialog implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private final int WIDTH = 600;
private final int HEIGHT = 400;
private JEditorPane editorpane;
private URL homeURL;
private ArrayList<URL> visitedPages;
private int visitedIndex;
private JButton btnback;
private JButton btnforward;
/**
* This constructs a dialog window displaying html messages.
* @param owner The owner frame of the dialog window. The owner cannot get back the focus until the
* dialog window is closed.
* @param title The title of the window.
* @param hlpURL The home url that is displayed when the window is displayed.
* @param buttons It true, navigation buttons are shown.
*/
public HelpWindow(JFrame owner, String title, URL hlpURL, boolean buttons) {
super(owner,title, true);
homeURL = hlpURL;
editorpane = new JEditorPane();
editorpane.setEditable(false);
try {
editorpane.setPage(homeURL);
} catch (Exception ex) {
new ErrorMessage(null,"name: "+homeURL+"\n"+ex.getMessage(),true);
}
visitedPages = new ArrayList<URL>();
visitedIndex = 0;
visitedPages.add(homeURL);
//anonymous inner listener
editorpane.addHyperlinkListener(new HyperlinkListener() {
public void hyperlinkUpdate(HyperlinkEvent ev) {
try {
if (ev.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
for(int i = visitedIndex + 1; i < visitedPages.size(); ){
visitedPages.remove(i);
//System.out.println("Removing index "+i+" size: "+visitedPages.size());
}
visitedPages.add(ev.getURL());
btnback.setEnabled(true);
btnforward.setEnabled(false);
visitedIndex++;
//System.out.println("visited index: "+visitedIndex+" size of the array: "+visitedPages.size());
editorpane.setPage(ev.getURL());
// new ErrorMessage(null,"the name of the URL is: "+ev.getURL().getFile(),false);
}
} catch (IOException ex) {
//put message in window
new ErrorMessage(null,"name: "+homeURL+"\n"+ex.getMessage(),true);
}
}
});
getContentPane().add(new JScrollPane(editorpane));
if(buttons){
addButtons();
}
// no need for listener just dispose
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// dynamically set location
calculateLocation();
setVisible(true);
// end constructor
}
/**
* An Actionlistener is implemented, so must implement this method
*
*/
public void actionPerformed(ActionEvent e) {
String strAction = e.getActionCommand();
// URL tempURL;
try {
if (strAction == "< Back") {
// tempURL = editorpane.getPage();
btnforward.setEnabled(true);
visitedIndex--;
//System.out.println("visited index: "+visitedIndex+" size of the array: "+visitedPages.size());
editorpane.setPage(visitedPages.get(visitedIndex));
if(visitedIndex == 0){
btnback.setEnabled(false);
}
}
if (strAction == "Forward >") {
// tempURL = editorpane.getPage();
btnback.setEnabled(true);
visitedIndex++;
//System.out.println("visited index: "+visitedIndex+" size of the array: "+visitedPages.size());
editorpane.setPage(visitedPages.get(visitedIndex));
if(visitedIndex == visitedPages.size() - 1){
btnforward.setEnabled(false);
}
}
if (strAction == "Home") {
// tempURL = editorpane.getPage();
for(int i = visitedIndex + 1; i < visitedPages.size(); i++){
visitedPages.remove(i);
}
visitedPages.add(homeURL);
btnback.setEnabled(true);
btnforward.setEnabled(false);
visitedIndex++;
//System.out.println("visited index: "+visitedIndex);
editorpane.setPage(homeURL);
}
if (strAction == "Close") {
// more portable if delegated
processWindowEvent(new WindowEvent(this,
WindowEvent.WINDOW_CLOSING));
}
} catch (IOException ex) {
new ErrorMessage(null,"name: "+homeURL+"\n"+ex.getMessage(),true);
}
}
/**
* add buttons at the south
*/
private void addButtons() {
btnback = new JButton("< Back");
btnback.addActionListener(this);
btnback.setEnabled(false);
btnforward = new JButton("Forward >");
btnforward.addActionListener(this);
btnforward.setEnabled(false);
JButton btnhome = new JButton("Home");
btnhome.addActionListener(this);
JButton btnclose = new JButton("Close");
btnclose.addActionListener(this);
//put into JPanel
JPanel panebuttons = new JPanel();
panebuttons.add(btnback);
panebuttons.add(btnforward);
panebuttons.add(btnhome);
panebuttons.add(btnclose);
//add panel south
getContentPane().add(panebuttons, BorderLayout.NORTH);
}
/**
* locate in middle of screen
*/
private void calculateLocation() {
Dimension screendim = Toolkit.getDefaultToolkit().getScreenSize();
setSize(new Dimension(WIDTH, HEIGHT));
int locationx = (screendim.width - WIDTH) / 2;
int locationy = (screendim.height - HEIGHT) / 2;
setLocation(locationx, locationy);
}
/**
* For testing purposes
* @param args No argument is used.
*/
public static void main(String [] args){
URL index = ClassLoader.getSystemResource("index.html");
new HelpWindow(null,"Test", index, true);
}
}