|
@@ -38,10 +38,12 @@ import java.awt.image.BufferedImage;
|
|
|
import java.lang.reflect.Method;
|
|
|
import java.net.MalformedURLException;
|
|
|
import java.net.URL;
|
|
|
+import java.text.MessageFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Comparator;
|
|
|
import java.util.List;
|
|
|
+import java.util.ResourceBundle;
|
|
|
import java.util.logging.Level;
|
|
|
import java.util.logging.Logger;
|
|
|
import java.util.prefs.BackingStoreException;
|
|
@@ -68,27 +70,32 @@ public final class SettingsDialog extends JDialog {
|
|
|
public static final int NO_SELECTION = 0,
|
|
|
APPROVE_SELECTION = 1,
|
|
|
CANCEL_SELECTION = 2;
|
|
|
+
|
|
|
+ // Resource bundle for i18n.
|
|
|
+ ResourceBundle resourceBundle = ResourceBundle.getBundle("com.jme3.app/SettingsDialog");
|
|
|
+
|
|
|
// connection to properties file.
|
|
|
private final AppSettings source;
|
|
|
+
|
|
|
// Title Image
|
|
|
private URL imageFile = null;
|
|
|
// Array of supported display modes
|
|
|
private DisplayMode[] modes = null;
|
|
|
- // Array of windowed resolutions
|
|
|
- private String[] windowedResolutions = {"320 x 240", "640 x 480", "800 x 600",
|
|
|
- "1024 x 768", "1152 x 864", "1280 x 720"};
|
|
|
+
|
|
|
// UI components
|
|
|
private JCheckBox vsyncBox = null;
|
|
|
private JCheckBox fullscreenBox = null;
|
|
|
private JComboBox displayResCombo = null;
|
|
|
private JComboBox colorDepthCombo = null;
|
|
|
private JComboBox displayFreqCombo = null;
|
|
|
-// private JComboBox rendererCombo = null;
|
|
|
private JComboBox antialiasCombo = null;
|
|
|
private JLabel icon = null;
|
|
|
private int selection = 0;
|
|
|
private SelectionListener selectionListener = null;
|
|
|
|
|
|
+ private int minWidth = 0;
|
|
|
+ private int minHeight = 0;
|
|
|
+
|
|
|
/**
|
|
|
* Constructor for the <code>PropertiesDialog</code>. Creates a
|
|
|
* properties dialog initialized for the primary display.
|
|
@@ -128,9 +135,9 @@ public final class SettingsDialog extends JDialog {
|
|
|
this.source = source;
|
|
|
this.imageFile = imageFile;
|
|
|
|
|
|
-// setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
|
|
|
setModal(true);
|
|
|
setAlwaysOnTop(true);
|
|
|
+ setResizable(false);
|
|
|
|
|
|
AppSettings registrySettings = new AppSettings(true);
|
|
|
|
|
@@ -140,6 +147,10 @@ public final class SettingsDialog extends JDialog {
|
|
|
}else{
|
|
|
appTitle = registrySettings.getTitle();
|
|
|
}
|
|
|
+
|
|
|
+ minWidth = source.getMinWidth();
|
|
|
+ minHeight = source.getMinHeight();
|
|
|
+
|
|
|
try {
|
|
|
registrySettings.load(appTitle);
|
|
|
} catch (BackingStoreException ex) {
|
|
@@ -157,7 +168,7 @@ public final class SettingsDialog extends JDialog {
|
|
|
|
|
|
modes = device.getDisplayModes();
|
|
|
Arrays.sort(modes, new DisplayModeSorter());
|
|
|
-
|
|
|
+
|
|
|
createUI();
|
|
|
}
|
|
|
|
|
@@ -174,6 +185,25 @@ public final class SettingsDialog extends JDialog {
|
|
|
selectionListener.onSelection(selection);
|
|
|
}
|
|
|
|
|
|
+ public int getMinWidth() {
|
|
|
+ return minWidth;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setMinWidth(int minWidth) {
|
|
|
+ this.minWidth = minWidth;
|
|
|
+ }
|
|
|
+
|
|
|
+ public int getMinHeight() {
|
|
|
+ return minHeight;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setMinHeight(int minHeight) {
|
|
|
+ this.minHeight = minHeight;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* <code>setImage</code> sets the background image of the dialog.
|
|
|
*
|
|
@@ -216,6 +246,10 @@ public final class SettingsDialog extends JDialog {
|
|
|
* <code>init</code> creates the components to use the dialog.
|
|
|
*/
|
|
|
private void createUI() {
|
|
|
+ GridBagConstraints gbc;
|
|
|
+
|
|
|
+ JPanel mainPanel = new JPanel(new GridBagLayout());
|
|
|
+
|
|
|
try {
|
|
|
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
|
|
} catch (Exception e) {
|
|
@@ -224,6 +258,7 @@ public final class SettingsDialog extends JDialog {
|
|
|
|
|
|
addWindowListener(new WindowAdapter() {
|
|
|
|
|
|
+ @Override
|
|
|
public void windowClosing(WindowEvent e) {
|
|
|
setUserSelection(CANCEL_SELECTION);
|
|
|
dispose();
|
|
@@ -234,25 +269,17 @@ public final class SettingsDialog extends JDialog {
|
|
|
safeSetIconImages( (List<BufferedImage>) Arrays.asList((BufferedImage[]) source.getIcons()) );
|
|
|
}
|
|
|
|
|
|
- setTitle("Select Display Settings");
|
|
|
-
|
|
|
- // The panels...
|
|
|
- JPanel mainPanel = new JPanel();
|
|
|
- JPanel centerPanel = new JPanel();
|
|
|
- JPanel optionsPanel = new JPanel();
|
|
|
- JPanel buttonPanel = new JPanel();
|
|
|
+ setTitle(MessageFormat.format(resourceBundle.getString("frame.title"), source.getTitle()));
|
|
|
+
|
|
|
// The buttons...
|
|
|
- JButton ok = new JButton("Ok");
|
|
|
- JButton cancel = new JButton("Cancel");
|
|
|
+ JButton ok = new JButton(resourceBundle.getString("button.ok"));
|
|
|
+ JButton cancel = new JButton(resourceBundle.getString("button.cancel"));
|
|
|
|
|
|
icon = new JLabel(imageFile != null ? new ImageIcon(imageFile) : null);
|
|
|
|
|
|
- mainPanel.setLayout(new BorderLayout());
|
|
|
-
|
|
|
- centerPanel.setLayout(new BorderLayout());
|
|
|
-
|
|
|
KeyListener aListener = new KeyAdapter() {
|
|
|
|
|
|
+ @Override
|
|
|
public void keyPressed(KeyEvent e) {
|
|
|
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
|
|
|
if (verifyAndSaveCurrentSelection()) {
|
|
@@ -275,7 +302,7 @@ public final class SettingsDialog extends JDialog {
|
|
|
displayFreqCombo.addKeyListener(aListener);
|
|
|
antialiasCombo = new JComboBox();
|
|
|
antialiasCombo.addKeyListener(aListener);
|
|
|
- fullscreenBox = new JCheckBox("Fullscreen?");
|
|
|
+ fullscreenBox = new JCheckBox(resourceBundle.getString("checkbox.fullscreen"));
|
|
|
fullscreenBox.setSelected(source.isFullscreen());
|
|
|
fullscreenBox.addActionListener(new ActionListener() {
|
|
|
|
|
@@ -283,25 +310,73 @@ public final class SettingsDialog extends JDialog {
|
|
|
updateResolutionChoices();
|
|
|
}
|
|
|
});
|
|
|
- vsyncBox = new JCheckBox("VSync?");
|
|
|
+ vsyncBox = new JCheckBox(resourceBundle.getString("checkbox.vsync"));
|
|
|
vsyncBox.setSelected(source.isVSync());
|
|
|
-// rendererCombo = setUpRendererChooser();
|
|
|
-// rendererCombo.addKeyListener(aListener);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- updateResolutionChoices();
|
|
|
- updateAntialiasChoices();
|
|
|
- displayResCombo.setSelectedItem(source.getWidth() + " x " + source.getHeight());
|
|
|
- colorDepthCombo.setSelectedItem(source.getBitsPerPixel() + " bpp");
|
|
|
|
|
|
- optionsPanel.add(displayResCombo);
|
|
|
- optionsPanel.add(colorDepthCombo);
|
|
|
- optionsPanel.add(displayFreqCombo);
|
|
|
- optionsPanel.add(antialiasCombo);
|
|
|
- optionsPanel.add(fullscreenBox);
|
|
|
- optionsPanel.add(vsyncBox);
|
|
|
-// optionsPanel.add(rendererCombo);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.weightx = 0.5;
|
|
|
+ gbc.gridx = 0;
|
|
|
+ gbc.gridwidth = 2;
|
|
|
+ gbc.gridy = 1;
|
|
|
+ gbc.anchor = GridBagConstraints.EAST;
|
|
|
+ mainPanel.add(fullscreenBox, gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.weightx = 0.5;
|
|
|
+ gbc.insets = new Insets(4, 16, 0, 4);
|
|
|
+ gbc.gridx = 2;
|
|
|
+ gbc.gridwidth = 2;
|
|
|
+ gbc.gridy = 1;
|
|
|
+ gbc.anchor = GridBagConstraints.WEST;
|
|
|
+ mainPanel.add(vsyncBox, gbc);
|
|
|
+
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.insets = new Insets(4, 4, 4, 4);
|
|
|
+ gbc.gridx = 0;
|
|
|
+ gbc.gridy = 2;
|
|
|
+ gbc.anchor = GridBagConstraints.EAST;
|
|
|
+ gbc.weightx = 0.5;
|
|
|
+ mainPanel.add(new JLabel(resourceBundle.getString("label.resolutions")), gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.gridx = 1;
|
|
|
+ gbc.gridy = 2;
|
|
|
+ gbc.anchor = GridBagConstraints.WEST;
|
|
|
+ mainPanel.add(displayResCombo, gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.insets = new Insets(4, 16, 4, 4);
|
|
|
+ gbc.gridx = 2;
|
|
|
+ gbc.gridy = 2;
|
|
|
+ gbc.anchor = GridBagConstraints.EAST;
|
|
|
+ mainPanel.add(new JLabel(resourceBundle.getString("label.colordepth")), gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.weightx = 0.5;
|
|
|
+ gbc.gridx = 3;
|
|
|
+ gbc.gridy = 2;
|
|
|
+ gbc.anchor = GridBagConstraints.WEST;
|
|
|
+ mainPanel.add(colorDepthCombo, gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.insets = new Insets(4, 4, 4, 4);
|
|
|
+ gbc.weightx = 0.5;
|
|
|
+ gbc.gridx = 0;
|
|
|
+ gbc.gridy = 3;
|
|
|
+ gbc.anchor = GridBagConstraints.EAST;
|
|
|
+ mainPanel.add(new JLabel(resourceBundle.getString("label.refresh")), gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.gridx = 1;
|
|
|
+ gbc.gridy = 3;
|
|
|
+ gbc.anchor = GridBagConstraints.WEST;
|
|
|
+ mainPanel.add(displayFreqCombo, gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.insets = new Insets(4, 16, 4, 4);
|
|
|
+ gbc.gridx = 2;
|
|
|
+ gbc.gridy = 3;
|
|
|
+ gbc.anchor = GridBagConstraints.EAST;
|
|
|
+ mainPanel.add(new JLabel(resourceBundle.getString("label.antialias")), gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.weightx = 0.5;
|
|
|
+ gbc.gridx = 3;
|
|
|
+ gbc.gridy = 3;
|
|
|
+ gbc.anchor = GridBagConstraints.WEST;
|
|
|
+ mainPanel.add(antialiasCombo, gbc);
|
|
|
|
|
|
// Set the button action listeners. Cancel disposes without saving, OK
|
|
|
// saves.
|
|
@@ -323,20 +398,50 @@ public final class SettingsDialog extends JDialog {
|
|
|
}
|
|
|
});
|
|
|
|
|
|
- buttonPanel.add(ok);
|
|
|
- buttonPanel.add(cancel);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.gridx = 0;
|
|
|
+ gbc.gridwidth = 2;
|
|
|
+ gbc.gridy = 4;
|
|
|
+ gbc.anchor = GridBagConstraints.EAST;
|
|
|
+ mainPanel.add(ok, gbc);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.insets = new Insets(4, 16, 4, 4);
|
|
|
+ gbc.gridx = 2;
|
|
|
+ gbc.gridwidth = 2;
|
|
|
+ gbc.gridy = 4;
|
|
|
+ gbc.anchor = GridBagConstraints.WEST;
|
|
|
+ mainPanel.add(cancel, gbc);
|
|
|
|
|
|
if (icon != null) {
|
|
|
- centerPanel.add(icon, BorderLayout.NORTH);
|
|
|
+ gbc = new GridBagConstraints();
|
|
|
+ gbc.gridwidth = 4;
|
|
|
+ mainPanel.add(icon, gbc);
|
|
|
}
|
|
|
- centerPanel.add(optionsPanel, BorderLayout.SOUTH);
|
|
|
-
|
|
|
- mainPanel.add(centerPanel, BorderLayout.CENTER);
|
|
|
- mainPanel.add(buttonPanel, BorderLayout.SOUTH);
|
|
|
|
|
|
this.getContentPane().add(mainPanel);
|
|
|
|
|
|
pack();
|
|
|
+
|
|
|
+
|
|
|
+ SwingUtilities.invokeLater(new Runnable() {
|
|
|
+
|
|
|
+ public void run() {
|
|
|
+ // Fill in the combos once the window has opened so that the insets can be read.
|
|
|
+ // The assumption is made that the settings window and the display window will have the
|
|
|
+ // same insets as that is used to resize the "full screen windowed" mode appropriately.
|
|
|
+ updateResolutionChoices();
|
|
|
+ if (source.getWidth() != 0 && source.getHeight() != 0) {
|
|
|
+ displayResCombo.setSelectedItem(source.getWidth() + " x "
|
|
|
+ + source.getHeight());
|
|
|
+ } else {
|
|
|
+ displayResCombo.setSelectedIndex(displayResCombo.getItemCount()-1);
|
|
|
+ }
|
|
|
+
|
|
|
+ updateAntialiasChoices();
|
|
|
+ colorDepthCombo.setSelectedItem(source.getBitsPerPixel() + " bpp");
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/* Access JDialog.setIconImages by reflection in case we're running on JRE < 1.6 */
|
|
@@ -394,7 +499,7 @@ public final class SettingsDialog extends JDialog {
|
|
|
|
|
|
String aaString = (String) antialiasCombo.getSelectedItem();
|
|
|
int multisample = -1;
|
|
|
- if (aaString.equals("Disabled")) {
|
|
|
+ if (aaString.equals(resourceBundle.getString("antialias.disabled"))) {
|
|
|
multisample = 0;
|
|
|
} else {
|
|
|
multisample = Integer.parseInt(aaString.substring(0, aaString.indexOf('x')));
|
|
@@ -410,8 +515,6 @@ public final class SettingsDialog extends JDialog {
|
|
|
* false; } }
|
|
|
*/
|
|
|
|
|
|
- String renderer = "LWJGL-OpenGL2";//(String) rendererCombo.getSelectedItem();
|
|
|
-
|
|
|
boolean valid = false;
|
|
|
|
|
|
// test valid display mode when going full screen
|
|
@@ -444,8 +547,7 @@ public final class SettingsDialog extends JDialog {
|
|
|
} else {
|
|
|
showError(
|
|
|
this,
|
|
|
- "Your monitor claims to not support the display mode you've selected.\n"
|
|
|
- + "The combination of bit depth and refresh rate is not supported.");
|
|
|
+ resourceBundle.getString("error.unsupportedmode"));
|
|
|
}
|
|
|
|
|
|
return valid;
|
|
@@ -459,11 +561,8 @@ public final class SettingsDialog extends JDialog {
|
|
|
* @return the combo box of display modes.
|
|
|
*/
|
|
|
private JComboBox setUpResolutionChooser() {
|
|
|
- String[] res = getResolutions(modes);
|
|
|
- JComboBox resolutionBox = new JComboBox(res);
|
|
|
+ JComboBox resolutionBox = new JComboBox();
|
|
|
|
|
|
- resolutionBox.setSelectedItem(source.getWidth() + " x "
|
|
|
- + source.getHeight());
|
|
|
resolutionBox.addActionListener(new ActionListener() {
|
|
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
@@ -474,20 +573,6 @@ public final class SettingsDialog extends JDialog {
|
|
|
return resolutionBox;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * <code>setUpRendererChooser</code> sets the list of available renderers.
|
|
|
- * Data is obtained from the <code>DisplaySystem</code> class. The
|
|
|
- * renderer specified by GameSettings is used as the default value.
|
|
|
- *
|
|
|
- * @return the list of renderers.
|
|
|
- */
|
|
|
- private JComboBox setUpRendererChooser() {
|
|
|
- String modes[] = {"NULL", "JOGL-OpenGL1", "LWJGL-OpenGL2", "LWJGL-OpenGL3", "LWJGL-OpenGL3.1"};
|
|
|
- JComboBox nameBox = new JComboBox(modes);
|
|
|
- nameBox.setSelectedItem(source.getRenderer());
|
|
|
- return nameBox;
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* <code>updateDisplayChoices</code> updates the available color depth and
|
|
|
* display frequency options to match the currently selected resolution.
|
|
@@ -527,15 +612,15 @@ public final class SettingsDialog extends JDialog {
|
|
|
private void updateResolutionChoices() {
|
|
|
if (!fullscreenBox.isSelected()) {
|
|
|
displayResCombo.setModel(new DefaultComboBoxModel(
|
|
|
- windowedResolutions));
|
|
|
+ getWindowedResolutions(modes)));
|
|
|
colorDepthCombo.setModel(new DefaultComboBoxModel(new String[]{
|
|
|
"24 bpp", "16 bpp"}));
|
|
|
displayFreqCombo.setModel(new DefaultComboBoxModel(
|
|
|
- new String[]{"n/a"}));
|
|
|
+ new String[]{resourceBundle.getString("refresh.na")}));
|
|
|
displayFreqCombo.setEnabled(false);
|
|
|
} else {
|
|
|
displayResCombo.setModel(new DefaultComboBoxModel(
|
|
|
- getResolutions(modes)));
|
|
|
+ getResolutions(modes, Integer.MAX_VALUE)));
|
|
|
displayFreqCombo.setEnabled(true);
|
|
|
updateDisplayChoices();
|
|
|
}
|
|
@@ -544,7 +629,7 @@ public final class SettingsDialog extends JDialog {
|
|
|
private void updateAntialiasChoices() {
|
|
|
// maybe in the future will add support for determining this info
|
|
|
// through pbuffer
|
|
|
- String[] choices = new String[]{"Disabled", "2x", "4x", "6x", "8x", "16x"};
|
|
|
+ String[] choices = new String[]{resourceBundle.getString("antialias.disabled"), "2x", "4x", "6x", "8x", "16x"};
|
|
|
antialiasCombo.setModel(new DefaultComboBoxModel(choices));
|
|
|
antialiasCombo.setSelectedItem(choices[Math.min(source.getSamples()/2,5)]);
|
|
|
}
|
|
@@ -572,14 +657,26 @@ public final class SettingsDialog extends JDialog {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Returns every unique resolution from an array of <code>DisplayMode</code>s.
|
|
|
+ * Returns every unique resolution from an array of <code>DisplayMode</code>s
|
|
|
+ * where the resolution is greater than the configured minimums.
|
|
|
*/
|
|
|
- private static String[] getResolutions(DisplayMode[] modes) {
|
|
|
+ private String[] getResolutions(DisplayMode[] modes, int heightLimit) {
|
|
|
ArrayList<String> resolutions = new ArrayList<String>(modes.length);
|
|
|
for (int i = 0; i < modes.length; i++) {
|
|
|
- String res = modes[i].getWidth() + " x " + modes[i].getHeight();
|
|
|
- if (!resolutions.contains(res)) {
|
|
|
- resolutions.add(res);
|
|
|
+ int height = modes[i].getHeight();
|
|
|
+ int width = modes[i].getWidth();
|
|
|
+ if (width >= minWidth && height >= minHeight && height <= heightLimit) {
|
|
|
+ if (height == heightLimit) {
|
|
|
+ // If height is equal to height limit then subtract the size of the window frame and use that
|
|
|
+ Insets insets = getInsets();
|
|
|
+ height -= insets.top + insets.bottom;
|
|
|
+ width -= insets.left + insets.right;
|
|
|
+ }
|
|
|
+
|
|
|
+ String res = width + " x " + height;
|
|
|
+ if (!resolutions.contains(res)) {
|
|
|
+ resolutions.add(res);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -587,6 +684,22 @@ public final class SettingsDialog extends JDialog {
|
|
|
resolutions.toArray(res);
|
|
|
return res;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Returns every unique resolution from an array of <code>DisplayMode</code>s
|
|
|
+ * where the resolution is greater than the configured minimums and the height
|
|
|
+ * is less than the current screen resolution.
|
|
|
+ */
|
|
|
+ private String[] getWindowedResolutions(DisplayMode[] modes) {
|
|
|
+ int maxHeight = 0;
|
|
|
+ for (int i = 0; i < modes.length; i++) {
|
|
|
+ if (maxHeight < modes[i].getHeight()) {
|
|
|
+ maxHeight = modes[i].getHeight();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return getResolutions(modes, maxHeight);
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* Returns every possible bit depth for the given resolution.
|