001 package com.croftsoft.core.gui.multi;
002
003 import java.applet.*;
004 import java.awt.*;
005 import java.io.*;
006 import java.net.*;
007 import java.util.*;
008 import javax.swing.*;
009 import javax.swing.event.*;
010
011 import com.croftsoft.core.CroftSoftConstants;
012 import com.croftsoft.core.awt.image.ImageLib;
013 import com.croftsoft.core.gui.FullScreenToggler;
014 import com.croftsoft.core.gui.LifecycleWindowListener;
015 import com.croftsoft.core.lang.NullArgumentException;
016 import com.croftsoft.core.lang.Pair;
017 import com.croftsoft.core.lang.lifecycle.Lifecycle;
018
019 /*********************************************************************
020 * An applet that contains multiple applets.
021 *
022 * @version
023 * 2003-08-02
024 * @since
025 * 2002-02-25
026 * @author
027 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
028 *********************************************************************/
029
030 public class MultiApplet
031 extends JApplet
032 implements Lifecycle
033 //////////////////////////////////////////////////////////////////////
034 //////////////////////////////////////////////////////////////////////
035 {
036
037 public static final String DEFAULT_NEWS_NAME = "News";
038
039 //
040
041 private final String appletInfo;
042
043 private final Pair [ ] appletPairs;
044
045 private final String newsName;
046
047 private final String newsHTML;
048
049 private final String newsPage;
050
051 //
052
053 private JTabbedPane jTabbedPane;
054
055 private Component appletComponent;
056
057 private boolean isStarted;
058
059 private int index;
060
061 private MultiAppletStub multiAppletStub;
062
063 //////////////////////////////////////////////////////////////////////
064 //////////////////////////////////////////////////////////////////////
065
066 /*********************************************************************
067 * Test method.
068 *********************************************************************/
069 public static void main ( String [ ] args )
070 //////////////////////////////////////////////////////////////////////
071 {
072 launch (
073 CroftSoftConstants.DEFAULT_APPLET_INFO,
074 new Pair [ ] {
075 new Pair ( "Applet1", "javax.swing.JApplet" ),
076 new Pair ( "Applet2", "javax.swing.JApplet" ) },
077 DEFAULT_NEWS_NAME,
078 ( String ) null,
079 CroftSoftConstants.HOME_PAGE,
080 "CroftSoft MultiApplet",
081 CroftSoftConstants.FRAME_ICON_FILENAME,
082 MultiApplet.class.getClassLoader ( ),
083 ( Dimension ) null,
084 "Close CroftSoft MultiApplet?" );
085 }
086
087 public static void launch (
088 String appletInfo,
089 Pair [ ] appletPairs,
090 String newsName,
091 String newsHTML,
092 String newsPage,
093 String frameTitle,
094 String frameIconFilename,
095 ClassLoader frameIconClassLoader,
096 Dimension frameSize,
097 String shutdownConfirmationPrompt )
098 //////////////////////////////////////////////////////////////////////
099 {
100 JFrame jFrame = new JFrame ( frameTitle );
101
102 try
103 {
104 // Using ImageLib.loadBufferedImage()
105 // since ImageIO.read(URL) buggy
106
107 Image iconImage = ImageLib.loadBufferedImage (
108 frameIconFilename, frameIconClassLoader );
109
110 if ( iconImage != null )
111 {
112 jFrame.setIconImage ( iconImage );
113 }
114 }
115 catch ( Exception ex )
116 {
117 }
118
119 MultiApplet multiApplet = new MultiApplet (
120 appletInfo, appletPairs, newsName, newsHTML, newsPage );
121
122 jFrame.setContentPane ( multiApplet );
123
124 FullScreenToggler.monitor ( jFrame );
125
126 LifecycleWindowListener.launchFrameAsDesktopApp (
127 jFrame,
128 new Lifecycle [ ] { multiApplet },
129 frameSize,
130 shutdownConfirmationPrompt );
131 }
132
133 //////////////////////////////////////////////////////////////////////
134 // constructor methods
135 //////////////////////////////////////////////////////////////////////
136
137 public MultiApplet (
138 String appletInfo,
139 Pair [ ] appletPairs,
140 String newsName,
141 String newsHTML,
142 String newsPage )
143 //////////////////////////////////////////////////////////////////////
144 {
145 NullArgumentException.check ( this.appletInfo = appletInfo );
146
147 NullArgumentException.check ( this.appletPairs = appletPairs );
148
149 NullArgumentException.check ( this.newsName = newsName );
150
151 this.newsHTML = newsHTML;
152
153 this.newsPage = newsPage;
154 }
155
156 //////////////////////////////////////////////////////////////////////
157 //////////////////////////////////////////////////////////////////////
158
159 public String getAppletInfo ( )
160 //////////////////////////////////////////////////////////////////////
161 {
162 return appletInfo;
163 }
164
165 //////////////////////////////////////////////////////////////////////
166 //////////////////////////////////////////////////////////////////////
167
168 public void init ( )
169 //////////////////////////////////////////////////////////////////////
170 {
171 Container contentPane = getContentPane ( );
172
173 contentPane.setLayout ( new BorderLayout ( ) );
174
175 jTabbedPane = new JTabbedPane (
176 JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT );
177
178 contentPane.add ( jTabbedPane, BorderLayout.CENTER );
179
180 jTabbedPane.add (
181 new MultiAppletNews ( newsHTML, newsPage, this ), newsName );
182
183 for ( int i = 0; i < appletPairs.length; i++ )
184 {
185 jTabbedPane.add ( new JPanel ( ), appletPairs [ i ].name );
186 }
187
188 jTabbedPane.addChangeListener (
189 new ChangeListener ( )
190 {
191 public void stateChanged ( ChangeEvent changeEvent )
192 {
193 handleStateChange ( );
194 }
195 } );
196
197 multiAppletStub = new MultiAppletStub ( this );
198 }
199
200 public void start ( )
201 //////////////////////////////////////////////////////////////////////
202 {
203 multiAppletStub.setActive ( true );
204
205 try
206 {
207 if ( appletComponent instanceof Applet )
208 {
209 ( ( Applet ) appletComponent ).start ( );
210 }
211 else if ( appletComponent instanceof Lifecycle )
212 {
213 ( ( Lifecycle ) appletComponent ).start ( );
214 }
215 }
216 catch ( Exception ex )
217 {
218 ex.printStackTrace ( );
219 }
220
221 isStarted = true;
222 }
223
224 public void stop ( )
225 //////////////////////////////////////////////////////////////////////
226 {
227 multiAppletStub.setActive ( false );
228
229 try
230 {
231 if ( appletComponent instanceof Applet )
232 {
233 ( ( Applet ) appletComponent ).stop ( );
234 }
235 else if ( appletComponent instanceof Lifecycle )
236 {
237 ( ( Lifecycle ) appletComponent ).stop ( );
238 }
239 }
240 catch ( Exception ex )
241 {
242 ex.printStackTrace ( );
243 }
244
245 isStarted = false;
246 }
247
248 public synchronized void destroy ( )
249 //////////////////////////////////////////////////////////////////////
250 {
251 try
252 {
253 if ( appletComponent instanceof Applet )
254 {
255 ( ( Applet ) appletComponent ).destroy ( );
256 }
257 else if ( appletComponent instanceof Lifecycle )
258 {
259 ( ( Lifecycle ) appletComponent ).destroy ( );
260 }
261 }
262 catch ( Exception ex )
263 {
264 ex.printStackTrace ( );
265 }
266 }
267
268 //////////////////////////////////////////////////////////////////////
269 //////////////////////////////////////////////////////////////////////
270
271 private void handleStateChange ( )
272 //////////////////////////////////////////////////////////////////////
273 {
274 if ( isStarted )
275 {
276 stop ( );
277 }
278
279 if ( index > 0 )
280 {
281 jTabbedPane.setComponentAt ( index, new JPanel ( ) );
282
283 destroy ( );
284
285 appletComponent = null;
286
287 System.gc ( );
288 }
289
290 index = jTabbedPane.getSelectedIndex ( );
291
292 if ( index > 0 )
293 {
294 try
295 {
296 appletComponent = ( Component ) Class.forName (
297 appletPairs [ index - 1 ].value ).newInstance ( );
298
299 if ( appletComponent instanceof Applet )
300 {
301 ( ( Applet ) appletComponent ).setStub ( multiAppletStub );
302 }
303
304 if ( appletComponent instanceof JComponent )
305 {
306 FullScreenToggler.monitor ( ( JComponent ) appletComponent );
307 }
308
309 jTabbedPane.setComponentAt ( index, appletComponent );
310
311 try
312 {
313 if ( appletComponent instanceof Applet )
314 {
315 ( ( Applet ) appletComponent ).init ( );
316 }
317 else if ( appletComponent instanceof Lifecycle )
318 {
319 ( ( Lifecycle ) appletComponent ).init ( );
320 }
321 }
322 catch ( Exception ex )
323 {
324 ex.printStackTrace ( );
325 }
326
327 start ( );
328 }
329 catch ( Exception ex )
330 {
331 ex.printStackTrace ( );
332 }
333 }
334 }
335
336 //////////////////////////////////////////////////////////////////////
337 //////////////////////////////////////////////////////////////////////
338 }