1/*
2 * Copyright (c) 1998, 2011, Oracle and/or its affiliates. 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 *   - Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *   - Neither the name of Oracle nor the names of its
16 *     contributors may be used to endorse or promote products derived
17 *     from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
20 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32/*
33 * This source code is provided to illustrate the usage of a given feature
34 * or technique and has been deliberately simplified. Additional steps
35 * required for a production-quality application, such as security checks,
36 * input validation and proper error handling, might not be present in
37 * this sample code.
38 */
39
40
41
42import java.awt.Dimension;
43import java.awt.Toolkit;
44import java.awt.event.ActionEvent;
45import java.awt.event.ActionListener;
46import java.awt.event.WindowAdapter;
47import java.awt.event.WindowEvent;
48import java.io.InputStream;
49import javax.swing.ButtonGroup;
50import javax.swing.JCheckBoxMenuItem;
51import javax.swing.JComponent;
52import javax.swing.JDesktopPane;
53import javax.swing.JFileChooser;
54import javax.swing.JFrame;
55import javax.swing.JInternalFrame;
56import javax.swing.JMenu;
57import javax.swing.JMenuBar;
58import javax.swing.JMenuItem;
59import javax.swing.JOptionPane;
60import javax.swing.JRadioButtonMenuItem;
61import javax.swing.UIManager;
62import javax.swing.plaf.metal.DefaultMetalTheme;
63import javax.swing.plaf.metal.MetalTheme;
64import javax.swing.plaf.metal.OceanTheme;
65
66
67/**
68 * This is the main container frame for the Metalworks demo app
69 *
70 * @author Steve Wilson
71 * @author Alexander Kouznetsov
72 */
73@SuppressWarnings("serial")
74public final class MetalworksFrame extends JFrame {
75
76    JMenuBar menuBar;
77    JDesktopPane desktop;
78    JInternalFrame toolPalette;
79    JCheckBoxMenuItem showToolPaletteMenuItem;
80    static final Integer DOCLAYER = 5;
81    static final Integer TOOLLAYER = 6;
82    static final Integer HELPLAYER = 7;
83    static final String ABOUTMSG = "Metalworks \n \nAn application written to "
84            + "show off the Java Look & Feel. \n \nWritten by the JavaSoft "
85            + "Look & Feel Team \n  Michael Albers\n  Tom Santos\n  "
86            + "Jeff Shapiro\n  Steve Wilson";
87
88    public MetalworksFrame() {
89        super("Metalworks");
90        final int inset = 50;
91        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
92        setBounds(inset, inset, screenSize.width - inset * 2, screenSize.height - inset
93                * 2);
94        buildContent();
95        buildMenus();
96        this.addWindowListener(new WindowAdapter() {
97
98            @Override
99            public void windowClosing(WindowEvent e) {
100                quit();
101            }
102        });
103        UIManager.addPropertyChangeListener(new UISwitchListener(
104                (JComponent) getRootPane()));
105    }
106
107    protected void buildMenus() {
108        menuBar = new JMenuBar();
109        menuBar.setOpaque(true);
110        JMenu file = buildFileMenu();
111        JMenu edit = buildEditMenu();
112        JMenu views = buildViewsMenu();
113        JMenu speed = buildSpeedMenu();
114        JMenu help = buildHelpMenu();
115
116        // load a theme from a text file
117        MetalTheme myTheme = null;
118        try {
119            InputStream istream = getClass().getResourceAsStream(
120                    "/resources/MyTheme.theme");
121            myTheme = new PropertiesMetalTheme(istream);
122        } catch (NullPointerException e) {
123            System.out.println(e);
124        }
125
126        // build an array of themes
127        MetalTheme[] themes = { new OceanTheme(),
128            new DefaultMetalTheme(),
129            new GreenMetalTheme(),
130            new AquaMetalTheme(),
131            new KhakiMetalTheme(),
132            new DemoMetalTheme(),
133            new ContrastMetalTheme(),
134            new BigContrastMetalTheme(),
135            myTheme };
136
137        // put the themes in a menu
138        JMenu themeMenu = new MetalThemeMenu("Theme", themes);
139
140        menuBar.add(file);
141        menuBar.add(edit);
142        menuBar.add(views);
143        menuBar.add(themeMenu);
144        menuBar.add(speed);
145        menuBar.add(help);
146        setJMenuBar(menuBar);
147    }
148
149    protected JMenu buildFileMenu() {
150        JMenu file = new JMenu("File");
151        JMenuItem newWin = new JMenuItem("New");
152        JMenuItem open = new JMenuItem("Open");
153        JMenuItem quit = new JMenuItem("Quit");
154
155        newWin.addActionListener(new ActionListener() {
156
157            public void actionPerformed(ActionEvent e) {
158                newDocument();
159            }
160        });
161
162        open.addActionListener(new ActionListener() {
163
164            public void actionPerformed(ActionEvent e) {
165                openDocument();
166            }
167        });
168
169        quit.addActionListener(new ActionListener() {
170
171            public void actionPerformed(ActionEvent e) {
172                quit();
173            }
174        });
175
176        file.add(newWin);
177        file.add(open);
178        file.addSeparator();
179        file.add(quit);
180        return file;
181    }
182
183    protected JMenu buildEditMenu() {
184        JMenu edit = new JMenu("Edit");
185        JMenuItem undo = new JMenuItem("Undo");
186        JMenuItem copy = new JMenuItem("Copy");
187        JMenuItem cut = new JMenuItem("Cut");
188        JMenuItem paste = new JMenuItem("Paste");
189        JMenuItem prefs = new JMenuItem("Preferences...");
190
191        undo.setEnabled(false);
192        copy.setEnabled(false);
193        cut.setEnabled(false);
194        paste.setEnabled(false);
195
196        prefs.addActionListener(new ActionListener() {
197
198            public void actionPerformed(ActionEvent e) {
199                openPrefsWindow();
200            }
201        });
202
203        edit.add(undo);
204        edit.addSeparator();
205        edit.add(cut);
206        edit.add(copy);
207        edit.add(paste);
208        edit.addSeparator();
209        edit.add(prefs);
210        return edit;
211    }
212
213    protected JMenu buildViewsMenu() {
214        JMenu views = new JMenu("Views");
215
216        JMenuItem inBox = new JMenuItem("Open In-Box");
217        JMenuItem outBox = new JMenuItem("Open Out-Box");
218        outBox.setEnabled(false);
219
220        inBox.addActionListener(new ActionListener() {
221
222            public void actionPerformed(ActionEvent e) {
223                openInBox();
224            }
225        });
226
227        views.add(inBox);
228        views.add(outBox);
229        return views;
230    }
231
232    protected JMenu buildSpeedMenu() {
233        JMenu speed = new JMenu("Drag");
234
235        JRadioButtonMenuItem live = new JRadioButtonMenuItem("Live");
236        JRadioButtonMenuItem outline = new JRadioButtonMenuItem("Outline");
237
238        JRadioButtonMenuItem slow = new JRadioButtonMenuItem("Old and Slow");
239
240        ButtonGroup group = new ButtonGroup();
241
242        group.add(live);
243        group.add(outline);
244        group.add(slow);
245
246        live.setSelected(true);
247
248        slow.addActionListener(new ActionListener() {
249
250            public void actionPerformed(ActionEvent e) {
251                // for right now I'm saying if you set the mode
252                // to something other than a specified mode
253                // it will revert to the old way
254                // This is mostly for comparison's sake
255                desktop.setDragMode(-1);
256            }
257        });
258
259        live.addActionListener(new ActionListener() {
260
261            public void actionPerformed(ActionEvent e) {
262                desktop.setDragMode(JDesktopPane.LIVE_DRAG_MODE);
263            }
264        });
265
266        outline.addActionListener(new ActionListener() {
267
268            public void actionPerformed(ActionEvent e) {
269                desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
270            }
271        });
272
273
274        speed.add(live);
275        speed.add(outline);
276        speed.add(slow);
277        return speed;
278    }
279
280    protected JMenu buildHelpMenu() {
281        JMenu help = new JMenu("Help");
282        JMenuItem about = new JMenuItem("About Metalworks...");
283        JMenuItem openHelp = new JMenuItem("Open Help Window");
284
285        about.addActionListener(new ActionListener() {
286
287            public void actionPerformed(ActionEvent e) {
288                showAboutBox();
289            }
290        });
291
292        openHelp.addActionListener(new ActionListener() {
293
294            public void actionPerformed(ActionEvent e) {
295                openHelpWindow();
296            }
297        });
298
299        help.add(about);
300        help.add(openHelp);
301
302        return help;
303    }
304
305    protected void buildContent() {
306        desktop = new JDesktopPane();
307        getContentPane().add(desktop);
308    }
309
310    public void quit() {
311        System.exit(0);
312    }
313
314    public void newDocument() {
315        JInternalFrame doc = new MetalworksDocumentFrame();
316        desktop.add(doc, DOCLAYER);
317        try {
318            doc.setVisible(true);
319            doc.setSelected(true);
320        } catch (java.beans.PropertyVetoException e2) {
321        }
322    }
323
324    public void openDocument() {
325        JFileChooser chooser = new JFileChooser();
326        chooser.showOpenDialog(this);
327    }
328
329    public void openHelpWindow() {
330        JInternalFrame help = new MetalworksHelp();
331        desktop.add(help, HELPLAYER);
332        try {
333            help.setVisible(true);
334            help.setSelected(true);
335        } catch (java.beans.PropertyVetoException e2) {
336        }
337    }
338
339    public void showAboutBox() {
340        JOptionPane.showMessageDialog(this, ABOUTMSG);
341    }
342
343    public void openPrefsWindow() {
344        MetalworksPrefs dialog = new MetalworksPrefs(this);
345        dialog.setVisible(true);
346
347    }
348
349    public void openInBox() {
350        JInternalFrame doc = new MetalworksInBox();
351        desktop.add(doc, DOCLAYER);
352        try {
353            doc.setVisible(true);
354            doc.setSelected(true);
355        } catch (java.beans.PropertyVetoException e2) {
356        }
357    }
358}
359