View Javadoc

1   /*
2    *  Copyright (C) 2003-2005 SINTEF
3    *  Author:  Fredrik Vraalsen (fredrik dot vraalsen at sintef dot no)
4    *  Webpage: http://coras.sourceforge.net/
5    *
6    *  This program is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public License
8    *  as published by the Free Software Foundation; either version 2.1
9    *  of the License, or (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this program; if not, write to the Free
18   *  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19   *  02111-1307 USA
20   */
21  package coras.client.ui;
22  
23  import java.awt.BorderLayout;
24  import java.awt.Cursor;
25  import java.awt.event.ComponentAdapter;
26  import java.awt.event.ComponentEvent;
27  import java.net.MalformedURLException;
28  import java.net.URL;
29  import java.util.Map;
30  
31  import javax.swing.JButton;
32  import javax.swing.JPanel;
33  import javax.swing.JToolBar;
34  
35  import org.jdesktop.jdic.browser.WebBrowser;
36  import org.jdesktop.jdic.browser.WebBrowserEvent;
37  import org.jdesktop.jdic.browser.WebBrowserListener;
38  
39  import coras.client.SwingWorker;
40  
41  import javax.swing.ImageIcon;
42  import javax.swing.JTextField;
43  /***
44   * @author fvr
45   *
46   * TODO To change the template for this generated type comment go to
47   * Window - Preferences - Java - Code Style - Code Templates
48   */
49  public class HtmlPanel extends JPanel {
50  
51  	private JPanel browserPanel = null;
52  	private WebBrowser webBrowser = null;
53  	private JToolBar navigationPanel = null;
54  	private JButton homeButton = null;
55  	private JButton backButton = null;
56  	private JButton forwardButton = null;
57  	private Map idMap = null;
58  	private String homeId;
59  	private boolean initialised = false;
60  	private String firstUrl;
61  	private JTextField statusField = null;
62  	
63  	/***
64  	 * This is the default constructor
65  	 */
66  	public HtmlPanel(Map idMap, String homeId) {
67  		super();
68  		initialize();
69  		this.idMap = idMap;
70  		this.homeId = homeId;
71  		addComponentListener(new ComponentAdapter() {
72  			public void componentShown(ComponentEvent e) {
73  				lazyInit();
74  			}
75  		});
76  		showHelpID(homeId);
77  	}
78  	
79  	public void lazyInit() {
80  		if (initialised) {
81  			return;
82  		}
83  		initialised = true;
84  		new SwingWorker() {
85  			public Object construct() {
86  				setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
87  				browserPanel.add(getWebBrowser(), BorderLayout.CENTER);
88  				showPage(firstUrl);
89  				setCursor(Cursor.getDefaultCursor());
90  				return null;
91  			}
92  		}.start();
93  	}
94  	
95  	public void showHelpID(String id) {
96  		Object url = idMap != null ? idMap.get(id) : null;
97  		if (url instanceof String) {
98  			showPage((String) url);
99  		}
100 	}
101 	
102 	public void showPage(String relativeUrl) {
103 		if (!initialised) {
104 			firstUrl = relativeUrl;
105 			return;
106 		}
107 		ClassLoader cl = getClass().getClassLoader();
108 		URL url = cl.getResource(relativeUrl);
109 		if (url == null) {
110 			try {
111 				url= new URL("http://coras.sourceforge.net/help/" + relativeUrl);
112 			} catch (MalformedURLException e) {
113 				// TODO Auto-generated catch block
114 				e.printStackTrace();
115 			}
116 		}
117 //		System.out.println("help url: " + url);
118 		getWebBrowser().setURL(url);
119 		updateButtons();
120 	}
121 
122 	private void updateButtons() {
123 		getBackButton().setEnabled(getWebBrowser().isBackEnabled());
124 		getForwardButton().setEnabled(getWebBrowser().isForwardEnabled());
125 	}
126 	
127 	/***
128 	 * This method initializes this
129 	 * 
130 	 * @return void
131 	 */
132 	private  void initialize() {
133 		this.setLayout(new BorderLayout());
134 		this.add(getNavigationPanel(), java.awt.BorderLayout.NORTH);
135 		this.add(getBrowserPanel(), java.awt.BorderLayout.CENTER);
136 		this.add(getStatusField(), java.awt.BorderLayout.SOUTH);
137 	}
138 	/***
139 	 * This method initializes webBrowser	
140 	 * 	
141 	 * @return org.jdesktop.jdic.browser.WebBrowser	
142 	 */    
143 	private JPanel getBrowserPanel() {
144 		if (browserPanel == null) {
145 			browserPanel = new JPanel(new BorderLayout());
146 		}
147 		return browserPanel;
148 	}
149 	/***
150 	 * This method initializes webBrowser	
151 	 * 	
152 	 * @return org.jdesktop.jdic.browser.WebBrowser	
153 	 */    
154 	private WebBrowser getWebBrowser() {
155 		if (webBrowser == null) {
156 			webBrowser = new WebBrowser();
157 			webBrowser.addWebBrowserListener(new WebBrowserListener() {
158 				public void downloadStarted(WebBrowserEvent e) {
159 				}
160 				public void downloadCompleted(WebBrowserEvent e) {
161 					updateButtons();
162 				}
163 				public void downloadProgress(WebBrowserEvent e) {
164 				}
165 				public void downloadError(WebBrowserEvent e) {
166 				}
167 				public void documentCompleted(WebBrowserEvent e) {
168 				}
169 				public void titleChange(WebBrowserEvent e) {
170 				}
171 				public void statusTextChange(WebBrowserEvent e) {
172 					getStatusField().setText(e.getData());
173 				}
174 			});
175 		}
176 		return webBrowser;
177 	}
178 	/***
179 	 * This method initializes jPanel	
180 	 * 	
181 	 * @return javax.swing.JPanel	
182 	 */    
183 	private JToolBar getNavigationPanel() {
184 		if (navigationPanel == null) {
185 			navigationPanel = new JToolBar();
186 			navigationPanel.add(getHomeButton(), null);
187 			navigationPanel.add(getBackButton(), null);
188 			navigationPanel.add(getForwardButton(), null);
189 			navigationPanel.setFloatable(false);
190 		}
191 		return navigationPanel;
192 	}
193 	/***
194 	 * This method initializes jButton	
195 	 * 	
196 	 * @return javax.swing.JButton	
197 	 */    
198 	private JButton getHomeButton() {
199 		if (homeButton == null) {
200 			homeButton = new JButton();
201 			homeButton.setText("Home");
202 			homeButton.setIcon(new ImageIcon(getClass().getResource("/images/icons/home.gif")));
203 			homeButton.addActionListener(new java.awt.event.ActionListener() { 
204 				public void actionPerformed(java.awt.event.ActionEvent e) {    
205 					showHelpID(homeId);
206 				}
207 			});
208 		}
209 		return homeButton;
210 	}
211 	/***
212 	 * This method initializes jButton	
213 	 * 	
214 	 * @return javax.swing.JButton	
215 	 */    
216 	private JButton getBackButton() {
217 		if (backButton == null) {
218 			backButton = new JButton();
219 			backButton.setText("Back");
220 			backButton.setEnabled(false);
221 			backButton.setIcon(new ImageIcon(getClass().getResource("/images/icons/back.gif")));
222 			backButton.addActionListener(new java.awt.event.ActionListener() { 
223 				public void actionPerformed(java.awt.event.ActionEvent e) {    
224 					getWebBrowser().back();
225 				}
226 			});
227 		}
228 		return backButton;
229 	}
230 	/***
231 	 * This method initializes jButton1	
232 	 * 	
233 	 * @return javax.swing.JButton	
234 	 */    
235 	private JButton getForwardButton() {
236 		if (forwardButton == null) {
237 			forwardButton = new JButton();
238 			forwardButton.setText("Forward");
239 			forwardButton.setEnabled(false);
240 			forwardButton.setIcon(new ImageIcon(getClass().getResource("/images/icons/forward.gif")));
241 			forwardButton.addActionListener(new java.awt.event.ActionListener() { 
242 				public void actionPerformed(java.awt.event.ActionEvent e) {    
243 					getWebBrowser().forward();
244 				}
245 			});
246 		}
247 		return forwardButton;
248 	}
249 
250 	/***
251 	 * This method initializes statusField	
252 	 * 	
253 	 * @return javax.swing.JTextField	
254 	 */
255 	private JTextField getStatusField() {
256 		if (statusField == null) {
257 			statusField = new JTextField();
258 			statusField.setEditable(false);
259 		}
260 		return statusField;
261 	}
262     }