/*******************************************************************************
* gMix open source project - https://svs.informatik.uni-hamburg.de/gmix/
* Copyright (C) 2014 SVS
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
package staticContent.evaluation.simulator.gui.customElements;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import staticContent.evaluation.simulator.annotations.property.SimProp;
import staticContent.evaluation.simulator.gui.customElements.structure.HelpPropValues;
import staticContent.evaluation.simulator.gui.pluginRegistry.SimPropRegistry;
/**
* @author alex
*
*/
@SuppressWarnings("serial")
public class PropVaryElement extends JPanel {
private static Logger logger = Logger.getLogger(PropVaryElement.class);
private JComboBox<String> cBox[];
private JTextField propElement[];
private HelpPropValues value[];
private Class propType[];
private Boolean propUsed[];
private final int numOfPropsToVary = 2;
private String cBoxItemSave;
Map<String, SimProp> propMap;
Map<JComboBox<String>, Integer> boxToIndexMap;
Map<JTextField, Integer> propToIndexMap;
public PropVaryElement() {
this.setLayout(new MigLayout("", "[grow]", ""));
loadContent();
}
/**
* Loads content
*/
private void loadContent() {
this.propMap = SimPropRegistry.getInstance().getProperties();
// old version
// String propertyStrings[] = propMap.keySet().toArray(new String[1]);
// added by alex
Vector<String> tmp = new Vector<String>();
for (String key: propMap.keySet()){
SimProp tmpProp = propMap.get(key);
if (tmpProp.isPropertyToVary()){
String tmpString = tmpProp.getPluginID()+ ":" + tmpProp.getName();
tmp.add(tmpString);
}
}
tmp.add(0, "---");
Collections.sort(tmp);
//String propertyStrings[] = tmp.toArray(new String[1]);
cBox = new JComboBox[numOfPropsToVary];
cBox[0] = new JComboBox<String>(tmp);
cBox[0].setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxx");
cBox[1] = new JComboBox<String>(tmp);
cBox[1].setPrototypeDisplayValue("xxxxxxxxxxxxxxxxxxx");
addBoxListener(cBox[0]);
addBoxListener(cBox[1]);
cBoxItemSave = "EMPTY";
propElement = new JTextField[numOfPropsToVary];
propElement[0] = new JTextField();
propElement[1] = new JTextField();
addTextListener(propElement[0]);
addTextListener(propElement[1]);
addFocusListener(propElement[0]);
addFocusListener(propElement[1]);
value = new HelpPropValues[numOfPropsToVary];
value[0] = null;
value[1] = null;
propUsed = new Boolean[numOfPropsToVary];
propUsed[0] = false;
propUsed[1] = false;
propType = new Class[numOfPropsToVary];
this.boxToIndexMap = new HashMap<JComboBox<String>, Integer>();
this.boxToIndexMap.put(cBox[0], 0);
this.boxToIndexMap.put(cBox[1], 1);
this.propToIndexMap = new HashMap<JTextField, Integer>();
this.propToIndexMap.put(propElement[0], 0);
this.propToIndexMap.put(propElement[1], 1);
this.add(cBox[0], "growx, wrap");
this.add(propElement[0], "growx, wrap");
this.add(cBox[1], "growx, wrap");
this.add(propElement[1], "growx");
// this.add(wrapper1);
// JPanel wrapper2 = new JPanel(new BorderLayout());
// wrapper2.add(propElement[0], BorderLayout.CENTER);
// this.add(wrapper2);
//
// JPanel wrapper3 = new JPanel(new BorderLayout());
// wrapper3.add(cBox[1], BorderLayout.CENTER);
// this.add(wrapper3);
//
// JPanel wrapper4 = new JPanel(new BorderLayout());
// wrapper4.add(propElement[1], BorderLayout.CENTER);
// this.add(wrapper4);
comboboxChanged(cBox[0]);
comboboxChanged(cBox[1]);
}
private void comboboxChanged(JComboBox<String> ComboBox) {
int index = this.boxToIndexMap.get(ComboBox);
JTextField currentElement = propElement[index];
currentElement.setText("");
//value[index] = null;
textfieldused(currentElement);
String currentItem = (String) ComboBox.getSelectedItem();
String propname = currentItem;
StringTokenizer tokenizer = new StringTokenizer(currentItem, ":" );
System.err.println(propname);
while (tokenizer.hasMoreTokens()){
propname = (String) tokenizer.nextElement();
System.err.println(propname);
}
System.err.println(propname);
if ((index == 0) && (!cBoxItemSave.equals("EMPTY"))){
cBox[1].addItem(cBoxItemSave);
cBoxItemSave="EMPTY";
}
if (currentItem.equals("---")) {
propElement[index].setEnabled(false);
propType[index] = null;
propUsed[index] = false;
if (index == 0) {
cBox[1].setSelectedItem("---");
this.cBox[1].setEnabled(false);
this.propElement[1].setEnabled(false);
this.propUsed[1] = false;
}
} else {
propElement[index].setEnabled(true);
SimProp tmp = SimPropRegistry.getInstance().getPropertiesByName(propname);
propType[index] = tmp.getValueType();
logger.log(Level.DEBUG, "Proptype is set to" + propType[index].toString());
}
if ((ComboBox == cBox[0]) && (!currentItem.equals("---"))) {
this.cBox[1].setEnabled(true);
String prop = SimPropRegistry.getInstance().getPropertiesByName(propname).getPropertyID();
logger.log(Level.DEBUG,"writing into PROPERTY_TO_VARY: " + prop);
SimPropRegistry.getInstance().setPropertyToVaryValue("PROPERTY_TO_VARY", prop);
cBoxItemSave = currentItem;
cBox[1].removeItem(currentItem);
}
if ((ComboBox == cBox[1]) && (!currentItem.equals("---"))){
String prop = SimPropRegistry.getInstance().getPropertiesByName(propname).getPropertyID();
logger.log(Level.DEBUG,"writing into second PROPERTY_TO_VARY: " + prop);
SimPropRegistry.getInstance().setPropertyToVaryValue("SECOND_PROPERTY_TO_VARY", prop);
}
if (String.valueOf(cBox[1].getSelectedItem()).equals("---")){
SimPropRegistry.getInstance().setPropertyToVaryValue("USE_SECOND_PROPERTY_TO_VARY", "FALSE");
}else{
SimPropRegistry.getInstance().setPropertyToVaryValue("USE_SECOND_PROPERTY_TO_VARY", "TRUE");
}
logger.log(Level.DEBUG, currentElement.getSelectedText());
this.repaint();
SimPropRegistry.getInstance().setUnsavedChanges(true);
}
private void addBoxListener(final JComboBox<String> box) {
ItemListener il = new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
PropVaryElement.this.comboboxChanged(box);
}
}
};
box.addItemListener(il);
}
private void addTextListener(final JTextField field) {
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent a) {
if (a.getActionCommand() != null) {
textfieldused(field);
}
}
};
field.addActionListener(al);
}
private void addFocusListener(final JTextField field) {
FocusListener fl = new FocusListener() {
@Override
public void focusLost(FocusEvent f) {
textfieldused(field);
}
@Override
public void focusGained(FocusEvent arg0) {
field.select(0, field.getSelectionEnd());
}
};
field.addFocusListener(fl);
}
private void textfieldused(JTextField field) {
int i = PropVaryElement.this.propToIndexMap.get(field);
value[i] = new HelpPropValues(field.getText(), propType[i]);
logger.log(Level.DEBUG, "PropertyType is: " + value[i].getTypeName());
logger.log(Level.DEBUG, "PropertyValue is: " + field.getText());
boolean validity = value[i].isValid();
logger.log(Level.DEBUG, "Validity is: " + validity);
if (validity && field == propElement[0]){
SimPropRegistry.getInstance().setPropertyToVaryValue("VALUES_FOR_THE_PROPERTY_TO_VARY", propElement[0].getText());
}else if (validity && field == propElement[1]){
SimPropRegistry.getInstance().setPropertyToVaryValue("VALUES_FOR_THE_SECOND_PROPERTY_TO_VARY", propElement[1].getText());
}else{
JOptionPane.showMessageDialog(field,
"Wrong Value. Values are supposed to be " +value[i].getTypeName() +". Separation by \",\" possible.",
"Invalid Value",
JOptionPane.ERROR_MESSAGE);
}
SimPropRegistry.getInstance().setUnsavedChanges(true);
}
/**
* Update
*/
public void update() {
logger.log(Level.DEBUG, "PROPERTY_TO_VARY");
String id = SimPropRegistry.getInstance().getPropertiesToVary().get("PROPERTY_TO_VARY");
logger.log(Level.DEBUG, "VALUES_FOR_THE_PROPERTY_TO_VARY");
String values0 = SimPropRegistry.getInstance().getPropertiesToVary().get("VALUES_FOR_THE_PROPERTY_TO_VARY");
logger.log(Level.DEBUG, values0);
System.err.println("FIRST PROP TO VARRY");
System.err.println("id: "+ id);
String name = SimPropRegistry.getInstance().getPropertieNameByID(id);
System.err.println("name: "+ name);
if(name !="---"){
SimProp prop = SimPropRegistry.getInstance().getPropertiesByName(name);
System.err.println("prop: "+ prop);
String plugin = prop.getPluginID();
cBox[0].setSelectedItem(plugin +":"+ name);
}
else{
cBox[0].setSelectedItem("---");
}
comboboxChanged(cBox[0]);
propElement[0].setText(values0);
textfieldused(propElement[0]);
logger.log(Level.DEBUG, "USE_SECOND_PROPERTY_TO_VARY");
logger.log(Level.DEBUG, SimPropRegistry.getInstance().getPropertiesToVary().get("USE_SECOND_PROPERTY_TO_VARY"));
logger.log(Level.DEBUG, SimPropRegistry.getInstance().getPropertiesToVary().get("SECOND_PROPERTY_TO_VARY"));
id = SimPropRegistry.getInstance().getPropertiesToVary().get("SECOND_PROPERTY_TO_VARY");
logger.log(Level.DEBUG, SimPropRegistry.getInstance().getPropertiesToVary().get("VALUES_FOR_THE_SECOND_PROPERTY_TO_VARY"));
logger.log(Level.DEBUG, "VALUES_FOR_THE_SECOND_PROPERTY_TO_VARY");
String values1 = SimPropRegistry.getInstance().getPropertiesToVary().get("VALUES_FOR_THE_SECOND_PROPERTY_TO_VARY");
logger.log(Level.DEBUG, values1);
System.err.println("SECOND PROP TO VARRY");
System.err.println("id: "+ id);
name = SimPropRegistry.getInstance().getPropertieNameByID(id);
System.err.println("name: "+ name);
if(name !="---"){
SimProp prop = SimPropRegistry.getInstance().getPropertiesByName(name);
System.err.println("prop: "+ prop);
String plugin = prop.getPluginID();
cBox[1].setSelectedItem(plugin+ ":" +name);
}
else{
cBox[1].setSelectedItem("---");
}
comboboxChanged(cBox[1]);
propElement[1].setText(values1);
textfieldused(propElement[0]);
}
}