package nl.fontys.sofa.limo.view.node.property.editor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.beans.PropertyEditorSupport;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import nl.fontys.sofa.limo.domain.component.procedure.Procedure;
import nl.fontys.sofa.limo.domain.component.procedure.TimeType;
import nl.fontys.sofa.limo.view.custom.procedure.ProcedureComponent;
import nl.fontys.sofa.limo.view.util.LIMOResourceBundle;
/**
* This class implements property editor for procedures.
*
* @author Matthias Brück
*/
public class ProcedurePropertyEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
List<Procedure> procedures = (List<Procedure>) getValue();
if (procedures == null || procedures.isEmpty()) {
return LIMOResourceBundle.getString("PROCEDURES");
}
StringBuilder name = new StringBuilder();
procedures.stream().forEach((prod) -> {
if (name.toString().length() == 0) {
name.append(prod.getName());
} else {
name.append(" - ").append(prod.getName());
}
});
return name.toString();
}
@Override
public void setAsText(String s) {
}
@Override
public Component getCustomEditor() {
return new CustomEditor();
}
@Override
public boolean supportsCustomEditor() {
return true;
}
/**
* This is the custom editor for editing the procedure property.
*/
private class CustomEditor extends ProcedureComponent implements ItemListener, CellEditorListener {
private final JTextField name;
/**
* Creates a new instance of this custom editor.
*/
public CustomEditor() {
super();
List<Procedure> procedures = (List<Procedure>) getValue();
if (procedures != null) {
setProcedureTable(procedures);
}
procedureCategoryCheckbox.addItemListener(this);
timeTypesCheckbox.addItemListener(this);
name = new JTextField();
DefaultCellEditor nameEditor = new DefaultCellEditor(name);
nameEditor.addCellEditorListener(this);
table.getColumnModel().getColumn(0).setCellEditor(nameEditor);
setProcedureComboBox();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(newButton)) {
addProcedure();
setValue(tableProcedures);
}
super.actionPerformed(e);
if (e.getSource().equals(addButton)) {
setValue(tableProcedures);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource().equals(table)) {
if (e.getClickCount() > 1) {
editProcedure();
List<Procedure> procedures = getActiveTableState();
setValue(procedures);
checkButtonsState();
}
}
super.mouseClicked(e);
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (table.getSelectedRow() >= 0 && table.getSelectedRow() < table.getModel().getRowCount()) {
List<Procedure> procedures = getActiveTableState();
if (e.getSource().equals(procedureCategoryCheckbox)) {
procedures.get(table.getSelectedRow()).setCategory((String) procedureCategoryCheckbox.getSelectedItem().toString());
} else if (e.getSource().equals(timeTypesCheckbox)) {
procedures.get(table.getSelectedRow()).setTimeType((TimeType) timeTypesCheckbox.getSelectedItem());
}
setProcedureTable(procedures);
setValue(procedures);
}
checkButtonsState();
}
}
@Override
public void editingStopped(ChangeEvent e) {
List<Procedure> procedures = getActiveTableState();
setValue(procedures);
}
@Override
public void editingCanceled(ChangeEvent e) {
/**
* not used*
*/
}
}
}