/**
* Abstract settings class with helper widgets, and change detection.
*/
/*
Copywrite 2016 Will Winder
This file is part of Universal Gcode Sender (UGS).
UGS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.universalgcodesender.uielements.helpers;
import com.willwinder.universalgcodesender.uielements.IChanged;
import com.willwinder.universalgcodesender.utils.Settings;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerModel;
import javax.swing.event.ChangeEvent;
import net.miginfocom.swing.MigLayout;
/**
*
* @author wwinder
*/
public abstract class AbstractUGSSettings extends JPanel {
final private Collection<Component> components = new ArrayList<>();
final protected Settings settings;
final private IChanged changer;
public AbstractUGSSettings(Settings settings, IChanged changer) {
this.settings = settings;
this.changer = changer;
}
protected abstract void updateComponentsInternal(Settings s);
public abstract void save();
public abstract String getHelpMessage();
public abstract void restoreDefaults() throws Exception;
protected void change() {
if (changer != null) changer.changed();
}
private void initActions() {
for (Component c : components) {
Class clazz = c.getClass();
if (clazz == Spinner.class) {
((Spinner)c).spinner.addChangeListener((ChangeEvent e) -> {
change();
});
}
else if (clazz == Checkbox.class) {
((Checkbox)c).box.addActionListener((ActionEvent e) -> {
change();
});
}
else if (clazz == JComboBox.class) {
((JComboBox)c).addActionListener((ActionEvent e) -> {
change();
});
}
else if (clazz == JButton.class) {
((JButton)c).addActionListener((ActionEvent e) -> {
change();
});
}
}
}
public Component addIgnoreChanges(Component comp) {
return super.add(comp);
}
public void addIgnoreChanges(Component comp, Object constraints) {
super.add(comp, constraints);
}
public Component add(Component comp) {
Component ret = super.add(comp);
components.add(comp);
return ret;
}
public Component add(JPanel panel, Component comp) {
Component ret = panel.add(comp);
components.add(comp);
return ret;
}
protected void updateComponents() {
updateComponents(settings);
}
public void updateComponents(Settings s) {
components.clear();
updateComponentsInternal(s);
initActions();
}
/**
* Helper object to simplify layout.
*/
protected class Spinner extends JPanel {
JLabel label;
public JSpinner spinner;
public Spinner(String text, SpinnerModel model) {
label = new JLabel(text);
spinner = new JSpinner(model);
setLayout(new MigLayout("insets 0, wrap 2"));
add(spinner, "w 70");
add(label);
}
public void setValue(Object v) { spinner.setValue(v); }
public Object getValue() { return spinner.getValue(); }
}
protected class Checkbox extends JPanel {
public JCheckBox box;
public Checkbox(String text) {
box = new JCheckBox(text);
setLayout(new MigLayout("insets 0"));
add(box, "gapleft 50, w 100");
}
public void setSelected(Boolean s) {box.setSelected(s); }
public boolean getValue() { return box.isSelected(); }
}
}