159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2012 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.app; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.system.AppSettings; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.*; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.event.*; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.awt.image.BufferedImage; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.lang.reflect.Method; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.net.MalformedURLException; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.net.URL; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Arrays; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Comparator; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.prefs.BackingStoreException; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.swing.*; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>PropertiesDialog</code> provides an interface to make use of the 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>GameSettings</code> class. The <code>GameSettings</code> object 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * is still created by the client application, and passed during construction. 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @see com.jme.system.GameSettings 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Mark Powell 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Eric Woroshow 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Joshua Slack - reworked for proper use of GL commands. 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @version $Id: LWJGLPropertiesDialog.java 4131 2009-03-19 20:15:28Z blaine.dev $ 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic final class SettingsDialog extends JDialog { 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static interface SelectionListener { 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void onSelection(int selection); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger logger = Logger.getLogger(SettingsDialog.class.getName()); 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final long serialVersionUID = 1L; 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static final int NO_SELECTION = 0, 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta APPROVE_SELECTION = 1, 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta CANCEL_SELECTION = 2; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // connection to properties file. 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final AppSettings source; 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Title Image 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private URL imageFile = null; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Array of supported display modes 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private DisplayMode[] modes = null; 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Array of windowed resolutions 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private String[] windowedResolutions = {"320 x 240", "640 x 480", "800 x 600", 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta "1024 x 768", "1152 x 864", "1280 x 720"}; 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // UI components 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JCheckBox vsyncBox = null; 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JCheckBox fullscreenBox = null; 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JComboBox displayResCombo = null; 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JComboBox colorDepthCombo = null; 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JComboBox displayFreqCombo = null; 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// private JComboBox rendererCombo = null; 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JComboBox antialiasCombo = null; 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JLabel icon = null; 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int selection = 0; 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private SelectionListener selectionListener = null; 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Constructor for the <code>PropertiesDialog</code>. Creates a 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * properties dialog initialized for the primary display. 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param source 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the <code>AppSettings</code> object to use for working with 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the properties file. 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param imageFile 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the image file to use as the title of the dialog; 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>null</code> will result in to image being displayed 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws NullPointerException 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * if the source is <code>null</code> 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public SettingsDialog(AppSettings source, String imageFile, boolean loadSettings) { 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this(source, getURL(imageFile), loadSettings); 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Constructor for the <code>PropertiesDialog</code>. Creates a 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * properties dialog initialized for the primary display. 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param source 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the <code>GameSettings</code> object to use for working with 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the properties file. 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param imageFile 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the image file to use as the title of the dialog; 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>null</code> will result in to image being displayed 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param loadSettings 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @throws JmeException 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * if the source is <code>null</code> 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public SettingsDialog(AppSettings source, URL imageFile, boolean loadSettings) { 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (source == null) { 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new NullPointerException("Settings source cannot be null"); 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.source = source; 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.imageFile = imageFile; 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// setModalityType(Dialog.ModalityType.APPLICATION_MODAL); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setModal(true); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AppSettings registrySettings = new AppSettings(true); 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String appTitle; 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if(source.getTitle()!=null){ 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta appTitle = source.getTitle(); 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta appTitle = registrySettings.getTitle(); 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta registrySettings.load(appTitle); 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (BackingStoreException ex) { 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta "Failed to load settings", ex); 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (loadSettings) { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.copyFrom(registrySettings); 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if(!registrySettings.isEmpty()) { 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.mergeFrom(registrySettings); 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta modes = device.getDisplayModes(); 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Arrays.sort(modes, new DisplayModeSorter()); 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta createUI(); 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSelectionListener(SelectionListener sl) { 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.selectionListener = sl; 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int getUserSelection() { 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return selection; 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void setUserSelection(int selection) { 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.selection = selection; 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta selectionListener.onSelection(selection); 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>setImage</code> sets the background image of the dialog. 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param image 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>String</code> representing the image file. 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setImage(String image) { 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta URL file = new URL("file:" + image); 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setImage(file); 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // We can safely ignore the exception - it just means that the user 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // gave us a bogus file 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (MalformedURLException e) { 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>setImage</code> sets the background image of this dialog. 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param image 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>URL</code> pointing to the image file. 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setImage(URL image) { 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta icon.setIcon(new ImageIcon(image)); 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pack(); // Resize to accomodate the new image 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setLocationRelativeTo(null); // put in center 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>showDialog</code> sets this dialog as visble, and brings it to 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the front. 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void showDialog() { 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setLocationRelativeTo(null); 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setVisible(true); 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta toFront(); 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>init</code> creates the components to use the dialog. 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void createUI() { 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (Exception e) { 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.warning("Could not set native look and feel."); 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta addWindowListener(new WindowAdapter() { 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void windowClosing(WindowEvent e) { 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setUserSelection(CANCEL_SELECTION); 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dispose(); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (source.getIcons() != null) { 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta safeSetIconImages( (List<BufferedImage>) Arrays.asList((BufferedImage[]) source.getIcons()) ); 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setTitle("Select Display Settings"); 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // The panels... 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JPanel mainPanel = new JPanel(); 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JPanel centerPanel = new JPanel(); 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JPanel optionsPanel = new JPanel(); 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JPanel buttonPanel = new JPanel(); 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // The buttons... 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JButton ok = new JButton("Ok"); 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JButton cancel = new JButton("Cancel"); 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta icon = new JLabel(imageFile != null ? new ImageIcon(imageFile) : null); 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mainPanel.setLayout(new BorderLayout()); 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta centerPanel.setLayout(new BorderLayout()); 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta KeyListener aListener = new KeyAdapter() { 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void keyPressed(KeyEvent e) { 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (e.getKeyCode() == KeyEvent.VK_ENTER) { 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (verifyAndSaveCurrentSelection()) { 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setUserSelection(APPROVE_SELECTION); 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dispose(); 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setUserSelection(CANCEL_SELECTION); 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dispose(); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }; 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayResCombo = setUpResolutionChooser(); 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayResCombo.addKeyListener(aListener); 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepthCombo = new JComboBox(); 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepthCombo.addKeyListener(aListener); 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo = new JComboBox(); 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo.addKeyListener(aListener); 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta antialiasCombo = new JComboBox(); 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta antialiasCombo.addKeyListener(aListener); 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fullscreenBox = new JCheckBox("Fullscreen?"); 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fullscreenBox.setSelected(source.isFullscreen()); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fullscreenBox.addActionListener(new ActionListener() { 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void actionPerformed(ActionEvent e) { 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateResolutionChoices(); 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vsyncBox = new JCheckBox("VSync?"); 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta vsyncBox.setSelected(source.isVSync()); 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// rendererCombo = setUpRendererChooser(); 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// rendererCombo.addKeyListener(aListener); 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateResolutionChoices(); 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateAntialiasChoices(); 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayResCombo.setSelectedItem(source.getWidth() + " x " + source.getHeight()); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepthCombo.setSelectedItem(source.getBitsPerPixel() + " bpp"); 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta optionsPanel.add(displayResCombo); 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta optionsPanel.add(colorDepthCombo); 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta optionsPanel.add(displayFreqCombo); 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta optionsPanel.add(antialiasCombo); 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta optionsPanel.add(fullscreenBox); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta optionsPanel.add(vsyncBox); 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta// optionsPanel.add(rendererCombo); 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Set the button action listeners. Cancel disposes without saving, OK 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // saves. 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ok.addActionListener(new ActionListener() { 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void actionPerformed(ActionEvent e) { 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (verifyAndSaveCurrentSelection()) { 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setUserSelection(APPROVE_SELECTION); 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dispose(); 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta cancel.addActionListener(new ActionListener() { 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void actionPerformed(ActionEvent e) { 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setUserSelection(CANCEL_SELECTION); 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta dispose(); 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buttonPanel.add(ok); 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta buttonPanel.add(cancel); 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (icon != null) { 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta centerPanel.add(icon, BorderLayout.NORTH); 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta centerPanel.add(optionsPanel, BorderLayout.SOUTH); 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mainPanel.add(centerPanel, BorderLayout.CENTER); 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mainPanel.add(buttonPanel, BorderLayout.SOUTH); 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.getContentPane().add(mainPanel); 33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pack(); 34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* Access JDialog.setIconImages by reflection in case we're running on JRE < 1.6 */ 34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void safeSetIconImages(List<? extends Image> icons) { 34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Due to Java bug 6445278, we try to set icon on our shared owner frame first. 34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Otherwise, our alt-tab icon will be the Java default under Windows. 34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Window owner = getOwner(); 34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (owner != null) { 34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Method setIconImages = owner.getClass().getMethod("setIconImages", List.class); 35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setIconImages.invoke(owner, icons); 35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Method setIconImages = getClass().getMethod("setIconImages", List.class); 35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta setIconImages.invoke(this, icons); 35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (Exception e) { 35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>verifyAndSaveCurrentSelection</code> first verifies that the 36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * display mode is valid for this system, and then saves the current 36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * selection as a properties.cfg file. 36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return if the selection is valid 36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean verifyAndSaveCurrentSelection() { 36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String display = (String) displayResCombo.getSelectedItem(); 37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean fullscreen = fullscreenBox.isSelected(); 37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean vsync = vsyncBox.isSelected(); 37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int width = Integer.parseInt(display.substring(0, display.indexOf(" x "))); 37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta display = display.substring(display.indexOf(" x ") + 3); 37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int height = Integer.parseInt(display); 37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String depthString = (String) colorDepthCombo.getSelectedItem(); 37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int depth = -1; 37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (depthString.equals("???")) { 38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta depth = 0; 38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 38259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta depth = Integer.parseInt(depthString.substring(0, depthString.indexOf(' '))); 38359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 38459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 38559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String freqString = (String) displayFreqCombo.getSelectedItem(); 38659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int freq = -1; 38759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (fullscreen) { 38859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (freqString.equals("???")) { 38959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta freq = 0; 39059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 39159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta freq = Integer.parseInt(freqString.substring(0, freqString.indexOf(' '))); 39259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 39559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String aaString = (String) antialiasCombo.getSelectedItem(); 39659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int multisample = -1; 39759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (aaString.equals("Disabled")) { 39859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta multisample = 0; 39959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 40059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta multisample = Integer.parseInt(aaString.substring(0, aaString.indexOf('x'))); 40159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 40259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 40359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // FIXME: Does not work in Linux 40459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* 40559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * if (!fullscreen) { //query the current bit depth of the desktop int 40659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * curDepth = GraphicsEnvironment.getLocalGraphicsEnvironment() 40759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * .getDefaultScreenDevice().getDisplayMode().getBitDepth(); if (depth > 40859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * curDepth) { showError(this,"Cannot choose a higher bit depth in 40959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * windowed " + "mode than your current desktop bit depth"); return 41059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * false; } } 41159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 41259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 41359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String renderer = "LWJGL-OpenGL2";//(String) rendererCombo.getSelectedItem(); 41459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 41559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean valid = false; 41659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 41759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // test valid display mode when going full screen 41859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!fullscreen) { 41959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta valid = true; 42059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 42159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 42259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta valid = device.isFullScreenSupported(); 42359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 42459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 42559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (valid) { 42659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //use the GameSettings class to save it. 42759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setWidth(width); 42859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setHeight(height); 42959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setBitsPerPixel(depth); 43059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setFrequency(freq); 43159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setFullscreen(fullscreen); 43259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setVSync(vsync); 43359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //source.setRenderer(renderer); 43459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.setSamples(multisample); 43559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 43659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String appTitle = source.getTitle(); 43759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 43859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 43959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta source.save(appTitle); 44059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (BackingStoreException ex) { 44159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, 44259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta "Failed to save setting changes", ex); 44359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 44459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 44559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta showError( 44659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this, 44759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta "Your monitor claims to not support the display mode you've selected.\n" 44859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + "The combination of bit depth and refresh rate is not supported."); 44959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 45059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 45159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return valid; 45259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 45359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 45459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 45559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>setUpChooser</code> retrieves all available display modes and 45659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * places them in a <code>JComboBox</code>. The resolution specified by 45759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * GameSettings is used as the default value. 45859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 45959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the combo box of display modes. 46059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 46159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JComboBox setUpResolutionChooser() { 46259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] res = getResolutions(modes); 46359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JComboBox resolutionBox = new JComboBox(res); 46459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 46559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resolutionBox.setSelectedItem(source.getWidth() + " x " 46659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta + source.getHeight()); 46759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resolutionBox.addActionListener(new ActionListener() { 46859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 46959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void actionPerformed(ActionEvent e) { 47059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateDisplayChoices(); 47159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 47259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 47359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 47459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return resolutionBox; 47559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 47659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 47759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 47859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>setUpRendererChooser</code> sets the list of available renderers. 47959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Data is obtained from the <code>DisplaySystem</code> class. The 48059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * renderer specified by GameSettings is used as the default value. 48159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 48259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the list of renderers. 48359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 48459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private JComboBox setUpRendererChooser() { 48559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String modes[] = {"NULL", "JOGL-OpenGL1", "LWJGL-OpenGL2", "LWJGL-OpenGL3", "LWJGL-OpenGL3.1"}; 48659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JComboBox nameBox = new JComboBox(modes); 48759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta nameBox.setSelectedItem(source.getRenderer()); 48859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return nameBox; 48959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 49059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 49159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 49259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>updateDisplayChoices</code> updates the available color depth and 49359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * display frequency options to match the currently selected resolution. 49459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 49559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void updateDisplayChoices() { 49659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!fullscreenBox.isSelected()) { 49759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // don't run this function when changing windowed settings 49859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 49959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 50059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String resolution = (String) displayResCombo.getSelectedItem(); 50159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String colorDepth = (String) colorDepthCombo.getSelectedItem(); 50259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (colorDepth == null) { 50359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepth = source.getBitsPerPixel() + " bpp"; 50459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 50559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String displayFreq = (String) displayFreqCombo.getSelectedItem(); 50659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (displayFreq == null) { 50759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreq = source.getFrequency() + " Hz"; 50859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 50959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 51059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // grab available depths 51159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] depths = getDepths(resolution, modes); 51259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepthCombo.setModel(new DefaultComboBoxModel(depths)); 51359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepthCombo.setSelectedItem(colorDepth); 51459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // grab available frequencies 51559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] freqs = getFrequencies(resolution, modes); 51659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo.setModel(new DefaultComboBoxModel(freqs)); 51759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Try to reset freq 51859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo.setSelectedItem(displayFreq); 51959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 52059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 52159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 52259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <code>updateResolutionChoices</code> updates the available resolutions 52359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * list to match the currently selected window mode (fullscreen or 52459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * windowed). It then sets up a list of standard options (if windowed) or 52559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * calls <code>updateDisplayChoices</code> (if fullscreen). 52659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 52759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void updateResolutionChoices() { 52859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!fullscreenBox.isSelected()) { 52959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayResCombo.setModel(new DefaultComboBoxModel( 53059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta windowedResolutions)); 53159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta colorDepthCombo.setModel(new DefaultComboBoxModel(new String[]{ 53259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta "24 bpp", "16 bpp"})); 53359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo.setModel(new DefaultComboBoxModel( 53459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta new String[]{"n/a"})); 53559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo.setEnabled(false); 53659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 53759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayResCombo.setModel(new DefaultComboBoxModel( 53859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta getResolutions(modes))); 53959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta displayFreqCombo.setEnabled(true); 54059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta updateDisplayChoices(); 54159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 54259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 54359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 54459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private void updateAntialiasChoices() { 54559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // maybe in the future will add support for determining this info 54659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // through pbuffer 54759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] choices = new String[]{"Disabled", "2x", "4x", "6x", "8x", "16x"}; 54859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta antialiasCombo.setModel(new DefaultComboBoxModel(choices)); 54959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta antialiasCombo.setSelectedItem(choices[Math.min(source.getSamples()/2,5)]); 55059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 55159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 55259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // 55359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Utility methods 55459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // 55559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 55659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Utility method for converting a String denoting a file into a URL. 55759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 55859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return a URL pointing to the file or null 55959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 56059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static URL getURL(String file) { 56159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta URL url = null; 56259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 56359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta url = new URL("file:" + file); 56459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (MalformedURLException e) { 56559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 56659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return url; 56759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 56859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 56959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static void showError(java.awt.Component parent, String message) { 57059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JOptionPane.showMessageDialog(parent, message, "Error", 57159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JOptionPane.ERROR_MESSAGE); 57259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 57359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 57459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 57559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Returns every unique resolution from an array of <code>DisplayMode</code>s. 57659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 57759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static String[] getResolutions(DisplayMode[] modes) { 57859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ArrayList<String> resolutions = new ArrayList<String>(modes.length); 57959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < modes.length; i++) { 58059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String res = modes[i].getWidth() + " x " + modes[i].getHeight(); 58159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!resolutions.contains(res)) { 58259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resolutions.add(res); 58359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 58459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 58559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 58659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] res = new String[resolutions.size()]; 58759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resolutions.toArray(res); 58859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return res; 58959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 59059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 59159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 59259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Returns every possible bit depth for the given resolution. 59359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 59459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static String[] getDepths(String resolution, DisplayMode[] modes) { 59559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ArrayList<String> depths = new ArrayList<String>(4); 59659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < modes.length; i++) { 59759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Filter out all bit depths lower than 16 - Java incorrectly 59859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // reports 59959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // them as valid depths though the monitor does not support them 60059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (modes[i].getBitDepth() < 16 && modes[i].getBitDepth() > 0) { 60159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta continue; 60259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 60359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 60459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String res = modes[i].getWidth() + " x " + modes[i].getHeight(); 60559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String depth = modes[i].getBitDepth() + " bpp"; 60659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (res.equals(resolution) && !depths.contains(depth)) { 60759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta depths.add(depth); 60859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 60959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 61059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 61159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (depths.size() == 1 && depths.contains("-1 bpp")) { 61259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // add some default depths, possible system is multi-depth supporting 61359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta depths.clear(); 61459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta depths.add("24 bpp"); 61559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 61659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 61759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] res = new String[depths.size()]; 61859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta depths.toArray(res); 61959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return res; 62059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 62159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 62259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 62359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Returns every possible refresh rate for the given resolution. 62459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 62559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static String[] getFrequencies(String resolution, 62659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta DisplayMode[] modes) { 62759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta ArrayList<String> freqs = new ArrayList<String>(4); 62859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (int i = 0; i < modes.length; i++) { 62959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String res = modes[i].getWidth() + " x " + modes[i].getHeight(); 63059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String freq; 63159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (modes[i].getRefreshRate() == DisplayMode.REFRESH_RATE_UNKNOWN) { 63259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta freq = "???"; 63359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 63459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta freq = modes[i].getRefreshRate() + " Hz"; 63559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 63659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 63759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (res.equals(resolution) && !freqs.contains(freq)) { 63859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta freqs.add(freq); 63959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 64059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 64159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 64259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String[] res = new String[freqs.size()]; 64359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta freqs.toArray(res); 64459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return res; 64559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 64659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 64759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 64859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Utility class for sorting <code>DisplayMode</code>s. Sorts by 64959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * resolution, then bit depth, and then finally refresh rate. 65059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 65159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private class DisplayModeSorter implements Comparator<DisplayMode> { 65259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 65359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 65459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) 65559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 65659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int compare(DisplayMode a, DisplayMode b) { 65759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Width 65859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (a.getWidth() != b.getWidth()) { 65959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (a.getWidth() > b.getWidth()) ? 1 : -1; 66059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 66159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Height 66259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (a.getHeight() != b.getHeight()) { 66359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (a.getHeight() > b.getHeight()) ? 1 : -1; 66459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 66559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Bit depth 66659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (a.getBitDepth() != b.getBitDepth()) { 66759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (a.getBitDepth() > b.getBitDepth()) ? 1 : -1; 66859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 66959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Refresh rate 67059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (a.getRefreshRate() != b.getRefreshRate()) { 67159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (a.getRefreshRate() > b.getRefreshRate()) ? 1 : -1; 67259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 67359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // All fields are equal 67459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return 0; 67559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 67659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 67759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 678