EMMA Coverage Report (generated Tue May 18 22:20:04 CDT 2004)
[all classes][default package]

COVERAGE SUMMARY FOR SOURCE FILE [SwingSet2.java]

nameclass, %method, %block, %line, %
SwingSet2.java96%  (22/23)78%  (69/88)80%  (1984/2475)80%  (397.5/497)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class SwingSet2$AboutPanel0%   (0/1)0%   (0/3)0%   (0/45)0%   (0/11)
SwingSet2$AboutPanel (SwingSet2, SwingSet2): void 0%   (0/1)0%   (0/24)0%   (0/7)
getPreferredSize (): Dimension 0%   (0/1)0%   (0/10)0%   (0/1)
paint (Graphics): void 0%   (0/1)0%   (0/11)0%   (0/3)
     
class SwingSet2$AboutAction100% (1/1)50%  (1/2)9%   (10/106)21%  (4/19)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/96)0%   (0/15)
SwingSet2$AboutAction (SwingSet2, SwingSet2): void 100% (1/1)100% (10/10)100% (4/4)
     
class SwingSet2$ActivatePopupMenuAction100% (1/1)50%  (1/2)32%  (13/41)56%  (5/9)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/28)0%   (0/4)
SwingSet2$ActivatePopupMenuAction (SwingSet2, SwingSet2, JPopupMenu): void 100% (1/1)100% (13/13)100% (5/5)
     
class SwingSet2$ToolBarPanel100% (1/1)50%  (2/4)49%  (30/61)31%  (5/16)
componentAdded (ContainerEvent): void 0%   (0/1)0%   (0/13)0%   (0/5)
componentRemoved (ContainerEvent): void 0%   (0/1)0%   (0/13)0%   (0/5)
contains (int, int): boolean 100% (1/1)83%  (24/29)80%  (4/5)
SwingSet2$ToolBarPanel (SwingSet2): void 100% (1/1)100% (6/6)100% (1/1)
     
class SwingSet2$DefaultAudioAction100% (1/1)50%  (1/2)53%  (10/19)57%  (4/7)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/9)0%   (0/3)
SwingSet2$DefaultAudioAction (SwingSet2, SwingSet2): void 100% (1/1)100% (10/10)100% (4/4)
     
class SwingSet2$OffAudioAction100% (1/1)50%  (1/2)53%  (10/19)57%  (4/7)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/9)0%   (0/3)
SwingSet2$OffAudioAction (SwingSet2, SwingSet2): void 100% (1/1)100% (10/10)100% (4/4)
     
class SwingSet2$OnAudioAction100% (1/1)50%  (1/2)53%  (10/19)57%  (4/7)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/9)0%   (0/3)
SwingSet2$OnAudioAction (SwingSet2, SwingSet2): void 100% (1/1)100% (10/10)100% (4/4)
     
class SwingSet2$ToolTipAction100% (1/1)50%  (1/2)72%  (13/18)71%  (5/7)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/5)0%   (0/2)
SwingSet2$ToolTipAction (SwingSet2, SwingSet2, boolean): void 100% (1/1)100% (13/13)100% (5/5)
     
class SwingSet2$ExitAction100% (1/1)50%  (1/2)77%  (10/13)67%  (4/6)
actionPerformed (ActionEvent): void 0%   (0/1)0%   (0/3)0%   (0/2)
SwingSet2$ExitAction (SwingSet2, SwingSet2): void 100% (1/1)100% (10/10)100% (4/4)
     
class SwingSet2100% (1/1)85%  (35/41)86%  (1535/1790)86%  (282.5/327)
SwingSet2 (SwingSet2Applet): void 0%   (0/1)0%   (0/5)0%   (0/2)
createMultiscreenMenuItem (JMenu, int): JMenuItem 0%   (0/1)0%   (0/74)0%   (0/10)
debug (String): void 0%   (0/1)0%   (0/22)0%   (0/3)
getApplet (): SwingSet2Applet 0%   (0/1)0%   (0/3)0%   (0/1)
getContentPane (): Container 0%   (0/1)0%   (0/23)0%   (0/6)
getMenuBar (): JMenuBar 0%   (0/1)0%   (0/3)0%   (0/1)
getString (String): String 100% (1/1)35%  (12/34)62%  (5/8)
showSplashScreen (): void 100% (1/1)47%  (8/17)50%  (3/6)
createFrame (GraphicsConfiguration): JFrame 100% (1/1)65%  (13/20)67%  (4/6)
loadDemos (): void 100% (1/1)70%  (19/27)85%  (4.3/5)
isApplet (): boolean 100% (1/1)71%  (5/7)71%  (0.7/1)
updateLookAndFeel (): void 100% (1/1)76%  (53/70)76%  (13/17)
loadDemo (String): void 100% (1/1)84%  (58/69)80%  (8/10)
setLookAndFeel (String): void 100% (1/1)88%  (15/17)97%  (4.8/5)
createMenus (): JMenuBar 100% (1/1)91%  (383/421)89%  (50/56)
showSwingSet2 (): void 100% (1/1)91%  (91/100)98%  (14.7/15)
<static initializer> 100% (1/1)100% (17/17)100% (4/4)
SwingSet2 (SwingSet2Applet, GraphicsConfiguration): void 100% (1/1)100% (228/228)100% (46/46)
addDemo (DemoModule): DemoModule 100% (1/1)100% (13/13)100% (3/3)
createAudioMenuItem (JMenu, String, String, String, Action): JMenuItem 100% (1/1)100% (30/30)100% (6/6)
createImageIcon (String, String): ImageIcon 100% (1/1)100% (17/17)100% (2/2)
createLafMenuItem (JMenu, String, String, String, String): JMenuItem 100% (1/1)100% (40/40)100% (7/7)
createMenuItem (JMenu, String, String, String, Action): JMenuItem 100% (1/1)100% (30/30)100% (7/7)
createPopupMenu (): JPopupMenu 100% (1/1)100% (67/67)100% (10/10)
createPopupMenuItem (JPopupMenu, String, String, String, String): JMenuItem 100% (1/1)100% (39/39)100% (7/7)
createSplashScreen (): void 100% (1/1)100% (66/66)100% (8/8)
createThemesMenuItem (JMenu, String, String, String, DefaultMetalTheme): JMen... 100% (1/1)100% (35/35)100% (6/6)
createToolTipMenuItem (JMenu, String, String, String, Action): JMenuItem 100% (1/1)100% (30/30)100% (6/6)
getFrame (): JFrame 100% (1/1)100% (3/3)100% (1/1)
getMnemonic (String): char 100% (1/1)100% (6/6)100% (1/1)
getResourceBundle (): ResourceBundle 100% (1/1)100% (10/10)100% (3/3)
getToolBar (): SwingSet2$ToggleButtonToolBar 100% (1/1)100% (3/3)100% (1/1)
getToolBarGroup (): ButtonGroup 100% (1/1)100% (3/3)100% (1/1)
hideSplash (): void 100% (1/1)100% (14/14)100% (5/5)
initializeDemo (): void 100% (1/1)100% (145/145)100% (28/28)
isAvailableLookAndFeel (String): boolean 100% (1/1)100% (13/13)100% (5/5)
main (String []): void 100% (1/1)100% (9/9)100% (2/2)
preloadFirstDemo (): void 100% (1/1)100% (11/11)100% (3/3)
setDemo (DemoModule): void 100% (1/1)100% (33/33)100% (9/9)
setSourceCode (DemoModule): void 100% (1/1)100% (8/8)100% (2/2)
setStatus (String): void 100% (1/1)100% (8/8)100% (2/2)
     
