| /* | |
| * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions | |
| * are met: | |
| * | |
| * - Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | |
| * | |
| * - Redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution. | |
| * | |
| * - Neither the name of Oracle nor the names of its | |
| * contributors may be used to endorse or promote products derived | |
| * from this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| */ | |
| /* | |
| * This source code is provided to illustrate the usage of a given feature | |
| * or technique and has been deliberately simplified. Additional steps | |
| * required for a production-quality application, such as security checks, | |
| * input validation and proper error handling, might not be present in | |
| * this sample code. | |
| */ | |
| import java.awt.Dimension; | |
| import java.awt.Toolkit; | |
| import java.awt.event.ActionEvent; | |
| import java.awt.event.ActionListener; | |
| import java.awt.event.WindowAdapter; | |
| import java.awt.event.WindowEvent; | |
| import java.io.InputStream; | |
| import javax.swing.ButtonGroup; | |
| import javax.swing.JCheckBoxMenuItem; | |
| import javax.swing.JComponent; | |
| import javax.swing.JDesktopPane; | |
| import javax.swing.JFileChooser; | |
| import javax.swing.JFrame; | |
| import javax.swing.JInternalFrame; | |
| import javax.swing.JMenu; | |
| import javax.swing.JMenuBar; | |
| import javax.swing.JMenuItem; | |
| import javax.swing.JOptionPane; | |
| import javax.swing.JRadioButtonMenuItem; | |
| import javax.swing.UIManager; | |
| import javax.swing.plaf.metal.DefaultMetalTheme; | |
| import javax.swing.plaf.metal.MetalTheme; | |
| import javax.swing.plaf.metal.OceanTheme; | |
| /** | |
| * This is the main container frame for the Metalworks demo app | |
| * | |
| * @author Steve Wilson | |
| * @author Alexander Kouznetsov | |
| */ | |
| @SuppressWarnings("serial") | |
| public final class MetalworksFrame extends JFrame { | |
| JMenuBar menuBar; | |
| JDesktopPane desktop; | |
| JInternalFrame toolPalette; | |
| JCheckBoxMenuItem showToolPaletteMenuItem; | |
| static final Integer DOCLAYER = 5; | |
| static final Integer TOOLLAYER = 6; | |
| static final Integer HELPLAYER = 7; | |
| static final String ABOUTMSG = "Metalworks \n \nAn application written to " | |
| + "show off the Java Look & Feel. \n \nWritten by the JavaSoft " | |
| + "Look & Feel Team \n Michael Albers\n Tom Santos\n " | |
| + "Jeff Shapiro\n Steve Wilson"; | |
| public MetalworksFrame() { | |
| super("Metalworks"); | |
| final int inset = 50; | |
| Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); | |
| setBounds(inset, inset, screenSize.width - inset * 2, screenSize.height - inset | |
| * 2); | |
| buildContent(); | |
| buildMenus(); | |
| this.addWindowListener(new WindowAdapter() { | |
| @Override | |
| public void windowClosing(WindowEvent e) { | |
| quit(); | |
| } | |
| }); | |
| UIManager.addPropertyChangeListener(new UISwitchListener( | |
| (JComponent) getRootPane())); | |
| } | |
| protected void buildMenus() { | |
| menuBar = new JMenuBar(); | |
| menuBar.setOpaque(true); | |
| JMenu file = buildFileMenu(); | |
| JMenu edit = buildEditMenu(); | |
| JMenu views = buildViewsMenu(); | |
| JMenu speed = buildSpeedMenu(); | |
| JMenu help = buildHelpMenu(); | |
| // load a theme from a text file | |
| MetalTheme myTheme = null; | |
| try { | |
| InputStream istream = getClass().getResourceAsStream( | |
| "/resources/MyTheme.theme"); | |
| myTheme = new PropertiesMetalTheme(istream); | |
| } catch (NullPointerException e) { | |
| System.out.println(e); | |
| } | |
| // build an array of themes | |
| MetalTheme[] themes = { new OceanTheme(), | |
| new DefaultMetalTheme(), | |
| new GreenMetalTheme(), | |
| new AquaMetalTheme(), | |
| new KhakiMetalTheme(), | |
| new DemoMetalTheme(), | |
| new ContrastMetalTheme(), | |
| new BigContrastMetalTheme(), | |
| myTheme }; | |
| // put the themes in a menu | |
| JMenu themeMenu = new MetalThemeMenu("Theme", themes); | |
| menuBar.add(file); | |
| menuBar.add(edit); | |
| menuBar.add(views); | |
| menuBar.add(themeMenu); | |
| menuBar.add(speed); | |
| menuBar.add(help); | |
| setJMenuBar(menuBar); | |
| } | |
| protected JMenu buildFileMenu() { | |
| JMenu file = new JMenu("File"); | |
| JMenuItem newWin = new JMenuItem("New"); | |
| JMenuItem open = new JMenuItem("Open"); | |
| JMenuItem quit = new JMenuItem("Quit"); | |
| newWin.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| newDocument(); | |
| } | |
| }); | |
| open.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| openDocument(); | |
| } | |
| }); | |
| quit.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| quit(); | |
| } | |
| }); | |
| file.add(newWin); | |
| file.add(open); | |
| file.addSeparator(); | |
| file.add(quit); | |
| return file; | |
| } | |
| protected JMenu buildEditMenu() { | |
| JMenu edit = new JMenu("Edit"); | |
| JMenuItem undo = new JMenuItem("Undo"); | |
| JMenuItem copy = new JMenuItem("Copy"); | |
| JMenuItem cut = new JMenuItem("Cut"); | |
| JMenuItem paste = new JMenuItem("Paste"); | |
| JMenuItem prefs = new JMenuItem("Preferences..."); | |
| undo.setEnabled(false); | |
| copy.setEnabled(false); | |
| cut.setEnabled(false); | |
| paste.setEnabled(false); | |
| prefs.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| openPrefsWindow(); | |
| } | |
| }); | |
| edit.add(undo); | |
| edit.addSeparator(); | |
| edit.add(cut); | |
| edit.add(copy); | |
| edit.add(paste); | |
| edit.addSeparator(); | |
| edit.add(prefs); | |
| return edit; | |
| } | |
| protected JMenu buildViewsMenu() { | |
| JMenu views = new JMenu("Views"); | |
| JMenuItem inBox = new JMenuItem("Open In-Box"); | |
| JMenuItem outBox = new JMenuItem("Open Out-Box"); | |
| outBox.setEnabled(false); | |
| inBox.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| openInBox(); | |
| } | |
| }); | |
| views.add(inBox); | |
| views.add(outBox); | |
| return views; | |
| } | |
| protected JMenu buildSpeedMenu() { | |
| JMenu speed = new JMenu("Drag"); | |
| JRadioButtonMenuItem live = new JRadioButtonMenuItem("Live"); | |
| JRadioButtonMenuItem outline = new JRadioButtonMenuItem("Outline"); | |
| JRadioButtonMenuItem slow = new JRadioButtonMenuItem("Old and Slow"); | |
| ButtonGroup group = new ButtonGroup(); | |
| group.add(live); | |
| group.add(outline); | |
| group.add(slow); | |
| live.setSelected(true); | |
| slow.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| // for right now I'm saying if you set the mode | |
| // to something other than a specified mode | |
| // it will revert to the old way | |
| // This is mostly for comparison's sake | |
| desktop.setDragMode(-1); | |
| } | |
| }); | |
| live.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| desktop.setDragMode(JDesktopPane.LIVE_DRAG_MODE); | |
| } | |
| }); | |
| outline.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); | |
| } | |
| }); | |
| speed.add(live); | |
| speed.add(outline); | |
| speed.add(slow); | |
| return speed; | |
| } | |
| protected JMenu buildHelpMenu() { | |
| JMenu help = new JMenu("Help"); | |
| JMenuItem about = new JMenuItem("About Metalworks..."); | |
| JMenuItem openHelp = new JMenuItem("Open Help Window"); | |
| about.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| showAboutBox(); | |
| } | |
| }); | |
| openHelp.addActionListener(new ActionListener() { | |
| public void actionPerformed(ActionEvent e) { | |
| openHelpWindow(); | |
| } | |
| }); | |
| help.add(about); | |
| help.add(openHelp); | |
| return help; | |
| } | |
| protected void buildContent() { | |
| desktop = new JDesktopPane(); | |
| getContentPane().add(desktop); | |
| } | |
| public void quit() { | |
| System.exit(0); | |
| } | |
| public void newDocument() { | |
| JInternalFrame doc = new MetalworksDocumentFrame(); | |
| desktop.add(doc, DOCLAYER); | |
| try { | |
| doc.setVisible(true); | |
| doc.setSelected(true); | |
| } catch (java.beans.PropertyVetoException e2) { | |
| } | |
| } | |
| public void openDocument() { | |
| JFileChooser chooser = new JFileChooser(); | |
| chooser.showOpenDialog(this); | |
| } | |
| public void openHelpWindow() { | |
| JInternalFrame help = new MetalworksHelp(); | |
| desktop.add(help, HELPLAYER); | |
| try { | |
| help.setVisible(true); | |
| help.setSelected(true); | |
| } catch (java.beans.PropertyVetoException e2) { | |
| } | |
| } | |
| public void showAboutBox() { | |
| JOptionPane.showMessageDialog(this, ABOUTMSG); | |
| } | |
| public void openPrefsWindow() { | |
| MetalworksPrefs dialog = new MetalworksPrefs(this); | |
| dialog.setVisible(true); | |
| } | |
| public void openInBox() { | |
| JInternalFrame doc = new MetalworksInBox(); | |
| desktop.add(doc, DOCLAYER); | |
| try { | |
| doc.setVisible(true); | |
| doc.setSelected(true); | |
| } catch (java.beans.PropertyVetoException e2) { | |
| } | |
| } | |
| } |