import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
+import javax.swing.LookAndFeel;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
import net.pterodactylus.jsite.i18n.I18n;
import net.pterodactylus.jsite.i18n.I18nable;
/**
* The configuration dialog.
- *
+ *
* @author <a href="mailto:dr@ina-germany.de">David Roden</a>
* @version $Id$
*/
/** The “use custom user font” action. */
private I18nAction useCustomUserFontAction;
+ /** The “use custom L&F” action. */
+ private I18nAction useCustomLAFAction;
+
/** The “restart required” warning label. */
private I18nLabel restartRequiredLabel;
/** The user font size spinner. */
private JSpinner userFontSizeSpinner;
+ /** The checkbox for custom L&F. */
+ private JCheckBox useCustomLAFCheckBox;
+
+ /** The combo box for the L&Fs. */
+ private JComboBox customLAFComboBox;
+
/** Whether the dialog was cancelled. */
private boolean cancelled;
/**
* Creates a new configuration dialog.
- *
+ *
* @param swingInterface
* The Swing interface
*/
/**
* Returns whether the dialog was cancelled or confirmed. If the dialog was
* cancelled, no further processing should be done.
- *
+ *
* @return <code>true</code> if the dialog was cancelled,
* <code>false</code> otherwise
*/
/**
* Returns whether the advanced mode is selected.
- *
+ *
* @return <code>true</code> if the advanced mode is selected,
* <code>false</code> otherwise
*/
/**
* Sets whether the advanced mode is selected.
- *
+ *
* @param advancedMode
* <code>true</code> if the advanced mode is selected,
* <code>false</code> otherwise
* Returns whether the “beautify” checkbox has been selected. The result of
* this method should not be used if {@link #wasCancelled()} returned
* <code>true</code>!
- *
+ *
* @return <code>true</code> if the checkbox was selected,
* <code>false</code> otherwise
*/
/**
* Sets the state of the “antialias” checkbox.
- *
+ *
* @param antialias
* The state of the checkbox
*/
/**
* Returns the font for the controls.
- *
+ *
* @return The control font, or <code>null</code> if no custom control
* font is to be used
*/
/**
* Sets the font for the controls.
- *
+ *
* @param controlFont
* The control font, or <code>null</code> if no custom control
* font is to be used
/**
* Returns the font for user input.
- *
+ *
* @return The font for user input, or <code>null</code> if no custom user
* input font is to be used
*/
/**
* Sets the font for user input.
- *
+ *
* @param userFont
* The font for user input, or <code>null</code> if no custom
* user input font is to be used
}
}
+ /**
+ * Returns the class name of the selected look and feel, if a custom look
+ * and feel is selected.
+ *
+ * @return The class name of the look and feel to load, or <code>null</code>
+ * if no special look and feel should be used
+ */
+ public String getLookAndFeel() {
+ if (!useCustomLAFCheckBox.isSelected()) {
+ return null;
+ }
+ return ((LookAndFeelWrapper) customLAFComboBox.getSelectedItem()).getClassName();
+ }
+
+ /**
+ * Sets the given look and feel.
+ *
+ * @param lookAndFeel
+ * The class name of the look and feel, or <code>null</code> to
+ * not select a custom look and feel
+ */
+ public void setLookAndFeel(String lookAndFeel) {
+ useCustomLAFCheckBox.setSelected(false);
+ customLAFComboBox.setEnabled(false);
+ if (lookAndFeel == null) {
+ return;
+ }
+ for (int lookAndFeelIndex = 0; lookAndFeelIndex < customLAFComboBox.getItemCount(); lookAndFeelIndex++) {
+ LookAndFeelWrapper lookAndFeelWrapper = (LookAndFeelWrapper) customLAFComboBox.getItemAt(lookAndFeelIndex);
+ if (lookAndFeelWrapper.getClassName().equals(lookAndFeel)) {
+ customLAFComboBox.setSelectedIndex(lookAndFeelIndex);
+ useCustomLAFCheckBox.setSelected(true);
+ break;
+ }
+ }
+ }
+
//
// PRIVATE METHODS
//
userFontSizeSpinner.setEnabled(selected);
}
};
+ useCustomLAFAction = new I18nAction("configurationDialog.page.interfaceTweaks.item.useCustomLAF") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent e) {
+ customLAFComboBox.setEnabled(useCustomLAFCheckBox.isSelected());
+ }
+ };
}
/**
/**
* Creates the interface configuration panel.
- *
+ *
* @return The interface configuration panel
*/
private JComponent createInterfaceConfig() {
/**
* Creates the panel for the interface tweaks configuration.
- *
+ *
* @return The interface tweaks configuration panel
*/
private JComponent createInterfaceTweaksConfig() {
userFontSizeSpinner = new JSpinner(new SpinnerNumberModel(12, 6, 80, 1));
interfaceTweaksConfigPanel.add(userFontSizeSpinner, new GridBagConstraints(2, 3, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(6, 6, 0, 0), 0, 0));
- interfaceTweaksConfigPanel.add(new JPanel(), new GridBagConstraints(0, 4, 3, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
+ useCustomLAFCheckBox = new JCheckBox(useCustomLAFAction);
+ interfaceTweaksConfigPanel.add(useCustomLAFCheckBox, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(6, 0, 0, 0), 0, 0));
+
+ LookAndFeelInfo[] lookAndFeelInfos = UIManager.getInstalledLookAndFeels();
+ List<LookAndFeelWrapper> lookAndFeelWrappers = new ArrayList<LookAndFeelWrapper>();
+ for (LookAndFeelInfo lookAndFeelInfo: lookAndFeelInfos) {
+ lookAndFeelWrappers.add(new LookAndFeelWrapper(lookAndFeelInfo.getClassName(), lookAndFeelInfo.getName()));
+ }
+ customLAFComboBox = new JComboBox(lookAndFeelWrappers.toArray(new LookAndFeelWrapper[0]));
+ interfaceTweaksConfigPanel.add(customLAFComboBox, new GridBagConstraints(1, 4, 2, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(6, 6, 0, 0), 0, 0));
+
+ interfaceTweaksConfigPanel.add(new JPanel(), new GridBagConstraints(0, 5, 3, 1, 1.0, 1.0, GridBagConstraints.LINE_START, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
return interfaceTweaksConfigPanel;
}
SwingUtils.repackCentered(this);
}
+ /**
+ * Wrapper around class name and name of a {@link LookAndFeel}.
+ *
+ * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
+ * @version $Id$
+ */
+ private static class LookAndFeelWrapper {
+
+ /** The class name of the look and feel. */
+ private final String className;
+
+ /** The name of a look and feel. */
+ private final String lookAndFeelName;
+
+ /**
+ * Creates a new wrapper around the given class name and name of a look
+ * and feel.
+ *
+ * @param className
+ * The class name of the look and feel
+ * @param lookAndFeelName
+ * The name of the look and feel
+ */
+ public LookAndFeelWrapper(String className, String lookAndFeelName) {
+ this.className = className;
+ this.lookAndFeelName = lookAndFeelName;
+ }
+
+ /**
+ * Returns the class name of the look and feel.
+ *
+ * @return The class name of the look and feel
+ */
+ public String getClassName() {
+ return className;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return lookAndFeelName;
+ }
+
+ }
+
}
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
import net.pterodactylus.jsite.core.Core;
import net.pterodactylus.jsite.core.CoreListener;
/** The user font. */
private String userFont;
+ /** The class name of the look and feel. */
+ private String lookAndFeel;
+
/**
* Creates a new swing interface.
*
this.configDirectory = configDirectory;
I18n.setLocale(Locale.ENGLISH);
loadConfig();
+ if (lookAndFeel != null) {
+ try {
+ UIManager.setLookAndFeel(lookAndFeel);
+ } catch (ClassNotFoundException cnfe1) {
+ logger.log(Level.WARNING, "could not load look and feel", cnfe1);
+ } catch (InstantiationException ie1) {
+ logger.log(Level.WARNING, "could not load look and feel", ie1);
+ } catch (IllegalAccessException iae1) {
+ logger.log(Level.WARNING, "could not load look and feel", iae1);
+ } catch (UnsupportedLookAndFeelException ulafe1) {
+ logger.log(Level.WARNING, "could not load look and feel", ulafe1);
+ }
+ }
if (antialias) {
System.setProperty("swing.aatext", "true");
}
if (configProperties.containsKey("userFont")) {
userFont = configProperties.getProperty("userFont");
}
+ if (configProperties.containsKey("lookAndFeel")) {
+ lookAndFeel = configProperties.getProperty("lookAndFeel");
+ }
if (configProperties.containsKey("language")) {
I18n.setLocale(new Locale(configProperties.getProperty("language")));
}
if (userFont != null) {
configProperties.setProperty("userFont", userFont);
}
+ if (lookAndFeel != null) {
+ configProperties.setProperty("lookAndFeel", lookAndFeel);
+ }
configProperties.setProperty("language", I18n.getLocale().getLanguage());
FileOutputStream configOutputStream = null;
try {
configurationDialog.setAntialias(antialias);
configurationDialog.setControlFont(controlFont);
configurationDialog.setUserFont(userFont);
+ configurationDialog.setLookAndFeel(lookAndFeel);
configurationDialog.setVisible(true);
if (!configurationDialog.wasCancelled()) {
advancedMode = configurationDialog.isAdvancedMode();
antialias = configurationDialog.isAntialias();
controlFont = configurationDialog.getControlFont();
userFont = configurationDialog.getUserFont();
+ lookAndFeel = configurationDialog.getLookAndFeel();
saveConfig();
}
}