void CtrlrPanelComponentProperties::changeListenerCallback (ChangeBroadcaster* source)
{
    if (owner.getSelection() == nullptr)
        return;

	if (selectedItems != owner.getSelection()->getNumSelected() && owner.getSelection()->getNumSelected() > 1)
	{
		selectedItems = owner.getSelection()->getNumSelected();
		msTree = ValueTree(Ids::modulator);
		msTree.removeListener (this);

		for (int i=0; i<owner.getSelection()->getNumSelected(); i++)
		{
			ValueTree modTree = owner.getSelection()->getSelectedItem(i)->getOwner().getModulatorTree();

			copyProperties (modTree, msTree);

			for (int i=0; i<modTree.getNumChildren(); i++)
			{
				if (!msTree.getChildWithName(modTree.getChild(i).getType()).isValid())
					msTree.addChild (modTree.getChild(i).createCopy(), i, 0);
			}
		}

		if (msTree.getChildWithName(Ids::component).isValid())
		{
			msTree.getChildWithName(Ids::component).setProperty (Ids::uiType, "uiMultipleSelection", 0);
		}

		msTree.addListener (this);
		setTree (msTree);
	}

	if (owner.getSelection()->getNumSelected() == 0)
	{
		setTree (owner.getOwner().getPanelTree());
		propertyPanel->restoreOpennessState(panelPropertyOpennessState);
	}

	if (owner.getSelection()->getNumSelected() == 1)
	{
	    refreshTargetModulationPropertyList(owner.getSelection()->getSelectedItem(0)->getOwner().getModulatorTree());
		refreshDynamicData();
		setTree (owner.getSelection()->getSelectedItem(0)->getOwner().getModulatorTree());
		propertyPanel->restoreOpennessState(modulatorPropertyOpennessState);
	}
}
//==============================================================================
CtrlrPanelComponentProperties::CtrlrPanelComponentProperties (CtrlrPanelEditor &_owner)
    : owner(_owner), panelPropertyOpennessState("invalid"), modulatorPropertyOpennessState("invalid")
{
    addAndMakeVisible (propertyPanel = new PropertyPanel());


    //[UserPreSize]
	selectedItems=-1;
	owner.getOwner().getOwner().addListener (this);
	msTree.addListener (this);
	refreshDynamicData();
    if (owner.getSelection())
	{
        owner.getSelection()->addChangeListener (this);
	}
    //[/UserPreSize]

    setSize (216, 400);


    //[Constructor] You can add your own custom stuff here..
    //[/Constructor]
}
void CtrlrPanelComponentProperties::refreshAll()
{
	refreshDynamicData();
	propertyPanel->refreshAll();
	setTree(treeToEdit, true);
}