434 lines
13 KiB
Java
434 lines
13 KiB
Java
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() {
|
|
wrappedLabelMap.clear();
|
|
labelMap.clear();
|
|
stringMap.clear();
|
|
intMap.clear();
|
|
boolMap.clear();
|
|
sliderMap.clear();
|
|
comboMap.clear();
|
|
chooserMap.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; }
|
|
}
|
|
}
|