package net.vhati.modmanager.ui;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.HashMap;
import java.util.Map;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSlider;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.vhati.modmanager.ui.RegexDocument;
public class FieldEditorPanel extends JPanel {
public enum ContentType { WRAPPED_LABEL, LABEL, STRING, INTEGER, BOOLEAN, SLIDER, COMBO, CHOOSER };
private Map<String, JTextArea> wrappedLabelMap = new HashMap<String, JTextArea>();
private Map<String, JLabel> labelMap = new HashMap<String, JLabel>();
private Map<String, JTextField> stringMap = new HashMap<String, JTextField>();
private Map<String, JTextField> intMap = new HashMap<String, JTextField>();
private Map<String, JCheckBox> boolMap = new HashMap<String, JCheckBox>();
private Map<String, JSlider> sliderMap = new HashMap<String, JSlider>();
private Map<String, JComboBox> comboMap = new HashMap<String, JComboBox>();
private Map<String, Chooser> chooserMap = new HashMap<String, Chooser>();
private Map<String, JLabel> reminderMap = new HashMap<String, JLabel>();
private GridBagConstraints gridC = new GridBagConstraints();
private Component nameStrut = Box.createHorizontalStrut(1);
private Component valueStrut = Box.createHorizontalStrut(120);
private Component reminderStrut = Box.createHorizontalStrut(90);
private boolean remindersVisible;
public FieldEditorPanel( boolean remindersVisible ) {
super( new GridBagLayout() );
this.remindersVisible = remindersVisible;
gridC.anchor = GridBagConstraints.WEST;
gridC.fill = GridBagConstraints.HORIZONTAL;
gridC.weightx = 0.0;
gridC.weighty = 0.0;
gridC.gridwidth = 1;
gridC.gridx = 0;
gridC.gridy = 0;
// No default width for col 0.
gridC.gridx = 0;
this.add( nameStrut, gridC );
gridC.gridx++;
this.add( valueStrut, gridC );
gridC.gridx++;
if ( remindersVisible ) {
this.add( reminderStrut, gridC );
gridC.gridy++;
}
gridC.insets = new Insets(2, 4, 2, 4);
}
public void setNameWidth( int width ) {
nameStrut.setMinimumSize( new Dimension(width, 0) );
nameStrut.setPreferredSize( new Dimension(width, 0) );
}
public void setValueWidth( int width ) {
valueStrut.setMinimumSize( new Dimension(width, 0) );
valueStrut.setPreferredSize( new Dimension(width, 0) );
}
public void setReminderWidth( int width ) {
reminderStrut.setMinimumSize( new Dimension(width, 0) );
reminderStrut.setPreferredSize( new Dimension(width, 0) );
}
/**
* Constructs JComponents for a given type of value.
* A row consists of a static label, some JComponent,
* and a reminder label.
*
* The component and reminder will be accessable later
* via getter methods.
*/
public void addRow( String valueName, ContentType contentType ) {
gridC.fill = GridBagConstraints.HORIZONTAL;
gridC.gridwidth = 1;
gridC.weighty = 0.0;
gridC.gridx = 0;
this.add( new JLabel( valueName +":" ), gridC );
gridC.gridx++;
if ( contentType == ContentType.WRAPPED_LABEL ) {
gridC.anchor = GridBagConstraints.WEST;
JTextArea valueArea = new JTextArea();
valueArea.setBackground(null);
valueArea.setEditable( false );
valueArea.setBorder(null);
valueArea.setLineWrap( true );
valueArea.setWrapStyleWord( true );
valueArea.setFocusable( false );
valueArea.setFont( UIManager.getFont("Label.font") );
wrappedLabelMap.put( valueName, valueArea );
this.add( valueArea, gridC );
}
else if ( contentType == ContentType.LABEL ) {
gridC.anchor = GridBagConstraints.WEST;
JLabel valueLbl = new JLabel();
valueLbl.setHorizontalAlignment( SwingConstants.CENTER );
labelMap.put( valueName, valueLbl );
this.add( valueLbl, gridC );
}
else if ( contentType == ContentType.STRING ) {
gridC.anchor = GridBagConstraints.WEST;
JTextField valueField = new JTextField();
stringMap.put( valueName, valueField );
this.add( valueField, gridC );
}
else if ( contentType == ContentType.INTEGER ) {
gridC.anchor = GridBagConstraints.WEST;
JTextField valueField = new JTextField();
valueField.setHorizontalAlignment( JTextField.RIGHT );
valueField.setDocument( new RegexDocument("[0-9]*") );
intMap.put( valueName, valueField );
this.add( valueField, gridC );
}
else if ( contentType == ContentType.BOOLEAN ) {
gridC.anchor = GridBagConstraints.CENTER;
JCheckBox valueCheck = new JCheckBox();
valueCheck.setHorizontalAlignment( SwingConstants.CENTER );
boolMap.put( valueName, valueCheck );
this.add( valueCheck, gridC );
}
else if ( contentType == ContentType.SLIDER ) {
gridC.anchor = GridBagConstraints.CENTER;
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel, BoxLayout.X_AXIS) );
final JSlider valueSlider = new JSlider( JSlider.HORIZONTAL );
valueSlider.setPreferredSize( new Dimension(50, valueSlider.getPreferredSize().height) );
sliderMap.put( valueName, valueSlider );
panel.add(valueSlider);
final JTextField valueField = new JTextField(3);
valueField.setMaximumSize( valueField.getPreferredSize() );
valueField.setHorizontalAlignment( JTextField.RIGHT );
valueField.setEditable( false );
panel.add(valueField);
this.add( panel, gridC );
valueSlider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
valueField.setText( ""+valueSlider.getValue() );
}
});
}
else if ( contentType == ContentType.COMBO ) {
gridC.anchor = GridBagConstraints.CENTER;
JComboBox valueCombo = new JComboBox();
valueCombo.setEditable(false);
comboMap.put( valueName, valueCombo );
this.add( valueCombo, gridC );
}
else if ( contentType == ContentType.CHOOSER ) {
gridC.anchor = GridBagConstraints.WEST;
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel, BoxLayout.X_AXIS) );
JTextField chooserField = new JTextField();
panel.add( chooserField );
panel.add( Box.createHorizontalStrut( 5 ) );
JButton chooserBtn = new JButton( "..." );
chooserBtn.setMargin( new Insets(1,2,1,2) );
panel.add( chooserBtn );
Chooser valueChooser = new Chooser( chooserField, chooserBtn );
chooserMap.put( valueName, valueChooser );
this.add( panel, gridC );
}
gridC.gridx++;
if ( remindersVisible ) {
gridC.anchor = GridBagConstraints.WEST;
JLabel valueReminder = new JLabel();
reminderMap.put( valueName, valueReminder );
this.add( valueReminder, gridC );
}
gridC.gridy++;
}
public void addTextRow( String text ) {
gridC.fill = GridBagConstraints.HORIZONTAL;
gridC.weighty = 0.0;
gridC.gridwidth = GridBagConstraints.REMAINDER;
gridC.gridx = 0;
gridC.anchor = GridBagConstraints.WEST;
JTextArea textArea = new JTextArea( text );
textArea.setBackground(null);
textArea.setEditable( false );
textArea.setBorder(null);
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setFocusable( false );
textArea.setFont( UIManager.getFont("Label.font") );
this.add( textArea, gridC );
gridC.gridy++;
}
public void addSeparatorRow() {
gridC.fill = GridBagConstraints.HORIZONTAL;
gridC.weighty = 0.0;
gridC.gridwidth = GridBagConstraints.REMAINDER;
gridC.gridx = 0;
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout( panel, BoxLayout.Y_AXIS ) );
panel.add( Box.createVerticalStrut(8) );
JSeparator sep = new JSeparator();
sep.setPreferredSize( new Dimension(1, sep.getPreferredSize().height) );
panel.add( sep );
panel.add( Box.createVerticalStrut(8) );
this.add( panel, gridC );
gridC.gridy++;
}
public void addBlankRow() {
gridC.fill = GridBagConstraints.NONE;
gridC.weighty = 0.0;
gridC.gridwidth = GridBagConstraints.REMAINDER;
gridC.gridx = 0;
this.add( Box.createVerticalStrut(12), gridC );
gridC.gridy++;
}
public void addFillRow() {
gridC.fill = GridBagConstraints.VERTICAL;
gridC.weighty = 1.0;
gridC.gridwidth = GridBagConstraints.REMAINDER;
gridC.gridx = 0;
this.add( Box.createVerticalGlue(), gridC );
gridC.gridy++;
}
public void setStringAndReminder( String valueName, String s ) {
JTextField valueField = stringMap.get( valueName );
if ( valueField != null ) valueField.setText(s);
if ( remindersVisible ) setReminder( valueName, s );
}
public void setIntAndReminder( String valueName, int n ) {
setIntAndReminder( valueName, n, ""+n );
}
public void setIntAndReminder( String valueName, int n, String s ) {
JTextField valueField = intMap.get( valueName );
if ( valueField != null ) valueField.setText( ""+n );
if ( remindersVisible ) setReminder( valueName, s );
}
public void setBoolAndReminder( String valueName, boolean b ) {
setBoolAndReminder( valueName, b, ""+b );
}
public void setBoolAndReminder( String valueName, boolean b, String s ) {
JCheckBox valueCheck = boolMap.get( valueName );
if ( valueCheck != null ) valueCheck.setSelected(b);
if ( remindersVisible ) setReminder( valueName, s );
}
public void setSliderAndReminder( String valueName, int n ) {
setSliderAndReminder( valueName, n, ""+n );
}
public void setSliderAndReminder( String valueName, int n, String s ) {
JSlider valueSlider = sliderMap.get( valueName );
if ( valueSlider != null ) valueSlider.setValue(n);
if ( remindersVisible ) setReminder( valueName, s );
}
public void setComboAndReminder( String valueName, Object o ) {
setComboAndReminder( valueName, o, o.toString() );
}
public void setComboAndReminder( String valueName, Object o, String s ) {
JComboBox valueCombo = comboMap.get( valueName );
if ( valueCombo != null ) valueCombo.setSelectedItem(o);
if ( remindersVisible ) setReminder( valueName, s );
}
public void setChooserAndReminder( String valueName, String s ) {
Chooser valueChooser = chooserMap.get( valueName );
if ( valueChooser != null ) valueChooser.getTextField().setText(s);
if ( remindersVisible ) setReminder( valueName, s );
}
public void setReminder( String valueName, String s ) {
JLabel valueReminder = reminderMap.get( valueName );
if ( valueReminder != null ) valueReminder.setText( "( "+ s +" )" );
}
public JTextArea getWrappedLabel( String valueName ) {
return wrappedLabelMap.get( valueName );
}
public JLabel getLabel( String valueName ) {
return labelMap.get( valueName );
}
public JTextField getString( String valueName ) {
return stringMap.get( valueName );
}
public JTextField getInt( String valueName ) {
return intMap.get( valueName );
}
public JCheckBox getBoolean( String valueName ) {
return boolMap.get( valueName );
}
public JSlider getSlider( String valueName ) {
return sliderMap.get( valueName );
}
public JComboBox getCombo( String valueName ) {
return comboMap.get( valueName );
}
public Chooser getChooser( String valueName ) {
return chooserMap.get( valueName );
}
public void reset() {
for ( JTextArea valueArea : wrappedLabelMap.values() )
valueArea.setText("");
for ( JLabel valueLbl : labelMap.values() )
valueLbl.setText("");
for ( JTextField valueField : stringMap.values() )
valueField.setText("");
for ( JTextField valueField : intMap.values() )
valueField.setText("");
for ( JCheckBox valueCheck : boolMap.values() )
valueCheck.setSelected(false);
for ( JSlider valueSlider : sliderMap.values() )
valueSlider.setValue(0);
for ( JComboBox valueCombo : comboMap.values() )
valueCombo.removeAllItems();
for ( Chooser valueChooser : chooserMap.values() )
valueChooser.getTextField().setText("");
for ( JLabel valueReminder : reminderMap.values() )
valueReminder.setText("");
}
@Override
public void removeAll() {
labelMap.clear();
stringMap.clear();
intMap.clear();
boolMap.clear();
sliderMap.clear();
comboMap.clear();
reminderMap.clear();
super.removeAll();
gridC = new GridBagConstraints();
gridC.anchor = GridBagConstraints.WEST;
gridC.fill = GridBagConstraints.HORIZONTAL;
gridC.weightx = 0.0;
gridC.weighty = 0.0;
gridC.gridwidth = 1;
gridC.gridx = 0;
gridC.gridy = 0;
// No default width for col 0.
gridC.gridx = 0;
this.add( Box.createVerticalStrut(1), gridC );
gridC.gridx++;
this.add( valueStrut, gridC );
gridC.gridx++;
if ( remindersVisible ) {
this.add( reminderStrut, gridC );
gridC.gridy++;
}
gridC.insets = new Insets(2, 4, 2, 4);
}
public static class Chooser {
private JTextField textField;
private JButton button;
public Chooser( JTextField textField, JButton button ) {
this.textField = textField;
this.button = button;
}
public JTextField getTextField() { return textField; }
public JButton getButton() { return button; }
}
}