/** * Copyright (C) IntelliBitz Technologies., Muthu Ramadoss * 168, Medavakkam Main Road, Madipakkam, Chennai 600091, Tamilnadu, India. * http://www.intellibitz.com * training@intellibitz.com * +91 44 2247 5106 * http://groups.google.com/group/etoe * http://sted.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * STED, Copyright (C) 2007 IntelliBitz Technologies * STED comes with ABSOLUTELY NO WARRANTY; * This is free software, and you are welcome * to redistribute it under the GNU GPL conditions; * * Visit http://www.gnu.org/ for GPL License terms. */ /** * $Id:HelpWindow.java 55 2007-05-19 05:55:34Z sushmu $ * $HeadURL: svn+ssh://sushmu@svn.code.sf.net/p/sted/code/FontTransliterator/trunk/src/intellibitz/sted/ui/HelpWindow.java $ */ package intellibitz.sted.ui; import intellibitz.sted.event.IMessageEventSource; import intellibitz.sted.event.IMessageListener; import intellibitz.sted.event.MessageEvent; import intellibitz.sted.util.FileHelper; import intellibitz.sted.util.Resources; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.JToolBar; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLEditorKit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Stack; import java.util.logging.Logger; public class HelpWindow extends JFrame implements HyperlinkListener, IMessageEventSource { private final JTextPane textPane; private final Stack<URL> currentPages; private final Stack<URL> backPages; private final Stack<URL> forwardPages; private final JButton backButton; private final JButton forwardButton; private final JButton homeButton; private URL homepage; private static final String HELP_INDEX = FileHelper.suffixFileSeparator (System.getProperty(Resources.STED_HOME_PATH, "../")) + Resources .getResource(Resources.HELP_INDEX); private static final Logger logger = Logger.getLogger(HelpWindow.class.getName()); private static HelpWindow helpWindow; private MessageEvent messageEvent; private IMessageListener messageListener; public static synchronized HelpWindow getInstance() { if (helpWindow == null) { helpWindow = new HelpWindow(); helpWindow.setSize(600, 800); } return helpWindow; } private HelpWindow() { super(Resources.getResource(Resources.TITLE_HELP)); setIconImage(Resources.getSystemResourceIcon( Resources.getResource(Resources.ICON_HELP)).getImage()); currentPages = new Stack<URL>(); backPages = new Stack<URL>(); forwardPages = new Stack<URL>(); final JToolBar jToolBar = new JToolBar(JToolBar.HORIZONTAL); jToolBar.setFloatable(false); homeButton = new JButton(Resources.getSystemResourceIcon( Resources.getResource(Resources.ICON_HELP_HOME))); homeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { goHome(); } }); homeButton.setToolTipText("Table Of Contents"); // jToolBar.add(homeButton); backButton = new JButton(Resources.getSystemResourceIcon( Resources.getResource(Resources.ICON_HELP_BACK))); backButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { goBack(); } }); backButton.setToolTipText("Back"); // jToolBar.add(backButton); forwardButton = new JButton( Resources.getSystemResourceIcon( Resources.getResource(Resources.ICON_HELP_FORWARD))); forwardButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { goForward(); } }); forwardButton.setToolTipText("Forward"); // jToolBar.add(forwardButton); // add the toolbar // NOTE: "North" is required.. else the toolbar is not visible. getContentPane().add("North", jToolBar); textPane = new JTextPane(); textPane.setEditable(false); textPane.setSize(400, 400); textPane.setEditorKit(new HTMLEditorKit()); textPane.addHyperlinkListener(this); final JScrollPane scroller = new JScrollPane(); scroller.getViewport().add(textPane); getContentPane().add(scroller); goHome(); setSize(textPane.getSize()); setDefaultLookAndFeelDecorated(true); setState(JFrame.MAXIMIZED_HORIZ); setExtendedState(JFrame.MAXIMIZED_BOTH); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); } }); messageEvent = new MessageEvent(this); pack(); } public void fireMessagePosted(String message) { messageEvent.setMessage(message); messageListener.messagePosted(messageEvent); } public void fireMessagePosted() { messageListener.messagePosted(messageEvent); } public void addMessageListener(IMessageListener messageListener) { this.messageListener = messageListener; } private void goHome() { // if first time, then should be the startup if (homepage == null) { go(HELP_INDEX); homepage = textPane.getPage(); } else { setURL(homepage); } } private void goBack() { final URL url = backPages.pop(); // push the current page into the forward stack if (currentPages.isEmpty()) { forwardPages.push(url); } else { forwardPages.push(currentPages.pop()); } setPage(url); } private void goForward() { final URL url = forwardPages.pop(); // push the current page into the forward stack if (currentPages.isEmpty()) { backPages.push(url); } else { backPages.push(currentPages.pop()); } setPage(url); } private void setPage(URL url) { try { textPane.setPage(url); // push the current page currentPages.push(url); setButtonState(); } catch (IOException e) { logger.severe(e.getMessage()); fireMessagePosted("Cannot set page " + e.getMessage()); } } private void setURL(URL url) { try { textPane.setPage(url); // pop the previous page and push it into back if (!currentPages.isEmpty()) { backPages.push(currentPages.pop()); } // clear the forward currentPages forwardPages.clear(); // push the current page currentPages.push(url); } catch (IOException e) { logger.severe("Cannot set page " + url); fireMessagePosted("Cannot set page " + url); } setButtonState(); } private void setButtonState() { backButton.setEnabled(!backPages.isEmpty()); forwardButton.setEnabled(!forwardPages.isEmpty()); final URL index = textPane.getPage(); homeButton.setEnabled( index != null && index.getPath().indexOf(HELP_INDEX) == -1); } private void go(String path) { try { if (path != null) { // check if the path is relative or absolute // if relative, then get the absolute path.. this happens the first time showing Help if (path.indexOf(":") == -1) { final File file = new File(path); setURL(new URL("file:///" + file.getAbsolutePath())); } else { setURL(new URL("file:///" + path)); } } } catch (IOException e) { logger.throwing(getClass().getName(), "actionPerformed", e); fireMessagePosted("Cannot go to page - IOException occured: " + e.getMessage()); } } private void go(URL url) { if (url.getProtocol().startsWith("file")) { go(url.getPath()); } else if (url.getProtocol().startsWith("http")) { // TODO: NEED TO IMPLEMENT } else { setURL(url); } } public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { go(e.getURL()); } } }