package com.aerodynelabs.habtk.help; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.io.IOException; import javax.swing.BoxLayout; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; /** * A class to display a help window. * @author Ethan Harstad * */ public class HelpWindow { private static JFrame frame; private JTree tree; private JEditorPane view; /** * Show the help window if it is hidden, otherwise create it. */ public static void showHelp() { if(frame != null) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if(frame.getExtendedState() == JFrame.ICONIFIED) { frame.setExtendedState(JFrame.NORMAL); } frame.setVisible(true); frame.toFront(); frame.repaint(); } }); } else { new HelpWindow(); } } /** * Create help window. */ public HelpWindow() { frame = new JFrame("HABtk - Help"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); JPanel panel = new JPanel(); BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS); panel.setLayout(layout); frame.getContentPane().add(panel); tree = new HelpTree(addNodes(null, new File("Documentation/"))); tree.setRootVisible(false); tree.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); if(path != null) { if(e.getClickCount() == 2) { File picked = (File) ((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject(); if(picked.isFile() == false) return; try { view.setPage("file:///" + picked.getAbsolutePath()); } catch (IOException e1) { e1.printStackTrace(); } } } } }); JScrollPane treeScroll = new JScrollPane(tree); panel.add(treeScroll); view = new JEditorPane(); view.setEditable(false); try { view.setPage("file:///" + new File("Documentation/index.html").getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } JScrollPane viewScroll = new JScrollPane(view); panel.add(viewScroll); frame.pack(); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((screen.width - frame.getWidth()) / 2, (screen.height - frame.getHeight()) / 2); frame.setVisible(true); } /** * Load help hierarchy. * @param top * @param dir * @return */ private DefaultMutableTreeNode addNodes(DefaultMutableTreeNode top, File dir) { DefaultMutableTreeNode cur = new DefaultMutableTreeNode(dir); if(top != null) top.add(cur); File children[] = dir.listFiles(); if(children == null) return cur; for(int i = 0; i < children.length; i++) { if(dir.isDirectory()) { cur.add(addNodes(cur, children[i])); } else { cur.add(new DefaultMutableTreeNode(children[i])); } } return cur; } }