/* * WPCleaner: A tool to help on Wikipedia maintenance tasks. * Copyright (C) 2013 Nicolas Vervelle * * See README.txt file for licensing information. */ package org.wikipediacleaner.gui.swing.options; import java.awt.LayoutManager; import java.util.Enumeration; import java.util.HashMap; import java.util.Vector; import java.util.Map.Entry; import javax.swing.AbstractButton; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import org.wikipediacleaner.gui.swing.basic.Utilities; import org.wikipediacleaner.utils.Configuration; import org.wikipediacleaner.utils.ConfigurationValueBoolean; import org.wikipediacleaner.utils.ConfigurationValueInteger; import org.wikipediacleaner.utils.ConfigurationValueString; /** * Base class for an Options panel. */ abstract class OptionsPanel extends JPanel { /** * Serialization. */ private static final long serialVersionUID = -6581007549837818171L; /** * Construct an Options panel. * * @param layout Layout manager. */ public OptionsPanel(LayoutManager layout) { super(layout); booleanValues = new HashMap<ConfigurationValueBoolean, JCheckBox>(); integerValues = new HashMap<ConfigurationValueInteger, Object>(); stringValues = new HashMap<ConfigurationValueString, JComponent>(); } // ========================================================================== // Actions management // ========================================================================== /** * Restore all options to their default values. */ public void defaultValues() { defaultValuesBoolean(); defaultValuesInteger(); defaultValuesString(); } /** * Apply new values to the options. */ public void apply() { applyBoolean(); applyInteger(); applyString(); } // ========================================================================== // Boolean options management // ========================================================================== /** * Map of check box for each boolean property. */ private final HashMap<ConfigurationValueBoolean, JCheckBox> booleanValues; /** * @param message Message displayed in the JCheckBox. * @param property Boolean property. * @return JCheckBox for the boolean property. */ protected JCheckBox createJCheckBox( String message, ConfigurationValueBoolean property) { if (property == null) { return null; } Configuration config = Configuration.getConfiguration(); boolean selected = config.getBoolean(null, property); JCheckBox chk = Utilities.createJCheckBox(message, selected); booleanValues.put(property, chk); return chk; } /** * Restore all boolean options to their default values. */ private void defaultValuesBoolean() { for (Entry<ConfigurationValueBoolean, JCheckBox> entry : booleanValues.entrySet()) { if ((entry.getValue() != null) && (entry.getKey() != null)) { entry.getValue().setSelected(entry.getKey().getDefaultValue()); } } } /** * Apply new values to the boolean options. */ private void applyBoolean() { Configuration config = Configuration.getConfiguration(); for (Entry<ConfigurationValueBoolean, JCheckBox> entry : booleanValues.entrySet()) { if ((entry.getValue() != null) && (entry.getKey() != null)) { config.setBoolean(null, entry.getKey(), entry.getValue().isSelected()); } } } // ========================================================================== // Integer options management // ========================================================================== /** * Map of spinner for each integer property. */ private final HashMap<ConfigurationValueInteger, Object> integerValues; /** * @param property Integer property. * @param minimum Minimum value. * @param maximum Maximum value. * @param stepSize Step size. * @return JSpinner for the integer property. */ protected JSpinner createJSpinner( ConfigurationValueInteger property, int minimum, int maximum, int stepSize) { if (property == null) { return null; } Configuration config = Configuration.getConfiguration(); int value = config.getInt(null, property); value = Math.max(minimum, Math.min(maximum, value)); SpinnerNumberModel model = new SpinnerNumberModel(value, minimum, maximum, stepSize); JSpinner spin = new JSpinner(model); integerValues.put(property, spin); return spin; } /** * @param property Integer property. */ protected void setButtonGroup( ConfigurationValueInteger property, ButtonGroup group) { if ((property == null) || (group == null)) { return; } Configuration config = Configuration.getConfiguration(); int value = config.getInt(null, property); integerValues.put(property, group); setButtonGroupSelection(group, value); } /** * Restore all integer options to their default values. */ private void defaultValuesInteger() { for (Entry<ConfigurationValueInteger, Object> entry : integerValues.entrySet()) { if ((entry.getValue() != null) && (entry.getKey() != null)) { if (entry.getValue() instanceof JSpinner) { JSpinner spinner = (JSpinner) entry.getValue(); SpinnerModel model = spinner.getModel(); model.setValue(Integer.valueOf(entry.getKey().getDefaultValue())); } if (entry.getValue() instanceof ButtonGroup) { ButtonGroup group = (ButtonGroup) entry.getValue(); setButtonGroupSelection(group, entry.getKey().getDefaultValue()); } } } } /** * @param group Button group. * @param value Value. */ private void setButtonGroupSelection(ButtonGroup group, int value) { if (group == null) { return; } Enumeration<AbstractButton> buttons = group.getElements(); int count = 0; while (buttons.hasMoreElements()) { AbstractButton button = buttons.nextElement(); group.setSelected(button.getModel(), (count == value)); count++; } } /** * Apply new values to the integer options. */ private void applyInteger() { Configuration config = Configuration.getConfiguration(); for (Entry<ConfigurationValueInteger, Object> entry : integerValues.entrySet()) { if ((entry.getValue() != null) && (entry.getKey() != null)) { if (entry.getValue() instanceof JSpinner) { JSpinner spinner = (JSpinner) entry.getValue(); Object value = spinner.getValue(); if (value instanceof Integer) { Integer intValue = (Integer) value; config.setInt(null, entry.getKey(), intValue.intValue()); } } if (entry.getValue() instanceof ButtonGroup) { ButtonGroup group = (ButtonGroup) entry.getValue(); int count = 0; Enumeration<AbstractButton> buttons = group.getElements(); while (buttons.hasMoreElements()) { AbstractButton button = buttons.nextElement(); if (group.isSelected(button.getModel())) { config.setInt(null, entry.getKey(), count); } count++; } } } } } // ========================================================================== // String options management // ========================================================================== /** * Map of text field for each string property. */ private final HashMap<ConfigurationValueString, JComponent> stringValues; /** * @param property String property. * @param columns Number of columns in the text field. * @return JTextField for the string property. */ protected JTextField createJTextField( ConfigurationValueString property, int columns) { if (property == null) { return null; } Configuration config = Configuration.getConfiguration(); String value = config.getString(null, property); JTextField txt = new JTextField(columns); txt.setText(value); stringValues.put(property, txt); return txt; } protected JComboBox createJComboBox( ConfigurationValueString property, Vector<String> items) { if (property == null) { return null; } JComboBox<String> combo = new JComboBox<String>(items); combo.setEditable(false); Configuration config = Configuration.getConfiguration(); String value = config.getString(null, property); combo.setSelectedItem(value); stringValues.put(property, combo); return combo; } /** * Restore all string options to their default values. */ private void defaultValuesString() { for (Entry<ConfigurationValueString, JComponent> entry : stringValues.entrySet()) { if ((entry.getValue() != null) && (entry.getKey() != null)) { if (entry.getValue() instanceof JTextField) { JTextField text = (JTextField) entry.getValue(); text.setText(entry.getKey().getDefaultValue()); } if (entry.getValue() instanceof JComboBox) { JComboBox combo = (JComboBox) entry.getValue(); combo.setSelectedItem(entry.getKey().getDefaultValue()); } } } } /** * Apply new values to the string options. */ private void applyString() { Configuration config = Configuration.getConfiguration(); for (Entry<ConfigurationValueString, JComponent> entry : stringValues.entrySet()) { if ((entry.getValue() != null) && (entry.getKey() != null)) { if (entry.getValue() instanceof JTextField) { JTextField text = (JTextField) entry.getValue(); config.setString(null, entry.getKey(), text.getText()); } if (entry.getValue() instanceof JComboBox) { JComboBox combo = (JComboBox) entry.getValue(); Object selection = combo.getSelectedItem(); if (selection != null) { config.setString(null, entry.getKey(), selection.toString()); } } } } } }