package info.u250.c2d.box2deditor.ui.controls;
import info.u250.c2d.box2d.model.b2FixtureDefModel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public abstract class FixtureDefPropertiesPanel extends AbstractBindablePropertiesPanel {
private static final long serialVersionUID = -8501957140419675396L;
private JTextField textName;
private JSpinner spinnerDensity;
private JSpinner spinnerFriction;
private JSpinner spinnerMaskBits;
private JSpinner spinnerCategoryBits;
private JSpinner spinnerGroupIndex;
private JCheckBox chckbxIsSensor;
private JSpinner spinnerRestitution;
private JPanel panel;
/** The list of available categories */
private static final Category[] CATEGORIES;
private JScrollPane scrollPaneCategoryBits;
private JList listCategoryBits;
private JScrollPane scrollPaneMaskBits;
private JList listMaskBits;
private JLabel lblMark;
private JTextField txtMark;
/**
* Class used to display the categories in a JList.
* @author William Bittle
* @version 1.0.0
* @since 1.0.0
*/
private static class Category {
/** The value of the category */
public short value;
/** The text shown in the list box */
public String text;
/**
* Full constructor.
* @param value the category
* @param text the category name
*/
public Category(short value, String text) {
this.value = value;
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return this.text;
}
}
/**
* Generates the list of available categories.
*/
static {
// the list of categories
Category[] categories = new Category[16];
// add the initial ones
categories[0] = new Category((short)-1, "ALL");
short v = 1;
for (short i = 1; i < 16; i++) {
categories[i] = new Category(v, "Category"+i);
v *= 2;
}
CATEGORIES = categories;
}
/**
* Create the panel.
*/
public FixtureDefPropertiesPanel() {
setLayout(new BorderLayout(0, 0));
JScrollPane scrollPane = new JScrollPane();
add(scrollPane, BorderLayout.CENTER);
panel = new JPanel();
scrollPane.setViewportView(panel);
GridBagLayout gbl_panel = new GridBagLayout();
gbl_panel.columnWidths = new int[]{0, 0, 0};
gbl_panel.rowHeights = new int[]{
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0};
gbl_panel.columnWeights = new double[]{ 0.0, 1.0, Double.MIN_VALUE};
gbl_panel.rowWeights = new double[]{
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
Double.MIN_VALUE};
panel.setLayout(gbl_panel);
lblMark = new JLabel("Mark:");
GridBagConstraints gbc_lblMark = new GridBagConstraints();
gbc_lblMark.anchor = GridBagConstraints.EAST;
gbc_lblMark.insets = new Insets(0, 0, 5, 5);
gbc_lblMark.gridx = 0;
gbc_lblMark.gridy = 0;
panel.add(lblMark, gbc_lblMark);
txtMark = new JTextField();
GridBagConstraints gbc_txtMark = new GridBagConstraints();
gbc_txtMark.insets = new Insets(0, 0, 5, 0);
gbc_txtMark.fill = GridBagConstraints.HORIZONTAL;
gbc_txtMark.gridx = 1;
gbc_txtMark.gridy = 0;
panel.add(txtMark, gbc_txtMark);
txtMark.setColumns(10);
JLabel lblName = new JLabel("name:");
GridBagConstraints gbc_lblName = new GridBagConstraints();
gbc_lblName.insets = new Insets(0, 0, 5, 5);
gbc_lblName.gridx = 0;
gbc_lblName.gridy = 1;
panel.add(lblName, gbc_lblName);
textName = new JTextField();
textName.setColumns(10);
GridBagConstraints gbc_textName = new GridBagConstraints();
gbc_textName.fill = GridBagConstraints.HORIZONTAL;
gbc_textName.insets = new Insets(0, 0, 5, 0);
gbc_textName.gridx = 1;
gbc_textName.gridy = 1;
panel.add(textName, gbc_textName);
JLabel lblFriction = new JLabel("friction:");
GridBagConstraints gbc_lblFriction = new GridBagConstraints();
gbc_lblFriction.insets = new Insets(0, 0, 5, 5);
gbc_lblFriction.gridx = 0;
gbc_lblFriction.gridy = 2;
panel.add(lblFriction, gbc_lblFriction);
spinnerFriction = new JSpinner();
spinnerFriction.setModel(new SpinnerNumberModel(new Float(0.2f), null, null, new Float(1)));
GridBagConstraints gbc_spinnerFriction = new GridBagConstraints();
gbc_spinnerFriction.fill = GridBagConstraints.HORIZONTAL;
gbc_spinnerFriction.insets = new Insets(0, 0, 5, 0);
gbc_spinnerFriction.gridx = 1;
gbc_spinnerFriction.gridy = 2;
panel.add(spinnerFriction, gbc_spinnerFriction);
JLabel lblRestitution = new JLabel("restitution:");
GridBagConstraints gbc_lblRestitution = new GridBagConstraints();
gbc_lblRestitution.insets = new Insets(0, 0, 5, 5);
gbc_lblRestitution.gridx = 0;
gbc_lblRestitution.gridy = 3;
panel.add(lblRestitution, gbc_lblRestitution);
spinnerRestitution = new JSpinner();
spinnerRestitution.setModel(new SpinnerNumberModel(new Float(0), null, null, new Float(1)));
GridBagConstraints gbc_spinnerRestitution = new GridBagConstraints();
gbc_spinnerRestitution.fill = GridBagConstraints.HORIZONTAL;
gbc_spinnerRestitution.insets = new Insets(0, 0, 5, 0);
gbc_spinnerRestitution.gridx = 1;
gbc_spinnerRestitution.gridy = 3;
panel.add(spinnerRestitution, gbc_spinnerRestitution);
JLabel lblDensity = new JLabel("density:");
GridBagConstraints gbc_lblDensity = new GridBagConstraints();
gbc_lblDensity.insets = new Insets(0, 0, 5, 5);
gbc_lblDensity.gridx = 0;
gbc_lblDensity.gridy = 4;
panel.add(lblDensity, gbc_lblDensity);
spinnerDensity = new JSpinner();
spinnerDensity.setModel(new SpinnerNumberModel(new Float(0), null, null, new Float(1)));
GridBagConstraints gbc_spinnerDensity = new GridBagConstraints();
gbc_spinnerDensity.insets = new Insets(0, 0, 5, 0);
gbc_spinnerDensity.fill = GridBagConstraints.HORIZONTAL;
gbc_spinnerDensity.gridx = 1;
gbc_spinnerDensity.gridy = 4;
panel.add(spinnerDensity, gbc_spinnerDensity);
JLabel lblIssensor = new JLabel("isSensor:");
GridBagConstraints gbc_lblIssensor = new GridBagConstraints();
gbc_lblIssensor.insets = new Insets(0, 0, 5, 5);
gbc_lblIssensor.gridx = 0;
gbc_lblIssensor.gridy = 5;
panel.add(lblIssensor, gbc_lblIssensor);
chckbxIsSensor = new JCheckBox("isSensor");
GridBagConstraints gbc_chckbxIsSensor = new GridBagConstraints();
gbc_chckbxIsSensor.insets = new Insets(0, 0, 5, 0);
gbc_chckbxIsSensor.anchor = GridBagConstraints.WEST;
gbc_chckbxIsSensor.gridx = 1;
gbc_chckbxIsSensor.gridy = 5;
panel.add(chckbxIsSensor, gbc_chckbxIsSensor);
JLabel lblCategorybits = new JLabel("categoryBits:");
GridBagConstraints gbc_lblCategorybits = new GridBagConstraints();
gbc_lblCategorybits.insets = new Insets(0, 0, 5, 5);
gbc_lblCategorybits.gridx = 0;
gbc_lblCategorybits.gridy = 6;
panel.add(lblCategorybits, gbc_lblCategorybits);
spinnerCategoryBits = new JSpinner();
spinnerCategoryBits.setEnabled(false);
spinnerCategoryBits.setModel(new SpinnerNumberModel(new Short((short) 0), null, null, new Short((short) 1)));
GridBagConstraints gbc_spinnerCategoryBits = new GridBagConstraints();
gbc_spinnerCategoryBits.insets = new Insets(0, 0, 5, 0);
gbc_spinnerCategoryBits.fill = GridBagConstraints.HORIZONTAL;
gbc_spinnerCategoryBits.gridx = 1;
gbc_spinnerCategoryBits.gridy = 6;
panel.add(spinnerCategoryBits, gbc_spinnerCategoryBits);
scrollPaneCategoryBits = new JScrollPane();
scrollPaneCategoryBits.setPreferredSize(new Dimension(150, 100));
GridBagConstraints gbc_scrollPaneCategoryBits = new GridBagConstraints();
gbc_scrollPaneCategoryBits.fill = GridBagConstraints.HORIZONTAL;
gbc_scrollPaneCategoryBits.insets = new Insets(0, 10, 5, 0);
gbc_scrollPaneCategoryBits.gridx = 0;
gbc_scrollPaneCategoryBits.gridy = 7;
gbc_scrollPaneCategoryBits.gridwidth = 2;
panel.add(scrollPaneCategoryBits, gbc_scrollPaneCategoryBits);
listCategoryBits = new JList(CATEGORIES);
listCategoryBits.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// make sure the user is done adjusting
if (!e.getValueIsAdjusting()) {
JList list = (JList)e.getSource();
int[] selections = list.getSelectedIndices();
short value = 0;
for (int i = 0; i < selections.length; i++) {
value |= CATEGORIES[selections[i]].value;
}
spinnerCategoryBits.setValue(value);
try{
spinnerCategoryBits.commitEdit();
}catch(Exception ex){
}
}
}
});
scrollPaneCategoryBits.setViewportView(listCategoryBits);
JLabel lblMaskbits = new JLabel("maskBits:");
GridBagConstraints gbc_lblMaskbits = new GridBagConstraints();
gbc_lblMaskbits.insets = new Insets(0, 0, 5, 5);
gbc_lblMaskbits.gridx = 0;
gbc_lblMaskbits.gridy = 8;
panel.add(lblMaskbits, gbc_lblMaskbits);
spinnerMaskBits = new JSpinner();
spinnerMaskBits.setEnabled(false);
spinnerMaskBits.setModel(new SpinnerNumberModel(new Short((short) 0), null, null, new Short((short) 1)));
GridBagConstraints gbc_spinnerMaskBits = new GridBagConstraints();
gbc_spinnerMaskBits.insets = new Insets(0, 0, 5, 0);
gbc_spinnerMaskBits.fill = GridBagConstraints.HORIZONTAL;
gbc_spinnerMaskBits.gridx = 1;
gbc_spinnerMaskBits.gridy = 8;
panel.add(spinnerMaskBits, gbc_spinnerMaskBits);
listMaskBits = new JList(CATEGORIES);
listMaskBits.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// make sure the user is done adjusting
if (!e.getValueIsAdjusting()) {
JList list = (JList)e.getSource();
int[] selections = list.getSelectedIndices();
short value = 0;
for (int i = 0; i < selections.length; i++) {
value |= CATEGORIES[selections[i]].value;
}
spinnerMaskBits.setValue(value);
try{
spinnerMaskBits.commitEdit();
}catch(Exception ex){
}
}
}
});
scrollPaneMaskBits = new JScrollPane(listMaskBits);
scrollPaneMaskBits.setPreferredSize(new Dimension(150, 100));
GridBagConstraints gbc_scrollPaneMaskBits = new GridBagConstraints();
gbc_scrollPaneMaskBits.insets = new Insets(0, 10, 5, 0);
gbc_scrollPaneMaskBits.fill = GridBagConstraints.BOTH;
gbc_scrollPaneMaskBits.gridx = 0;
gbc_scrollPaneMaskBits.gridy = 9;
gbc_scrollPaneMaskBits.gridwidth = 2;
panel.add(scrollPaneMaskBits, gbc_scrollPaneMaskBits);
JLabel lblGroupindex = new JLabel("groupIndex:");
GridBagConstraints gbc_lblGroupindex = new GridBagConstraints();
gbc_lblGroupindex.insets = new Insets(0, 0, 5, 5);
gbc_lblGroupindex.gridx = 0;
gbc_lblGroupindex.gridy = 10;
panel.add(lblGroupindex, gbc_lblGroupindex);
spinnerGroupIndex = new JSpinner();
spinnerGroupIndex.setModel(new SpinnerNumberModel(new Short((short) 0), null, null, new Short((short) 1)));
GridBagConstraints gbc_spinnerGroupIndex = new GridBagConstraints();
gbc_spinnerGroupIndex.insets = new Insets(0, 0, 5, 0);
gbc_spinnerGroupIndex.fill = GridBagConstraints.HORIZONTAL;
gbc_spinnerGroupIndex.gridx = 1;
gbc_spinnerGroupIndex.gridy = 10;
panel.add(spinnerGroupIndex, gbc_spinnerGroupIndex);
GridBagConstraints gbc_list_1 = new GridBagConstraints();
gbc_list_1.insets = new Insets(0, 0, 5, 5);
gbc_list_1.fill = GridBagConstraints.BOTH;
gbc_list_1.gridx = 0;
gbc_list_1.gridy = 10;
this.listCategoryBits.setSelectedIndex(0);
this.listMaskBits.setSelectedIndex(0);
}
@Override
public void doBinder() {
b2FixtureDefModel object = b2FixtureDefModel.class.cast(this.object);
bind(object,"name",textName);
bind(object,"friction",spinnerFriction);
bind(object,"restitution",spinnerRestitution);
bind(object,"isSensor",chckbxIsSensor);
bind(object,"density",spinnerDensity);
bind(object,"categoryBits",spinnerCategoryBits);
bind(object,"maskBits",spinnerMaskBits);
bind(object,"groupIndex",spinnerGroupIndex);
bind(object,"mark",txtMark);
int[] indices = this.getSelectedIndices(object.categoryBits);
this.listCategoryBits.setSelectedIndices(indices);
if(object.maskBits==-1){
this.listMaskBits.setSelectedIndex(0);
}else{
indices = this.getSelectedIndices(object.maskBits);
this.listMaskBits.setSelectedIndices(indices);
}
}
public JPanel getPanel() {
return panel;
}
/**
* Returns an array of indices that should be selected in the JList
* given the value of the category or mask.
* @param value the category or mask
* @return int[] the selected indices
*/
private int[] getSelectedIndices(short value) {
List<Short> indexList = new ArrayList<Short>();
int t = 1;
for (short i = 1; i < 16; i++) {
if ((value & t) == t) {
indexList.add(i);
}
t *= 2;
}
int[] indices = new int[indexList.size()];
for (int i = 0; i < indexList.size(); i++) {
indices[i] = indexList.get(i);
}
return indices;
}
}