package net.sf.nmedit.jpatch.clavia.nordmodular; import net.sf.nmedit.jpatch.PModule; import net.sf.nmedit.jpatch.PModuleContainer; import net.sf.nmedit.jpatch.PParameter; import net.sf.nmedit.jpatch.clavia.nordmodular.PNMMorphSection.Assignments; import net.sf.nmedit.jpatch.event.PModuleContainerEvent; import net.sf.nmedit.jpatch.event.PModuleContainerListener; import net.sf.nmedit.jpatch.event.PParameterEvent; import net.sf.nmedit.jpatch.event.PParameterListener; public class MorphAutoAssigner implements PModuleContainerListener, PParameterListener { private NMPatch patch; public MorphAutoAssigner(NMPatch patch) { this.patch = patch; } public void installAt(PModuleContainer c) { c.addModuleContainerListener(this); installAtModules(c); } public void uninstallFrom(PModuleContainer c) { c.removeModuleContainerListener(this); uninstallFromModules(c); } private void installAtModules(PModuleContainer c) { for (PModule module: c) installAt(module); } private void uninstallFromModules(PModuleContainer c) { for (PModule module: c) uninstallFrom(module); } public void moduleAdded(PModuleContainerEvent e) { installAt(e.getModule()); } public void moduleRemoved(PModuleContainerEvent e) { uninstallFrom(e.getModule()); } private void installAt(PModule module) { for (int i = module.getParameterCount()-1;i>=0;i--) { PParameter param = module.getParameter(i); if (param.getExtensionParameter() != null) installAt(param, param.getExtensionParameter()); } } private void uninstallFrom(PModule module) { for (int i = module.getParameterCount()-1;i>=0;i--) { PParameter param = module.getParameter(i); if (param.getExtensionParameter() != null) uninstallFrom(param.getExtensionParameter()); } } private void installAt(PParameter parameter, PParameter extensionParameter) { extensionParameter.addParameterListener(this); } private void uninstallFrom(PParameter extensionParameter) { extensionParameter.removeParameterListener(this); } public void parameterValueChanged(PParameterEvent e) { PParameter extensionParameter = e.getParameter(); PModule module = extensionParameter.getParentComponent(); for (int i=module.getParameterCount()-1;i>=0;i--) { PParameter extendedParameter = module.getParameter(i); if (extendedParameter.getExtensionParameter() == extensionParameter) { // found parameterValueChanged(extendedParameter, extensionParameter); return; } } } private void parameterValueChanged(PParameter parameter, PParameter extensionParameter) { // now check if parameter was assigned to a morph group if (patch.getMorphSection().getAssignedMorph(parameter) < 0) { // not assigned int nextFreeGroup = findNextFreeMorphGroup(); if (nextFreeGroup>=0) // free group found { if (patch.getMorphSection().assign(nextFreeGroup, parameter)) { return ; // assigned } } // no morph assigned - reset value extensionParameter.setValue(0); } else { // morph already assigned } } private int findNextFreeMorphGroup() { PNMMorphSection morphs = patch.getMorphSection(); for (int i=0;i<morphs.getMorphCount();i++) { Assignments a = morphs.getAssignments(i); if (!a.isFull()) return i; } return -1; } public void focusRequested(PParameterEvent e) { // no op } }