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