/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.fib.utils;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.lang.reflect.Type;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openflexo.antar.binding.AbstractBinding;
import org.openflexo.antar.binding.BooleanStaticBinding;
import org.openflexo.antar.binding.FloatStaticBinding;
import org.openflexo.antar.binding.IntegerStaticBinding;
import org.openflexo.antar.binding.NullStaticBinding;
import org.openflexo.antar.binding.StaticBinding;
import org.openflexo.antar.binding.StringStaticBinding;
import org.openflexo.antar.binding.TypeUtils;
import org.openflexo.antar.expr.EvaluationType;
import org.openflexo.fib.model.FIBModelObject;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.swing.DateSelector;
import org.openflexo.toolbox.ToolBox;
class StaticBindingPanel extends JPanel {
public static final Font SMALL_FONT = new Font("SansSerif", Font.PLAIN, 9);
/**
*
*/
private final BindingSelectorPanel _bindingSelectorPanel;
boolean isUpdatingPanel = false;
protected JCheckBox selectStaticBindingCB = null;
protected JComboBox selectValueCB = null;
protected JTextField enterValueTF = null;
protected DateSelector dateSelector = null;
protected DurationSelector durationSelector = null;
protected JSpinner integerValueChooser = null;
protected JComboBox typeCB = null;
private EvaluationType currentType;
protected StaticBindingPanel(BindingSelectorPanel bindingSelectorPanel) {
_bindingSelectorPanel = bindingSelectorPanel;
setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0));
initStaticBindingPanel();
updateStaticBindingPanel();
}
private void initStaticBindingPanel() {
selectStaticBindingCB = null;
selectValueCB = null;
enterValueTF = null;
dateSelector = null;
durationSelector = null;
integerValueChooser = null;
selectStaticBindingCB = new JCheckBox(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "define_a_static_value"));
selectStaticBindingCB.setFont(SMALL_FONT);
selectStaticBindingCB.setSelected(false);
selectStaticBindingCB.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StaticBindingPanel.this._bindingSelectorPanel.setEditStaticValue(selectStaticBindingCB.isSelected());
}
});
add(selectStaticBindingCB);
if (_bindingSelectorPanel._bindingSelector.getBindingDefinition() == null
|| _bindingSelectorPanel._bindingSelector.getBindingDefinition().getType() == null) {
enterValueTF = new JTextField(10);
enterValueTF.setFont(SMALL_FONT);
add(enterValueTF);
currentType = EvaluationType.LITERAL;
disableStaticBindingPanel();
} else {
currentType = kindOf(_bindingSelectorPanel._bindingSelector.getBindingDefinition().getType());
if (currentType == EvaluationType.BOOLEAN) {
final String UNSELECTED = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "select_a_value");
final String TRUE = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "true");
final String FALSE = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "false");
String[] availableValues = { UNSELECTED, TRUE, FALSE };
selectValueCB = new JComboBox(availableValues);
selectValueCB.setFont(SMALL_FONT);
selectValueCB.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isUpdatingPanel) {
return;
}
if (selectValueCB.getSelectedItem().equals(TRUE)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new BooleanStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), true));
} else if (selectValueCB.getSelectedItem().equals(FALSE)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new BooleanStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), false));
}
}
});
add(selectValueCB);
} else if (currentType == EvaluationType.ARITHMETIC_INTEGER) {
SpinnerNumberModel valueModel = new SpinnerNumberModel(1, Short.MIN_VALUE, Short.MAX_VALUE, 1);
integerValueChooser = new JSpinner(valueModel);
integerValueChooser.setEditor(new JSpinner.NumberEditor(integerValueChooser, "#"));
integerValueChooser.setMinimumSize(integerValueChooser.getPreferredSize());
integerValueChooser.setValue(1);
integerValueChooser.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (isUpdatingPanel) {
return;
}
Object v = integerValueChooser.getValue();
if (v instanceof Integer) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new IntegerStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), (Integer) v));
} else if (v instanceof Long) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new IntegerStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), (Long) v));
} else if (v instanceof Short) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new IntegerStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), (Short) v));
} else if (v instanceof Byte) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new IntegerStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), (Byte) v));
} else if (v instanceof Character) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new IntegerStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), (Character) v));
}
}
});
integerValueChooser.setFont(SMALL_FONT);
integerValueChooser.getEditor().setFont(SMALL_FONT);
add(integerValueChooser);
} else if (currentType == EvaluationType.ARITHMETIC_FLOAT) {
enterValueTF = new JTextField(10);
enterValueTF.setFont(SMALL_FONT);
enterValueTF.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isUpdatingPanel) {
return;
}
if (_bindingSelectorPanel._bindingSelector.isAcceptableStaticBindingValue(enterValueTF.getText())) {
_bindingSelectorPanel._bindingSelector.setEditedObject(_bindingSelectorPanel._bindingSelector
.makeStaticBindingFromString(enterValueTF.getText()));
}
}
});
enterValueTF.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
if (!StaticBindingPanel.this._bindingSelectorPanel._connectButton.isEnabled()
&& _bindingSelectorPanel._bindingSelector.isAcceptableStaticBindingValue(enterValueTF.getText())) {
StaticBindingPanel.this._bindingSelectorPanel._connectButton.setEnabled(true);
if (ToolBox.getPLATFORM() == ToolBox.MACOS) {
StaticBindingPanel.this._bindingSelectorPanel._connectButton.setSelected(true);
}
}
}
});
add(enterValueTF);
} else if (currentType == EvaluationType.STRING) {
enterValueTF = new JTextField(10);
enterValueTF.setFont(SMALL_FONT);
enterValueTF.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isUpdatingPanel) {
return;
}
if (_bindingSelectorPanel._bindingSelector.isAcceptableStaticBindingValue('"' + enterValueTF.getText() + '"')) {
_bindingSelectorPanel._bindingSelector.setEditedObject(_bindingSelectorPanel._bindingSelector
.makeStaticBindingFromString('"' + enterValueTF.getText() + '"'));
}
}
});
enterValueTF.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
if (!StaticBindingPanel.this._bindingSelectorPanel._connectButton.isEnabled()
&& enterValueTF.getText().length() > 0) {
StaticBindingPanel.this._bindingSelectorPanel._connectButton.setEnabled(true);
if (ToolBox.getPLATFORM() == ToolBox.MACOS) {
StaticBindingPanel.this._bindingSelectorPanel._connectButton.setSelected(true);
}
}
}
});
add(enterValueTF);
}
if (_bindingSelectorPanel.getEditStaticValue()) {
enableStaticBindingPanel();
for (int i = 0; i < _bindingSelectorPanel.getVisibleColsCount(); i++) {
_bindingSelectorPanel.listAtIndex(i).setEnabled(false);
}
} else {
disableStaticBindingPanel();
}
}
if (_bindingSelectorPanel._bindingSelector.getBindingDefinition() == null
|| _bindingSelectorPanel._bindingSelector.getBindingDefinition().getType() == null
|| TypeUtils.isObject(_bindingSelectorPanel._bindingSelector.getBindingDefinition().getType())) {
final String SELECT = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "select");
final String BOOLEAN = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "boolean");
final String INTEGER = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "integer");
final String FLOAT = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "float");
final String STRING = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "string");
final String DATE = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "date");
final String DURATION = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "duration");
final String DKV = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "enum");
final String NULL = FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "null");
String[] availableValues = { SELECT, BOOLEAN, INTEGER, FLOAT, STRING, DATE, DURATION, DKV, NULL };
typeCB = new JComboBox(availableValues);
typeCB.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (isUpdatingPanel) {
return;
}
if (typeCB.getSelectedItem().equals(BOOLEAN)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new BooleanStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), true));
} else if (typeCB.getSelectedItem().equals(INTEGER)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new IntegerStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), 0));
} else if (typeCB.getSelectedItem().equals(FLOAT)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new FloatStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), 0));
} else if (typeCB.getSelectedItem().equals(STRING)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new StringStaticBinding(
_bindingSelectorPanel._bindingSelector.getBindingDefinition(), _bindingSelectorPanel._bindingSelector
.getBindable(), ""));
} else if (typeCB.getSelectedItem().equals(NULL)) {
_bindingSelectorPanel._bindingSelector.setEditedObject(new NullStaticBinding(_bindingSelectorPanel._bindingSelector
.getBindingDefinition(), _bindingSelectorPanel._bindingSelector.getBindable()));
}
}
});
isUpdatingPanel = true;
if (currentType == EvaluationType.BOOLEAN) {
typeCB.setSelectedItem(BOOLEAN);
} else if (currentType == EvaluationType.ARITHMETIC_INTEGER) {
typeCB.setSelectedItem(INTEGER);
} else if (currentType == EvaluationType.ARITHMETIC_FLOAT) {
typeCB.setSelectedItem(FLOAT);
} else if (currentType == EvaluationType.STRING) {
typeCB.setSelectedItem(STRING);
} else if (currentType == EvaluationType.DATE) {
typeCB.setSelectedItem(DATE);
} else if (currentType == EvaluationType.DURATION) {
typeCB.setSelectedItem(DURATION);
} else if (currentType == EvaluationType.ENUM) {
typeCB.setSelectedItem(DKV);
}
isUpdatingPanel = false;
if (_bindingSelectorPanel._bindingSelector.getEditedObject() instanceof NullStaticBinding) {
isUpdatingPanel = true;
typeCB.setSelectedItem(NULL);
isUpdatingPanel = false;
}
typeCB.setFont(SMALL_FONT);
add(typeCB);
}
}
void willApply() {
if (currentType == EvaluationType.ARITHMETIC_FLOAT) {
if (_bindingSelectorPanel._bindingSelector.isAcceptableStaticBindingValue(enterValueTF.getText())) {
_bindingSelectorPanel._bindingSelector.setEditedObject(_bindingSelectorPanel._bindingSelector
.makeStaticBindingFromString(enterValueTF.getText()));
}
} else if (currentType == EvaluationType.STRING) {
if (_bindingSelectorPanel._bindingSelector.isAcceptableStaticBindingValue('"' + enterValueTF.getText() + '"')) {
_bindingSelectorPanel._bindingSelector.setEditedObject(_bindingSelectorPanel._bindingSelector
.makeStaticBindingFromString('"' + enterValueTF.getText() + '"'));
}
}
}
private EvaluationType kindOf(Type type) {
if (TypeUtils.isObject(type) && _bindingSelectorPanel._bindingSelector.getEditedObject() instanceof StaticBinding) {
return ((StaticBinding) _bindingSelectorPanel._bindingSelector.getEditedObject()).getEvaluationType();
} else {
return TypeUtils.kindOfType(type);
}
}
void updateStaticBindingPanel() {
isUpdatingPanel = true;
EvaluationType newType;
if (_bindingSelectorPanel._bindingSelector.getBindingDefinition() == null
|| _bindingSelectorPanel._bindingSelector.getBindingDefinition().getType() == null) {
newType = EvaluationType.LITERAL;
} else {
newType = kindOf(_bindingSelectorPanel._bindingSelector.getBindingDefinition().getType());
}
if (newType != currentType) {
removeAll();
initStaticBindingPanel();
revalidate();
repaint();
}
AbstractBinding edited = _bindingSelectorPanel._bindingSelector.getEditedObject();
isUpdatingPanel = true;
if (edited instanceof StaticBinding) {
if (currentType == EvaluationType.BOOLEAN && edited instanceof BooleanStaticBinding) {
selectValueCB.setSelectedItem(((BooleanStaticBinding) edited).getStringRepresentation());
} else if (currentType == EvaluationType.ARITHMETIC_INTEGER && edited instanceof IntegerStaticBinding) {
integerValueChooser.setValue(((IntegerStaticBinding) edited).getValue());
} else if (currentType == EvaluationType.ARITHMETIC_FLOAT) {
if (edited instanceof FloatStaticBinding) {
enterValueTF.setText(((FloatStaticBinding) edited).getStringRepresentation());
} else if (edited instanceof IntegerStaticBinding) {
enterValueTF.setText(((IntegerStaticBinding) edited).getStringRepresentation());
}
} else if (currentType == EvaluationType.STRING && edited instanceof StringStaticBinding) {
enterValueTF.setText(((StringStaticBinding) edited).getValue());
}
}
isUpdatingPanel = false;
}
void enableStaticBindingPanel() {
_bindingSelectorPanel._connectButton.setText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "validate"));
selectStaticBindingCB.setSelected(true);
if (selectValueCB != null) {
selectValueCB.setEnabled(true);
}
if (enterValueTF != null) {
enterValueTF.setEnabled(true);
}
if (dateSelector != null) {
dateSelector.setEnabled(true);
}
if (durationSelector != null) {
durationSelector.setEnabled(true);
}
if (integerValueChooser != null) {
integerValueChooser.setEnabled(true);
}
}
void disableStaticBindingPanel() {
_bindingSelectorPanel._connectButton.setText(FlexoLocalization.localizedForKey(FIBModelObject.LOCALIZATION, "connect"));
selectStaticBindingCB.setSelected(false);
if (selectValueCB != null) {
selectValueCB.setEnabled(false);
}
if (enterValueTF != null) {
enterValueTF.setEnabled(false);
}
if (dateSelector != null) {
dateSelector.setEnabled(false);
}
if (durationSelector != null) {
durationSelector.setEnabled(false);
}
if (integerValueChooser != null) {
integerValueChooser.setEnabled(false);
}
}
}