package jada.ngeditor.guiviews.editors;
import de.lessvoid.nifty.tools.SizeValue;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.AbstractCellEditor;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellEditor;
public class SizeEditor extends AbstractCellEditor implements TableCellEditor,ActionListener,PropertyChangeListener {
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private JPanel editorPane;
private ButtonGroup group;
private JRadioButton perc;
private JRadioButton px;
private JRadioButton fill;
private ValueEditor percEditor = new ValueEditor();
private ValueEditor pxEditor = new ValueEditor();
private SizeValue edited = null;
public SizeEditor(){
GridBagLayout gridLayout = new GridBagLayout();
editorPane = new JPanel(gridLayout);
GridBagConstraints c = new GridBagConstraints();
perc = new JRadioButton("Percentage");
px = new JRadioButton("Pixel");
fill = new JRadioButton("*");
fill.setToolTipText("Wildcard, leave this value to layoutmanger");
fill.addActionListener(this);
px.addActionListener(this);
perc.addActionListener(this);
group = new ButtonGroup();
group.add(perc);
group.add(px);
group.add(fill);
px.setSelected(true);
c.gridx = 0;
c.anchor = GridBagConstraints.FIRST_LINE_START;
editorPane.add(perc,c);
c.gridx=1;
editorPane.add(percEditor,c);
c.gridx = 0;
c.gridy = 1;
editorPane.add(px,c);
c.gridx = 1;
c.gridy = 1;
editorPane.add(pxEditor,c);
c.gridx = 0;
c.gridy = 2;
editorPane.add(fill,c);
this.percEditor.setEnabled(false);
this.percEditor.setValue(SizeValue.percent(50));
this.pxEditor.setEnabled(true);
percEditor.addPropertyChangeListener(this);
pxEditor.addPropertyChangeListener(this);
}
@Override
public Object getCellEditorValue() {
return this.edited.toString();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
SizeValue val = new SizeValue(value.toString());
this.setUpByType(val);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
int res = JOptionPane.showConfirmDialog(null, editorPane,"SizeEditor", JOptionPane.OK_CANCEL_OPTION);
if(res == JOptionPane.OK_OPTION){
fireEditingStopped();
}else{
cancelCellEditing();
}
}
});
return new JLabel(this.edited.toString());
}
public Component getComponent(){
return this.editorPane;
}
public void setValue(Object value){
SizeValue val = new SizeValue(value.toString());
this.setUpByType(val);
}
private void setUpByType(Object value) {
if(value == null) {
this.px.setEnabled(true);
} else {
String s = value.toString();
if(s.endsWith("px")) {
this.percEditor.setEnabled(false);
this.pxEditor.setEnabled(true);
this.pxEditor.setValue((SizeValue)value);
this.px.getModel().setSelected(true);
} else if(s.endsWith("%")) {
this.percEditor.setEnabled(true);
this.pxEditor.setEnabled(false);
this.percEditor.setValue((SizeValue)value);
this.perc.getModel().setSelected(true);
} else if(s.equals("*")) {
this.percEditor.setEnabled(false);
this.pxEditor.setEnabled(false);
this.fill.getModel().setSelected(true);
this.edited = SizeValue.wildcard();
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(fill.equals(source)){
SizeValue old = this.edited;
this.setUpByType(new SizeValue("*"));
pcs.firePropertyChange("value",old, edited); //event forwarding
}else if(px.equals(source)){
this.setUpByType(new SizeValue("0px"));
}else if(perc.equals(source)){
this.setUpByType(new SizeValue("50%"));
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getPropertyName().equals("value")){
this.edited = (SizeValue) evt.getNewValue();
pcs.firePropertyChange("value",evt.getOldValue(), evt.getNewValue());//event forwarding
}
}
public void addPropertyChangeListener(PropertyChangeListener listener){
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
pcs.removePropertyChangeListener(listener);
}
}