class SwingSet2$SwingSetRunnable100% (1/1)50%  (1/2)92%  (12/13)80%  (4/5)
run (): void 0%   (0/1)0%   (0/1)0%   (0/1)
SwingSet2$SwingSetRunnable (SwingSet2, SwingSet2, Object): void 100% (1/1)100% (12/12)100% (4/4)
     
class SwingSet2$1100% (1/1)100% (2/2)100% (10/10)100% (3/3)
SwingSet2$1 (SwingSet2): void 100% (1/1)100% (6/6)100% (1/1)
run (): void 100% (1/1)100% (4/4)100% (2/2)
     
class SwingSet2$2100% (1/1)100% (2/2)100% (13/13)100% (4/4)
SwingSet2$2 (SwingSet2): void 100% (1/1)100% (6/6)100% (1/1)
run (): void 100% (1/1)100% (7/7)100% (3/3)
     
class SwingSet2$3100% (1/1)100% (2/2)100% (72/72)100% (11/11)
SwingSet2$3 (SwingSet2, SwingSet2, Object): void 100% (1/1)100% (9/9)100% (1/1)
run (): void 100% (1/1)100% (63/63)100% (10/10)
     
class SwingSet2$5100% (1/1)100% (2/2)100% (17/17)100% (3/3)
SwingSet2$5 (SwingSet2, SwingSet2, Object): void 100% (1/1)100% (9/9)100% (1/1)
run (): void 100% (1/1)100% (8/8)100% (2/2)
     
class SwingSet2$6100% (1/1)100% (2/2)100% (15/15)100% (3/3)
SwingSet2$6 (SwingSet2, SwingSet2, Object): void 100% (1/1)100% (9/9)100% (1/1)
run (): void 100% (1/1)100% (6/6)100% (2/2)
     
class SwingSet2$7100% (1/1)100% (2/2)100% (23/23)100% (4/4)
SwingSet2$7 (SwingSet2, SwingSet2, Object): void 100% (1/1)100% (9/9)100% (1/1)
run (): void 100% (1/1)100% (14/14)100% (3/3)
     
class SwingSet2$ChangeLookAndFeelAction100% (1/1)100% (2/2)100% (19/19)100% (7/7)
SwingSet2$ChangeLookAndFeelAction (SwingSet2, SwingSet2, String): void 100% (1/1)100% (13/13)100% (5/5)
actionPerformed (ActionEvent): void 100% (1/1)100% (6/6)100% (2/2)
     
class SwingSet2$ChangeThemeAction100% (1/1)100% (2/2)100% (20/20)100% (8/8)
SwingSet2$ChangeThemeAction (SwingSet2, SwingSet2, DefaultMetalTheme): void 100% (1/1)100% (13/13)100% (5/5)
actionPerformed (ActionEvent): void 100% (1/1)100% (7/7)100% (3/3)
     
class SwingSet2$DemoLoadThread100% (1/1)100% (2/2)100% (13/13)100% (5/5)
SwingSet2$DemoLoadThread (SwingSet2, SwingSet2): void 100% (1/1)100% (9/9)100% (3/3)
run (): void 100% (1/1)100% (4/4)100% (2/2)
     
class SwingSet2$SwitchToDemoAction100% (1/1)100% (2/2)100% (22/22)100% (7/7)
SwingSet2$SwitchToDemoAction (SwingSet2, SwingSet2, DemoModule): void 100% (1/1)100% (16/16)100% (5/5)
actionPerformed (ActionEvent): void 100% (1/1)100% (6/6)100% (2/2)
     
class SwingSet2$TabListener100% (1/1)100% (2/2)100% (64/64)100% (10/10)
SwingSet2$TabListener (SwingSet2): void 100% (1/1)100% (6/6)100% (1/1)
stateChanged (ChangeEvent): void 100% (1/1)100% (58/58)100% (9/9)
     
class SwingSet2$ToggleButtonToolBar100% (1/1)100% (2/2)100% (43/43)100% (11/11)
SwingSet2$ToggleButtonToolBar (SwingSet2): void 100% (1/1)100% (6/6)100% (3/3)
addToggleButton (Action): JToggleButton 100% (1/1)100% (37/37)100% (8/8)

