package nl.fontys.sofa.limo.view.node.bean;
import java.awt.event.ActionEvent;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
import nl.fontys.sofa.limo.api.service.provider.EventService;
import nl.fontys.sofa.limo.domain.component.Icon;
import nl.fontys.sofa.limo.domain.component.event.Event;
import nl.fontys.sofa.limo.domain.component.event.distribution.Distribution;
import nl.fontys.sofa.limo.view.node.property.StupidProperty;
import nl.fontys.sofa.limo.view.node.property.editor.EventPropertyEditor;
import nl.fontys.sofa.limo.view.node.property.editor.ProcedurePropertyEditor;
import nl.fontys.sofa.limo.view.util.LIMOResourceBundle;
import nl.fontys.sofa.limo.view.wizard.event.EventWizardAction;
import org.openide.ErrorManager;
import org.openide.nodes.Sheet;
import org.openide.util.Lookup;
/**
* View representation of an event that is displayed in the list.
*
* @author Sven Mäurer
*/
public class EventNode extends AbstractBeanNode<Event> implements PropertyChangeListener {
public EventNode(Event event) throws IntrospectionException {
super(event, Event.class);
this.bean = event;
bean.addPropertyChangeListener(this);
}
public Event getEvent() {
return bean;
}
@Override
public Action[] getActions(boolean context) {
ArrayList<Action> actionList = new ArrayList<>();
actionList.add(new AbstractAction(LIMOResourceBundle.getString("EDIT")) {
@Override
public void actionPerformed(ActionEvent e) {
editEvent();
}
});
actionList.add(new AbstractAction(LIMOResourceBundle.getString("DELETE")) {
@Override
public void actionPerformed(ActionEvent e) {
deleteEvent();
}
});
return actionList.toArray(new Action[actionList.size()]);
}
/**
* Open an event wizard with the event for editing.
*/
private void editEvent() {
EventWizardAction wiz = new EventWizardAction();
wiz.setEvent(bean);
wiz.actionPerformed(null);
createProperties(getBean(), null);
setSheet(getSheet());
}
/**
* Delete the event form database.
*/
private void deleteEvent() {
int reply = JOptionPane.showConfirmDialog(null, LIMOResourceBundle.getString("DELETE_QUESTION", bean.getName()), LIMOResourceBundle.getString("ARE_YOU_SURE"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (reply == JOptionPane.YES_OPTION) {
EventService service = Lookup.getDefault().lookup(EventService.class);
service.delete(bean);
}
}
@Override
protected void createProperties(Event bean, BeanInfo info) {
Sheet sets = getSheet();
Sheet.Set set = super.getNameDescriptionPropertySheet();
try {
StupidProperty distributionProp = new StupidProperty(getBean(), Distribution.class, "probability");
distributionProp.addPropertyChangeListener(getListener());
distributionProp.setDisplayName(LIMOResourceBundle.getString("PROBABILITY"));
distributionProp.setShortDescription(LIMOResourceBundle.getString("PROBABILITY_DESC"));
distributionProp.setValue("canEditAsText", false);
StupidProperty eventProp = new StupidProperty(getBean(), List.class, "events");
eventProp.addPropertyChangeListener(getListener());
eventProp.setPropertyEditorClass(EventPropertyEditor.class);
eventProp.setDisplayName(LIMOResourceBundle.getString("EVENTS"));
eventProp.setShortDescription(LIMOResourceBundle.getString("EVENTS_OF", LIMOResourceBundle.getString("EVENT")));
eventProp.setValue("canEditAsText", false);
StupidProperty procedureProp = new StupidProperty(getBean(), List.class, "procedures");
procedureProp.addPropertyChangeListener(getListener());
procedureProp.setPropertyEditorClass(ProcedurePropertyEditor.class);
procedureProp.setDisplayName(LIMOResourceBundle.getString("PROCEDURES"));
procedureProp.setShortDescription(LIMOResourceBundle.getString("PROCEDURES_OF", LIMOResourceBundle.getString("EVENT")));
procedureProp.setValue("canEditAsText", false);
set.put(distributionProp);
set.put(procedureProp);
set.put(eventProp);
} catch (NoSuchMethodException ex) {
ErrorManager.getDefault();
}
sets.put(set);
}
@Override
public AbstractBeanNode getDetachedNodeCopy() {
throw new UnsupportedOperationException(LIMOResourceBundle.getString("COPY_NOT_SUPPORTED"));
}
@Override
Class getServiceClass() {
return EventService.class;
}
@Override
protected Icon getBeanIcon() {
throw new UnsupportedOperationException(LIMOResourceBundle.getString("NOT_SUPPORTED"));
}
@Override
public void delete() {
EventService service = Lookup.getDefault().lookup(EventService.class);
service.delete(bean);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
setDisplayName(bean.getName());
}
}