package nl.fontys.sofa.limo.view.node.bean; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.Action; import nl.fontys.sofa.limo.domain.component.Icon; import nl.fontys.sofa.limo.domain.component.hub.Hub; import nl.fontys.sofa.limo.domain.component.leg.Leg; import nl.fontys.sofa.limo.domain.component.leg.MultiModeLeg; import nl.fontys.sofa.limo.domain.component.leg.ScheduledLeg; 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.leg.multimode.MultimodeLegWizardAction; import nl.fontys.sofa.limo.view.wizard.leg.normal.EventLegTypeWizard; import nl.fontys.sofa.limo.view.wizard.leg.normal.NormalLegWizardAction; import nl.fontys.sofa.limo.view.wizard.leg.normal.ProceduresLegTypeWizard; import nl.fontys.sofa.limo.view.wizard.leg.scheduled.ScheduledLegWizardAction; import org.openide.DialogDisplayer; import org.openide.ErrorManager; import org.openide.WizardDescriptor; import org.openide.nodes.Sheet; import org.openide.util.ImageUtilities; /** * View representation of a Leg. This class is used to display a NormalLeg and * is used by ScheduledLegNode and MultiModeLegNode. * * @author Sebastiaan Heijmann */ public class LegNode extends AbstractBeanNode<Leg> implements PropertyChangeListener { /** * /** * constructor for LegNode, calls the second constructor with the correct * class name. * * @param bean * @throws IntrospectionException */ public LegNode(Leg bean) throws IntrospectionException { this(bean, Leg.class); } @Override public void propertyChange(PropertyChangeEvent evt) { String s = getBean().getName(); fireNameChange(s, s); } public Leg getLeg() { return bean; } /** * constructor for LegNode, adds the bean to the instancecontent. * * @param bean the base entity * @param entityClass the class name of the entity * @throws IntrospectionException */ public LegNode(Leg bean, Class entityClass) throws IntrospectionException { super(bean, entityClass); this.bean = bean; this.bean.addPropertyChangeListener(this); } @Override protected PropertyChangeListener getListener() { return (PropertyChangeEvent evt) -> { firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); switch (evt.getPropertyName()) { case "name": setDisplayName((String) evt.getNewValue()); break; case "description": setShortDescription((String) evt.getNewValue()); break; case "icon": createProperties(getBean(), null); setSheet(getSheet()); break; } }; } /* @Override public boolean canDestroy() { return true; }*/ @Override public AbstractBeanNode getDetachedNodeCopy() { throw new UnsupportedOperationException(LIMOResourceBundle.getString("COPY_NOT_SUPPORTED")); } @Override public String getHtmlDisplayName() { String name = getBean().getName(); Leg l = getBean(); Hub preHub = l.getPrevious(); Hub nextHub = l.getNext(); if (preHub != null && nextHub != null) { return "<font color='!textText'>" + name + "</font>" + " <font color='!controlShadow'><i>" + preHub.getName() + " -> " + nextHub.getName() + "</i></font>"; //To change body of generated methods, choose Tools | Templates. } else { return name; } } @Override Class getServiceClass() { return null; } @Override protected Icon getBeanIcon() { return getBean().getIcon(); } public void refresh() { createProperties(bean, null); } @Override public Image getIcon(int type) { return getBean().getIcon().getImage().getScaledInstance(16, 16, BufferedImage.SCALE_SMOOTH); } @Override protected void createProperties(Leg bean, BeanInfo info) { Sheet sets = getSheet(); Sheet.Set set = super.getBaseEntityPropertySheet(); try { 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("HUB"))); 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("HUB"))); procedureProp.setValue("canEditAsText", false); set.put(procedureProp); set.put(eventProp); } catch (NoSuchMethodException ex) { ErrorManager.getDefault(); } set.addPropertyChangeListener((PropertyChangeEvent evt) -> { getListener().propertyChange(evt); }); sets.put(set); } @Override public Action[] getActions(boolean context) { return new Action[]{new AbstractAction(LIMOResourceBundle.getString("EDIT")) { @Override public void actionPerformed(ActionEvent e) { Leg l = getBean(); if (l instanceof ScheduledLeg) { ScheduledLegWizardAction wiz = new ScheduledLegWizardAction(); wiz.setUpdate((ScheduledLeg) getBean()); wiz.actionPerformed(e); createProperties(getBean(), null); setSheet(getSheet()); setDisplayName(getBean().getName()); //Manually update the displayname } else if (false) { MultimodeLegWizardAction wiz = new MultimodeLegWizardAction(); wiz.setUpdate((MultiModeLeg) getBean()); wiz.actionPerformed(e); createProperties(getBean(), null); setSheet(getSheet()); setDisplayName(getBean().getName()); //Manually update the displayname } else if (l instanceof Leg) { NormalLegWizardAction wiz = new NormalLegWizardAction(); wiz.setUpdate(getBean()); wiz.actionPerformed(e); createProperties(getBean(), null); setSheet(getSheet()); setDisplayName(getBean().getName()); //Manually update the displayname } else { } } }, new AddEventAction(), new AddProcedureAction() }; } @Override public void delete() { /** * Delete is empty because the LegNodes aren't saved in the database and * therefore didn't need to be deleted. */ } protected class AddEventAction extends AbstractAction { public AddEventAction() { putValue(NAME, "Add Event"); } @Override public void actionPerformed(ActionEvent e) { List<WizardDescriptor.Panel<WizardDescriptor>> panels = new ArrayList<>(); panels.add(new EventLegTypeWizard()); WizardDescriptor wiz = new WizardDescriptor(new WizardDescriptor.ArrayIterator<>(panels)); wiz.putProperty(WizardDescriptor.PROP_IMAGE, ImageUtilities.loadImage("icons/limo_wizard.png", true)); wiz.putProperty("leg", new Leg(getBean())); wiz.putProperty("original_leg", getBean()); wiz.setTitleFormat(new MessageFormat("{0}")); wiz.setTitle(LIMOResourceBundle.getString("CREATE_NORMAL_LEG")); if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) { getBean().deepOverwrite((Leg) wiz.getProperty("leg")); } } } protected class AddProcedureAction extends AbstractAction { public AddProcedureAction() { putValue(NAME, "Add procedure"); } @Override public void actionPerformed(ActionEvent e) { List<WizardDescriptor.Panel<WizardDescriptor>> panels = new ArrayList<>(); panels.add(new ProceduresLegTypeWizard()); WizardDescriptor wiz = new WizardDescriptor(new WizardDescriptor.ArrayIterator<>(panels)); wiz.putProperty(WizardDescriptor.PROP_IMAGE, ImageUtilities.loadImage("icons/limo_wizard.png", true)); wiz.putProperty("leg", new Leg(getBean())); wiz.putProperty("original_leg", getBean()); wiz.setTitleFormat(new MessageFormat("{0}")); wiz.setTitle(LIMOResourceBundle.getString("CREATE_NORMAL_LEG")); if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) { getBean().deepOverwrite((Leg) wiz.getProperty("leg")); } } } }