1/*
2 * Copyright (c) 2003 Sun Microsystems, Inc. All  Rights Reserved.
3 * 
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 
8 * -Redistributions of source code must retain the above copyright
9 *  notice, this list of conditions and the following disclaimer.
10 * 
11 * -Redistribution in binary form must reproduct the above copyright
12 *  notice, this list of conditions and the following disclaimer in
13 *  the documentation and/or other materials provided with the distribution.
14 * 
15 * Neither the name of Sun Microsystems, Inc. or the names of contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 * 
19 * This software is provided "AS IS," without a warranty of any kind. ALL
20 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
21 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
22 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT
23 * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
24 * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR ITS
25 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
26 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
27 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
28 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN
29 * IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
30 * 
31 * You acknowledge that Software is not designed, licensed or intended for
32 * use in the design, construction, operation or maintenance of any nuclear
33 * facility.
34 */
35 
36/*
37 * @(#)SwingSet2.java        1.35 03/01/23
38 */
39 
40import javax.swing.*;
41import javax.swing.event.*;
42import javax.swing.text.*;
43import javax.swing.border.*;
44import javax.swing.colorchooser.*;
45import javax.swing.filechooser.*;
46import javax.accessibility.*;
47 
48import javax.swing.plaf.metal.DefaultMetalTheme;
49import javax.swing.plaf.metal.MetalLookAndFeel;
50 
51import java.lang.reflect.*;
52import java.awt.*;
53import java.awt.event.*;
54import java.beans.*;
55import java.util.*;
56import java.io.*;
57import java.applet.*;
58import java.net.*;
59 
60/**
61 * A demo that shows all of the Swing components.
62 *
63 * @version 1.35 01/23/03
64 * @author Jeff Dinkins
65 */
66public class SwingSet2 extends JPanel {
67 
68    String[] demos = {
69      "ButtonDemo",
70      "ColorChooserDemo",
71      "ComboBoxDemo",
72      "FileChooserDemo",
73      "HtmlDemo",
74      "ListDemo",
75      "OptionPaneDemo",
76      "ProgressBarDemo",
77      "ScrollPaneDemo",
78      "SliderDemo",
79      "SplitPaneDemo",
80      "TabbedPaneDemo",
81      "TableDemo",
82      "ToolTipDemo",
83      "TreeDemo"
84    };
85 
86    void loadDemos() {
87        for(int i = 0; i < demos.length;) {
88            if(isApplet() && demos[i].equals("FileChooserDemo")) {
89               // don't load the file chooser demo if we are
90               // an applet
91            } else {
92               loadDemo(demos[i]);
93            }
94            i++;
95        }
96    }
97 
98    // Possible Look & Feels
99    private static final String mac      =
100            "com.sun.java.swing.plaf.mac.MacLookAndFeel";
101    private static final String metal    =
102            "javax.swing.plaf.metal.MetalLookAndFeel";
103    private static final String motif    =
104            "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
105    private static final String windows  =
106            "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
107    private static final String gtk  =
108            "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
109 
110    // The current Look & Feel
111    private static String currentLookAndFeel = metal;
112 
113    // List of demos
114    private Vector demosVector = new Vector();
115 
116    // The preferred size of the demo
117    private static final int PREFERRED_WIDTH = 720;
118    private static final int PREFERRED_HEIGHT = 640;
119    
120    // Box spacers
121    private Dimension HGAP = new Dimension(1,5);
122    private Dimension VGAP = new Dimension(5,1);
123 
124    // Resource bundle for internationalized and accessible text
125    private ResourceBundle bundle = null;
126 
127    // A place to hold on to the visible demo
128    private DemoModule currentDemo = null;
129    private JPanel demoPanel = null;
130 
131    // About Box
132    private JDialog aboutBox = null;
133 
134    // Status Bar
135    private JTextField statusField = null;
136 
137    // Tool Bar
138    private ToggleButtonToolBar toolbar = null;
139    private ButtonGroup toolbarGroup = new ButtonGroup();
140 
141    // Menus
142    private JMenuBar menuBar = null;
143    private JMenu lafMenu = null;
144    private JMenu themesMenu = null;
145    private JMenu audioMenu = null;
146    private JMenu toolTipMenu = null;
147    private ButtonGroup lafMenuGroup = new ButtonGroup();
148    private ButtonGroup themesMenuGroup = new ButtonGroup();
149    private ButtonGroup audioMenuGroup = new ButtonGroup();
150    private ButtonGroup toolTipMenuGroup = new ButtonGroup();
151 
152    // Popup menu
153    private JPopupMenu popupMenu = null;
154    private ButtonGroup popupMenuGroup = new ButtonGroup();
155 
156    // Used only if swingset is an application 
157    private JFrame frame = null;
158    private JWindow splashScreen = null;
159 
160    // Used only if swingset is an applet 
161    private SwingSet2Applet applet = null;
162 
163    // To debug or not to debug, that is the question
164    private boolean DEBUG = true;
165    private int debugCounter = 0;
166 
167    // The tab pane that holds the demo
168    private JTabbedPane tabbedPane = null;
169 
170    private JEditorPane demoSrcPane = null;
171 
172    private JLabel splashLabel = null;
173 
174    // contentPane cache, saved from the applet or application frame
175    Container contentPane = null;
176 
177 
178    // number of swingsets - for multiscreen
179    // keep track of the number of SwingSets created - we only want to exit
180    // the program when the last one has been closed.
181    private static int numSSs = 0;
182    private static Vector swingSets = new Vector();
183 
184    public SwingSet2(SwingSet2Applet applet) {
185        this(applet, null);
186    }
187 
188    /**
189     * SwingSet2 Constructor
190     */
191    public SwingSet2(SwingSet2Applet applet, GraphicsConfiguration gc) {
192 
193        // Note that the applet may null if this is started as an application
194        this.applet = applet;
195 
196    // Create Frame here for app-mode so the splash screen can get the
197    // GraphicsConfiguration from it in createSplashScreen()
198    if (!isApplet()) {
199        frame = createFrame(gc);
200    }
201 
202        // setLayout(new BorderLayout());
203        setLayout(new BorderLayout());
204 
205        // set the preferred size of the demo
206        setPreferredSize(new Dimension(PREFERRED_WIDTH,PREFERRED_HEIGHT));
207 
208        // Create and throw the splash screen up. Since this will
209        // physically throw bits on the screen, we need to do this
210        // on the GUI thread using invokeLater.
211        createSplashScreen();
212 
213        // do the following on the gui thread
214        SwingUtilities.invokeLater(new Runnable() {
215            public void run() {
216                showSplashScreen();
217            }
218        });
219            
220        initializeDemo();
221        preloadFirstDemo();
222 
223        // Show the demo and take down the splash screen. Note that
224        // we again must do this on the GUI thread using invokeLater.
225        SwingUtilities.invokeLater(new Runnable() {
226            public void run() {
227                showSwingSet2();
228                hideSplash();
229            }
230        });
231 
232        // Start loading the rest of the demo in the background
233        DemoLoadThread demoLoader = new DemoLoadThread(this);
234        demoLoader.start();
235    }
236 
237 
238    /**
239     * SwingSet2 Main. Called only if we're an application, not an applet.
240     */
241    public static void main(String[] args) {
242    // Create SwingSet on the default monitor
243        SwingSet2 swingset = new SwingSet2(null, GraphicsEnvironment.
244                                             getLocalGraphicsEnvironment().
245                                             getDefaultScreenDevice().
246                                             getDefaultConfiguration());
247    }
248 
249    // *******************************************************
250    // *************** Demo Loading Methods ******************
251    // *******************************************************
252    
253    
254    
255    public void initializeDemo() {
256        JPanel top = new JPanel();
257        top.setLayout(new BorderLayout());
258        add(top, BorderLayout.NORTH);
259 
260        menuBar = createMenus();
261        top.add(menuBar, BorderLayout.NORTH);
262 
263         // creates popup menu accessible via keyboard
264         popupMenu = createPopupMenu();
265 
266        ToolBarPanel toolbarPanel = new ToolBarPanel();
267        toolbarPanel.setLayout(new BorderLayout());
268        toolbar = new ToggleButtonToolBar();
269        toolbarPanel.add(toolbar, BorderLayout.CENTER);
270        top.add(toolbarPanel, BorderLayout.SOUTH);
271        toolbarPanel.addContainerListener(toolbarPanel);
272 
273        tabbedPane = new JTabbedPane();
274        add(tabbedPane, BorderLayout.CENTER);
275        tabbedPane.getModel().addChangeListener(new TabListener());
276 
277        statusField = new JTextField("");
278        statusField.setEditable(false);
279        add(statusField, BorderLayout.SOUTH);
280        
281        demoPanel = new JPanel();
282        demoPanel.setLayout(new BorderLayout());
283        demoPanel.setBorder(new EtchedBorder());
284        tabbedPane.addTab("Hi There!", demoPanel);
285        
286        // Add html src code viewer 
287        demoSrcPane = new JEditorPane("text/html", getString("SourceCode.loading"));
288        demoSrcPane.setEditable(false);
289    
290        JScrollPane scroller = new JScrollPane();
291        scroller.getViewport().add(demoSrcPane);
292    
293        tabbedPane.addTab(
294            getString("TabbedPane.src_label"),
295            null,
296            scroller,
297            getString("TabbedPane.src_tooltip")
298        );
299    }
300 
301    DemoModule currentTabDemo = null;
302    class TabListener implements ChangeListener {
303        public void stateChanged(ChangeEvent e) {
304            SingleSelectionModel model = (SingleSelectionModel) e.getSource();
305            boolean srcSelected = model.getSelectedIndex() == 1;
306            if(currentTabDemo != currentDemo && demoSrcPane != null && srcSelected) {
307                demoSrcPane.setText(getString("SourceCode.loading"));
308                repaint();
309            }
310            if(currentTabDemo != currentDemo && srcSelected) {
311                currentTabDemo = currentDemo;
312                setSourceCode(currentDemo);
313            } 
314        }
315    }
316 
317 
318    /**
319     * Create menus
320     */
321    public JMenuBar createMenus() {
322        JMenuItem mi;
323        // ***** create the menubar ****
324        JMenuBar menuBar = new JMenuBar();
325        menuBar.getAccessibleContext().setAccessibleName(
326            getString("MenuBar.accessible_description"));
327 
328        // ***** create File menu 
329        JMenu fileMenu = (JMenu) menuBar.add(new JMenu(getString("FileMenu.file_label")));
330        fileMenu.setMnemonic(getMnemonic("FileMenu.file_mnemonic"));
331        fileMenu.getAccessibleContext().setAccessibleDescription(getString("FileMenu.accessible_description"));
332 
333        createMenuItem(fileMenu, "FileMenu.about_label", "FileMenu.about_mnemonic",
334                       "FileMenu.about_accessible_description", new AboutAction(this));
335 
336        fileMenu.addSeparator();
337 
338        createMenuItem(fileMenu, "FileMenu.open_label", "FileMenu.open_mnemonic",
339                       "FileMenu.open_accessible_description", null);
340 
341        createMenuItem(fileMenu, "FileMenu.save_label", "FileMenu.save_mnemonic",
342                       "FileMenu.save_accessible_description", null);
343 
344        createMenuItem(fileMenu, "FileMenu.save_as_label", "FileMenu.save_as_mnemonic",
345                       "FileMenu.save_as_accessible_description", null);
346 
347 
348        if(!isApplet()) {
349            fileMenu.addSeparator();
350            
351            createMenuItem(fileMenu, "FileMenu.exit_label", "FileMenu.exit_mnemonic",
352                           "FileMenu.exit_accessible_description", new ExitAction(this)
353            );
354        }
355 
356        // Create these menu items for the first SwingSet only.
357        if (numSSs == 0) {
358        // ***** create laf switcher menu 
359        lafMenu = (JMenu) menuBar.add(new JMenu(getString("LafMenu.laf_label")));
360        lafMenu.setMnemonic(getMnemonic("LafMenu.laf_mnemonic"));
361        lafMenu.getAccessibleContext().setAccessibleDescription(
362            getString("LafMenu.laf_accessible_description"));
363 
364        mi = createLafMenuItem(lafMenu, "LafMenu.java_label", "LafMenu.java_mnemonic",
365                       "LafMenu.java_accessible_description", metal);
366        mi.setSelected(true); // this is the default l&f
367 
368        createLafMenuItem(lafMenu, "LafMenu.mac_label", "LafMenu.mac_mnemonic",
369                       "LafMenu.mac_accessible_description", mac);
370 
371        createLafMenuItem(lafMenu, "LafMenu.motif_label", "LafMenu.motif_mnemonic",
372                       "LafMenu.motif_accessible_description", motif);
373 
374        createLafMenuItem(lafMenu, "LafMenu.windows_label", "LafMenu.windows_mnemonic",
375                       "LafMenu.windows_accessible_description", windows);
376 
377        createLafMenuItem(lafMenu, "LafMenu.gtk_label", "LafMenu.gtk_mnemonic",
378                       "LafMenu.gtk_accessible_description", gtk);
379 
380        // ***** create themes menu 
381        themesMenu = (JMenu) menuBar.add(new JMenu(getString("ThemesMenu.themes_label")));
382        themesMenu.setMnemonic(getMnemonic("ThemesMenu.themes_mnemonic"));
383        themesMenu.getAccessibleContext().setAccessibleDescription(
384            getString("ThemesMenu.themes_accessible_description"));
385 
386        // ***** create the audio submenu under the theme menu
387        audioMenu = (JMenu) themesMenu.add(new JMenu(getString("AudioMenu.audio_label")));
388        audioMenu.setMnemonic(getMnemonic("AudioMenu.audio_mnemonic"));
389        audioMenu.getAccessibleContext().setAccessibleDescription(
390            getString("AudioMenu.audio_accessible_description"));
391 
392        createAudioMenuItem(audioMenu, "AudioMenu.on_label",
393                            "AudioMenu.on_mnemonic", 
394                            "AudioMenu.on_accessible_description",
395                            new OnAudioAction(this));
396 
397        mi = createAudioMenuItem(audioMenu, "AudioMenu.default_label",
398                                 "AudioMenu.default_mnemonic", 
399                                 "AudioMenu.default_accessible_description",
400                                 new DefaultAudioAction(this));
401        mi.setSelected(true); // This is the default feedback setting
402 
403        createAudioMenuItem(audioMenu, "AudioMenu.off_label",
404                            "AudioMenu.off_mnemonic", 
405                            "AudioMenu.off_accessible_description",
406                            new OffAudioAction(this));
407 
408        // *** now back to adding color/font themes to the theme menu
409        mi = createThemesMenuItem(themesMenu, "ThemesMenu.default_label", "ThemesMenu.default_mnemonic",
410                       "ThemesMenu.default_accessible_description", new DefaultMetalTheme());
411        mi.setSelected(true); // This is the default theme
412        
413        createThemesMenuItem(themesMenu, "ThemesMenu.aqua_label", "ThemesMenu.aqua_mnemonic",
414                       "ThemesMenu.aqua_accessible_description", new AquaTheme());
415 
416        createThemesMenuItem(themesMenu, "ThemesMenu.charcoal_label", "ThemesMenu.charcoal_mnemonic",
417                       "ThemesMenu.charcoal_accessible_description", new CharcoalTheme());
418 
419        createThemesMenuItem(themesMenu, "ThemesMenu.contrast_label", "ThemesMenu.contrast_mnemonic",
420                       "ThemesMenu.contrast_accessible_description", new ContrastTheme());
421 
422        createThemesMenuItem(themesMenu, "ThemesMenu.emerald_label", "ThemesMenu.emerald_mnemonic",
423                       "ThemesMenu.emerald_accessible_description", new EmeraldTheme());
424 
425        createThemesMenuItem(themesMenu, "ThemesMenu.ruby_label", "ThemesMenu.ruby_mnemonic",
426                       "ThemesMenu.ruby_accessible_description", new RubyTheme());
427 
428        // ***** create the tooltip menu.
429        toolTipMenu = (JMenu) menuBar.add(new JMenu(
430                getString("ToolTipMenu.tooltip_label")));
431        toolTipMenu.setMnemonic(getMnemonic("ToolTipMenu.tooltip_mnemonic"));
432        toolTipMenu.getAccessibleContext().setAccessibleDescription(
433            getString("ToolTipMenu.tooltip_accessible_description"));
434 
435        // ***** create tool tip submenu items.
436        mi = createToolTipMenuItem(toolTipMenu, "ToolTipMenu.on_label",
437                "ToolTipMenu.on_mnemonic",
438                "ToolTipMenu.on_accessible_description",
439                new ToolTipAction(this, true));
440        mi.setSelected(true);
441 
442        createToolTipMenuItem(toolTipMenu, "ToolTipMenu.off_label",
443                "ToolTipMenu.off_mnemonic",
444                "ToolTipMenu.off_accessible_description",
445                new ToolTipAction(this, false));
446        }
447 
448 
449        // ***** create the multiscreen menu, if we have multiple screens
450    if (!isApplet()) {
451        GraphicsDevice[] screens = GraphicsEnvironment.
452                                    getLocalGraphicsEnvironment().
453                                    getScreenDevices();
454        if (screens.length > 1) {
455 
456            JMenu multiScreenMenu = (JMenu) menuBar.add(new JMenu(
457                                     getString("MultiMenu.multi_label")));
458 
459            multiScreenMenu.setMnemonic(getMnemonic("MultiMenu.multi_mnemonic"));    
460            multiScreenMenu.getAccessibleContext().setAccessibleDescription(
461             getString("MultiMenu.multi_accessible_description"));
462 
463            createMultiscreenMenuItem(multiScreenMenu, MultiScreenAction.ALL_SCREENS);
464            for (int i = 0; i < screens.length; i++) {
465                createMultiscreenMenuItem(multiScreenMenu, i);
466            }
467        }
468    }
469 
470        return menuBar;
471    }
472 
473    /**
474     * Create the tool tip submenu
475     */
476    public JMenuItem createToolTipMenuItem(JMenu menu, String label,
477                                           String mnemonic,
478                                           String accessibleDescription,
479                                           Action action) {
480        JRadioButtonMenuItem mi = (JRadioButtonMenuItem)menu.add(
481                new JRadioButtonMenuItem(getString(label)));
482        toolTipMenuGroup.add(mi);
483        mi.setMnemonic(getMnemonic(mnemonic));
484        mi.getAccessibleContext().setAccessibleDescription(getString(
485                accessibleDescription));
486        mi.addActionListener(action);
487 
488        return mi;
489    }
490 
491    /**
492     * Create the theme's audio submenu
493     */
494    public JMenuItem createAudioMenuItem(JMenu menu, String label,
495                                         String mnemonic,
496                                         String accessibleDescription,
497                                         Action action) {
498        JRadioButtonMenuItem mi = (JRadioButtonMenuItem) menu.add(new JRadioButtonMenuItem(getString(label)));
499        audioMenuGroup.add(mi);
500        mi.setMnemonic(getMnemonic(mnemonic));
501        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
502        mi.addActionListener(action);
503 
504        return mi;
505    }
506 
507    /**
508     * Creates a generic menu item
509     */
510    public JMenuItem createMenuItem(JMenu menu, String label, String mnemonic,
511                               String accessibleDescription, Action action) {
512        JMenuItem mi = (JMenuItem) menu.add(new JMenuItem(getString(label)));
513        mi.setMnemonic(getMnemonic(mnemonic));
514        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
515        mi.addActionListener(action);
516        if(action == null) {
517            mi.setEnabled(false);
518        }
519        return mi;
520    }
521 
522    /**
523     * Creates a JRadioButtonMenuItem for the Themes menu
524     */
525    public JMenuItem createThemesMenuItem(JMenu menu, String label, String mnemonic,
526                               String accessibleDescription, DefaultMetalTheme theme) {
527        JRadioButtonMenuItem mi = (JRadioButtonMenuItem) menu.add(new JRadioButtonMenuItem(getString(label)));
528        themesMenuGroup.add(mi);
529        mi.setMnemonic(getMnemonic(mnemonic));
530        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
531        mi.addActionListener(new ChangeThemeAction(this, theme));
532 
533        return mi;
534    }
535 
536    /**
537     * Creates a JRadioButtonMenuItem for the Look and Feel menu
538     */
539    public JMenuItem createLafMenuItem(JMenu menu, String label, String mnemonic,
540                               String accessibleDescription, String laf) {
541        JMenuItem mi = (JRadioButtonMenuItem) menu.add(new JRadioButtonMenuItem(getString(label)));
542        lafMenuGroup.add(mi);
543        mi.setMnemonic(getMnemonic(mnemonic));
544        mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
545        mi.addActionListener(new ChangeLookAndFeelAction(this, laf));
546 
547        mi.setEnabled(isAvailableLookAndFeel(laf));
548 
549        return mi;
550    }
551 
552    /**
553     * Creates a multi-screen menu item
554     */
555    public JMenuItem createMultiscreenMenuItem(JMenu menu, int screen) {
556        JMenuItem mi = null;
557        if (screen == MultiScreenAction.ALL_SCREENS) {
558            mi = (JMenuItem) menu.add(new JMenuItem(getString("MultiMenu.all_label")));
559            mi.setMnemonic(getMnemonic("MultiMenu.all_mnemonic"));
560            mi.getAccessibleContext().setAccessibleDescription(getString(
561                                                                 "MultiMenu.all_accessible_description"));
562        }
563        else {
564            mi = (JMenuItem) menu.add(new JMenuItem(getString("MultiMenu.single_label") + " " +
565                                                                                                 screen));
566            mi.setMnemonic(KeyEvent.VK_0 + screen);
567            mi.getAccessibleContext().setAccessibleDescription(getString(
568                                               "MultiMenu.single_accessible_description") + " " + screen);
569                                                                                            
570        }
571        mi.addActionListener(new MultiScreenAction(this, screen));
572        return mi;
573    }
574 
575    public JPopupMenu createPopupMenu() {
576         JPopupMenu popup = new JPopupMenu("JPopupMenu demo");
577        
578         createPopupMenuItem(popup, "LafMenu.java_label", "LafMenu.java_mnemonic",
579                            "LafMenu.java_accessible_description", metal);
580        
581         createPopupMenuItem(popup, "LafMenu.mac_label", "LafMenu.mac_mnemonic",
582                            "LafMenu.mac_accessible_description", mac);
583        
584         createPopupMenuItem(popup, "LafMenu.motif_label", "LafMenu.motif_mnemonic",
585                            "LafMenu.motif_accessible_description", motif);
586        
587         createPopupMenuItem(popup, "LafMenu.windows_label", "LafMenu.windows_mnemonic",
588                            "LafMenu.windows_accessible_description", windows);
589        
590        createPopupMenuItem(popup, "LafMenu.gtk_label", "LafMenu.gtk_mnemonic",
591                            "LafMenu.gtk_accessible_description", gtk);
592 
593         // register key binding to activate popup menu
594         InputMap map = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
595         map.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.CTRL_MASK),
596                 "postMenuAction");
597         getActionMap().put("postMenuAction", new ActivatePopupMenuAction(this, popup));
598         
599         return popup;
600    }
601    
602    /**
603     * Creates a JMenuItem for the Look and Feel popup menu
604     */
605    public JMenuItem createPopupMenuItem(JPopupMenu menu, String label, String mnemonic,
606                                          String accessibleDescription, String laf) {
607        JMenuItem mi = menu.add(new JMenuItem(getString(label)));
608        popupMenuGroup.add(mi);
609         mi.setMnemonic(getMnemonic(mnemonic));
610         mi.getAccessibleContext().setAccessibleDescription(getString(accessibleDescription));
611         mi.addActionListener(new ChangeLookAndFeelAction(this, laf));
612         mi.setEnabled(isAvailableLookAndFeel(laf));
613        
614         return mi;
615    }
616    
617 
618    /**
619     * Load the first demo. This is done separately from the remaining demos
620     * so that we can get SwingSet2 up and available to the user quickly.
621     */
622    public void preloadFirstDemo() {
623        DemoModule demo = addDemo(new InternalFrameDemo(this));
624        setDemo(demo);
625    }
626 
627 
628    /**
629     * Add a demo to the toolbar
630     */
631    public DemoModule addDemo(DemoModule demo) {
632        demosVector.addElement(demo);
633        // do the following on the gui thread
634        SwingUtilities.invokeLater(new SwingSetRunnable(this, demo) {
635            public void run() {
636                SwitchToDemoAction action = new SwitchToDemoAction(swingset, (DemoModule) obj);
637                JToggleButton tb = swingset.getToolBar().addToggleButton(action);
638                swingset.getToolBarGroup().add(tb);
639                if(swingset.getToolBarGroup().getSelection() == null) {
640                    tb.setSelected(true);
641                }
642                tb.setText(null);
643                tb.setToolTipText(((DemoModule)obj).getToolTip());
644 
645                if(demos[demos.length-1].equals(obj.getClass().getName())) {
646                     setStatus(getString("Status.popupMenuAccessible"));
647                } 
648                  
649            }
650        });
651        return demo;
652    }
653 
654 
655    /**
656     * Sets the current demo
657     */
658    public void setDemo(DemoModule demo) {
659        currentDemo = demo;
660 
661        // Ensure panel's UI is current before making visible
662        JComponent currentDemoPanel = demo.getDemoPanel();
663        SwingUtilities.updateComponentTreeUI(currentDemoPanel);
664 
665        demoPanel.removeAll();
666        demoPanel.add(currentDemoPanel, BorderLayout.CENTER);
667 
668        tabbedPane.setSelectedIndex(0);
669        tabbedPane.setTitleAt(0, demo.getName());
670        tabbedPane.setToolTipTextAt(0, demo.getToolTip());
671    }
672 
673 
674    /**
675     * Bring up the SwingSet2 demo by showing the frame (only
676     * applicable if coming up as an application, not an applet);
677     */
678    public void showSwingSet2() {
679        if(!isApplet() && getFrame() != null) {
680            // put swingset in a frame and show it
681            JFrame f = getFrame();
682            f.setTitle(getString("Frame.title"));
683            f.getContentPane().add(this, BorderLayout.CENTER);
684            f.pack();
685 
686            Rectangle screenRect = f.getGraphicsConfiguration().getBounds();
687            Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(
688                    f.getGraphicsConfiguration());
689 
690            // Make sure we don't place the demo off the screen.
691            int centerWidth = screenRect.width < f.getSize().width ?
692                    screenRect.x :
693                    screenRect.x + screenRect.width/2 - f.getSize().width/2;
694            int centerHeight = screenRect.height < f.getSize().height ?
695                    screenRect.y :
696                    screenRect.y + screenRect.height/2 - f.getSize().height/2;
697 
698            centerHeight = centerHeight < screenInsets.top ?
699                    screenInsets.top : centerHeight;
700 
701            f.setLocation(centerWidth, centerHeight);
702            f.show();
703            numSSs++;
704            swingSets.add(this);
705        } 
706    }
707 
708    /**
709     * Show the spash screen while the rest of the demo loads
710     */
711    public void createSplashScreen() {
712        splashLabel = new JLabel(createImageIcon("Splash.jpg", "Splash.accessible_description"));
713        
714        if(!isApplet()) {
715            splashScreen = new JWindow(getFrame());
716            splashScreen.getContentPane().add(splashLabel);
717            splashScreen.pack();
718            Rectangle screenRect = getFrame().getGraphicsConfiguration().getBounds();
719            splashScreen.setLocation(
720         screenRect.x + screenRect.width/2 - splashScreen.getSize().width/2,
721                 screenRect.y + screenRect.height/2 - splashScreen.getSize().height/2);
722        } 
723    }
724 
725    public void showSplashScreen() {
726        if(!isApplet()) {
727            splashScreen.show();
728        } else {
729            add(splashLabel, BorderLayout.CENTER);
730            validate();
731            repaint();
732        }
733    }
734 
735    /**
736     * pop down the spash screen
737     */
738    public void hideSplash() {
739        if(!isApplet()) {
740            splashScreen.setVisible(false);
741            splashScreen = null;
742            splashLabel = null;
743        }
744    }
745 
746    // *******************************************************
747    // ****************** Utility Methods ********************
748    // *******************************************************
749 
750    /**
751     * Loads a demo from a classname
752     */
753    void loadDemo(String classname) {
754        setStatus(getString("Status.loading") + getString(classname + ".name"));
755        DemoModule demo = null;
756        try {
757            Class demoClass = Class.forName(classname);
758            Constructor demoConstructor = demoClass.getConstructor(new Class[]{SwingSet2.class});
759            demo = (DemoModule) demoConstructor.newInstance(new Object[]{this});
760            addDemo(demo);
761        } catch (Exception e) {
762            System.out.println("Error occurred loading demo: " + classname);
763        }
764    }
765    
766    /**
767     * A utility function that layers on top of the LookAndFeel's
768     * isSupportedLookAndFeel() method. Returns true if the LookAndFeel
769     * is supported. Returns false if the LookAndFeel is not supported
770     * and/or if there is any kind of error checking if the LookAndFeel
771     * is supported.
772     *
773     * The L&F menu will use this method to detemine whether the various
774     * L&F options should be active or inactive.
775     *
776     */
777     protected boolean isAvailableLookAndFeel(String laf) {
778         try { 
779             Class lnfClass = Class.forName(laf);
780             LookAndFeel newLAF = (LookAndFeel)(lnfClass.newInstance());
781             return newLAF.isSupportedLookAndFeel();
782         } catch(Exception e) { // If ANYTHING weird happens, return false
783             return false;
784         }
785     }
786 
787 
788    /**
789     * Determines if this is an applet or application
790     */
791    public boolean isApplet() {
792        return (applet != null);
793    }
794 
795    /**
796     * Returns the applet instance
797     */
798    public SwingSet2Applet getApplet() {
799        return applet;
800    }
801 
802 
803    /**
804     * Returns the frame instance
805     */
806    public JFrame getFrame() {
807        return frame;
808    }
809 
810    /**
811     * Returns the menubar
812     */
813    public JMenuBar getMenuBar() {
814        return menuBar;
815    }
816 
817    /**
818     * Returns the toolbar
819     */
820    public ToggleButtonToolBar getToolBar() {
821        return toolbar;
822    }
823 
824    /**
825     * Returns the toolbar button group
826     */
827    public ButtonGroup getToolBarGroup() {
828        return toolbarGroup;
829    }
830 
831    /**
832     * Returns the content pane wether we're in an applet
833     * or application
834     */
835    public Container getContentPane() {
836        if(contentPane == null) {
837            if(getFrame() != null) {
838                contentPane = getFrame().getContentPane();
839            } else if (getApplet() != null) {
840                contentPane = getApplet().getContentPane();
841            }
842        }
843        return contentPane;
844    }
845 
846    /**
847     * Create a frame for SwingSet2 to reside in if brought up
848     * as an application.
849     */
850    public static JFrame createFrame(GraphicsConfiguration gc) {
851        JFrame frame = new JFrame(gc);
852        if (numSSs == 0) {
853            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
854        } else {
855            WindowListener l = new WindowAdapter() {
856                public void windowClosing(WindowEvent e) {
857                    numSSs--;
858                    swingSets.remove(this);
859                }
860            };
861            frame.addWindowListener(l);
862        }
863        return frame;
864    }
865 
866 
867    /**
868     * Set the status 
869     */
870    public void setStatus(String s) {
871        // do the following on the gui thread
872        SwingUtilities.invokeLater(new SwingSetRunnable(this, s) {
873            public void run() {
874                swingset.statusField.setText((String) obj);
875            }
876        });
877    }
878 
879 
880    /**
881     * This method returns a string from the demo's resource bundle.
882     */
883    public String getString(String key) {
884        String value = null;
885        try {
886            value = getResourceBundle().getString(key);
887        } catch (MissingResourceException e) {
888            System.out.println("java.util.MissingResourceException: Couldn't find value for: " + key);
889        }
890        if(value == null) {
891            value = "Could not find resource: " + key + "  ";
892        }
893        return value;
894    }
895 
896    /**
897     * Returns the resource bundle associated with this demo. Used
898     * to get accessable and internationalized strings.
899     */
900    public ResourceBundle getResourceBundle() {
901        if(bundle == null) {
902            bundle = ResourceBundle.getBundle("resources.swingset");
903        }
904        return bundle;
905    }
906 
907    /**
908     * Returns a mnemonic from the resource bundle. Typically used as
909     * keyboard shortcuts in menu items.
910     */
911    public char getMnemonic(String key) {
912        return (getString(key)).charAt(0);
913    }
914 
915    /**
916     * Creates an icon from an image contained in the "images" directory.
917     */
918    public ImageIcon createImageIcon(String filename, String description) {
919        String path = "/resources/images/" + filename;
920        return new ImageIcon(getClass().getResource(path)); 
921    }
922 
923    /**
924     * If DEBUG is defined, prints debug information out to std ouput.
925     */
926    public void debug(String s) {
927        if(DEBUG) {
928            System.out.println((debugCounter++) + ": " + s);
929        }
930    }
931 
932    /**
933     * Stores the current L&F, and calls updateLookAndFeel, below
934     */
935    public void setLookAndFeel(String laf) {
936        if(currentLookAndFeel != laf) {
937            currentLookAndFeel = laf;
938            themesMenu.setEnabled(laf == metal);
939            updateLookAndFeel();
940        }
941    }
942 
943    /**
944     * Sets the current L&F on each demo module
945     */
946    public void updateLookAndFeel() {
947        try {
948            UIManager.setLookAndFeel(currentLookAndFeel);
949            for (Iterator itr = swingSets.iterator(); itr.hasNext(); ) {
950                SwingSet2 ss = (SwingSet2)itr.next();
951                SwingUtilities.updateComponentTreeUI(ss);
952            }
953            // update LAF for the toplevel frame, too
954            if (!isApplet()) {
955                SwingUtilities.updateComponentTreeUI(getFrame());
956            } else {
957                SwingUtilities.updateComponentTreeUI(getApplet());
958            }
959             SwingUtilities.updateComponentTreeUI(popupMenu);
960 
961        } catch (Exception ex) {
962            System.out.println("Failed loading L&F: " + currentLookAndFeel);
963            System.out.println(ex);
964        }
965 
966        // lazily update update the UI's for the remaining demos
967        for (int i = 0; i < demosVector.size(); i++) {
968            DemoModule demo = (DemoModule) demosVector.elementAt(i);
969            if(currentDemo != demo) {
970                // do the following on the gui thread
971                SwingUtilities.invokeLater(new SwingSetRunnable(this, demo) {
972                    public void run() {
973                        SwingUtilities.updateComponentTreeUI(((DemoModule)obj).getDemoPanel());
974                    }
975                });
976            }
977        }
978 
979    }
980 
981    /**
982     * Loads and puts the source code text into JEditorPane in the "Source Code" tab
983     */
984    public void setSourceCode(DemoModule demo) {
985        // do the following on the gui thread
986        SwingUtilities.invokeLater(new SwingSetRunnable(this, demo) {
987            public void run() {
988                swingset.demoSrcPane.setText(((DemoModule)obj).getSourceCode());
989                swingset.demoSrcPane.setCaretPosition(0);
990 
991            }
992        });
993    }
994 
995    // *******************************************************
996    // **************   ToggleButtonToolbar  *****************
997    // *******************************************************
998    static Insets zeroInsets = new Insets(1,1,1,1);
999    protected class ToggleButtonToolBar extends JToolBar {
1000        public ToggleButtonToolBar() {
1001            super();
1002        }
1003 
1004        JToggleButton addToggleButton(Action a) {
1005            JToggleButton tb = new JToggleButton(
1006                (String)a.getValue(Action.NAME),
1007                (Icon)a.getValue(Action.SMALL_ICON)
1008            );
1009            tb.setMargin(zeroInsets);
1010            tb.setText(null);
1011            tb.setEnabled(a.isEnabled());
1012            tb.setToolTipText((String)a.getValue(Action.SHORT_DESCRIPTION));
1013            tb.setAction(a);
1014            add(tb);
1015            return tb;
1016        }
1017    }
1018 
1019    // *******************************************************
1020    // *********  ToolBar Panel / Docking Listener ***********
1021    // *******************************************************
1022    class ToolBarPanel extends JPanel implements ContainerListener {
1023 
1024        public boolean contains(int x, int y) {
1025            Component c = getParent();
1026            if (c != null) {
1027                Rectangle r = c.getBounds();
1028                return (x >= 0) && (x < r.width) && (y >= 0) && (y < r.height);
1029            }
1030            else {
1031                return super.contains(x,y);
1032            }
1033        }
1034 
1035        public void componentAdded(ContainerEvent e) {
1036            Container c = e.getContainer().getParent();
1037            if (c != null) {
1038                c.getParent().validate();
1039                c.getParent().repaint();            
1040            }
1041        }
1042 
1043        public void componentRemoved(ContainerEvent e) {
1044            Container c = e.getContainer().getParent();
1045            if (c != null) {
1046                c.getParent().validate();
1047                c.getParent().repaint();
1048            }
1049        }
1050    }
1051 
1052    // *******************************************************
1053    // ******************   Runnables  ***********************
1054    // *******************************************************
1055 
1056    /**
1057     * Generic SwingSet2 runnable. This is intended to run on the
1058     * AWT gui event thread so as not to muck things up by doing
1059     * gui work off the gui thread. Accepts a SwingSet2 and an Object
1060     * as arguments, which gives subtypes of this class the two
1061     * "must haves" needed in most runnables for this demo.
1062     */
1063    class SwingSetRunnable implements Runnable {
1064        protected SwingSet2 swingset;
1065        protected Object obj;
1066        
1067        public SwingSetRunnable(SwingSet2 swingset, Object obj) {
1068            this.swingset = swingset;
1069            this.obj = obj;
1070        }
1071 
1072        public void run() {
1073        }
1074    }
1075        
1076    
1077    // *******************************************************
1078    // ********************   Actions  ***********************
1079    // *******************************************************
1080    
1081    public class SwitchToDemoAction extends AbstractAction {
1082        SwingSet2 swingset;
1083        DemoModule demo;
1084        
1085        public SwitchToDemoAction(SwingSet2 swingset, DemoModule demo) {
1086            super(demo.getName(), demo.getIcon());
1087            this.swingset = swingset;
1088            this.demo = demo;
1089        }
1090 
1091        public void actionPerformed(ActionEvent e) {
1092            swingset.setDemo(demo);
1093        }
1094    }
1095 
1096    class OkAction extends AbstractAction {
1097        JDialog aboutBox;
1098 
1099        protected OkAction(JDialog aboutBox) {
1100            super("OkAction");
1101            this.aboutBox = aboutBox;
1102        }
1103 
1104        public void actionPerformed(ActionEvent e) {
1105            aboutBox.setVisible(false);
1106        }
1107    }
1108 
1109    class ChangeLookAndFeelAction extends AbstractAction {
1110        SwingSet2 swingset;
1111        String laf;
1112        protected ChangeLookAndFeelAction(SwingSet2 swingset, String laf) {
1113            super("ChangeTheme");
1114            this.swingset = swingset;
1115            this.laf = laf;
1116        }
1117 
1118        public void actionPerformed(ActionEvent e) {
1119            swingset.setLookAndFeel(laf);
1120        }
1121    }
1122 
1123    class ActivatePopupMenuAction extends AbstractAction {
1124         SwingSet2 swingset;
1125         JPopupMenu popup;
1126        protected ActivatePopupMenuAction(SwingSet2 swingset, JPopupMenu popup) {
1127            super("ActivatePopupMenu");
1128             this.swingset = swingset;
1129             this.popup = popup;
1130        }
1131        
1132         public void actionPerformed(ActionEvent e) {
1133             Dimension invokerSize = getSize();
1134             Dimension popupSize = popup.getPreferredSize();
1135             popup.show(swingset, (invokerSize.width - popupSize.width) / 2,
1136                        (invokerSize.height - popupSize.height) / 2);
1137         }
1138    }
1139 
1140    // Turns on all possible auditory feedback
1141    class OnAudioAction extends AbstractAction {
1142        SwingSet2 swingset;
1143        protected OnAudioAction(SwingSet2 swingset) {
1144            super("Audio On");
1145            this.swingset = swingset;
1146        }
1147        public void actionPerformed(ActionEvent e) {
1148            UIManager.put("AuditoryCues.playList",
1149                          UIManager.get("AuditoryCues.allAuditoryCues"));
1150            swingset.updateLookAndFeel();
1151        }
1152    }
1153 
1154    // Turns on the default amount of auditory feedback
1155    class DefaultAudioAction extends AbstractAction {
1156        SwingSet2 swingset;
1157        protected DefaultAudioAction(SwingSet2 swingset) {
1158            super("Audio Default");
1159            this.swingset = swingset;
1160        }
1161        public void actionPerformed(ActionEvent e) {
1162            UIManager.put("AuditoryCues.playList",
1163                          UIManager.get("AuditoryCues.defaultCueList"));
1164            swingset.updateLookAndFeel();
1165        }
1166    }
1167 
1168    // Turns off all possible auditory feedback
1169    class OffAudioAction extends AbstractAction {
1170        SwingSet2 swingset;
1171        protected OffAudioAction(SwingSet2 swingset) {
1172            super("Audio Off");
1173            this.swingset = swingset;
1174        }
1175        public void actionPerformed(ActionEvent e) {
1176            UIManager.put("AuditoryCues.playList",
1177                          UIManager.get("AuditoryCues.noAuditoryCues"));
1178            swingset.updateLookAndFeel();
1179        }
1180    }
1181 
1182    // Turns on or off the tool tips for the demo.
1183    class ToolTipAction extends AbstractAction {
1184        SwingSet2 swingset;
1185        boolean status;
1186        protected ToolTipAction(SwingSet2 swingset, boolean status) {
1187            super("ToolTip Control");
1188            this.swingset = swingset;
1189            this.status = status;
1190        }
1191 
1192        public void actionPerformed(ActionEvent e) {
1193            ToolTipManager.sharedInstance().setEnabled(status);
1194        }
1195    }
1196 
1197    class ChangeThemeAction extends AbstractAction {
1198        SwingSet2 swingset;
1199        DefaultMetalTheme theme;
1200        protected ChangeThemeAction(SwingSet2 swingset, DefaultMetalTheme theme) {
1201            super("ChangeTheme");
1202            this.swingset = swingset;
1203            this.theme = theme;
1204        }
1205 
1206        public void actionPerformed(ActionEvent e) {
1207            MetalLookAndFeel.setCurrentTheme(theme);
1208            swingset.updateLookAndFeel();
1209        }
1210    }
1211 
1212    class ExitAction extends AbstractAction {
1213        SwingSet2 swingset;
1214        protected ExitAction(SwingSet2 swingset) {
1215            super("ExitAction");
1216            this.swingset = swingset;
1217        }
1218 
1219        public void actionPerformed(ActionEvent e) {
1220            System.exit(0);
1221        }
1222    }
1223 
1224    class AboutAction extends AbstractAction {
1225        SwingSet2 swingset;
1226        protected AboutAction(SwingSet2 swingset) {
1227            super("AboutAction");
1228            this.swingset = swingset;
1229        }
1230        
1231        public void actionPerformed(ActionEvent e) {
1232            if(aboutBox == null) {
1233                // JPanel panel = new JPanel(new BorderLayout());
1234                JPanel panel = new AboutPanel(swingset);
1235                panel.setLayout(new BorderLayout());
1236 
1237                aboutBox = new JDialog(swingset.getFrame(), getString("AboutBox.title"), false);
1238                aboutBox.getContentPane().add(panel, BorderLayout.CENTER);
1239 
1240                // JButton button = new JButton(getString("AboutBox.ok_button_text"));
1241                JPanel buttonpanel = new JPanel();
1242                buttonpanel.setOpaque(false);
1243                JButton button = (JButton) buttonpanel.add(
1244                    new JButton(getString("AboutBox.ok_button_text"))
1245                );
1246                panel.add(buttonpanel, BorderLayout.SOUTH);
1247 
1248                button.addActionListener(new OkAction(aboutBox));
1249            }
1250            aboutBox.pack();
1251            Point p = swingset.getLocationOnScreen();
1252            aboutBox.setLocation(p.x + 10, p.y +10);
1253            aboutBox.show();
1254        }
1255    }
1256 
1257    class MultiScreenAction extends AbstractAction {
1258        static final int ALL_SCREENS = -1;
1259        int screen;
1260        protected MultiScreenAction(SwingSet2 swingset, int screen) {
1261            super("MultiScreenAction");
1262            this.screen = screen;
1263        }
1264 
1265        public void actionPerformed(ActionEvent e) {
1266            GraphicsDevice[] gds = GraphicsEnvironment.
1267                                   getLocalGraphicsEnvironment().
1268                                   getScreenDevices();
1269            if (screen == ALL_SCREENS) {
1270                for (int i = 0; i < gds.length; i++) {
1271                    SwingSet2 swingset = new SwingSet2(null,
1272                                  gds[i].getDefaultConfiguration());
1273                }
1274            }
1275            else {
1276                SwingSet2 swingset = new SwingSet2(null,
1277                             gds[screen].getDefaultConfiguration());
1278            }
1279        }
1280    }
1281 
1282    // *******************************************************
1283    // **********************  Misc  *************************
1284    // *******************************************************
1285 
1286    class DemoLoadThread extends Thread {
1287        SwingSet2 swingset;
1288        
1289        public DemoLoadThread(SwingSet2 swingset) {
1290            this.swingset = swingset;
1291        }
1292 
1293        public void run() {
1294            swingset.loadDemos();
1295        }
1296    }
1297 
1298    class AboutPanel extends JPanel {
1299        ImageIcon aboutimage = null;
1300        SwingSet2 swingset = null;
1301 
1302        public AboutPanel(SwingSet2 swingset) {
1303            this.swingset = swingset;
1304            aboutimage = swingset.createImageIcon("About.jpg", "AboutBox.accessible_description");
1305            setOpaque(false);
1306        }
1307 
1308        public void paint(Graphics g) {
1309            aboutimage.paintIcon(this, g, 0, 0);
1310            super.paint(g);
1311        }
1312 
1313        public Dimension getPreferredSize() {
1314            return new Dimension(aboutimage.getIconWidth(),
1315                                 aboutimage.getIconHeight());
1316        }
1317    }
1318 
1319}
1320 

[all classes][default package]
EMMA 2.0.4015 (stable) (C) Vladimir Roubtsov