package nl.fontys.sofa.limo.view.node.property.editor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyEditorSupport;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import nl.fontys.sofa.limo.domain.component.event.Event;
import nl.fontys.sofa.limo.domain.component.event.ExecutionState;
import nl.fontys.sofa.limo.view.custom.panel.EventsPanel;
import nl.fontys.sofa.limo.view.util.IconUtil;
import nl.fontys.sofa.limo.view.wizard.event.EventWizardAction;
import nl.fontys.sofa.limo.view.wizard.event.EventWizardAction.DefaultFinishClickHandler;
import nl.fontys.sofa.limo.view.wizard.event.EventWizardAction.FinishClickHandler;
import org.openide.WizardDescriptor;
/**
* This class is the Property Editor for our events. It enables you to change
* the events with the same component as in the wizards.
*
* @author Matthias Brück
*/
public class EventPropertyEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
List<Event> events = (List<Event>) getValue();
if (events == null || events.isEmpty()) {
return "No events";
}
StringBuilder name = new StringBuilder();
events.stream().forEach((event) -> {
if (name.toString().length() == 0) {
name.append(event.getName());
} else {
name.append(" - ").append(event.getName());
}
});
return name.toString();
}
@Override
public void setAsText(String s) {
}
@Override
public Component getCustomEditor() {
return new CustomEditor();
}
@Override
public boolean supportsCustomEditor() {
return true;
}
/**
* This CustomEditor is the actual JLabel that gets displayed as Editor.
*/
private class CustomEditor extends EventsPanel implements ActionListener, ItemListener {
private JButton newButton;
public CustomEditor() {
super();
for (ActionListener listener : deleteButton.getActionListeners()) {
deleteButton.removeActionListener(listener);
}
deleteButton.addActionListener(this);
executionStateComboBox.addItemListener(this);
newButton = new JButton(new ImageIcon(IconUtil.getIcon(IconUtil.UI_ICON.ADD)));
sidebarPanel.add(newButton, 1);
setNewButtonListener();
deleteButton.setEnabled(!eventsTableModel.getEvents().isEmpty());
}
@Override
protected void setAddButtonListener() {
addButton.addActionListener(this);
}
@Override
protected void setTableModel() {
List<Event> usedEvents = (List<Event>) getValue();
eventsTableModel.setEvents(usedEvents);
eventsTableModel.fireTableDataChanged();
setTableAndCheckbox();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(addButton)) {
if (eventsComboBox.getSelectedIndex() >= 0 && eventsComboBox.getSelectedIndex() < eventsComboBox.getItemCount()) {
addClicked();
}
} else if (e.getSource().equals(deleteButton)) {
if (eventsTable.getSelectedRow() >= 0 && eventsTable.getSelectedRow() < eventsTableModel.getRowCount()) {
deleteClicked();
}
}
}
/**
* Handles what should happen when you clicked on the "add" button.
*/
private void addClicked() {
Event selected = null;
for (Event allEvent : allEvents) {
if (((String) eventsComboBox.getSelectedItem()).equals(allEvent.getName())) {
selected = service.findById(allEvent.getId());
break;
}
}
if (selected != null) {
List<Event> events = new ArrayList<>(eventsTableModel.getEvents());
selected.setId(null);
selected.setDependency(ExecutionState.INDEPENDENT);
events.add(selected);
eventsTableModel.setEvents(events);
eventsTableModel.fireTableDataChanged();
setTableAndCheckbox();
setValue(events);
checkButtonsState();
}
}
/**
* Handles what should happen when you clicked on the "delete" button.
*/
private void deleteClicked() {
List<Event> events = new ArrayList<>(eventsTableModel.getEvents());
Event eventToRemove = events.get(eventsTable.getSelectedRow());
events.remove(eventToRemove);
eventsTableModel.setEvents(events);
eventsTableModel.fireTableDataChanged();
setTableAndCheckbox();
setValue(events);
checkButtonsState();
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (eventsTable.getSelectedRow() >= 0 && eventsTable.getSelectedRow() < eventsTable.getRowCount()) {
List<Event> events = new ArrayList<>(eventsTableModel.getEvents());
events.get(eventsTable.getSelectedRow()).setExecutionState((ExecutionState) executionStateComboBox.getSelectedItem());
eventsTableModel.setEvents(events);
eventsTableModel.fireTableDataChanged();
setTableAndCheckbox();
setValue(events);
}
}
}
/**
* The new action where a new event is created as template and added as well.
*/
private void setNewButtonListener() {
newButton.addActionListener((ActionEvent e) -> {
getNewEventByWizard();
});
}
private Event getNewEventByWizard() {
EventWizardAction action = new EventWizardAction();
FinishClickHandler handler = action.new DefaultFinishClickHandler() {
@Override
public void handle(Event event, WizardDescriptor descriptor) {
super.handle(event, descriptor);
List<Event> events = new ArrayList<>(eventsTableModel.getEvents());
event.setId(null);
event.setDependency(ExecutionState.INDEPENDENT);
events.add(event);
eventsTableModel.setEvents(events);
eventsTableModel.fireTableDataChanged();
setTableAndCheckbox();
setValue(events);
checkButtonsState();
}
};
action.setFinishClickHandler(handler);
action.actionPerformed(new ActionEvent(newButton, 0, ""));
return null;
}
}
}