001    package org.shiftone.jrat.desktop.util;
002    
003    
004    import org.shiftone.jrat.util.log.Logger;
005    
006    import javax.swing.*;
007    import javax.swing.border.EmptyBorder;
008    import javax.swing.event.HyperlinkEvent;
009    import javax.swing.event.HyperlinkListener;
010    import javax.swing.text.html.HTMLEditorKit;
011    import java.awt.*;
012    import java.awt.event.ActionEvent;
013    import java.awt.event.ActionListener;
014    import java.io.PrintWriter;
015    import java.io.StringWriter;
016    import java.net.URL;
017    
018    
019    /**
020     * Class BrowserPanel
021     *
022     * @author jeff@shiftone.org (Jeff Drost)
023     */
024    public class BrowserPanel extends JPanel implements HyperlinkListener, ActionListener {
025    
026        private static final Logger LOG = Logger.getLogger(BrowserPanel.class);
027        private final URL homePage;
028        private final JToolBar toolBar = new JToolBar();
029        private final JEditorPane editorPane = new JEditorPane();
030        private final JScrollPane scrollPane = new JScrollPane(editorPane);
031        private final JLabel location = new JLabel();
032        private final JButton home = new JButton("Home");
033        private final JButton back = new JButton("Back");
034        private final JButton forword = new JButton("Forward");
035        private URL[] urls = new URL[1024];
036        private int current;
037        private int maxCurrent;
038    
039    
040        public BrowserPanel(URL homePage) {
041    
042            this.homePage = homePage;
043    
044            HTMLEditorKit kit = new HTMLEditorKit();
045    
046            kit.setLinkCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
047    
048            //
049            editorPane.setEditorKit(kit);
050            editorPane.setEditable(false);
051            editorPane.addHyperlinkListener(this);
052            editorPane.setBorder(new EmptyBorder(20, 10, 10, 10));
053    
054            editorPane.setBackground(Color.white);
055    
056            //
057            setLayout(new BorderLayout());
058            add(toolBar, BorderLayout.NORTH);
059            add(scrollPane, BorderLayout.CENTER);
060            add(location, BorderLayout.SOUTH);
061    
062            //
063            toolBar.add(home);
064            toolBar.add(back);
065            toolBar.add(forword);
066            home.addActionListener(this);
067            back.addActionListener(this);
068            forword.addActionListener(this);
069    
070            setHyperLink(homePage, true);
071    
072        }
073    
074    
075        /**
076         * Method hyperlinkUpdate
077         */
078        public void hyperlinkUpdate(HyperlinkEvent e) {
079    
080            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
081                setHyperLink(e.getURL(), true);
082            }
083        }
084    
085    
086        /**
087         * Method setHyperLink
088         */
089        public void setHyperLink(URL url, boolean push) {
090    
091            try {
092    
093                if (url.equals(editorPane.getPage())) {
094                    return;
095                }
096    
097                editorPane.setPage(url);
098    
099                if (push) {
100                    current++;
101    
102                    maxCurrent = current;
103                } else {
104                    maxCurrent = Math.max(current, maxCurrent);
105                }
106    
107                urls[current] = url;
108    
109                location.setText(current + " : " + url.toString());
110                back.setEnabled(current > 1);
111                forword.setEnabled(current < maxCurrent);
112            }
113    
114            catch (Exception e) {
115    
116                error(e);
117    
118            }
119        }
120    
121    
122        /**
123         * Method error
124         */
125        private void error(Exception e) {
126    
127            StringWriter stringWriter = new StringWriter();
128            PrintWriter out = new PrintWriter(stringWriter);
129    
130            out.println("<b>Unable to open Documentation</b><p>");
131            e.printStackTrace(out);
132            out.flush();
133            editorPane.setText(stringWriter.toString());
134        }
135    
136    
137        /**
138         * Method actionPerformed
139         */
140        public void actionPerformed(ActionEvent e) {
141    
142            if (e.getSource() == home) {
143    
144                setHyperLink(homePage, true);
145    
146            } else if (e.getSource() == back) {
147    
148                if (current > 1) {
149                    current--;
150    
151                    setHyperLink(urls[current], false);
152                }
153            } else if (e.getSource() == forword) {
154                if (current < maxCurrent) {
155                    current++;
156    
157                    setHyperLink(urls[current], false);
158                }
159            }
160        }
161    }