| @@ -282,16 +282,12 @@ const ValueTree ComponentDocument::getComponent (int index) const | |||
| const ValueTree ComponentDocument::getComponentWithMemberName (const String& name) const | |||
| { | |||
| const ValueTree comps (getComponentGroup()); | |||
| for (int i = comps.getNumChildren(); --i >= 0;) | |||
| { | |||
| const ValueTree v (comps.getChild(i)); | |||
| if (v [memberNameProperty] == name) | |||
| return v; | |||
| } | |||
| return getComponentGroup().getChildWithProperty (memberNameProperty, name); | |||
| } | |||
| return ValueTree::invalid; | |||
| const ValueTree ComponentDocument::getComponentWithID (const String& uid) const | |||
| { | |||
| return getComponentGroup().getChildWithProperty (idProperty, uid); | |||
| } | |||
| Component* ComponentDocument::createComponent (int index) | |||
| @@ -301,8 +297,8 @@ Component* ComponentDocument::createComponent (int index) | |||
| if (v.isValid()) | |||
| { | |||
| Component* c = ComponentTypeManager::getInstance()->createFromStoredType (*this, v); | |||
| c->getProperties().set (idProperty, v[idProperty]); | |||
| jassert (c->getProperties()[idProperty].toString().isNotEmpty()); | |||
| c->getProperties().set (jucerIDProperty, v[idProperty]); | |||
| jassert (getJucerIDFor (c).isNotEmpty()); | |||
| return c; | |||
| } | |||
| @@ -490,25 +486,11 @@ const ValueTree ComponentDocument::getComponentState (Component* comp) const | |||
| return ValueTree::invalid; | |||
| } | |||
| void ComponentDocument::getComponentProperties (Array <PropertyComponent*>& props, Component* comp) | |||
| { | |||
| ValueTree v (getComponentState (comp)); | |||
| if (v.isValid()) | |||
| { | |||
| ComponentTypeHandler* handler = ComponentTypeManager::getInstance()->getHandlerFor (v.getType()); | |||
| jassert (handler != 0); | |||
| if (handler != 0) | |||
| handler->createPropertyEditors (*this, v, props); | |||
| } | |||
| } | |||
| bool ComponentDocument::isStateForComponent (const ValueTree& storedState, Component* comp) const | |||
| { | |||
| jassert (comp != 0); | |||
| jassert (! storedState [idProperty].isVoid()); | |||
| return storedState [idProperty] == comp->getProperties() [idProperty]; | |||
| return storedState [idProperty] == getJucerIDFor (comp); | |||
| } | |||
| void ComponentDocument::removeComponent (const ValueTree& state) | |||
| @@ -594,6 +576,7 @@ void ComponentDocument::MarkerList::createMarker (const String& name, int positi | |||
| ValueTree marker (markerTag); | |||
| marker.setProperty (markerNameProperty, document.getNonexistentMarkerName (name), 0); | |||
| marker.setProperty (markerPosProperty, Coordinate (position, isX).toString(), 0); | |||
| marker.setProperty (idProperty, createAlphaNumericUID(), 0); | |||
| group.addChild (marker, -1, document.getUndoManager()); | |||
| } | |||
| @@ -617,6 +600,24 @@ const Coordinate ComponentDocument::MarkerList::findMarker (const String& name, | |||
| return Coordinate (isX); | |||
| } | |||
| void ComponentDocument::MarkerList::createMarkerProperties (Array <PropertyComponent*>& props, ValueTree& marker) | |||
| { | |||
| props.add (new TextPropertyComponent (getNameAsValue (marker), "Marker Name", 256, false)); | |||
| } | |||
| bool ComponentDocument::MarkerList::createProperties (Array <PropertyComponent*>& props, const String& itemId) | |||
| { | |||
| ValueTree marker (group.getChildWithProperty (idProperty, itemId)); | |||
| if (marker.isValid()) | |||
| { | |||
| createMarkerProperties (props, marker); | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| const String ComponentDocument::getNonexistentMarkerName (const String& name) | |||
| { | |||
| String n (makeValidCppIdentifier (name, false, true, false)); | |||
| @@ -628,12 +629,59 @@ const String ComponentDocument::getNonexistentMarkerName (const String& name) | |||
| return n; | |||
| } | |||
| //============================================================================== | |||
| bool ComponentDocument::createItemProperties (Array <PropertyComponent*>& props, const String& itemId) | |||
| { | |||
| ValueTree comp (getComponentWithID (itemId)); | |||
| if (comp.isValid()) | |||
| { | |||
| ComponentTypeHandler* handler = ComponentTypeManager::getInstance()->getHandlerFor (comp.getType()); | |||
| jassert (handler != 0); | |||
| if (handler != 0) | |||
| handler->createPropertyEditors (*this, comp, props); | |||
| return true; | |||
| } | |||
| if (markersX->createProperties (props, itemId) | |||
| || markersY->createProperties (props, itemId)) | |||
| return true; | |||
| return false; | |||
| } | |||
| void ComponentDocument::createItemProperties (Array <PropertyComponent*>& props, const StringArray& selectedItemIds) | |||
| { | |||
| if (selectedItemIds.size() != 1) | |||
| return; //xxx | |||
| for (int i = 0; i < selectedItemIds.size(); ++i) | |||
| createItemProperties (props, selectedItemIds[i]); | |||
| } | |||
| //============================================================================== | |||
| UndoManager* ComponentDocument::getUndoManager() const | |||
| { | |||
| return &undoManager; | |||
| } | |||
| //============================================================================== | |||
| const char* const ComponentDocument::jucerIDProperty = "jucerID"; | |||
| const String ComponentDocument::getJucerIDFor (Component* c) | |||
| { | |||
| if (c == 0) | |||
| { | |||
| jassertfalse; | |||
| return String::empty; | |||
| } | |||
| jassert (c->getProperties().contains (jucerIDProperty)); | |||
| return c->getProperties() [jucerIDProperty]; | |||
| } | |||
| //============================================================================== | |||
| void ComponentDocument::createClassProperties (Array <PropertyComponent*>& props) | |||
| { | |||
| @@ -61,11 +61,11 @@ public: | |||
| int getNumComponents() const; | |||
| const ValueTree getComponent (int index) const; | |||
| const ValueTree getComponentWithMemberName (const String& name) const; | |||
| const ValueTree getComponentWithID (const String& uid) const; | |||
| Component* createComponent (int index); | |||
| void updateComponent (Component* comp); | |||
| bool containsComponent (Component* comp) const; | |||
| const ValueTree getComponentState (Component* comp) const; | |||
| void getComponentProperties (Array <PropertyComponent*>& props, Component* comp); | |||
| bool isStateForComponent (const ValueTree& storedState, Component* comp) const; | |||
| void removeComponent (const ValueTree& state); | |||
| const RectangleCoordinates getCoordsFor (const ValueTree& componentState) const; | |||
| @@ -102,6 +102,9 @@ public: | |||
| // for Coordinate::MarkerResolver: | |||
| const Coordinate findMarker (const String& name, bool isHorizontal) const; | |||
| bool createProperties (Array <PropertyComponent*>& props, const String& itemId); | |||
| void createMarkerProperties (Array <PropertyComponent*>& props, ValueTree& marker); | |||
| private: | |||
| ComponentDocument& document; | |||
| ValueTree group; | |||
| @@ -117,6 +120,9 @@ public: | |||
| const String getNonexistentMarkerName (const String& name); | |||
| //============================================================================== | |||
| void createItemProperties (Array <PropertyComponent*>& props, const StringArray& selectedItemIds); | |||
| //============================================================================== | |||
| void beginDrag (const Array<Component*>& items, const MouseEvent& e, | |||
| Component* parentForOverlays, const ResizableBorderComponent::Zone& zone); | |||
| @@ -139,6 +145,9 @@ public: | |||
| static const char* const markerNameProperty; | |||
| static const char* const markerPosProperty; | |||
| static const char* const jucerIDProperty; | |||
| static const String getJucerIDFor (Component* c); | |||
| private: | |||
| Project* project; | |||
| File cppFile; | |||
| @@ -158,6 +167,8 @@ private: | |||
| void writeCode (OutputStream& cpp, OutputStream& header); | |||
| void writeMetadata (OutputStream& out); | |||
| bool createItemProperties (Array <PropertyComponent*>& props, const String& itemId); | |||
| }; | |||
| @@ -104,7 +104,7 @@ public: | |||
| setBoundsInTargetSpace (component->getBounds().expanded (borderThickness, borderThickness)); | |||
| } | |||
| uint32 getTargetComponentUID() const { return component == 0 ? 0 : component->getComponentUID(); } | |||
| const String getTargetComponentID() const { return component == 0 ? String::empty : ComponentDocument::getJucerIDFor (component); } | |||
| //============================================================================== | |||
| class SizeGuideComponent : public OverlayItemComponent, | |||
| @@ -300,6 +300,8 @@ public: | |||
| toFront (false); | |||
| updateLabel(); | |||
| canvas.getSelection().selectOnly (marker [ComponentDocument::idProperty]); | |||
| if (e.mods.isPopupMenu()) | |||
| { | |||
| isDragging = false; | |||
| @@ -394,7 +396,7 @@ public: | |||
| if (! doc.containsComponent (c)) | |||
| { | |||
| selection.deselect (c->getComponentUID()); | |||
| selection.deselect (ComponentDocument::getJucerIDFor (c)); | |||
| delete c; | |||
| } | |||
| } | |||
| @@ -418,11 +420,16 @@ public: | |||
| } | |||
| // Make sure the z-order is correct.. | |||
| for (i = 0; i < num - 1; ++i) | |||
| componentsInOrder.getUnchecked(i)->toBehind (componentsInOrder.getUnchecked (i + 1)); | |||
| if (num > 0) | |||
| { | |||
| componentsInOrder.getLast()->toFront (false); | |||
| for (i = num - 1; --i >= 0;) | |||
| componentsInOrder.getUnchecked(i)->toBehind (componentsInOrder.getUnchecked (i + 1)); | |||
| } | |||
| } | |||
| Component* getComponentForState (ComponentDocument& doc, const ValueTree& state) | |||
| Component* getComponentForState (ComponentDocument& doc, const ValueTree& state) const | |||
| { | |||
| for (int i = getNumChildComponents(); --i >= 0;) | |||
| { | |||
| @@ -435,6 +442,19 @@ public: | |||
| return 0; | |||
| } | |||
| Component* findComponentWithID (const String& uid) const | |||
| { | |||
| for (int i = getNumChildComponents(); --i >= 0;) | |||
| { | |||
| Component* const c = getChildComponent(i); | |||
| if (ComponentDocument::getJucerIDFor (c) == uid) | |||
| return c; | |||
| } | |||
| return 0; | |||
| } | |||
| Component* findComponentAt (const Point<int>& pos) const | |||
| { | |||
| for (int i = getNumChildComponents(); --i >= 0;) | |||
| @@ -453,7 +473,7 @@ public: | |||
| { | |||
| Component* c = getChildComponent(i); | |||
| if (c->getBounds().intersects (lassoArea)) | |||
| itemsFound.add (c->getComponentUID()); | |||
| itemsFound.add (ComponentDocument::getJucerIDFor (c)); | |||
| } | |||
| } | |||
| }; | |||
| @@ -493,7 +513,7 @@ public: | |||
| void mouseDown (const MouseEvent& e) | |||
| { | |||
| lasso = 0; | |||
| mouseDownCompUID = 0; | |||
| mouseDownCompUID = String::empty; | |||
| isDraggingClickedComp = false; | |||
| Component* underMouse = canvas.getComponentHolder()->findComponentAt (e.getEventRelativeTo (canvas.getComponentHolder()).getPosition()); | |||
| @@ -502,8 +522,8 @@ public: | |||
| { | |||
| if (underMouse != 0) | |||
| { | |||
| if (! canvas.getSelection().isSelected (underMouse->getComponentUID())) | |||
| canvas.getSelection().selectOnly (underMouse->getComponentUID()); | |||
| if (! canvas.getSelection().isSelected (ComponentDocument::getJucerIDFor (underMouse))) | |||
| canvas.getSelection().selectOnly (ComponentDocument::getJucerIDFor (underMouse)); | |||
| } | |||
| PopupMenu m; | |||
| @@ -528,12 +548,14 @@ public: | |||
| { | |||
| if (underMouse == 0 || e.mods.isAltDown()) | |||
| { | |||
| canvas.deselectNonComponents(); | |||
| addAndMakeVisible (lasso = new LassoComponent <SelectedItems::ItemType>()); | |||
| lasso->beginLasso (e, this); | |||
| } | |||
| else | |||
| { | |||
| mouseDownCompUID = underMouse->getComponentUID(); | |||
| mouseDownCompUID = ComponentDocument::getJucerIDFor (underMouse); | |||
| canvas.deselectNonComponents(); | |||
| mouseDownResult = canvas.getSelection().addToSelectionOnMouseDown (mouseDownCompUID, e.mods); | |||
| updateResizeFrames(); | |||
| @@ -549,7 +571,7 @@ public: | |||
| { | |||
| lasso->dragLasso (e); | |||
| } | |||
| else if (mouseDownCompUID != 0 && (! e.mouseWasClicked()) && (! e.mods.isPopupMenu())) | |||
| else if (mouseDownCompUID.isNotEmpty() && (! e.mouseWasClicked()) && (! e.mods.isPopupMenu())) | |||
| { | |||
| if (! isDraggingClickedComp) | |||
| { | |||
| @@ -653,40 +675,24 @@ private: | |||
| ValueTree markerRootX, markerRootY; | |||
| ScopedPointer <LassoComponent <SelectedItems::ItemType> > lasso; | |||
| bool mouseDownResult, isDraggingClickedComp; | |||
| uint32 mouseDownCompUID; | |||
| SelectedItems::ItemType mouseDownCompUID; | |||
| ComponentDocument& getDocument() { return canvas.getDocument(); } | |||
| Component* getComponentWithUID (const uint32 uid) const | |||
| { | |||
| for (int i = canvas.getComponentHolder()->getNumChildComponents(); --i >= 0;) | |||
| { | |||
| Component* c = canvas.getComponentHolder()->getChildComponent(i); | |||
| if (c->getComponentUID() == uid) | |||
| return c; | |||
| } | |||
| return 0; | |||
| } | |||
| void updateResizeFrames() | |||
| { | |||
| SelectedItems& selection = canvas.getSelection(); | |||
| StringArray requiredIds (canvas.getSelectedIds()); | |||
| Array<int> requiredIds; | |||
| int i; | |||
| for (i = selection.getNumSelected(); --i >= 0;) | |||
| requiredIds.add (selection.getSelectedItem(i)); | |||
| for (i = getNumChildComponents(); --i >= 0;) | |||
| { | |||
| ComponentResizeFrame* resizer = dynamic_cast <ComponentResizeFrame*> (getChildComponent(i)); | |||
| if (resizer != 0) | |||
| { | |||
| if (selection.isSelected (resizer->getTargetComponentUID())) | |||
| requiredIds.removeValue (resizer->getTargetComponentUID()); | |||
| if (selection.isSelected (resizer->getTargetComponentID())) | |||
| requiredIds.removeString (resizer->getTargetComponentID()); | |||
| else | |||
| delete resizer; | |||
| } | |||
| @@ -694,7 +700,7 @@ private: | |||
| for (i = requiredIds.size(); --i >= 0;) | |||
| { | |||
| Component* c = getComponentWithUID (requiredIds.getUnchecked(i)); | |||
| Component* c = canvas.getComponentHolder()->findComponentWithID (requiredIds[i]); | |||
| if (c != 0) | |||
| { | |||
| @@ -951,16 +957,19 @@ void ComponentEditorCanvas::updateComponents() | |||
| } | |||
| //============================================================================== | |||
| void ComponentEditorCanvas::getSelectedItemProperties (Array <PropertyComponent*>& props) | |||
| const StringArray ComponentEditorCanvas::getSelectedIds() const | |||
| { | |||
| //xxx needs to handle multiple selections.. | |||
| StringArray ids; | |||
| const int num = selection.getNumSelected(); | |||
| for (int i = 0; i < num; ++i) | |||
| ids.add (selection.getSelectedItem(i)); | |||
| if (selection.getNumSelected() == 1) | |||
| { | |||
| Component* c = getComponentForUID (selection.getSelectedItem (0)); | |||
| jassert (c != 0); | |||
| getDocument().getComponentProperties (props, c); | |||
| } | |||
| return ids; | |||
| } | |||
| void ComponentEditorCanvas::getSelectedItemProperties (Array <PropertyComponent*>& props) | |||
| { | |||
| getDocument().createItemProperties (props, getSelectedIds()); | |||
| } | |||
| void ComponentEditorCanvas::deleteSelection() | |||
| @@ -969,7 +978,7 @@ void ComponentEditorCanvas::deleteSelection() | |||
| for (int i = selection.getNumSelected(); --i >= 0;) | |||
| { | |||
| Component* c = getComponentForUID (selection.getSelectedItem (0)); | |||
| Component* c = componentHolder->findComponentWithID (selection.getSelectedItem (0)); | |||
| if (c != 0) | |||
| getDocument().removeComponent (getDocument().getComponentState (c)); | |||
| @@ -980,6 +989,13 @@ void ComponentEditorCanvas::deleteSelection() | |||
| getDocument().beginNewTransaction(); | |||
| } | |||
| void ComponentEditorCanvas::deselectNonComponents() | |||
| { | |||
| for (int i = getSelection().getNumSelected(); --i >= 0;) | |||
| if (! getDocument().getComponentWithID (getSelection().getSelectedItem (i)).isValid()) | |||
| getSelection().deselect (getSelection().getSelectedItem (i)); | |||
| } | |||
| void ComponentEditorCanvas::selectionToFront() | |||
| { | |||
| getDocument().beginNewTransaction(); | |||
| @@ -990,11 +1006,10 @@ void ComponentEditorCanvas::selectionToFront() | |||
| const ValueTree comp (getDocument().getComponent (index)); | |||
| Component* c = componentHolder->getComponentForState (getDocument(), comp); | |||
| if (c != 0 && selection.isSelected (c->getComponentUID())) | |||
| if (c != 0 && selection.isSelected (ComponentDocument::getJucerIDFor (c))) | |||
| { | |||
| ValueTree parent (comp.getParent()); | |||
| parent.removeChild (comp, getDocument().getUndoManager()); | |||
| parent.addChild (comp, -1, getDocument().getUndoManager()); | |||
| parent.moveChild (parent.indexOf (comp), -1, getDocument().getUndoManager()); | |||
| } | |||
| else | |||
| { | |||
| @@ -1015,11 +1030,10 @@ void ComponentEditorCanvas::selectionToBack() | |||
| const ValueTree comp (getDocument().getComponent (index)); | |||
| Component* c = componentHolder->getComponentForState (getDocument(), comp); | |||
| if (c != 0 && selection.isSelected (c->getComponentUID())) | |||
| if (c != 0 && selection.isSelected (ComponentDocument::getJucerIDFor (c))) | |||
| { | |||
| ValueTree parent (comp.getParent()); | |||
| parent.removeChild (comp, getDocument().getUndoManager()); | |||
| parent.addChild (comp, 0, getDocument().getUndoManager()); | |||
| parent.moveChild (parent.indexOf (comp), 0, getDocument().getUndoManager()); | |||
| } | |||
| else | |||
| { | |||
| @@ -1036,22 +1050,13 @@ void ComponentEditorCanvas::hideSizeGuides() { overlay->hideSizeGuides(); } | |||
| //============================================================================== | |||
| Component* ComponentEditorCanvas::getComponentForUID (const uint32 uid) const | |||
| { | |||
| for (int i = componentHolder->getNumChildComponents(); --i >= 0;) | |||
| if (componentHolder->getChildComponent (i)->getComponentUID() == uid) | |||
| return componentHolder->getChildComponent (i); | |||
| return 0; | |||
| } | |||
| const Array<Component*> ComponentEditorCanvas::getSelectedComps() const | |||
| { | |||
| Array<Component*> comps; | |||
| for (int i = 0; i < selection.getNumSelected(); ++i) | |||
| { | |||
| Component* c = getComponentForUID (selection.getSelectedItem (i)); | |||
| Component* c = componentHolder->findComponentWithID (selection.getSelectedItem (i)); | |||
| jassert (c != 0); | |||
| if (c != 0) | |||
| comps.add (c); | |||
| @@ -1065,7 +1070,7 @@ const Array<Component*> ComponentEditorCanvas::getUnselectedComps() const | |||
| Array<Component*> comps; | |||
| for (int i = componentHolder->getNumChildComponents(); --i >= 0;) | |||
| if (! selection.isSelected (componentHolder->getChildComponent(i)->getComponentUID())) | |||
| if (! selection.isSelected (ComponentDocument::getJucerIDFor (componentHolder->getChildComponent(i)))) | |||
| comps.add (componentHolder->getChildComponent(i)); | |||
| return comps; | |||
| @@ -45,7 +45,7 @@ public: | |||
| ComponentEditor& getEditor(); | |||
| ComponentDocument& getDocument(); | |||
| typedef SelectedItemSet<uint32> SelectedItems; | |||
| typedef SelectedItemSet<String> SelectedItems; | |||
| SelectedItems& getSelection(); | |||
| class ComponentHolder; | |||
| @@ -67,8 +67,10 @@ public: | |||
| void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) {} | |||
| //============================================================================== | |||
| const StringArray getSelectedIds() const; | |||
| void getSelectedItemProperties (Array <PropertyComponent*>& props); | |||
| void deleteSelection(); | |||
| void deselectNonComponents(); | |||
| void selectionToFront(); | |||
| void selectionToBack(); | |||
| @@ -114,7 +116,6 @@ private: | |||
| WholeComponentResizer* resizeFrame; | |||
| SelectedItems selection; | |||
| Component* getComponentForUID (const uint32 uid) const; | |||
| const Array<Component*> getSelectedComps() const; | |||
| const Array<Component*> getUnselectedComps() const; | |||
| }; | |||
| @@ -654,7 +654,9 @@ public: | |||
| juceFilter->prepareToPlay (GetSampleRate(), | |||
| GetMaxFramesPerSlice()); | |||
| midiEvents.ensureSize (2048); | |||
| midiEvents.clear(); | |||
| incomingEvents.ensureSize (2048); | |||
| incomingEvents.clear(); | |||
| channels.calloc (jmax (juceFilter->getNumInputChannels(), | |||
| @@ -506,6 +506,8 @@ protected: | |||
| juceFilter->setPlayHead (this); | |||
| juceFilter->addListener (this); | |||
| midiEvents.ensureSize (2048); | |||
| } | |||
| void handleAsyncUpdate() | |||
| @@ -779,6 +779,8 @@ public: | |||
| deleteTempChannels(); | |||
| filter->prepareToPlay (rate, blockSize); | |||
| midiEvents.ensureSize (2048); | |||
| midiEvents.clear(); | |||
| setInitialDelay (filter->getLatencySamples()); | |||
| @@ -15704,11 +15704,11 @@ END_JUCE_NAMESPACE | |||
| /*** Start of inlined file: juce_ValueTree.cpp ***/ | |||
| BEGIN_JUCE_NAMESPACE | |||
| class ValueTreeSetPropertyAction : public UndoableAction | |||
| class ValueTree::SetPropertyAction : public UndoableAction | |||
| { | |||
| public: | |||
| ValueTreeSetPropertyAction (const ValueTree::SharedObjectPtr& target_, const var::identifier& name_, | |||
| const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_) | |||
| SetPropertyAction (const SharedObjectPtr& target_, const var::identifier& name_, | |||
| const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_) | |||
| : target (target_), name (name_), newValue (newValue_), | |||
| isAddingNewProperty (isAddingNewProperty_), | |||
| isDeletingProperty (isDeletingProperty_) | |||
| @@ -15717,7 +15717,7 @@ public: | |||
| oldValue = target_->getProperty (name_); | |||
| } | |||
| ~ValueTreeSetPropertyAction() {} | |||
| ~SetPropertyAction() {} | |||
| bool perform() | |||
| { | |||
| @@ -15747,21 +15747,21 @@ public: | |||
| } | |||
| private: | |||
| const ValueTree::SharedObjectPtr target; | |||
| const SharedObjectPtr target; | |||
| const var::identifier name; | |||
| const var newValue; | |||
| var oldValue; | |||
| const bool isAddingNewProperty, isDeletingProperty; | |||
| ValueTreeSetPropertyAction (const ValueTreeSetPropertyAction&); | |||
| ValueTreeSetPropertyAction& operator= (const ValueTreeSetPropertyAction&); | |||
| SetPropertyAction (const SetPropertyAction&); | |||
| SetPropertyAction& operator= (const SetPropertyAction&); | |||
| }; | |||
| class ValueTreeChildChangeAction : public UndoableAction | |||
| class ValueTree::AddOrRemoveChildAction : public UndoableAction | |||
| { | |||
| public: | |||
| ValueTreeChildChangeAction (const ValueTree::SharedObjectPtr& target_, const int childIndex_, | |||
| const ValueTree::SharedObjectPtr& newChild_) | |||
| AddOrRemoveChildAction (const SharedObjectPtr& target_, const int childIndex_, | |||
| const SharedObjectPtr& newChild_) | |||
| : target (target_), | |||
| child (newChild_ != 0 ? newChild_ : target_->children [childIndex_]), | |||
| childIndex (childIndex_), | |||
| @@ -15770,7 +15770,7 @@ public: | |||
| jassert (child != 0); | |||
| } | |||
| ~ValueTreeChildChangeAction() {} | |||
| ~AddOrRemoveChildAction() {} | |||
| bool perform() | |||
| { | |||
| @@ -15805,12 +15805,50 @@ public: | |||
| } | |||
| private: | |||
| const ValueTree::SharedObjectPtr target, child; | |||
| const SharedObjectPtr target, child; | |||
| const int childIndex; | |||
| const bool isDeleting; | |||
| ValueTreeChildChangeAction (const ValueTreeChildChangeAction&); | |||
| ValueTreeChildChangeAction& operator= (const ValueTreeChildChangeAction&); | |||
| AddOrRemoveChildAction (const AddOrRemoveChildAction&); | |||
| AddOrRemoveChildAction& operator= (const AddOrRemoveChildAction&); | |||
| }; | |||
| class ValueTree::MoveChildAction : public UndoableAction | |||
| { | |||
| public: | |||
| MoveChildAction (const SharedObjectPtr& target_, | |||
| const int startIndex_, const int endIndex_) | |||
| : target (target_), | |||
| startIndex (startIndex_), | |||
| endIndex (endIndex_) | |||
| { | |||
| } | |||
| ~MoveChildAction() {} | |||
| bool perform() | |||
| { | |||
| target->moveChild (startIndex, endIndex, 0); | |||
| return true; | |||
| } | |||
| bool undo() | |||
| { | |||
| target->moveChild (endIndex, startIndex, 0); | |||
| return true; | |||
| } | |||
| int getSizeInUnits() | |||
| { | |||
| return (int) sizeof (*this); //xxx should be more accurate | |||
| } | |||
| private: | |||
| const SharedObjectPtr target, child; | |||
| const int startIndex, endIndex; | |||
| MoveChildAction (const MoveChildAction&); | |||
| MoveChildAction& operator= (const MoveChildAction&); | |||
| }; | |||
| ValueTree::SharedObject::SharedObject (const String& type_) | |||
| @@ -15926,11 +15964,11 @@ void ValueTree::SharedObject::setProperty (const var::identifier& name, const va | |||
| if (existingValue != 0) | |||
| { | |||
| if (*existingValue != newValue) | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, false, false)); | |||
| undoManager->perform (new SetPropertyAction (this, name, newValue, false, false)); | |||
| } | |||
| else | |||
| { | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, true, false)); | |||
| undoManager->perform (new SetPropertyAction (this, name, newValue, true, false)); | |||
| } | |||
| } | |||
| } | |||
| @@ -15950,7 +15988,7 @@ void ValueTree::SharedObject::removeProperty (const var::identifier& name, UndoM | |||
| else | |||
| { | |||
| if (properties.contains (name)) | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, name, var::null, false, true)); | |||
| undoManager->perform (new SetPropertyAction (this, name, var::null, false, true)); | |||
| } | |||
| } | |||
| @@ -15968,7 +16006,7 @@ void ValueTree::SharedObject::removeAllProperties (UndoManager* const undoManage | |||
| else | |||
| { | |||
| for (int i = properties.size(); --i >= 0;) | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, properties.getName(i), var::null, false, true)); | |||
| undoManager->perform (new SetPropertyAction (this, properties.getName(i), var::null, false, true)); | |||
| } | |||
| } | |||
| @@ -16005,6 +16043,11 @@ bool ValueTree::SharedObject::isAChildOf (const SharedObject* const possiblePare | |||
| return false; | |||
| } | |||
| int ValueTree::SharedObject::indexOf (const ValueTree& child) const | |||
| { | |||
| return children.indexOf (child.object); | |||
| } | |||
| void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoManager* const undoManager) | |||
| { | |||
| if (child != 0 && child->parent != this) | |||
| @@ -16034,7 +16077,7 @@ void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoMana | |||
| if (index < 0) | |||
| index = children.size(); | |||
| undoManager->perform (new ValueTreeChildChangeAction (this, index, child)); | |||
| undoManager->perform (new AddOrRemoveChildAction (this, index, child)); | |||
| } | |||
| } | |||
| else | |||
| @@ -16061,7 +16104,7 @@ void ValueTree::SharedObject::removeChild (const int childIndex, UndoManager* co | |||
| } | |||
| else | |||
| { | |||
| undoManager->perform (new ValueTreeChildChangeAction (this, childIndex, 0)); | |||
| undoManager->perform (new AddOrRemoveChildAction (this, childIndex, 0)); | |||
| } | |||
| } | |||
| } | |||
| @@ -16072,6 +16115,29 @@ void ValueTree::SharedObject::removeAllChildren (UndoManager* const undoManager) | |||
| removeChild (children.size() - 1, undoManager); | |||
| } | |||
| void ValueTree::SharedObject::moveChild (int currentIndex, int newIndex, UndoManager* undoManager) | |||
| { | |||
| // The source index must be a valid index! | |||
| jassert (((unsigned int) currentIndex) < (unsigned int) children.size()); | |||
| if (currentIndex != newIndex | |||
| && ((unsigned int) currentIndex) < (unsigned int) children.size()) | |||
| { | |||
| if (undoManager == 0) | |||
| { | |||
| children.move (currentIndex, newIndex); | |||
| sendChildChangeMessage(); | |||
| } | |||
| else | |||
| { | |||
| if (((unsigned int) newIndex) >= (unsigned int) children.size()) | |||
| newIndex = children.size() - 1; | |||
| undoManager->perform (new MoveChildAction (this, currentIndex, newIndex)); | |||
| } | |||
| } | |||
| } | |||
| ValueTree::ValueTree() throw() | |||
| : object (0) | |||
| { | |||
| @@ -16274,6 +16340,11 @@ bool ValueTree::isAChildOf (const ValueTree& possibleParent) const | |||
| return object != 0 && object->isAChildOf (possibleParent.object); | |||
| } | |||
| int ValueTree::indexOf (const ValueTree& child) const | |||
| { | |||
| return object != 0 ? object->indexOf (child) : -1; | |||
| } | |||
| void ValueTree::addChild (ValueTree child, int index, UndoManager* const undoManager) | |||
| { | |||
| if (object != 0) | |||
| @@ -16298,6 +16369,12 @@ void ValueTree::removeAllChildren (UndoManager* const undoManager) | |||
| object->removeAllChildren (undoManager); | |||
| } | |||
| void ValueTree::moveChild (int currentIndex, int newIndex, UndoManager* undoManager) | |||
| { | |||
| if (object != 0) | |||
| object->moveChild (currentIndex, newIndex, undoManager); | |||
| } | |||
| void ValueTree::addListener (Listener* listener) | |||
| { | |||
| if (listener != 0) | |||
| @@ -26435,6 +26512,11 @@ void MidiBuffer::addEvents (const MidiBuffer& otherBuffer, | |||
| } | |||
| } | |||
| void MidiBuffer::ensureSize (size_t minimumNumBytes) | |||
| { | |||
| data.ensureSize (minimumNumBytes); | |||
| } | |||
| bool MidiBuffer::isEmpty() const throw() | |||
| { | |||
| return bytesUsed == 0; | |||
| @@ -32340,7 +32422,7 @@ void VSTPluginInstance::processBlock (AudioSampleBuffer& buffer, | |||
| // copy any incoming midi.. | |||
| const ScopedLock sl (midiInLock); | |||
| midiMessages = incomingMidi; | |||
| midiMessages.swapWith (incomingMidi); | |||
| incomingMidi.clear(); | |||
| } | |||
| } | |||
| @@ -6726,19 +6726,19 @@ public: | |||
| const var& operator[] (const var::identifier& name) const; | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager); | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager* undoManager); | |||
| bool hasProperty (const var::identifier& name) const; | |||
| void removeProperty (const var::identifier& name, UndoManager* const undoManager); | |||
| void removeProperty (const var::identifier& name, UndoManager* undoManager); | |||
| void removeAllProperties (UndoManager* const undoManager); | |||
| void removeAllProperties (UndoManager* undoManager); | |||
| int getNumProperties() const; | |||
| const var::identifier getPropertyName (int index) const; | |||
| Value getPropertyAsValue (const var::identifier& name, UndoManager* const undoManager) const; | |||
| Value getPropertyAsValue (const var::identifier& name, UndoManager* undoManager) const; | |||
| int getNumChildren() const; | |||
| @@ -6748,16 +6748,20 @@ public: | |||
| ValueTree getChildWithProperty (const var::identifier& propertyName, const var& propertyValue) const; | |||
| void addChild (ValueTree child, int index, UndoManager* const undoManager); | |||
| void addChild (ValueTree child, int index, UndoManager* undoManager); | |||
| void removeChild (const ValueTree& child, UndoManager* const undoManager); | |||
| void removeChild (const ValueTree& child, UndoManager* undoManager); | |||
| void removeChild (const int childIndex, UndoManager* const undoManager); | |||
| void removeChild (int childIndex, UndoManager* undoManager); | |||
| void removeAllChildren (UndoManager* const undoManager); | |||
| void removeAllChildren (UndoManager* undoManager); | |||
| void moveChild (int currentIndex, int newIndex, UndoManager* undoManager); | |||
| bool isAChildOf (const ValueTree& possibleParent) const; | |||
| int indexOf (const ValueTree& child) const; | |||
| ValueTree getParent() const; | |||
| XmlElement* createXml() const; | |||
| @@ -6801,8 +6805,12 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| friend class ValueTreeSetPropertyAction; | |||
| friend class ValueTreeChildChangeAction; | |||
| class SetPropertyAction; | |||
| friend class SetPropertyAction; | |||
| class AddOrRemoveChildAction; | |||
| friend class AddOrRemoveChildAction; | |||
| class MoveChildAction; | |||
| friend class MoveChildAction; | |||
| class JUCE_API SharedObject : public ReferenceCountedObject | |||
| { | |||
| @@ -6824,16 +6832,18 @@ private: | |||
| void sendParentChangeMessage(); | |||
| const var& getProperty (const var::identifier& name) const; | |||
| const var getProperty (const var::identifier& name, const var& defaultReturnValue) const; | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager); | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager*); | |||
| bool hasProperty (const var::identifier& name) const; | |||
| void removeProperty (const var::identifier& name, UndoManager* const undoManager); | |||
| void removeAllProperties (UndoManager* const undoManager); | |||
| bool isAChildOf (const SharedObject* const possibleParent) const; | |||
| void removeProperty (const var::identifier& name, UndoManager*); | |||
| void removeAllProperties (UndoManager*); | |||
| bool isAChildOf (const SharedObject* possibleParent) const; | |||
| int indexOf (const ValueTree& child) const; | |||
| ValueTree getChildWithName (const String& type) const; | |||
| ValueTree getChildWithProperty (const var::identifier& propertyName, const var& propertyValue) const; | |||
| void addChild (SharedObject* child, int index, UndoManager* const undoManager); | |||
| void removeChild (const int childIndex, UndoManager* const undoManager); | |||
| void removeAllChildren (UndoManager* const undoManager); | |||
| void addChild (SharedObject* child, int index, UndoManager*); | |||
| void removeChild (int childIndex, UndoManager*); | |||
| void removeAllChildren (UndoManager*); | |||
| void moveChild (int currentIndex, int newIndex, UndoManager*); | |||
| XmlElement* createXml() const; | |||
| juce_UseDebuggingNewOperator | |||
| @@ -6861,14 +6871,13 @@ private: | |||
| }; | |||
| friend class SharedObject; | |||
| typedef ReferenceCountedObjectPtr <SharedObject> SharedObjectPtr; | |||
| ReferenceCountedObjectPtr <SharedObject> object; | |||
| SharedObjectPtr object; | |||
| ListenerList <Listener> listeners; | |||
| public: | |||
| explicit ValueTree (SharedObject* const object_); // (can be made private when VC6 support is finally dropped) | |||
| explicit ValueTree (SharedObject*); // (can be made private when VC6 support is finally dropped) | |||
| }; | |||
| #endif // __JUCE_VALUETREE_JUCEHEADER__ | |||
| @@ -15723,6 +15732,8 @@ public: | |||
| void swapWith (MidiBuffer& other); | |||
| void ensureSize (size_t minimumNumBytes); | |||
| class Iterator | |||
| { | |||
| public: | |||
| @@ -191,6 +191,11 @@ void MidiBuffer::addEvents (const MidiBuffer& otherBuffer, | |||
| } | |||
| } | |||
| void MidiBuffer::ensureSize (size_t minimumNumBytes) | |||
| { | |||
| data.ensureSize (minimumNumBytes); | |||
| } | |||
| bool MidiBuffer::isEmpty() const throw() | |||
| { | |||
| return bytesUsed == 0; | |||
| @@ -157,6 +157,12 @@ public: | |||
| */ | |||
| void swapWith (MidiBuffer& other); | |||
| /** Preallocates some memory for the buffer to use. | |||
| This helps to avoid needing to reallocate space when the buffer has messages | |||
| added to it. | |||
| */ | |||
| void ensureSize (size_t minimumNumBytes); | |||
| //============================================================================== | |||
| /** | |||
| Used to iterate through the events in a MidiBuffer. | |||
| @@ -1140,7 +1140,7 @@ void VSTPluginInstance::processBlock (AudioSampleBuffer& buffer, | |||
| // copy any incoming midi.. | |||
| const ScopedLock sl (midiInLock); | |||
| midiMessages = incomingMidi; | |||
| midiMessages.swapWith (incomingMidi); | |||
| incomingMidi.clear(); | |||
| } | |||
| } | |||
| @@ -31,11 +31,11 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| class ValueTreeSetPropertyAction : public UndoableAction | |||
| class ValueTree::SetPropertyAction : public UndoableAction | |||
| { | |||
| public: | |||
| ValueTreeSetPropertyAction (const ValueTree::SharedObjectPtr& target_, const var::identifier& name_, | |||
| const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_) | |||
| SetPropertyAction (const SharedObjectPtr& target_, const var::identifier& name_, | |||
| const var& newValue_, const bool isAddingNewProperty_, const bool isDeletingProperty_) | |||
| : target (target_), name (name_), newValue (newValue_), | |||
| isAddingNewProperty (isAddingNewProperty_), | |||
| isDeletingProperty (isDeletingProperty_) | |||
| @@ -44,7 +44,7 @@ public: | |||
| oldValue = target_->getProperty (name_); | |||
| } | |||
| ~ValueTreeSetPropertyAction() {} | |||
| ~SetPropertyAction() {} | |||
| bool perform() | |||
| { | |||
| @@ -74,22 +74,22 @@ public: | |||
| } | |||
| private: | |||
| const ValueTree::SharedObjectPtr target; | |||
| const SharedObjectPtr target; | |||
| const var::identifier name; | |||
| const var newValue; | |||
| var oldValue; | |||
| const bool isAddingNewProperty, isDeletingProperty; | |||
| ValueTreeSetPropertyAction (const ValueTreeSetPropertyAction&); | |||
| ValueTreeSetPropertyAction& operator= (const ValueTreeSetPropertyAction&); | |||
| SetPropertyAction (const SetPropertyAction&); | |||
| SetPropertyAction& operator= (const SetPropertyAction&); | |||
| }; | |||
| //============================================================================== | |||
| class ValueTreeChildChangeAction : public UndoableAction | |||
| class ValueTree::AddOrRemoveChildAction : public UndoableAction | |||
| { | |||
| public: | |||
| ValueTreeChildChangeAction (const ValueTree::SharedObjectPtr& target_, const int childIndex_, | |||
| const ValueTree::SharedObjectPtr& newChild_) | |||
| AddOrRemoveChildAction (const SharedObjectPtr& target_, const int childIndex_, | |||
| const SharedObjectPtr& newChild_) | |||
| : target (target_), | |||
| child (newChild_ != 0 ? newChild_ : target_->children [childIndex_]), | |||
| childIndex (childIndex_), | |||
| @@ -98,7 +98,7 @@ public: | |||
| jassert (child != 0); | |||
| } | |||
| ~ValueTreeChildChangeAction() {} | |||
| ~AddOrRemoveChildAction() {} | |||
| bool perform() | |||
| { | |||
| @@ -133,12 +133,51 @@ public: | |||
| } | |||
| private: | |||
| const ValueTree::SharedObjectPtr target, child; | |||
| const SharedObjectPtr target, child; | |||
| const int childIndex; | |||
| const bool isDeleting; | |||
| ValueTreeChildChangeAction (const ValueTreeChildChangeAction&); | |||
| ValueTreeChildChangeAction& operator= (const ValueTreeChildChangeAction&); | |||
| AddOrRemoveChildAction (const AddOrRemoveChildAction&); | |||
| AddOrRemoveChildAction& operator= (const AddOrRemoveChildAction&); | |||
| }; | |||
| //============================================================================== | |||
| class ValueTree::MoveChildAction : public UndoableAction | |||
| { | |||
| public: | |||
| MoveChildAction (const SharedObjectPtr& target_, | |||
| const int startIndex_, const int endIndex_) | |||
| : target (target_), | |||
| startIndex (startIndex_), | |||
| endIndex (endIndex_) | |||
| { | |||
| } | |||
| ~MoveChildAction() {} | |||
| bool perform() | |||
| { | |||
| target->moveChild (startIndex, endIndex, 0); | |||
| return true; | |||
| } | |||
| bool undo() | |||
| { | |||
| target->moveChild (endIndex, startIndex, 0); | |||
| return true; | |||
| } | |||
| int getSizeInUnits() | |||
| { | |||
| return (int) sizeof (*this); //xxx should be more accurate | |||
| } | |||
| private: | |||
| const SharedObjectPtr target, child; | |||
| const int startIndex, endIndex; | |||
| MoveChildAction (const MoveChildAction&); | |||
| MoveChildAction& operator= (const MoveChildAction&); | |||
| }; | |||
| @@ -258,11 +297,11 @@ void ValueTree::SharedObject::setProperty (const var::identifier& name, const va | |||
| if (existingValue != 0) | |||
| { | |||
| if (*existingValue != newValue) | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, false, false)); | |||
| undoManager->perform (new SetPropertyAction (this, name, newValue, false, false)); | |||
| } | |||
| else | |||
| { | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, true, false)); | |||
| undoManager->perform (new SetPropertyAction (this, name, newValue, true, false)); | |||
| } | |||
| } | |||
| } | |||
| @@ -282,7 +321,7 @@ void ValueTree::SharedObject::removeProperty (const var::identifier& name, UndoM | |||
| else | |||
| { | |||
| if (properties.contains (name)) | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, name, var::null, false, true)); | |||
| undoManager->perform (new SetPropertyAction (this, name, var::null, false, true)); | |||
| } | |||
| } | |||
| @@ -300,7 +339,7 @@ void ValueTree::SharedObject::removeAllProperties (UndoManager* const undoManage | |||
| else | |||
| { | |||
| for (int i = properties.size(); --i >= 0;) | |||
| undoManager->perform (new ValueTreeSetPropertyAction (this, properties.getName(i), var::null, false, true)); | |||
| undoManager->perform (new SetPropertyAction (this, properties.getName(i), var::null, false, true)); | |||
| } | |||
| } | |||
| @@ -337,6 +376,11 @@ bool ValueTree::SharedObject::isAChildOf (const SharedObject* const possiblePare | |||
| return false; | |||
| } | |||
| int ValueTree::SharedObject::indexOf (const ValueTree& child) const | |||
| { | |||
| return children.indexOf (child.object); | |||
| } | |||
| void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoManager* const undoManager) | |||
| { | |||
| if (child != 0 && child->parent != this) | |||
| @@ -366,7 +410,7 @@ void ValueTree::SharedObject::addChild (SharedObject* child, int index, UndoMana | |||
| if (index < 0) | |||
| index = children.size(); | |||
| undoManager->perform (new ValueTreeChildChangeAction (this, index, child)); | |||
| undoManager->perform (new AddOrRemoveChildAction (this, index, child)); | |||
| } | |||
| } | |||
| else | |||
| @@ -393,7 +437,7 @@ void ValueTree::SharedObject::removeChild (const int childIndex, UndoManager* co | |||
| } | |||
| else | |||
| { | |||
| undoManager->perform (new ValueTreeChildChangeAction (this, childIndex, 0)); | |||
| undoManager->perform (new AddOrRemoveChildAction (this, childIndex, 0)); | |||
| } | |||
| } | |||
| } | |||
| @@ -404,6 +448,28 @@ void ValueTree::SharedObject::removeAllChildren (UndoManager* const undoManager) | |||
| removeChild (children.size() - 1, undoManager); | |||
| } | |||
| void ValueTree::SharedObject::moveChild (int currentIndex, int newIndex, UndoManager* undoManager) | |||
| { | |||
| // The source index must be a valid index! | |||
| jassert (((unsigned int) currentIndex) < (unsigned int) children.size()); | |||
| if (currentIndex != newIndex | |||
| && ((unsigned int) currentIndex) < (unsigned int) children.size()) | |||
| { | |||
| if (undoManager == 0) | |||
| { | |||
| children.move (currentIndex, newIndex); | |||
| sendChildChangeMessage(); | |||
| } | |||
| else | |||
| { | |||
| if (((unsigned int) newIndex) >= (unsigned int) children.size()) | |||
| newIndex = children.size() - 1; | |||
| undoManager->perform (new MoveChildAction (this, currentIndex, newIndex)); | |||
| } | |||
| } | |||
| } | |||
| //============================================================================== | |||
| ValueTree::ValueTree() throw() | |||
| @@ -610,6 +676,11 @@ bool ValueTree::isAChildOf (const ValueTree& possibleParent) const | |||
| return object != 0 && object->isAChildOf (possibleParent.object); | |||
| } | |||
| int ValueTree::indexOf (const ValueTree& child) const | |||
| { | |||
| return object != 0 ? object->indexOf (child) : -1; | |||
| } | |||
| void ValueTree::addChild (ValueTree child, int index, UndoManager* const undoManager) | |||
| { | |||
| if (object != 0) | |||
| @@ -634,6 +705,12 @@ void ValueTree::removeAllChildren (UndoManager* const undoManager) | |||
| object->removeAllChildren (undoManager); | |||
| } | |||
| void ValueTree::moveChild (int currentIndex, int newIndex, UndoManager* undoManager) | |||
| { | |||
| if (object != 0) | |||
| object->moveChild (currentIndex, newIndex, undoManager); | |||
| } | |||
| //============================================================================== | |||
| void ValueTree::addListener (Listener* listener) | |||
| { | |||
| @@ -159,7 +159,7 @@ public: | |||
| so that this change can be undone. | |||
| @see var, getProperty, removeProperty | |||
| */ | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager); | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager* undoManager); | |||
| /** Returns true if the node contains a named property. */ | |||
| bool hasProperty (const var::identifier& name) const; | |||
| @@ -168,13 +168,13 @@ public: | |||
| If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | |||
| so that this change can be undone. | |||
| */ | |||
| void removeProperty (const var::identifier& name, UndoManager* const undoManager); | |||
| void removeProperty (const var::identifier& name, UndoManager* undoManager); | |||
| /** Removes all properties from the node. | |||
| If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | |||
| so that this change can be undone. | |||
| */ | |||
| void removeAllProperties (UndoManager* const undoManager); | |||
| void removeAllProperties (UndoManager* undoManager); | |||
| /** Returns the total number of properties that the node contains. | |||
| @see getProperty. | |||
| @@ -192,7 +192,7 @@ public: | |||
| it needs to change the value. Attaching a Value::Listener to the value object will provide | |||
| callbacks whenever the property changes. | |||
| */ | |||
| Value getPropertyAsValue (const var::identifier& name, UndoManager* const undoManager) const; | |||
| Value getPropertyAsValue (const var::identifier& name, UndoManager* undoManager) const; | |||
| //============================================================================== | |||
| /** Returns the number of child nodes belonging to this one. | |||
| @@ -233,31 +233,50 @@ public: | |||
| If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | |||
| so that this change can be undone. | |||
| */ | |||
| void addChild (ValueTree child, int index, UndoManager* const undoManager); | |||
| void addChild (ValueTree child, int index, UndoManager* undoManager); | |||
| /** Removes the specified child from this node's child-list. | |||
| If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | |||
| so that this change can be undone. | |||
| */ | |||
| void removeChild (const ValueTree& child, UndoManager* const undoManager); | |||
| void removeChild (const ValueTree& child, UndoManager* undoManager); | |||
| /** Removes a child from this node's child-list. | |||
| If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | |||
| so that this change can be undone. | |||
| */ | |||
| void removeChild (const int childIndex, UndoManager* const undoManager); | |||
| void removeChild (int childIndex, UndoManager* undoManager); | |||
| /** Removes all child-nodes from this node. | |||
| If the undoManager parameter is non-null, its UndoManager::perform() method will be used, | |||
| so that this change can be undone. | |||
| */ | |||
| void removeAllChildren (UndoManager* const undoManager); | |||
| void removeAllChildren (UndoManager* undoManager); | |||
| /** Moves one of the children to a different index. | |||
| This will move the child to a specified index, shuffling along any intervening | |||
| items as required. So for example, if you have a list of { 0, 1, 2, 3, 4, 5 }, then | |||
| calling move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. | |||
| @param currentIndex the index of the item to be moved. If this isn't a | |||
| valid index, then nothing will be done | |||
| @param newIndex the index at which you'd like this item to end up. If this | |||
| is less than zero, the value will be moved to the end | |||
| of the list | |||
| */ | |||
| void moveChild (int currentIndex, int newIndex, UndoManager* undoManager); | |||
| /** Returns true if this node is anywhere below the specified parent node. | |||
| This returns true if the node is a child-of-a-child, as well as a direct child. | |||
| */ | |||
| bool isAChildOf (const ValueTree& possibleParent) const; | |||
| /** Returns the index of a child item in this parent. | |||
| If the child isn't found, this returns -1. | |||
| */ | |||
| int indexOf (const ValueTree& child) const; | |||
| /** Returns the parent node that contains this one. | |||
| If the node has no parent, this will return an invalid node. (See isValid() to find out | |||
| whether a node is valid). | |||
| @@ -403,8 +422,12 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| friend class ValueTreeSetPropertyAction; | |||
| friend class ValueTreeChildChangeAction; | |||
| class SetPropertyAction; | |||
| friend class SetPropertyAction; | |||
| class AddOrRemoveChildAction; | |||
| friend class AddOrRemoveChildAction; | |||
| class MoveChildAction; | |||
| friend class MoveChildAction; | |||
| class JUCE_API SharedObject : public ReferenceCountedObject | |||
| { | |||
| @@ -426,16 +449,18 @@ private: | |||
| void sendParentChangeMessage(); | |||
| const var& getProperty (const var::identifier& name) const; | |||
| const var getProperty (const var::identifier& name, const var& defaultReturnValue) const; | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager); | |||
| void setProperty (const var::identifier& name, const var& newValue, UndoManager*); | |||
| bool hasProperty (const var::identifier& name) const; | |||
| void removeProperty (const var::identifier& name, UndoManager* const undoManager); | |||
| void removeAllProperties (UndoManager* const undoManager); | |||
| bool isAChildOf (const SharedObject* const possibleParent) const; | |||
| void removeProperty (const var::identifier& name, UndoManager*); | |||
| void removeAllProperties (UndoManager*); | |||
| bool isAChildOf (const SharedObject* possibleParent) const; | |||
| int indexOf (const ValueTree& child) const; | |||
| ValueTree getChildWithName (const String& type) const; | |||
| ValueTree getChildWithProperty (const var::identifier& propertyName, const var& propertyValue) const; | |||
| void addChild (SharedObject* child, int index, UndoManager* const undoManager); | |||
| void removeChild (const int childIndex, UndoManager* const undoManager); | |||
| void removeAllChildren (UndoManager* const undoManager); | |||
| void addChild (SharedObject* child, int index, UndoManager*); | |||
| void removeChild (int childIndex, UndoManager*); | |||
| void removeAllChildren (UndoManager*); | |||
| void moveChild (int currentIndex, int newIndex, UndoManager*); | |||
| XmlElement* createXml() const; | |||
| juce_UseDebuggingNewOperator | |||
| @@ -463,15 +488,14 @@ private: | |||
| }; | |||
| friend class SharedObject; | |||
| typedef ReferenceCountedObjectPtr <SharedObject> SharedObjectPtr; | |||
| ReferenceCountedObjectPtr <SharedObject> object; | |||
| SharedObjectPtr object; | |||
| ListenerList <Listener> listeners; | |||
| public: | |||
| /** @internal */ | |||
| explicit ValueTree (SharedObject* const object_); // (can be made private when VC6 support is finally dropped) | |||
| explicit ValueTree (SharedObject*); // (can be made private when VC6 support is finally dropped) | |||
| }; | |||