001    /* PAVLOV -- Multiple Choice Study System
002     * Copyright (C) 2000 - 2004 T.J. Willis
003     * 
004     * This program is free software; you can redistribute it and/or
005     * modify it under the terms of the GNU General Public License
006     * as published by the Free Software Foundation; either version 2
007     * of the License, or (at your option) any later version.
008     *      
009     * This program is distributed in the hope that it will be useful,
010     * but WITHOUT ANY WARRANTY; without even the implied warranty of
011     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012     * GNU General Public License for more details.
013     *          
014     * You should have received a copy of the GNU General Public License
015     * along with this program; if not, write to the Free Software
016     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
017     *  
018     * $Header: /cvsroot/pavlov/net/sourceforge/pavlov/swing/HTMLInternalFrame.java,v 1.11 2004/07/01 05:50:21 tj_willis Exp $
019     */ 
020    package net.sourceforge.pavlov.swing;
021    
022    
023    import javax.swing.*;
024    import javax.swing.event.*;
025    import javax.swing.text.html.*;
026    
027    import java.awt.*;
028    import java.awt.event.*;
029    import java.io.*;
030    import java.net.*;
031    import org.apache.log4j.*;
032    import java.util.*;
033    
034    public class HTMLInternalFrame 
035        extends JDialog
036        implements ActionListener, HyperlinkListener
037    {
038    
039        JEditorPane html;
040        boolean reload = false;
041        URL myURL;
042        Vector<URL> urls;
043        JComboBox urlBox;
044        
045        public HTMLInternalFrame(String title, String url) {
046            super((JFrame)null,title);//,true,true,true,true);
047            URL u = null;
048            try {
049                u = new URL( url);
050            } catch (Exception e) {
051                reload = true;
052            }
053            myURL = u;
054            init(u);
055    
056        }
057    
058        /**
059         * Create a HTMLInternalFrame with the given title and initial URL.
060         */
061        public HTMLInternalFrame(String title, URL url) {
062            super((JFrame)null,title);//,true,true,true,true);
063            myURL = url;
064            init(url);
065        }
066    
067        private void init(URL url)
068        {
069    
070            html = new JEditorPane();
071            html.setContentType("text/html");
072            html.setEditable(false);
073            html.addHyperlinkListener(this);//createHyperLinkListener());
074            urls = new Vector<URL>();
075            JLabel urlLab = new JLabel("URL:");
076            Box b = new Box(BoxLayout.X_AXIS);
077            urlBox = new JComboBox();
078            urlBox.setEditable(false);
079            urlBox.addActionListener(this);
080            b.add(urlLab);
081            b.add(urlBox);
082            setURL( url);
083            getContentPane().add(b,BorderLayout.NORTH);
084            setDefaultCloseOperation(HIDE_ON_CLOSE);
085            JScrollPane scroller = new JScrollPane();
086            JViewport vp = scroller.getViewport();
087            vp.add(html);
088            getContentPane().add(scroller, BorderLayout.CENTER);
089            /*
090            //this.setBounds
091            this.setVisible(true);
092            invalidate();
093            pack();
094            setVisible(false);
095            invalidate();
096            validate();
097            setVisible(true);
098            invalidate();
099            validate();
100            */
101            pack(); //setSize(getPreferredSize());
102            HTMLEditorKit kit = (HTMLEditorKit)html.getEditorKit();
103            kit.setAutoFormSubmission(true);
104            //html.setEditorKit(kit);
105        }
106    
107        public void setVisible(boolean x)
108        {
109            if(x==true && reload == true){
110                setURL(myURL);
111            }
112            super.setVisible(x);
113        }
114    
115    
116    
117    
118        public void setURL(URL url)
119        {
120            try { 
121                if(url != null) {
122                    urls.remove(url);
123                    urls.add(0,url);
124                    urlBox.removeItem(url);
125                    urlBox.addItem(url);
126                    urlBox.setSelectedItem(url);
127                    html.setPage(url);
128                } else {
129                            html.setText(niceError("Null URL",url));
130                }
131                pack();
132            } catch (MalformedURLException e) {
133                html.setText(niceError("Malformed URL: " + e,url));
134                reload = true;
135            } catch (IOException e) {
136                html.setText(niceError("IOException: " + e,url));
137                reload = true;
138            } catch (Exception e) {
139                html.setText(niceError("Exception: " + e,url));
140                reload = true;
141            } 
142    
143        }
144    
145        protected String niceError(String msg, URL u)
146        {
147            String buf = new String();
148            buf +="<HTML><HEAD><TITLE>ERROR RETRIEVING PAGE</TITLE></HEAD>";
149            buf +="<BODY><H2>ERROR RETRIEVING PAGE</H2>";
150            buf +="<HR>";
151            buf +="Attempting to load page: " + u +"<BR>";
152            buf +="Error is: " + msg;
153            buf +="</BODY></HTML>";
154            return buf.toString();
155                
156        }
157    
158    //     public HyperlinkListener createHyperLinkListener() {
159    //         return new HyperlinkListener() {
160        public void hyperlinkUpdate(HyperlinkEvent e) {
161            //System.out.println("event type="+e.getEventType());
162            if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
163                if( e instanceof FormSubmitEvent ){
164                    System.out.println("Caught FormSubmit");
165                    return;
166                } else if (e instanceof HTMLFrameHyperlinkEvent) {
167                    HTMLDocument doc = (HTMLDocument)html.getDocument();
168                    doc.processHTMLFrameHyperlinkEvent((HTMLFrameHyperlinkEvent)e);
169                } else {
170                    myURL = e.getURL();
171                    setURL(myURL);
172                }
173            }
174        }
175    //             };
176    //     }
177        
178        public java.awt.Dimension getPreferredSize()
179        {
180            java.awt.Dimension d = html.getPreferredSize();
181            d.width+=20;
182            if(d.width<510) d.width=510;
183            d.height+=30;
184            if(d.height<510) d.height=510;
185            return d;
186        }
187    
188        public java.awt.Dimension getMinimumSize()
189        {
190            java.awt.Dimension d = html.getMinimumSize();
191            d.width+=20;
192            d.height+=30;
193            return d;
194        }
195    
196    
197        protected void closeDialog()
198        {
199            setVisible(false);
200        }
201    
202        public void actionPerformed(ActionEvent e){
203            if(e.getSource().equals(urlBox)){
204                //System.out.println("ActionCommand = " + e.getActionCommand());
205                Object sel = urlBox.getSelectedItem();
206                //System.out.println("New Selection = " + sel);
207                if(sel instanceof URL){
208                    setURL((URL)sel);       
209                }
210            }
211              
212        }
213    }