Browse Source

New class: NamedValueSet, which is a simple container for named var objects. Removed the clunky get/setComponentProperty methods and replaced them a single method Component::getProperties(), which returns a NamedValueSet for that component - if you've used component properties in your code you might need to change your syntax, but this is a cleaner solution, and using var objects for the data is more powerful than the old, string-based implementation. Also fixed a Mac image rendering bug.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
63d3d8a77e
39 changed files with 1743 additions and 1714 deletions
  1. +16
    -0
      build/macosx/Juce.xcodeproj/project.pbxproj
  2. +16
    -0
      build/win32/vc8/JUCE.vcproj
  3. +7
    -7
      extras/audio plugins/wrapper/VST/juce_VST_Wrapper.mm
  4. +2
    -2
      extras/the jucer/src/model/components/jucer_ButtonHandler.h
  5. +8
    -8
      extras/the jucer/src/model/components/jucer_ComboBoxHandler.h
  6. +18
    -18
      extras/the jucer/src/model/components/jucer_ComponentTypeHandler.cpp
  7. +8
    -8
      extras/the jucer/src/model/components/jucer_ImageButtonHandler.h
  8. +8
    -8
      extras/the jucer/src/model/components/jucer_LabelHandler.h
  9. +7
    -7
      extras/the jucer/src/model/components/jucer_TextEditorHandler.h
  10. +8
    -8
      extras/the jucer/src/model/components/jucer_ViewportHandler.h
  11. +16
    -15
      extras/the jucer/src/model/jucer_ComponentLayout.cpp
  12. +4
    -4
      extras/the jucer/src/model/jucer_PaintRoutine.cpp
  13. +259
    -316
      juce_amalgamated.cpp
  14. +714
    -690
      juce_amalgamated.h
  15. +1
    -0
      src/audio/processors/juce_AudioProcessor.h
  16. +1
    -0
      src/audio/processors/juce_AudioProcessorGraph.h
  17. +87
    -0
      src/containers/juce_DynamicObject.cpp
  18. +119
    -0
      src/containers/juce_DynamicObject.h
  19. +151
    -0
      src/containers/juce_NamedValueSet.cpp
  20. +114
    -0
      src/containers/juce_NamedValueSet.h
  21. +39
    -83
      src/containers/juce_ValueTree.cpp
  22. +6
    -13
      src/containers/juce_ValueTree.h
  23. +17
    -81
      src/containers/juce_Variant.cpp
  24. +5
    -90
      src/containers/juce_Variant.h
  25. +1
    -0
      src/core/juce_PlatformUtilities.h
  26. +7
    -7
      src/gui/components/controls/juce_TableListBox.cpp
  27. +21
    -142
      src/gui/components/juce_Component.cpp
  28. +10
    -116
      src/gui/components/juce_Component.h
  29. +14
    -10
      src/gui/components/layout/juce_MultiDocumentPanel.cpp
  30. +3
    -3
      src/gui/components/layout/juce_TabbedComponent.cpp
  31. +1
    -0
      src/gui/components/properties/juce_PropertyPanel.h
  32. +1
    -1
      src/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp
  33. +2
    -0
      src/juce_amalgamated_template.cpp
  34. +6
    -0
      src/juce_core_includes.h
  35. +1
    -1
      src/native/mac/juce_mac_CameraDevice.mm
  36. +1
    -1
      src/native/mac/juce_mac_CoreGraphicsContext.mm
  37. +1
    -1
      src/text/juce_XmlDocument.cpp
  38. +20
    -35
      src/text/juce_XmlElement.cpp
  39. +23
    -39
      src/text/juce_XmlElement.h

+ 16
- 0
build/macosx/Juce.xcodeproj/project.pbxproj View File

@@ -15,6 +15,10 @@
840F1DA610AD674F002A03A6 /* juce_CPlusPlusCodeTokeniser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84AB91F910A078190048FC39 /* juce_CPlusPlusCodeTokeniser.cpp */; };
840F1DA710AD6750002A03A6 /* juce_CPlusPlusCodeTokeniser.h in Headers */ = {isa = PBXBuildFile; fileRef = 84AB91FA10A078190048FC39 /* juce_CPlusPlusCodeTokeniser.h */; };
840F80BC092B399D005E7B4E /* juce.h in Headers */ = {isa = PBXBuildFile; fileRef = 840F80BB092B399D005E7B4E /* juce.h */; };
8414DE78111229B300DAF75A /* juce_NamedValueSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8414DE76111229B300DAF75A /* juce_NamedValueSet.cpp */; };
8414DE79111229B300DAF75A /* juce_NamedValueSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 8414DE77111229B300DAF75A /* juce_NamedValueSet.h */; };
8414DE8411122A8D00DAF75A /* juce_DynamicObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8414DE8211122A8D00DAF75A /* juce_DynamicObject.cpp */; };
8414DE8511122A8D00DAF75A /* juce_DynamicObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 8414DE8311122A8D00DAF75A /* juce_DynamicObject.h */; };
843D4A3B10D3C54500624BA6 /* juce_ValueTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 843D4A3910D3C54500624BA6 /* juce_ValueTree.cpp */; };
843D4A3C10D3C54500624BA6 /* juce_ValueTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 843D4A3A10D3C54500624BA6 /* juce_ValueTree.h */; };
844BB95B10C5578800DF5536 /* juce_TargetPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 8481730E10832513008FEC33 /* juce_TargetPlatform.h */; };
@@ -1225,6 +1229,10 @@

/* Begin PBXFileReference section */
840F80BB092B399D005E7B4E /* juce.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; lineEnding = 2; name = juce.h; path = ../../juce.h; sourceTree = SOURCE_ROOT; };
8414DE76111229B300DAF75A /* juce_NamedValueSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = juce_NamedValueSet.cpp; sourceTree = "<group>"; };
8414DE77111229B300DAF75A /* juce_NamedValueSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = juce_NamedValueSet.h; sourceTree = "<group>"; };
8414DE8211122A8D00DAF75A /* juce_DynamicObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = juce_DynamicObject.cpp; sourceTree = "<group>"; };
8414DE8311122A8D00DAF75A /* juce_DynamicObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = juce_DynamicObject.h; sourceTree = "<group>"; };
843D4A3910D3C54500624BA6 /* juce_ValueTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = juce_ValueTree.cpp; sourceTree = "<group>"; };
843D4A3A10D3C54500624BA6 /* juce_ValueTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = juce_ValueTree.h; sourceTree = "<group>"; };
8456EC6508A2A6C80087C412 /* juce_Config.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; lineEnding = 2; name = juce_Config.h; path = ../../juce_Config.h; sourceTree = SOURCE_ROOT; };
@@ -2175,11 +2183,15 @@
84F1E8D110403671006A1807 /* juce_ArrayAllocationBase.h */,
84F1E8D210403671006A1807 /* juce_BitArray.cpp */,
84F1E8D310403671006A1807 /* juce_BitArray.h */,
8414DE8211122A8D00DAF75A /* juce_DynamicObject.cpp */,
8414DE8311122A8D00DAF75A /* juce_DynamicObject.h */,
84F1E8D410403671006A1807 /* juce_ElementComparator.h */,
84F1E8D510403671006A1807 /* juce_MemoryBlock.cpp */,
84F1E8D610403671006A1807 /* juce_MemoryBlock.h */,
84F1E8D710403671006A1807 /* juce_OwnedArray.h */,
84DEDD9E10EE496500909D01 /* juce_HeapBlock.h */,
8414DE76111229B300DAF75A /* juce_NamedValueSet.cpp */,
8414DE77111229B300DAF75A /* juce_NamedValueSet.h */,
84F1E8D810403671006A1807 /* juce_PropertySet.cpp */,
84F1E8D910403671006A1807 /* juce_PropertySet.h */,
84F1E8DA10403671006A1807 /* juce_ReferenceCountedArray.h */,
@@ -3560,6 +3572,8 @@
84BA604110F2017A001D9D70 /* juce_Value.h in Headers */,
848432C310F933B800490977 /* juce_ByteOrder.h in Headers */,
84CABF6A1101292D0088D64D /* juce_TemporaryFile.h in Headers */,
8414DE79111229B300DAF75A /* juce_NamedValueSet.h in Headers */,
8414DE8511122A8D00DAF75A /* juce_DynamicObject.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4202,6 +4216,8 @@
843D4A3B10D3C54500624BA6 /* juce_ValueTree.cpp in Sources */,
84BA604010F2017A001D9D70 /* juce_Value.cpp in Sources */,
84CABF691101292D0088D64D /* juce_TemporaryFile.cpp in Sources */,
8414DE78111229B300DAF75A /* juce_NamedValueSet.cpp in Sources */,
8414DE8411122A8D00DAF75A /* juce_DynamicObject.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};


+ 16
- 0
build/win32/vc8/JUCE.vcproj View File

@@ -1081,6 +1081,14 @@
RelativePath="..\..\..\src\containers\juce_BitArray.h"
>
</File>
<File
RelativePath="..\..\..\src\containers\juce_DynamicObject.cpp"
>
</File>
<File
RelativePath="..\..\..\src\containers\juce_DynamicObject.h"
>
</File>
<File
RelativePath="..\..\..\src\containers\juce_ElementComparator.h"
>
@@ -1097,6 +1105,14 @@
RelativePath="..\..\..\src\containers\juce_MemoryBlock.h"
>
</File>
<File
RelativePath="..\..\..\src\containers\juce_NamedValueSet.cpp"
>
</File>
<File
RelativePath="..\..\..\src\containers\juce_NamedValueSet.h"
>
</File>
<File
RelativePath="..\..\..\src\containers\juce_OwnedArray.h"
>


+ 7
- 7
extras/audio plugins/wrapper/VST/juce_VST_Wrapper.mm View File

@@ -65,7 +65,7 @@ static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, v
static void updateComponentPos (Component* const comp)
{
HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int)
comp->getComponentProperty ("dummyViewRef", false, String::empty).getHexValue64();
comp->getProperties() ["dummyViewRef"].toString().getHexValue64();
HIRect r;
HIViewGetFrame (dummyView, &r);
@@ -128,12 +128,12 @@ void* attachComponentToWindowRef (Component* comp, void* windowRef)
HIRect r = { {0, 0}, {comp->getWidth(), comp->getHeight()} };
HIViewSetFrame (dummyView, &r);
HIViewAddSubview (parentView, dummyView);
comp->setComponentProperty ("dummyViewRef", String::toHexString ((pointer_sized_int) (void*) dummyView));
comp->getProperties().set ("dummyViewRef", String::toHexString ((pointer_sized_int) (void*) dummyView));
EventHandlerRef ref;
const EventTypeSpec kControlBoundsChangedEvent = { kEventClassControl, kEventControlBoundsChanged };
InstallEventHandler (GetControlEventTarget (dummyView), NewEventHandlerUPP (viewBoundsChangedEvent), 1, &kControlBoundsChangedEvent, (void*) comp, &ref);
comp->setComponentProperty ("boundsEventRef", String::toHexString ((pointer_sized_int) (void*) ref));
comp->getProperties().set ("boundsEventRef", String::toHexString ((pointer_sized_int) (void*) ref));
updateComponentPos (comp);
@@ -168,7 +168,7 @@ void* attachComponentToWindowRef (Component* comp, void* windowRef)
NewEventHandlerUPP (windowVisibilityBodge),
GetEventTypeCount (eventsToCatch), eventsToCatch,
(void*) hostWindow, &ref);
comp->setComponentProperty ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref));
comp->getProperties().set ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref));
#endif
return hostWindow;
@@ -180,17 +180,17 @@ void detachComponentFromWindowRef (Component* comp, void* nsWindow)
const ScopedAutoReleasePool pool;
EventHandlerRef ref = (EventHandlerRef) (void*) (pointer_sized_int)
comp->getComponentProperty ("boundsEventRef", false, String::empty).getHexValue64();
comp->getProperties() ["boundsEventRef"].toString().getHexValue64();
RemoveEventHandler (ref);
#if ADD_CARBON_BODGE
ref = (EventHandlerRef) (void*) (pointer_sized_int)
comp->getComponentProperty ("carbonEventRef", false, String::empty).getHexValue64();
comp->getProperties() ["carbonEventRef"].toString().getHexValue64();
RemoveEventHandler (ref);
#endif
HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int)
comp->getComponentProperty ("dummyViewRef", false, String::empty).getHexValue64();
comp->getProperties() ["dummyViewRef"].toString().getHexValue64();
if (HIViewIsValid (dummyView))
CFRelease (dummyView);


+ 2
- 2
extras/the jucer/src/model/components/jucer_ButtonHandler.h View File

@@ -169,12 +169,12 @@ public:
static bool needsButtonListener (Component* button)
{
return button->getComponentPropertyBool (T("generateListenerCallback"), false, true);
return button->getProperties().getWithDefault ("generateListenerCallback", true);
}
static void setNeedsButtonListener (Component* button, const bool shouldDoCallback)
{
button->setComponentProperty (T("generateListenerCallback"), shouldDoCallback);
button->getProperties().set ("generateListenerCallback", shouldDoCallback);
}
//==============================================================================


+ 8
- 8
extras/the jucer/src/model/components/jucer_ComboBoxHandler.h View File

@@ -53,7 +53,7 @@ public:
e->setAttribute (T("editable"), c->isTextEditable());
e->setAttribute (T("layout"), c->getJustificationType().getFlags());
e->setAttribute (T("items"), c->getComponentProperty (T("items"), false));
e->setAttribute (T("items"), c->getProperties() ["items"].toString());
e->setAttribute (T("textWhenNonSelected"), c->getTextWhenNothingSelected());
e->setAttribute (T("textWhenNoItems"), c->getTextWhenNoChoicesAvailable());
@@ -72,7 +72,7 @@ public:
c->setEditableText (xml.getBoolAttribute (T("editable"), defaultBox.isTextEditable()));
c->setJustificationType (Justification (xml.getIntAttribute (T("layout"), defaultBox.getJustificationType().getFlags())));
c->setComponentProperty (T("items"), xml.getStringAttribute (T("items"), String::empty));
c->getProperties().set ("items", xml.getStringAttribute (T("items"), String::empty));
c->setTextWhenNothingSelected (xml.getStringAttribute (T("textWhenNonSelected"), defaultBox.getTextWhenNothingSelected()));
c->setTextWhenNoChoicesAvailable (xml.getStringAttribute (T("textWhenNoItems"), defaultBox.getTextWhenNoChoicesAvailable()));
@@ -114,7 +114,7 @@ public:
<< memberVariableName << "->setTextWhenNoChoicesAvailable (" << quotedString (c->getTextWhenNoChoicesAvailable()) << ");\n";
StringArray lines;
lines.addLines (c->getComponentProperty (T("items"), false));
lines.addLines (c->getProperties() ["items"].toString());
int itemId = 1;
for (int i = 0; i < lines.size(); ++i)
@@ -160,7 +160,7 @@ public:
static void updateItems (ComboBox* c)
{
StringArray lines;
lines.addLines (c->getComponentProperty (T("items"), false));
lines.addLines (c->getProperties() ["items"].toString());
c->clear();
int itemId = 1;
@@ -306,7 +306,7 @@ private:
const String getText() const
{
return component->getComponentProperty (T("items"), false);
return component->getProperties() ["items"];
}
private:
@@ -317,13 +317,13 @@ private:
: ComponentUndoableAction <ComboBox> (comp, layout),
newState (newState_)
{
oldState = comp->getComponentProperty (T("items"), false);
oldState = comp->getProperties() ["items"];
}
bool perform()
{
showCorrectTab();
getComponent()->setComponentProperty (T("items"), newState);
getComponent()->getProperties().set ("items", newState);
ComboBoxHandler::updateItems (getComponent());
changed();
return true;
@@ -332,7 +332,7 @@ private:
bool undo()
{
showCorrectTab();
getComponent()->setComponentProperty (T("items"), oldState);
getComponent()->getProperties().set ("items", oldState);
ComboBoxHandler::updateItems (getComponent());
changed();
return true;


+ 18
- 18
extras/the jucer/src/model/components/jucer_ComponentTypeHandler.cpp View File

@@ -146,8 +146,8 @@ XmlElement* ComponentTypeHandler::createXmlFor (Component* comp, const Component
e->setAttribute (T("name"), comp->getName());
e->setAttribute (T("id"), String::toHexString (getComponentId (comp)));
e->setAttribute (T("memberName"), comp->getComponentProperty (T("memberName"), false));
e->setAttribute (T("virtualName"), comp->getComponentProperty (T("virtualName"), false));
e->setAttribute (T("memberName"), comp->getProperties() ["memberName"].toString());
e->setAttribute (T("virtualName"), comp->getProperties() ["virtualName"].toString());
e->setAttribute (T("explicitFocusOrder"), comp->getExplicitFocusOrder());
RelativePositionedRectangle pos (getComponentPosition (comp));
@@ -181,8 +181,8 @@ bool ComponentTypeHandler::restoreFromXml (const XmlElement& xml,
comp->setName (xml.getStringAttribute (T("name"), comp->getName()));
setComponentId (comp, xml.getStringAttribute (T("id")).getHexValue64());
comp->setComponentProperty (T("memberName"), xml.getStringAttribute (T("memberName")));
comp->setComponentProperty (T("virtualName"), xml.getStringAttribute (T("virtualName")));
comp->getProperties().set ("memberName", xml.getStringAttribute (T("memberName")));
comp->getProperties().set ("virtualName", xml.getStringAttribute (T("virtualName")));
comp->setExplicitFocusOrder (xml.getIntAttribute (T("explicitFocusOrder")));
RelativePositionedRectangle currentPos (getComponentPosition (comp));
@@ -218,7 +218,7 @@ int64 ComponentTypeHandler::getComponentId (Component* comp)
if (comp == 0)
return 0;
int64 compId = comp->getComponentProperty (T("jucerCompId"), false).getHexValue64();
int64 compId = comp->getProperties() ["jucerCompId"].toString().getHexValue64();
if (compId == 0)
{
@@ -233,17 +233,17 @@ void ComponentTypeHandler::setComponentId (Component* comp, const int64 newID)
{
jassert (comp != 0);
if (newID != 0)
comp->setComponentProperty (T("jucerCompId"), String::toHexString (newID));
comp->getProperties().set ("jucerCompId", String::toHexString (newID));
}
const RelativePositionedRectangle ComponentTypeHandler::getComponentPosition (Component* comp)
{
RelativePositionedRectangle rp;
rp.rect = PositionedRectangle (comp->getComponentProperty (T("pos"), false));
rp.relativeToX = comp->getComponentProperty (T("relativeToX"), false).getHexValue64();
rp.relativeToY = comp->getComponentProperty (T("relativeToY"), false).getHexValue64();
rp.relativeToW = comp->getComponentProperty (T("relativeToW"), false).getHexValue64();
rp.relativeToH = comp->getComponentProperty (T("relativeToH"), false).getHexValue64();
rp.rect = PositionedRectangle (comp->getProperties() ["pos"]);
rp.relativeToX = comp->getProperties() ["relativeToX"].toString().getHexValue64();
rp.relativeToY = comp->getProperties() ["relativeToY"].toString().getHexValue64();
rp.relativeToW = comp->getProperties() ["relativeToW"].toString().getHexValue64();
rp.relativeToH = comp->getProperties() ["relativeToH"].toString().getHexValue64();
return rp;
}
@@ -252,11 +252,11 @@ void ComponentTypeHandler::setComponentPosition (Component* comp,
const RelativePositionedRectangle& newPos,
const ComponentLayout* layout)
{
comp->setComponentProperty (T("pos"), newPos.rect.toString());
comp->setComponentProperty (T("relativeToX"), String::toHexString (newPos.relativeToX));
comp->setComponentProperty (T("relativeToY"), String::toHexString (newPos.relativeToY));
comp->setComponentProperty (T("relativeToW"), String::toHexString (newPos.relativeToW));
comp->setComponentProperty (T("relativeToH"), String::toHexString (newPos.relativeToH));
comp->getProperties().set ("pos", newPos.rect.toString());
comp->getProperties().set ("relativeToX", String::toHexString (newPos.relativeToX));
comp->getProperties().set ("relativeToY", String::toHexString (newPos.relativeToY));
comp->getProperties().set ("relativeToW", String::toHexString (newPos.relativeToW));
comp->getProperties().set ("relativeToH", String::toHexString (newPos.relativeToH));
comp->setBounds (newPos.getRectangle (Rectangle (0, 0, comp->getParentWidth(), comp->getParentHeight()),
layout));
@@ -507,7 +507,7 @@ void ComponentTypeHandler::fillInGeneratedCode (Component* component, GeneratedC
void ComponentTypeHandler::fillInMemberVariableDeclarations (GeneratedCode& code, Component* component, const String& memberVariableName)
{
const String virtualName (component->getComponentProperty (T("virtualName"), false));
const String virtualName (component->getProperties() ["virtualName"].toString());
if (virtualName.isNotEmpty())
{
@@ -550,7 +550,7 @@ const String ComponentTypeHandler::getCreationParameters (Component* component)
void ComponentTypeHandler::fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName)
{
String params (getCreationParameters (component));
const String virtualName (component->getComponentProperty (T("virtualName"), false));
const String virtualName (component->getProperties() ["virtualName"].toString());
String s;
s << "addAndMakeVisible (" << memberVariableName << " = new ";


+ 8
- 8
extras/the jucer/src/model/components/jucer_ImageButtonHandler.h View File

@@ -247,7 +247,7 @@ public:
}
else
{
button->setComponentProperty ("resource" + String ((int) role), newName);
button->getProperties().set ("resource" + String ((int) role), newName);
updateButtonImages (*layout.getDocument(), button);
layout.changed();
}
@@ -257,7 +257,7 @@ public:
static const String getImageResource (ImageButton* button, const ImageRole role)
{
jassert (role < 3);
return button->getComponentProperty ("resource" + String ((int) role), false);
return button->getProperties() ["resource" + String ((int) role)].toString();
}
//==============================================================================
@@ -295,7 +295,7 @@ public:
static bool doesImageKeepProportions (ImageButton* button)
{
return button->getComponentPropertyBool ("keepImageProp", false, true);
return button->getProperties().getWithDefault ("keepImageProp", true);
}
static void setImageKeepProportions (ComponentLayout& layout, ImageButton* button, const bool newState, const bool undoable)
@@ -306,7 +306,7 @@ public:
}
else
{
button->setComponentProperty ("keepImageProp", newState);
button->getProperties().set ("keepImageProp", newState);
updateButtonImages (*layout.getDocument(), button);
layout.changed();
}
@@ -375,7 +375,7 @@ public:
static float getImageOpacity (ImageButton* button, const ImageRole role)
{
return (float) button->getComponentPropertyDouble ("imageOpacity" + String ((int) role), false, 1.0f);
return (float) button->getProperties().getWithDefault ("imageOpacity" + String ((int) role), 1.0f);
}
static void setImageOpacity (ComponentLayout& layout, ImageButton* button, const ImageRole role, const float opacity, const bool undoable)
@@ -386,7 +386,7 @@ public:
}
else
{
button->setComponentProperty ("imageOpacity" + String ((int) role), opacity);
button->getProperties().set ("imageOpacity" + String ((int) role), opacity);
updateButtonImages (*layout.getDocument(), button);
layout.changed();
}
@@ -459,7 +459,7 @@ public:
static const Colour getImageColour (ImageButton* button, const ImageRole role)
{
return Colour::fromString (button->getComponentProperty ("imageColour" + String ((int) role), false, "0"));
return Colour::fromString (button->getProperties().getWithDefault ("imageColour" + String ((int) role), "0").toString());
}
static void setImageColour (ComponentLayout& layout, ImageButton* button, const ImageRole role, const Colour& colour, const bool undoable)
@@ -470,7 +470,7 @@ public:
}
else
{
button->setComponentProperty ("imageColour" + String ((int) role), colour.toString());
button->getProperties().set ("imageColour" + String ((int) role), colour.toString());
updateButtonImages (*layout.getDocument(), button);
layout.changed();
}


+ 8
- 8
extras/the jucer/src/model/components/jucer_LabelHandler.h View File

@@ -66,7 +66,7 @@ public:
e->setAttribute (T("editableDoubleClick"), l->isEditableOnDoubleClick());
e->setAttribute (T("focusDiscardsChanges"), l->doesLossOfFocusDiscardChanges());
e->setAttribute (T("fontname"), l->getComponentProperty (T("typefaceName"), false, FontPropertyComponent::defaultFont));
e->setAttribute (T("fontname"), l->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::defaultFont).toString());
e->setAttribute (T("fontsize"), roundToInt (l->getFont().getHeight() * 100.0) / 100.0);
e->setAttribute (T("bold"), l->getFont().isBold());
e->setAttribute (T("italic"), l->getFont().isItalic());
@@ -90,7 +90,7 @@ public:
font.setItalic (xml.getBoolAttribute (T("italic"), false));
l->setFont (font);
l->setComponentProperty (T("typefaceName"), xml.getStringAttribute (T("fontname"), FontPropertyComponent::defaultFont));
l->getProperties().set ("typefaceName", xml.getStringAttribute (T("fontname"), FontPropertyComponent::defaultFont));
updateLabelFont (l);
l->setJustificationType (Justification (xml.getIntAttribute (T("justification"), Justification::centred)));
@@ -107,7 +107,7 @@ public:
static void updateLabelFont (Label* label)
{
Font f (label->getFont());
f = FontPropertyComponent::applyNameToFont (label->getComponentProperty (T("typefaceName"), false, FontPropertyComponent::defaultFont), f);
f = FontPropertyComponent::applyNameToFont (label->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::defaultFont), f);
label->setFont (f);
}
@@ -129,7 +129,7 @@ public:
String s;
s << memberVariableName << "->setFont ("
<< FontPropertyComponent::getCompleteFontCode (l->getFont(), l->getComponentProperty (T("typefaceName"), false, FontPropertyComponent::defaultFont))
<< FontPropertyComponent::getCompleteFontCode (l->getFont(), l->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::defaultFont))
<< ");\n"
<< memberVariableName << "->setJustificationType ("
<< justificationToCode (l->getJustificationType())
@@ -463,7 +463,7 @@ private:
const String getTypefaceName() const
{
return label->getComponentProperty (T("typefaceName"), false, FontPropertyComponent::defaultFont);
return label->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::defaultFont);
}
void changeListenerCallback (void*) { refresh(); }
@@ -479,13 +479,13 @@ private:
: ComponentUndoableAction <Label> (comp, layout),
newState (newState_)
{
oldState = comp->getComponentProperty (T("typefaceName"), false, FontPropertyComponent::defaultFont);
oldState = comp->getProperties().getWithDefault ("typefaceName", FontPropertyComponent::defaultFont);
}
bool perform()
{
showCorrectTab();
getComponent()->setComponentProperty (T("typefaceName"), newState);
getComponent()->getProperties().set ("typefaceName", newState);
LabelHandler::updateLabelFont (getComponent());
changed();
return true;
@@ -494,7 +494,7 @@ private:
bool undo()
{
showCorrectTab();
getComponent()->setComponentProperty (T("typefaceName"), oldState);
getComponent()->getProperties().set ("typefaceName", oldState);
LabelHandler::updateLabelFont (getComponent());
changed();
return true;


+ 7
- 7
extras/the jucer/src/model/components/jucer_TextEditorHandler.h View File

@@ -56,7 +56,7 @@ public:
XmlElement* e = ComponentTypeHandler::createXmlFor (comp, layout);
TextEditor* te = (TextEditor*) comp;
e->setAttribute (T("initialText"), comp->getComponentProperty (T("initialText"), false));
e->setAttribute (T("initialText"), comp->getProperties() ["initialText"].toString());
e->setAttribute (T("multiline"), te->isMultiLine());
e->setAttribute (T("retKeyStartsLine"), te->getReturnKeyStartsNewLine());
@@ -85,7 +85,7 @@ public:
const String initialText (xml.getStringAttribute (T("initialText")));
te->setText (initialText, false);
te->setComponentProperty (T("initialText"), initialText);
te->getProperties().set ("initialText", initialText);
return true;
}
@@ -126,7 +126,7 @@ public:
<< memberVariableName << "->setCaretVisible (" << boolToString (te->isCaretVisible()) << ");\n"
<< memberVariableName << "->setPopupMenuEnabled (" << boolToString (te->isPopupMenuEnabled()) << ");\n"
<< getColourIntialisationCode (component, memberVariableName)
<< memberVariableName << "->setText (" << quotedString (te->getComponentProperty (T("initialText"), false)) << ");\n\n";
<< memberVariableName << "->setText (" << quotedString (te->getProperties() ["initialText"].toString()) << ");\n\n";
code.constructorCode += s;
}
@@ -405,7 +405,7 @@ private:
const String getText() const
{
return component->getComponentProperty (T("initialText"), false);
return component->getProperties() ["initialText"];
}
private:
@@ -416,14 +416,14 @@ private:
: ComponentUndoableAction <TextEditor> (comp, layout),
newState (newState_)
{
oldState = comp->getComponentProperty (T("initialText"), false);
oldState = comp->getProperties() ["initialText"];
}
bool perform()
{
showCorrectTab();
getComponent()->setText (newState, false);
getComponent()->setComponentProperty (T("initialText"), newState);
getComponent()->getProperties().set ("initialText", newState);
changed();
return true;
}
@@ -432,7 +432,7 @@ private:
{
showCorrectTab();
getComponent()->setText (oldState, false);
getComponent()->setComponentProperty (T("initialText"), oldState);
getComponent()->getProperties().set ("initialText", oldState);
changed();
return true;
}


+ 8
- 8
extras/the jucer/src/model/components/jucer_ViewportHandler.h View File

@@ -205,56 +205,56 @@ public:
static int getViewportContentType (Viewport* vp)
{
return vp->getComponentPropertyInt (T("contentType"), false, 0);
return vp->getProperties() ["contentType"];
}
static void setViewportContentType (Viewport* vp, int newValue)
{
if (newValue != getViewportContentType (vp))
{
vp->setComponentProperty (T("contentType"), newValue);
vp->getProperties().set ("contentType", newValue);
updateViewportContentComp (vp);
}
}
static const String getViewportJucerComponentFile (Viewport* vp)
{
return vp->getComponentProperty (T("jucerFile"), false);
return vp->getProperties() ["jucerFile"].toString();
}
static void setViewportJucerComponentFile (Viewport* vp, const String& file)
{
if (file != getViewportJucerComponentFile (vp))
{
vp->setComponentProperty (T("jucerFile"), file);
vp->getProperties().set ("jucerFile", file);
updateViewportContentComp (vp);
}
}
static const String getViewportGenericComponentClass (Viewport* vp)
{
return vp->getComponentProperty (T("contentClass"), false);
return vp->getProperties() ["contentClass"].toString();
}
static void setViewportGenericComponentClass (Viewport* vp, const String& className)
{
if (className != getViewportGenericComponentClass (vp))
{
vp->setComponentProperty (T("contentClass"), className);
vp->getProperties().set ("contentClass", className);
updateViewportContentComp (vp);
}
}
static const String getViewportConstructorParams (Viewport* vp)
{
return vp->getComponentProperty (T("constructorParams"), false);
return vp->getProperties() ["constructorParams"].toString();
}
static void setViewportConstructorParams (Viewport* vp, const String& newParams)
{
if (newParams != getViewportConstructorParams (vp))
{
vp->setComponentProperty (T("constructorParams"), newParams);
vp->getProperties().set ("constructorParams", newParams);
updateViewportContentComp (vp);
}
}


+ 16
- 15
extras/the jucer/src/model/jucer_ComponentLayout.cpp View File

@@ -378,7 +378,7 @@ Component* ComponentLayout::addNewComponent (ComponentTypeHandler* const type, i
c->setCentrePosition (x, y);
updateStoredComponentPosition (c, false);
c->setComponentProperty (T("id"), nextCompUID++);
c->getProperties().set ("id", nextCompUID++);
XmlElement* xml = type->createXmlFor (c, this);
delete c;
@@ -472,8 +472,9 @@ Component* ComponentLayout::getComponentRelativePosTarget (Component* comp, int
}
else
{
return findComponentWithId (comp->getComponentProperty (String (T("relativeTo"))
+ dimensionSuffixes [whichDimension], false).getHexValue64());
return findComponentWithId (comp->getProperties() [String (T("relativeTo"))
+ dimensionSuffixes [whichDimension]]
.toString().getHexValue64());
}
}
@@ -641,8 +642,8 @@ void ComponentLayout::startDragging()
for (int i = 0; i < components.size(); ++i)
{
Component* const c = components[i];
c->setComponentProperty (T("xDragStart"), c->getX());
c->setComponentProperty (T("yDragStart"), c->getY());
c->getProperties().set ("xDragStart", c->getX());
c->getProperties().set ("yDragStart", c->getY());
}
jassert (document != 0);
@@ -661,8 +662,8 @@ void ComponentLayout::dragSelectedComps (int dx, int dy, const bool allowSnap)
{
Component* const c = selected.getSelectedItem (i);
const int startX = c->getComponentPropertyInt (T("xDragStart"), false);
const int startY = c->getComponentPropertyInt (T("yDragStart"), false);
const int startX = c->getProperties() ["xDragStart"];
const int startY = c->getProperties() ["yDragStart"];
if (allowSnap && document != 0 && selected.getNumSelected() == 1)
{
@@ -692,8 +693,8 @@ void ComponentLayout::endDragging()
const int newX = c->getX();
const int newY = c->getY();
const int startX = c->getComponentPropertyInt (T("xDragStart"), false);
const int startY = c->getComponentPropertyInt (T("yDragStart"), false);
const int startX = c->getProperties() ["xDragStart"];
const int startY = c->getProperties() ["yDragStart"];
c->setTopLeftPosition (startX, startY);
updateStoredComponentPosition (c, false);
@@ -774,7 +775,7 @@ const String ComponentLayout::getComponentMemberVariableName (Component* comp) c
if (comp == 0)
return String::empty;
String name (comp->getComponentProperty (T("memberName"), false));
String name (comp->getProperties() ["memberName"].toString());
if (name.isEmpty())
name = getUnusedMemberName (makeValidCppIdentifier (comp->getName(), true, true, false), comp);
@@ -786,10 +787,10 @@ void ComponentLayout::setComponentMemberVariableName (Component* comp, const Str
{
const String oldName (getComponentMemberVariableName (comp));
comp->setComponentProperty (T("memberName"), String::empty);
comp->getProperties().set ("memberName", String::empty);
const String n (getUnusedMemberName (makeValidCppIdentifier (newName, false, true, false), comp));
comp->setComponentProperty (T("memberName"), n);
comp->getProperties().set ("memberName", n);
if (n != oldName)
changed();
@@ -811,7 +812,7 @@ const String ComponentLayout::getUnusedMemberName (String nameRoot, Component* c
for (int i = 0; i < components.size(); ++i)
{
if (components[i] != comp
&& components[i]->getComponentProperty (T("memberName"), false) == n)
&& components[i]->getProperties() ["memberName"] == n)
{
alreadyUsed = true;
break;
@@ -833,7 +834,7 @@ const String ComponentLayout::getComponentVirtualClassName (Component* comp) con
if (comp == 0)
return String::empty;
return comp->getComponentProperty (T("virtualName"), false);
return comp->getProperties() ["virtualName"];
}
void ComponentLayout::setComponentVirtualClassName (Component* comp, const String& newName)
@@ -842,7 +843,7 @@ void ComponentLayout::setComponentVirtualClassName (Component* comp, const Strin
if (name != getComponentVirtualClassName (comp))
{
comp->setComponentProperty (T("virtualName"), name);
comp->getProperties().set ("virtualName", name);
changed();
}
}


+ 4
- 4
extras/the jucer/src/model/jucer_PaintRoutine.cpp View File

@@ -460,8 +460,8 @@ void PaintRoutine::startDragging (const Rectangle& parentArea)
Rectangle r (c->getCurrentBounds (parentArea));
c->setComponentProperty (T("xDragStart"), r.getX());
c->setComponentProperty (T("yDragStart"), r.getY());
c->getProperties().set ("xDragStart", r.getX());
c->getProperties().set ("yDragStart", r.getY());
}
getDocument()->getUndoManager().beginNewTransaction();
@@ -481,8 +481,8 @@ void PaintRoutine::dragSelectedComps (int dx, int dy, const Rectangle& parentAre
{
PaintElement* const c = selectedElements.getSelectedItem (i);
const int startX = c->getComponentPropertyInt (T("xDragStart"), false);
const int startY = c->getComponentPropertyInt (T("yDragStart"), false);
const int startX = c->getProperties() ["xDragStart"];
const int startY = c->getProperties() ["yDragStart"];
Rectangle r (c->getCurrentBounds (parentArea));


+ 259
- 316
juce_amalgamated.cpp
File diff suppressed because it is too large
View File


+ 714
- 690
juce_amalgamated.h
File diff suppressed because it is too large
View File


+ 1
- 0
src/audio/processors/juce_AudioProcessor.h View File

@@ -29,6 +29,7 @@
#include "juce_AudioProcessorEditor.h"
#include "../dsp/juce_AudioSampleBuffer.h"
#include "../midi/juce_MidiBuffer.h"
#include "../../text/juce_XmlElement.h"
#include "../../containers/juce_BitArray.h"
#include "juce_AudioProcessorListener.h"
#include "juce_AudioPlayHead.h"


+ 1
- 0
src/audio/processors/juce_AudioProcessorGraph.h View File

@@ -29,6 +29,7 @@
#include "juce_AudioProcessor.h"
#include "../plugins/juce_AudioPluginFormatManager.h"
#include "../plugins/juce_KnownPluginList.h"
#include "../../containers/juce_PropertySet.h"
#include "../../containers/juce_ReferenceCountedArray.h"


+ 87
- 0
src/containers/juce_DynamicObject.cpp View File

@@ -0,0 +1,87 @@
/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#include "../core/juce_StandardHeader.h"
BEGIN_JUCE_NAMESPACE
#include "juce_DynamicObject.h"
//==============================================================================
DynamicObject::DynamicObject()
{
}
DynamicObject::~DynamicObject()
{
}
bool DynamicObject::hasProperty (const var::identifier& propertyName) const
{
var* const v = properties.getItem (propertyName);
return v != 0 && ! v->isMethod();
}
const var DynamicObject::getProperty (const var::identifier& propertyName) const
{
return properties [propertyName];
}
void DynamicObject::setProperty (const var::identifier& propertyName, const var& newValue)
{
properties.set (propertyName, newValue);
}
void DynamicObject::removeProperty (const var::identifier& propertyName)
{
properties.remove (propertyName);
}
bool DynamicObject::hasMethod (const var::identifier& methodName) const
{
return getProperty (methodName).isMethod();
}
const var DynamicObject::invokeMethod (const var::identifier& methodName,
const var* parameters,
int numParameters)
{
return properties [methodName].invoke (var (this), parameters, numParameters);
}
void DynamicObject::setMethod (const var::identifier& name,
var::MethodFunction methodFunction)
{
properties.set (name, var (methodFunction));
}
void DynamicObject::clear()
{
properties.clear();
}
END_JUCE_NAMESPACE

+ 119
- 0
src/containers/juce_DynamicObject.h View File

@@ -0,0 +1,119 @@
/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#ifndef __JUCE_DYNAMICOBJECT_JUCEHEADER__
#define __JUCE_DYNAMICOBJECT_JUCEHEADER__
#include "juce_NamedValueSet.h"
#include "juce_ReferenceCountedObject.h"
//==============================================================================
/**
Represents a dynamically implemented object.
This class is primarily intended for wrapping scripting language objects,
but could be used for other purposes.
An instance of a DynamicObject can be used to store named properties, and
by subclassing hasMethod() and invokeMethod(), you can give your object
methods.
*/
class JUCE_API DynamicObject : public ReferenceCountedObject
{
public:
//==============================================================================
DynamicObject();
/** Destructor. */
virtual ~DynamicObject();
//==============================================================================
/** Returns true if the object has a property with this name.
Note that if the property is actually a method, this will return false.
*/
virtual bool hasProperty (const var::identifier& propertyName) const;
/** Returns a named property.
This returns a void if no such property exists.
*/
virtual const var getProperty (const var::identifier& propertyName) const;
/** Sets a named property. */
virtual void setProperty (const var::identifier& propertyName, const var& newValue);
/** Removes a named property. */
virtual void removeProperty (const var::identifier& propertyName);
//==============================================================================
/** Checks whether this object has the specified method.
The default implementation of this just checks whether there's a property
with this name that's actually a method, but this can be overridden for
building objects with dynamic invocation.
*/
virtual bool hasMethod (const var::identifier& methodName) const;
/** Invokes a named method on this object.
The default implementation looks up the named property, and if it's a method
call, then it invokes it.
This method is virtual to allow more dynamic invocation to used for objects
where the methods may not already be set as properies.
*/
virtual const var invokeMethod (const var::identifier& methodName,
const var* parameters,
int numParameters);
/** Sets up a method.
This is basically the same as calling setProperty (methodName, (var::MethodFunction) myFunction), but
helps to avoid accidentally invoking the wrong type of var constructor. It also makes
the code easier to read,
The compiler will probably force you to use an explicit cast your method to a (var::MethodFunction), e.g.
@code
setMethod ("doSomething", (var::MethodFunction) &MyClass::doSomething);
@endcode
*/
void setMethod (const var::identifier& methodName,
var::MethodFunction methodFunction);
//==============================================================================
/** Removes all properties and methods from the object. */
void clear();
//==============================================================================
juce_UseDebuggingNewOperator
private:
NamedValueSet properties;
};
#endif // __JUCE_DYNAMICOBJECT_JUCEHEADER__

+ 151
- 0
src/containers/juce_NamedValueSet.cpp View File

@@ -0,0 +1,151 @@
/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#include "../core/juce_StandardHeader.h"
BEGIN_JUCE_NAMESPACE
#include "juce_NamedValueSet.h"
//==============================================================================
NamedValueSet::NamedValue::NamedValue() throw()
{
}
inline NamedValueSet::NamedValue::NamedValue (const var::identifier& name_, const var& value_)
: name (name_), value (value_)
{
}
//==============================================================================
NamedValueSet::NamedValueSet() throw()
{
}
NamedValueSet::NamedValueSet (const NamedValueSet& other)
: values (other.values)
{
}
NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other)
{
values = other.values;
return *this;
}
NamedValueSet::~NamedValueSet()
{
}
int NamedValueSet::size() const throw()
{
return values.size();
}
const var& NamedValueSet::operator[] (const var::identifier& name) const
{
for (int i = values.size(); --i >= 0;)
{
const NamedValue& v = values.getReference(i);
if (v.name == name)
return v.value;
}
return var::null;
}
const var NamedValueSet::getWithDefault (const var::identifier& name, const var& defaultReturnValue) const
{
const var* v = getItem (name);
return v != 0 ? *v : defaultReturnValue;
}
var* NamedValueSet::getItem (const var::identifier& name) const
{
for (int i = values.size(); --i >= 0;)
{
NamedValue& v = values.getReference(i);
if (v.name == name)
return &(v.value);
}
return 0;
}
bool NamedValueSet::set (const var::identifier& name, const var& newValue)
{
for (int i = values.size(); --i >= 0;)
{
NamedValue& v = values.getReference(i);
if (v.name == name)
{
if (v.value == newValue)
return false;
v.value = newValue;
return true;
}
}
values.add (NamedValue (name, newValue));
return true;
}
bool NamedValueSet::contains (const var::identifier& name) const
{
return getItem (name) != 0;
}
bool NamedValueSet::remove (const var::identifier& name)
{
for (int i = values.size(); --i >= 0;)
{
if (values.getReference(i).name == name)
{
values.remove (i);
return true;
}
}
return false;
}
const var::identifier NamedValueSet::getName (int index) const
{
jassert (((unsigned int) index) < (unsigned int) values.size());
return values [index].name;
}
void NamedValueSet::clear()
{
values.clear();
}
END_JUCE_NAMESPACE

+ 114
- 0
src/containers/juce_NamedValueSet.h View File

@@ -0,0 +1,114 @@
/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#ifndef __JUCE_NAMEDVALUESET_JUCEHEADER__
#define __JUCE_NAMEDVALUESET_JUCEHEADER__
#include "juce_Variant.h"
#include "../containers/juce_Array.h"
//==============================================================================
/** Holds a set of named var objects.
This can be used as a basic structure to hold a set of var object, which can
be retrieved by using their identifier.
*/
class JUCE_API NamedValueSet
{
public:
/** Creates an empty set. */
NamedValueSet() throw();
/** Creates a copy of another set. */
NamedValueSet (const NamedValueSet& other);
/** Replaces this set with a copy of another set. */
NamedValueSet& operator= (const NamedValueSet& other);
/** Destructor. */
~NamedValueSet();
//==============================================================================
/** Returns the total number of values that the set contains. */
int size() const throw();
/** Returns the value of a named item.
If the name isn't found, this will return a void variant.
@see getProperty
*/
const var& operator[] (const var::identifier& name) const;
/** Tries to return the named value, but if no such value is found, this will
instead return the supplied default value.
*/
const var getWithDefault (const var::identifier& name, const var& defaultReturnValue) const;
/** Returns a pointer to the object holding a named value, or
null if there is no value with this name. */
var* getItem (const var::identifier& name) const;
/** Changes or adds a named value.
@returns true if a value was changed or added; false if the
value was already set the the value passed-in.
*/
bool set (const var::identifier& name, const var& newValue);
/** Returns true if the node contains an item with the specified name. */
bool contains (const var::identifier& name) const;
/** Removes a value from the set.
@returns true if a value was removed; false if there was no value
with the name that was given.
*/
bool remove (const var::identifier& name);
/** Returns the name of the value at a given index.
The index must be between 0 and size() - 1. Out-of-range indexes will
return an empty identifier.
*/
const var::identifier getName (int index) const;
/** Removes all values. */
void clear();
//==============================================================================
juce_UseDebuggingNewOperator
private:
struct NamedValue
{
NamedValue() throw();
NamedValue (const var::identifier& name, const var& value);
var::identifier name;
var value;
};
Array <NamedValue> values;
};
#endif // __JUCE_NAMEDVALUESET_JUCEHEADER__

+ 39
- 83
src/containers/juce_ValueTree.cpp View File

@@ -142,16 +142,9 @@ ValueTree::SharedObject::SharedObject (const String& type_)
}
ValueTree::SharedObject::SharedObject (const SharedObject& other)
: type (other.type), parent (0)
: type (other.type), properties (other.properties), parent (0)
{
int i;
for (i = 0; i < other.properties.size(); ++i)
{
const Property* const p = other.properties.getUnchecked(i);
properties.add (new Property (p->name, p->value));
}
for (i = 0; i < other.children.size(); ++i)
for (int i = 0; i < other.children.size(); ++i)
children.add (new SharedObject (*other.children.getUnchecked(i)));
}
@@ -168,11 +161,6 @@ ValueTree::SharedObject::~SharedObject()
}
}
ValueTree::SharedObject::Property::Property (const var::identifier& name_, const var& value_)
: name (name_), value (value_)
{
}
//==============================================================================
void ValueTree::deliverPropertyChangeMessage (ValueTree& tree, const var::identifier& property)
{
@@ -269,83 +257,50 @@ void ValueTree::SharedObject::sendParentChangeMessage()
}
//==============================================================================
const var ValueTree::SharedObject::getProperty (const var::identifier& name) const
const var& ValueTree::SharedObject::getProperty (const var::identifier& name) const
{
for (int i = properties.size(); --i >= 0;)
{
const Property* const p = properties.getUnchecked(i);
if (p->name == name)
return p->value;
}
return var();
return properties [name];
}
void ValueTree::SharedObject::setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager)
{
for (int i = properties.size(); --i >= 0;)
{
Property* const p = properties.getUnchecked(i);
if (p->name == name)
{
if (p->value != newValue)
{
if (undoManager == 0)
{
p->value = newValue;
sendPropertyChangeMessage (name);
}
else
{
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, false, false));
}
}
return;
}
}
if (undoManager == 0)
{
properties.add (new Property (name, newValue));
sendPropertyChangeMessage (name);
if (properties.set (name, newValue))
sendPropertyChangeMessage (name);
}
else
{
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, true, false));
var* const existingValue = properties.getItem (name);
if (existingValue != 0)
{
if (*existingValue != newValue)
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, false, false));
}
else
{
undoManager->perform (new ValueTreeSetPropertyAction (this, name, newValue, true, false));
}
}
}
bool ValueTree::SharedObject::hasProperty (const var::identifier& name) const
{
for (int i = properties.size(); --i >= 0;)
if (properties.getUnchecked(i)->name == name)
return true;
return false;
return properties.contains (name);
}
void ValueTree::SharedObject::removeProperty (const var::identifier& name, UndoManager* const undoManager)
{
for (int i = properties.size(); --i >= 0;)
if (undoManager == 0)
{
Property* const p = properties.getUnchecked(i);
if (p->name == name)
{
if (undoManager == 0)
{
properties.remove (i);
sendPropertyChangeMessage (name);
}
else
{
undoManager->perform (new ValueTreeSetPropertyAction (this, name, var(), false, true));
}
break;
}
if (properties.remove (name))
sendPropertyChangeMessage (name);
}
else
{
if (properties.contains (name))
undoManager->perform (new ValueTreeSetPropertyAction (this, name, var::null, false, true));
}
}
@@ -355,15 +310,15 @@ void ValueTree::SharedObject::removeAllProperties (UndoManager* const undoManage
{
while (properties.size() > 0)
{
const var::identifier name (properties.getLast()->name);
properties.removeLast();
const var::identifier name (properties.getName (properties.size() - 1));
properties.remove (name);
sendPropertyChangeMessage (name);
}
}
else
{
for (int i = properties.size(); --i >= 0;)
undoManager->perform (new ValueTreeSetPropertyAction (this, properties.getUnchecked(i)->name, var(), false, true));
undoManager->perform (new ValueTreeSetPropertyAction (this, properties.getName(i), var::null, false, true));
}
}
@@ -534,14 +489,14 @@ ValueTree ValueTree::getParent() const
return object != 0 ? ValueTree (object->parent) : ValueTree ((SharedObject*) 0);
}
const var ValueTree::operator[] (const var::identifier& name) const
const var& ValueTree::operator[] (const var::identifier& name) const
{
return object == 0 ? var() : object->getProperty (name);
return object == 0 ? var::null : object->getProperty (name);
}
const var ValueTree::getProperty (const var::identifier& name) const
const var& ValueTree::getProperty (const var::identifier& name) const
{
return object == 0 ? var() : object->getProperty (name);
return object == 0 ? var::null : object->getProperty (name);
}
void ValueTree::setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager)
@@ -576,8 +531,8 @@ int ValueTree::getNumProperties() const
const var::identifier ValueTree::getPropertyName (int index) const
{
const SharedObject::Property* const p = (object == 0) ? 0 : object->properties [index];
return p != 0 ? p->name : var::identifier (String::empty);
return (object == 0) ? var::identifier()
: object->properties.getName (index);
}
//==============================================================================
@@ -710,11 +665,12 @@ XmlElement* ValueTree::SharedObject::createXml() const
int i;
for (i = 0; i < properties.size(); ++i)
{
const Property* const p = properties.getUnchecked(i);
var::identifier name (properties.getName(i));
const var& v = properties [name];
jassert (! p->value.isObject()); // DynamicObjects can't be stored as XML!
jassert (! v.isObject()); // DynamicObjects can't be stored as XML!
xml->setAttribute (p->name.name, p->value.toString());
xml->setAttribute (name.name, v.toString());
}
for (i = 0; i < children.size(); ++i)


+ 6
- 13
src/containers/juce_ValueTree.h View File

@@ -26,12 +26,13 @@
#ifndef __JUCE_VALUETREE_JUCEHEADER__
#define __JUCE_VALUETREE_JUCEHEADER__
#include "juce_Variant.h"
#include "juce_NamedValueSet.h"
#include "juce_Value.h"
#include "../utilities/juce_UndoManager.h"
#include "../text/juce_XmlElement.h"
#include "juce_ReferenceCountedArray.h"
//==============================================================================
/**
A powerful tree structure that can be used to hold free-form data, and which can
@@ -126,14 +127,14 @@ public:
You can also use operator[] to get a property.
@see var, setProperty, hasProperty
*/
const var getProperty (const var::identifier& name) const;
const var& getProperty (const var::identifier& name) const;
/** Returns the value of a named property.
If no such property has been set, this will return a void variant. This is the same as
calling getProperty().
@see getProperty
*/
const var operator[] (const var::identifier& name) const;
const var& operator[] (const var::identifier& name) const;
/** Changes a named property of the node.
If the undoManager parameter is non-null, its UndoManager::perform() method will be used,
@@ -354,16 +355,8 @@ private:
SharedObject (const SharedObject& other);
~SharedObject();
struct Property
{
Property (const var::identifier& name, const var& value);
var::identifier name;
var value;
};
const String type;
OwnedArray <Property> properties;
NamedValueSet properties;
ReferenceCountedArray <SharedObject> children;
SortedSet <ValueTree*> valueTreesWithListeners;
SharedObject* parent;
@@ -373,7 +366,7 @@ private:
void sendChildChangeMessage();
void sendChildChangeMessage (ValueTree& tree);
void sendParentChangeMessage();
const var getProperty (const var::identifier& name) const;
const var& getProperty (const var::identifier& name) const;
void setProperty (const var::identifier& name, const var& newValue, UndoManager* const undoManager);
bool hasProperty (const var::identifier& name) const;
void removeProperty (const var::identifier& name, UndoManager* const undoManager);


+ 17
- 81
src/containers/juce_Variant.cpp View File

@@ -28,7 +28,7 @@
BEGIN_JUCE_NAMESPACE
#include "juce_Variant.h"
#include "juce_DynamicObject.h"
//==============================================================================
var::var() throw()
@@ -37,7 +37,7 @@ var::var() throw()
value.doubleValue = 0;
}
var::~var()
var::~var() throw()
{
if (type == stringType)
delete value.stringValue;
@@ -45,6 +45,8 @@ var::~var()
value.objectValue->decReferenceCount();
}
const var var::null;
//==============================================================================
var::var (const var& valueToCopy)
: type (valueToCopy.type),
@@ -190,6 +192,7 @@ const String var::toString() const
case doubleType: return String (value.doubleValue);
case stringType: return *(value.stringValue);
case objectType: return "Object 0x" + String::toHexString ((int) (pointer_sized_int) value.objectValue);
case methodType: return "Method";
default: jassertfalse; break;
}
@@ -216,6 +219,7 @@ bool var::operator== (const var& other) const throw()
case doubleType: return value.doubleValue == (double) other;
case stringType: return (*(value.stringValue)) == other.toString();
case objectType: return value.objectValue == other.getObject();
case methodType: return value.methodValue == other.value.methodValue && other.isMethod();
default: jassertfalse; break;
}
@@ -245,7 +249,8 @@ void var::writeToStream (OutputStream& output) const
output.write (temp, len);
break;
}
case objectType: output.writeCompressedInt (0); jassertfalse; break; // Can't write an object to a stream!
case objectType:
case methodType: output.writeCompressedInt (0); jassertfalse; break; // Can't write an object to a stream!
default: jassertfalse; break; // Is this a corrupted object?
}
}
@@ -273,7 +278,7 @@ const var var::readFromStream (InputStream& input)
}
}
return var();
return var::null;
}
const var var::operator[] (const var::identifier& propertyName) const
@@ -281,7 +286,7 @@ const var var::operator[] (const var::identifier& propertyName) const
if (type == objectType && value.objectValue != 0)
return value.objectValue->getProperty (propertyName);
return var();
return var::null;
}
const var var::invoke (const var::identifier& method, const var* arguments, int numArguments) const
@@ -289,7 +294,7 @@ const var var::invoke (const var::identifier& method, const var* arguments, int
if (type == objectType && value.objectValue != 0)
return value.objectValue->invokeMethod (method, arguments, numArguments);
return var();
return var::null;
}
const var var::invoke (const var& targetObject, const var* arguments, int numArguments) const
@@ -302,7 +307,7 @@ const var var::invoke (const var& targetObject, const var* arguments, int numArg
return (target->*(value.methodValue)) (arguments, numArguments);
}
return var();
return var::null;
}
const var var::call (const var::identifier& method) const
@@ -341,6 +346,11 @@ const var var::call (const var::identifier& method, const var& arg1, const var&
//==============================================================================
var::identifier::identifier() throw()
: hashCode (0)
{
}
var::identifier::identifier (const String& name_)
: name (name_),
hashCode (name_.hashCode())
@@ -359,79 +369,5 @@ var::identifier::~identifier()
{
}
//==============================================================================
//==============================================================================
DynamicObject::DynamicObject()
{
}
DynamicObject::~DynamicObject()
{
}
bool DynamicObject::hasProperty (const var::identifier& propertyName) const
{
const int index = propertyIds.indexOf (propertyName.hashCode);
return index >= 0 && ! propertyValues.getUnchecked (index)->isMethod();
}
const var DynamicObject::getProperty (const var::identifier& propertyName) const
{
const int index = propertyIds.indexOf (propertyName.hashCode);
if (index >= 0)
return *propertyValues.getUnchecked (index);
return var();
}
void DynamicObject::setProperty (const var::identifier& propertyName, const var& newValue)
{
const int index = propertyIds.indexOf (propertyName.hashCode);
if (index >= 0)
{
propertyValues.set (index, new var (newValue));
}
else
{
propertyIds.add (propertyName.hashCode);
propertyValues.add (new var (newValue));
}
}
void DynamicObject::removeProperty (const var::identifier& propertyName)
{
const int index = propertyIds.indexOf (propertyName.hashCode);
if (index >= 0)
{
propertyIds.remove (index);
propertyValues.remove (index);
}
}
bool DynamicObject::hasMethod (const var::identifier& methodName) const
{
return getProperty (methodName).isMethod();
}
const var DynamicObject::invokeMethod (const var::identifier& methodName,
const var* parameters,
int numParameters)
{
return getProperty (methodName).invoke (var (this), parameters, numParameters);
}
void DynamicObject::setMethod (const var::identifier& name,
var::MethodFunction methodFunction)
{
setProperty (name, var (methodFunction));
}
void DynamicObject::clear()
{
propertyIds.clear();
propertyValues.clear();
}
END_JUCE_NAMESPACE

+ 5
- 90
src/containers/juce_Variant.h View File

@@ -26,10 +26,6 @@
#ifndef __JUCE_VARIANT_JUCEHEADER__
#define __JUCE_VARIANT_JUCEHEADER__
#include "juce_ReferenceCountedObject.h"
#include "juce_OwnedArray.h"
#include "../text/juce_StringArray.h"
#include "../containers/juce_Array.h"
#include "../io/streams/juce_OutputStream.h"
#include "../io/streams/juce_InputStream.h"
@@ -57,7 +53,10 @@ public:
var() throw();
/** Destructor. */
~var();
~var() throw();
/** A static var object that can be used where you need an empty variant object. */
static const var null;
var (const var& valueToCopy);
var (const int value) throw();
@@ -116,6 +115,7 @@ public:
class JUCE_API identifier
{
public:
identifier() throw();
identifier (const char* const name);
identifier (const String& name);
~identifier();
@@ -183,90 +183,5 @@ private:
ValueUnion value;
};
//==============================================================================
/**
Represents a dynamically implemented object.
An instance of this class can be used to store named properties, and
by subclassing hasMethod() and invokeMethod(), you can give your object
methods.
This is intended for use as a wrapper for scripting language objects.
*/
class JUCE_API DynamicObject : public ReferenceCountedObject
{
public:
//==============================================================================
DynamicObject();
/** Destructor. */
virtual ~DynamicObject();
//==============================================================================
/** Returns true if the object has a property with this name.
Note that if the property is actually a method, this will return false.
*/
virtual bool hasProperty (const var::identifier& propertyName) const;
/** Returns a named property.
This returns a void if no such property exists.
*/
virtual const var getProperty (const var::identifier& propertyName) const;
/** Sets a named property. */
virtual void setProperty (const var::identifier& propertyName, const var& newValue);
/** Removes a named property. */
virtual void removeProperty (const var::identifier& propertyName);
//==============================================================================
/** Checks whether this object has the specified method.
The default implementation of this just checks whether there's a property
with this name that's actually a method, but this can be overridden for
building objects with dynamic invocation.
*/
virtual bool hasMethod (const var::identifier& methodName) const;
/** Invokes a named method on this object.
The default implementation looks up the named property, and if it's a method
call, then it invokes it.
This method is virtual to allow more dynamic invocation to used for objects
where the methods may not already be set as properies.
*/
virtual const var invokeMethod (const var::identifier& methodName,
const var* parameters,
int numParameters);
/** Sets up a method.
This is basically the same as calling setProperty (methodName, (var::MethodFunction) myFunction), but
helps to avoid accidentally invoking the wrong type of var constructor. It also makes
the code easier to read,
The compiler will probably force you to use an explicit cast your method to a (var::MethodFunction), e.g.
@code
setMethod ("doSomething", (var::MethodFunction) &MyClass::doSomething);
@endcode
*/
void setMethod (const var::identifier& methodName,
var::MethodFunction methodFunction);
//==============================================================================
/** Removes all properties and methods from the object. */
void clear();
//==============================================================================
juce_UseDebuggingNewOperator
private:
Array <int> propertyIds;
OwnedArray <var> propertyValues;
};
#endif // __JUCE_VARIANT_JUCEHEADER__

+ 1
- 0
src/core/juce_PlatformUtilities.h View File

@@ -27,6 +27,7 @@
#define __JUCE_PLATFORMUTILITIES_JUCEHEADER__
#include "../text/juce_StringArray.h"
#include "../io/files/juce_File.h"
//==============================================================================


+ 7
- 7
src/gui/components/controls/juce_TableListBox.cpp View File

@@ -36,7 +36,7 @@ BEGIN_JUCE_NAMESPACE
//==============================================================================
static const tchar* const tableColumnPropertyTag = T("_tableColumnID");
static const char* const tableColumnPropertyTag = "_tableColumnID";
class TableListRowComp : public Component,
public TooltipClient
@@ -100,7 +100,7 @@ public:
{
jassert (row >= 0);
const tchar* const tagPropertyName = T("_tableLastUseNum");
const var::identifier tagPropertyName ("_tableLastUseNum");
const int newTag = Random::getSystemRandom().nextInt();
const TableHeaderComponent* const header = owner.getHeader();
@@ -122,8 +122,8 @@ public:
if (newComp != 0)
{
addAndMakeVisible (newComp);
newComp->setComponentProperty (tagPropertyName, newTag);
newComp->setComponentProperty (tableColumnPropertyTag, columnId);
newComp->getProperties().set (tagPropertyName, newTag);
newComp->getProperties().set (tableColumnPropertyTag, columnId);
const Rectangle columnRect (header->getColumnPosition (i));
newComp->setBounds (columnRect.getX(), 0, columnRect.getWidth(), getHeight());
@@ -137,7 +137,7 @@ public:
{
Component* const c = getChildComponent (i);
if (c->getComponentPropertyInt (tagPropertyName, false, 0) != newTag)
if ((int) c->getProperties() [tagPropertyName] != newTag)
delete c;
}
}
@@ -154,7 +154,7 @@ public:
{
Component* const c = getChildComponent (i);
const int columnId = c->getComponentPropertyInt (tableColumnPropertyTag, false, 0);
const int columnId = c->getProperties() [tableColumnPropertyTag];
if (columnId != 0)
{
@@ -254,7 +254,7 @@ private:
{
Component* const c = getChildComponent (i);
if (c->getComponentPropertyInt (tableColumnPropertyTag, false, 0) == columnId)
if ((int) c->getProperties() [tableColumnPropertyTag] == columnId)
return c;
}


+ 21
- 142
src/gui/components/juce_Component.cpp View File

@@ -114,7 +114,6 @@ Component::Component() throw()
mouseListeners_ (0),
keyListeners_ (0),
componentListeners_ (0),
propertySet_ (0),
componentFlags_ (0)
{
}
@@ -130,7 +129,6 @@ Component::Component (const String& name) throw()
mouseListeners_ (0),
keyListeners_ (0),
componentListeners_ (0),
propertySet_ (0),
componentFlags_ (0)
{
}
@@ -162,7 +160,6 @@ Component::~Component()
delete mouseListeners_;
delete keyListeners_;
delete componentListeners_;
delete propertySet_;
}
//==============================================================================
@@ -1904,7 +1901,7 @@ void Component::sendLookAndFeelChange()
}
}
static const String getColourPropertyName (const int colourId) throw()
static const var::identifier getColourPropertyId (const int colourId)
{
String s;
s.preallocateStorage (18);
@@ -1914,62 +1911,49 @@ static const String getColourPropertyName (const int colourId) throw()
const Colour Component::findColour (const int colourId, const bool inheritFromParent) const throw()
{
const String customColour (getComponentProperty (getColourPropertyName (colourId),
inheritFromParent,
String::empty));
var* v = properties.getItem (getColourPropertyId (colourId));
if (customColour.isNotEmpty())
return Colour (customColour.getIntValue());
if (v != 0)
return Colour ((int) *v);
if (inheritFromParent && parentComponent_ != 0)
return parentComponent_->findColour (colourId, true);
return getLookAndFeel().findColour (colourId);
}
bool Component::isColourSpecified (const int colourId) const throw()
{
return getComponentProperty (getColourPropertyName (colourId),
false,
String::empty).isNotEmpty();
return properties.contains (getColourPropertyId (colourId));
}
void Component::removeColour (const int colourId)
{
if (isColourSpecified (colourId))
{
removeComponentProperty (getColourPropertyName (colourId));
if (properties.remove (getColourPropertyId (colourId)))
colourChanged();
}
}
void Component::setColour (const int colourId, const Colour& colour)
{
const String colourName (getColourPropertyName (colourId));
const String customColour (getComponentProperty (colourName, false, String::empty));
if (customColour.isEmpty() || Colour (customColour.getIntValue()) != colour)
{
setComponentProperty (colourName, colour);
if (properties.set (getColourPropertyId (colourId), (int) colour.getARGB()))
colourChanged();
}
}
void Component::copyAllExplicitColoursTo (Component& target) const throw()
{
if (propertySet_ != 0)
bool changed = false;
for (int i = properties.size(); --i >= 0;)
{
const StringPairArray& props = propertySet_->getAllProperties();
const StringArray& keys = props.getAllKeys();
const var::identifier name (properties.getName(i));
for (int i = 0; i < keys.size(); ++i)
{
if (keys[i].startsWith (T("jcclr_")))
{
target.setComponentProperty (keys[i],
props.getAllValues() [i]);
}
}
if (name.name.startsWith (T("jcclr_")))
if (target.properties.set (name, properties [name]))
changed = true;
}
if (changed)
target.colourChanged();
}
}
void Component::colourChanged()
@@ -3242,12 +3226,12 @@ bool Component::isFocusContainer() const throw()
int Component::getExplicitFocusOrder() const throw()
{
return getComponentPropertyInt (T("_jexfo"), false, 0);
return properties ["_jexfo"];
}
void Component::setExplicitFocusOrder (const int newFocusOrderIndex) throw()
{
setComponentProperty (T("_jexfo"), newFocusOrderIndex);
properties.set ("_jexfo", newFocusOrderIndex);
}
KeyboardFocusTraverser* Component::createFocusTraverser()
@@ -3552,111 +3536,6 @@ ComponentPeer* Component::getPeer() const throw()
return 0;
}
//==============================================================================
const String Component::getComponentProperty (const String& keyName,
const bool useParentComponentIfNotFound,
const String& defaultReturnValue) const throw()
{
if (propertySet_ != 0 && ((! useParentComponentIfNotFound) || propertySet_->containsKey (keyName)))
return propertySet_->getValue (keyName, defaultReturnValue);
if (useParentComponentIfNotFound && (parentComponent_ != 0))
return parentComponent_->getComponentProperty (keyName, true, defaultReturnValue);
return defaultReturnValue;
}
int Component::getComponentPropertyInt (const String& keyName,
const bool useParentComponentIfNotFound,
const int defaultReturnValue) const throw()
{
if (propertySet_ != 0 && ((! useParentComponentIfNotFound) || propertySet_->containsKey (keyName)))
return propertySet_->getIntValue (keyName, defaultReturnValue);
if (useParentComponentIfNotFound && (parentComponent_ != 0))
return parentComponent_->getComponentPropertyInt (keyName, true, defaultReturnValue);
return defaultReturnValue;
}
double Component::getComponentPropertyDouble (const String& keyName,
const bool useParentComponentIfNotFound,
const double defaultReturnValue) const throw()
{
if (propertySet_ != 0 && ((! useParentComponentIfNotFound) || propertySet_->containsKey (keyName)))
return propertySet_->getDoubleValue (keyName, defaultReturnValue);
if (useParentComponentIfNotFound && (parentComponent_ != 0))
return parentComponent_->getComponentPropertyDouble (keyName, true, defaultReturnValue);
return defaultReturnValue;
}
bool Component::getComponentPropertyBool (const String& keyName,
const bool useParentComponentIfNotFound,
const bool defaultReturnValue) const throw()
{
if (propertySet_ != 0 && ((! useParentComponentIfNotFound) || propertySet_->containsKey (keyName)))
return propertySet_->getBoolValue (keyName, defaultReturnValue);
if (useParentComponentIfNotFound && (parentComponent_ != 0))
return parentComponent_->getComponentPropertyBool (keyName, true, defaultReturnValue);
return defaultReturnValue;
}
const Colour Component::getComponentPropertyColour (const String& keyName,
const bool useParentComponentIfNotFound,
const Colour& defaultReturnValue) const throw()
{
return Colour ((uint32) getComponentPropertyInt (keyName,
useParentComponentIfNotFound,
defaultReturnValue.getARGB()));
}
void Component::setComponentProperty (const String& keyName, const String& value) throw()
{
if (propertySet_ == 0)
propertySet_ = new PropertySet();
propertySet_->setValue (keyName, value);
}
void Component::setComponentProperty (const String& keyName, const int value) throw()
{
if (propertySet_ == 0)
propertySet_ = new PropertySet();
propertySet_->setValue (keyName, value);
}
void Component::setComponentProperty (const String& keyName, const double value) throw()
{
if (propertySet_ == 0)
propertySet_ = new PropertySet();
propertySet_->setValue (keyName, value);
}
void Component::setComponentProperty (const String& keyName, const bool value) throw()
{
if (propertySet_ == 0)
propertySet_ = new PropertySet();
propertySet_->setValue (keyName, value);
}
void Component::setComponentProperty (const String& keyName, const Colour& colour) throw()
{
setComponentProperty (keyName, (int) colour.getARGB());
}
void Component::removeComponentProperty (const String& keyName) throw()
{
if (propertySet_ != 0)
propertySet_->removeValue (keyName);
}
//==============================================================================
ComponentDeletionWatcher::ComponentDeletionWatcher (const Component* const componentToWatch_) throw()
: componentToWatch (componentToWatch_),


+ 10
- 116
src/gui/components/juce_Component.h View File

@@ -38,7 +38,7 @@
#include "../../events/juce_MessageListener.h"
#include "../../text/juce_StringArray.h"
#include "../../containers/juce_VoidArray.h"
#include "../../containers/juce_PropertySet.h"
#include "../../containers/juce_NamedValueSet.h"
class LookAndFeel;
@@ -1815,123 +1815,17 @@ public:
//==============================================================================
/** Returns one of the component's properties as a string.
@param keyName the name of the property to retrieve
@param useParentComponentIfNotFound if this is true and the key isn't present in this component's
properties, then it will check whether the parent component has
the key.
@param defaultReturnValue a value to return if the named property doesn't actually exist
*/
const String getComponentProperty (const String& keyName,
const bool useParentComponentIfNotFound,
const String& defaultReturnValue = String::empty) const throw();
/** Returns one of the properties as an integer.
@param keyName the name of the property to retrieve
@param useParentComponentIfNotFound if this is true and the key isn't present in this component's
properties, then it will check whether the parent component has
the key.
@param defaultReturnValue a value to return if the named property doesn't actually exist
*/
int getComponentPropertyInt (const String& keyName,
const bool useParentComponentIfNotFound,
const int defaultReturnValue = 0) const throw();
/** Returns one of the properties as an double.
@param keyName the name of the property to retrieve
@param useParentComponentIfNotFound if this is true and the key isn't present in this component's
properties, then it will check whether the parent component has
the key.
@param defaultReturnValue a value to return if the named property doesn't actually exist
*/
double getComponentPropertyDouble (const String& keyName,
const bool useParentComponentIfNotFound,
const double defaultReturnValue = 0.0) const throw();
/** Returns one of the properties as an boolean.
The result will be true if the string found for this key name can be parsed as a non-zero
integer.
@param keyName the name of the property to retrieve
@param useParentComponentIfNotFound if this is true and the key isn't present in this component's
properties, then it will check whether the parent component has
the key.
@param defaultReturnValue a value to return if the named property doesn't actually exist
*/
bool getComponentPropertyBool (const String& keyName,
const bool useParentComponentIfNotFound,
const bool defaultReturnValue = false) const throw();
/** Returns one of the properties as an colour.
@param keyName the name of the property to retrieve
@param useParentComponentIfNotFound if this is true and the key isn't present in this component's
properties, then it will check whether the parent component has
the key.
@param defaultReturnValue a colour to return if the named property doesn't actually exist
*/
const Colour getComponentPropertyColour (const String& keyName,
const bool useParentComponentIfNotFound,
const Colour& defaultReturnValue = Colours::black) const throw();
/** Sets a named property as a string.
@param keyName the name of the property to set. (This mustn't be an empty string)
@param value the new value to set it to
@see removeComponentProperty
/** Returns the set of properties that belong to this component.
Each component has a NamedValueSet object which you can use to attach arbitrary
items of data to it.
*/
void setComponentProperty (const String& keyName, const String& value) throw();
/** Sets a named property to an integer.
@param keyName the name of the property to set. (This mustn't be an empty string)
@param value the new value to set it to
@see removeComponentProperty
*/
void setComponentProperty (const String& keyName, const int value) throw();
/** Sets a named property to a double.
@param keyName the name of the property to set. (This mustn't be an empty string)
@param value the new value to set it to
@see removeComponentProperty
*/
void setComponentProperty (const String& keyName, const double value) throw();
/** Sets a named property to a boolean.
@param keyName the name of the property to set. (This mustn't be an empty string)
@param value the new value to set it to
@see removeComponentProperty
*/
void setComponentProperty (const String& keyName, const bool value) throw();
/** Sets a named property to a colour.
@param keyName the name of the property to set. (This mustn't be an empty string)
@param newColour the new colour to set it to
@see removeComponentProperty
*/
void setComponentProperty (const String& keyName, const Colour& newColour) throw();
/** Deletes a named component property.
@param keyName the name of the property to delete. (This mustn't be an empty string)
@see setComponentProperty, getComponentProperty
*/
void removeComponentProperty (const String& keyName) throw();
/** Returns the complete set of properties that have been set for this component.
If no properties have been set, this will return a null pointer.
NamedValueSet& getProperties() throw() { return properties; }
@see getComponentProperty, setComponentProperty
/** Returns the set of properties that belong to this component.
Each component has a NamedValueSet object which you can use to attach arbitrary
items of data to it.
*/
PropertySet* getComponentProperties() const throw() { return propertySet_; }
const NamedValueSet& getProperties() const throw() { return properties; }
//==============================================================================
/** Looks for a colour that has been registered with the given colour ID number.
@@ -2023,7 +1917,7 @@ private:
VoidArray* mouseListeners_;
VoidArray* keyListeners_;
VoidArray* componentListeners_;
PropertySet* propertySet_;
NamedValueSet properties;
struct ComponentFlags
{


+ 14
- 10
src/gui/components/layout/juce_MultiDocumentPanel.cpp View File

@@ -131,7 +131,7 @@ MultiDocumentPanel::~MultiDocumentPanel()
//==============================================================================
static bool shouldDeleteComp (Component* const c)
{
return c->getComponentPropertyBool (T("mdiDocumentDelete_"), false);
return c->getProperties() ["mdiDocumentDelete_"];
}
bool MultiDocumentPanel::closeAllDocuments (const bool checkItsOkToCloseFirst)
@@ -155,7 +155,9 @@ void MultiDocumentPanel::addWindow (Component* component)
dw->setResizable (true, false);
dw->setContentComponent (component, false, true);
dw->setName (component->getName());
dw->setBackgroundColour (component->getComponentPropertyColour (T("mdiDocumentBkg_"), false, backgroundColour));
const var bkg (component->getProperties() ["mdiDocumentBkg_"]);
dw->setBackgroundColour (bkg.isVoid() ? backgroundColour : Colour ((int) bkg));
int x = 4;
Component* const topComp = getChildComponent (getNumChildComponents() - 1);
@@ -165,8 +167,9 @@ void MultiDocumentPanel::addWindow (Component* component)
dw->setTopLeftPosition (x, x);
if (component->getComponentProperty (T("mdiDocumentPos_"), false, String::empty).isNotEmpty())
dw->restoreWindowStateFromString (component->getComponentProperty (T("mdiDocumentPos_"), false, String::empty));
const var pos (component->getProperties() ["mdiDocumentPos_"]);
if (pos.toString().isNotEmpty())
dw->restoreWindowStateFromString (pos.toString());
addAndMakeVisible (dw);
dw->toFront (true);
@@ -184,8 +187,8 @@ bool MultiDocumentPanel::addDocument (Component* const component,
return false;
components.add (component);
component->setComponentProperty (T("mdiDocumentDelete_"), deleteWhenRemoved);
component->setComponentProperty (T("mdiDocumentBkg_"), docColour);
component->getProperties().set ("mdiDocumentDelete_", deleteWhenRemoved);
component->getProperties().set ("mdiDocumentBkg_", (int) docColour.getARGB());
component->addComponentListener (this);
if (mode == FloatingWindows)
@@ -249,8 +252,8 @@ bool MultiDocumentPanel::closeDocument (Component* component,
component->removeComponentListener (this);
const bool shouldDelete = shouldDeleteComp (component);
component->removeComponentProperty (T("mdiDocumentDelete_"));
component->removeComponentProperty (T("mdiDocumentBkg_"));
component->getProperties().remove ("mdiDocumentDelete_");
component->getProperties().remove ("mdiDocumentBkg_");
if (mode == FloatingWindows)
{
@@ -417,7 +420,7 @@ void MultiDocumentPanel::setLayoutMode (const LayoutMode newLayoutMode)
if (dw != 0)
{
dw->getContentComponent()->setComponentProperty (T("mdiDocumentPos_"), dw->getWindowStateAsString());
dw->getContentComponent()->getProperties().set ("mdiDocumentPos_", dw->getWindowStateAsString());
dw->setContentComponent (0, false);
delete dw;
}
@@ -432,8 +435,9 @@ void MultiDocumentPanel::setLayoutMode (const LayoutMode newLayoutMode)
for (int i = 0; i < tempComps.size(); ++i)
{
Component* const c = tempComps.getUnchecked(i);
addDocument (c,
c->getComponentPropertyColour (T("mdiDocumentBkg_"), false, Colours::white),
Colour ((int) c->getProperties().getWithDefault ("mdiDocumentBkg_", (int) Colours::white.getARGB())),
shouldDeleteComp (c));
}
}


+ 3
- 3
src/gui/components/layout/juce_TabbedComponent.cpp View File

@@ -138,7 +138,7 @@ void TabbedComponent::clearTabs()
// be careful not to delete these components until they've been removed from the tab component
jassert (c == 0 || c->isValidComponent());
if (c != 0 && c->getComponentPropertyBool (T("deleteByTabComp_"), false, false))
if (c != 0 && c->getProperties() ["deleteByTabComp_"])
delete c;
}
@@ -154,7 +154,7 @@ void TabbedComponent::addTab (const String& tabName,
contentComponents.insert (insertIndex, contentComponent);
if (contentComponent != 0)
contentComponent->setComponentProperty (T("deleteByTabComp_"), deleteComponentWhenNotNeeded);
contentComponent->getProperties().set ("deleteByTabComp_", deleteComponentWhenNotNeeded);
tabs->addTab (tabName, tabBackgroundColour, insertIndex);
}
@@ -169,7 +169,7 @@ void TabbedComponent::removeTab (const int tabIndex)
{
Component* const c = contentComponents [tabIndex];
if (c != 0 && c->getComponentPropertyBool (T("deleteByTabComp_"), false, false))
if (c != 0 && c->getProperties() ["deleteByTabComp_"])
{
if (c == panelComponent)
panelComponent = 0;


+ 1
- 0
src/gui/components/properties/juce_PropertyPanel.h View File

@@ -28,6 +28,7 @@
#include "juce_PropertyComponent.h"
#include "../layout/juce_Viewport.h"
#include "../../../text/juce_XmlElement.h"
//==============================================================================


+ 1
- 1
src/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp View File

@@ -103,7 +103,7 @@ private:
PixelRGB filler [4];
bool areRGBComponentsEqual;
forcedinline void blendLine (PixelType* dest, const PixelARGB& colour, int width) const
inline void blendLine (PixelType* dest, const PixelARGB& colour, int width) const
{
do
{


+ 2
- 0
src/juce_amalgamated_template.cpp View File

@@ -82,6 +82,8 @@
#include "containers/juce_MemoryBlock.cpp"
#include "containers/juce_PropertySet.cpp"
#include "containers/juce_Variant.cpp"
#include "containers/juce_NamedValueSet.cpp"
#include "containers/juce_DynamicObject.cpp"
#include "cryptography/juce_BlowFish.cpp"
#include "cryptography/juce_MD5.cpp"
#include "cryptography/juce_Primes.cpp"


+ 6
- 0
src/juce_core_includes.h View File

@@ -35,6 +35,9 @@
#ifndef __JUCE_BITARRAY_JUCEHEADER__
#include "containers/juce_BitArray.h"
#endif
#ifndef __JUCE_DYNAMICOBJECT_JUCEHEADER__
#include "containers/juce_DynamicObject.h"
#endif
#ifndef __JUCE_ELEMENTCOMPARATOR_JUCEHEADER__
#include "containers/juce_ElementComparator.h"
#endif
@@ -44,6 +47,9 @@
#ifndef __JUCE_MEMORYBLOCK_JUCEHEADER__
#include "containers/juce_MemoryBlock.h"
#endif
#ifndef __JUCE_NAMEDVALUESET_JUCEHEADER__
#include "containers/juce_NamedValueSet.h"
#endif
#ifndef __JUCE_OWNEDARRAY_JUCEHEADER__
#include "containers/juce_OwnedArray.h"
#endif


+ 1
- 1
src/native/mac/juce_mac_CameraDevice.mm View File

@@ -384,7 +384,7 @@ const StringArray CameraDevice::getAvailableDevices()
StringArray results;
NSArray* devs = [QTCaptureDevice inputDevicesWithMediaType: QTMediaTypeVideo];
for (int i = 0; i < [devs count]; ++i)
for (int i = 0; i < (int) [devs count]; ++i)
{
QTCaptureDevice* dev = (QTCaptureDevice*) [devs objectAtIndex: i];
results.add (nsStringToJuce ([dev localizedDisplayName]));


+ 1
- 1
src/native/mac/juce_mac_CoreGraphicsContext.mm View File

@@ -67,7 +67,7 @@ public:
{
const Image::BitmapData srcData (juceImage, 0, 0, juceImage.getWidth(), juceImage.getHeight());
CGDataProviderRef provider = CGDataProviderCreateWithData (0, srcData.data, srcData.lineStride * srcData.pixelStride, 0);
CGDataProviderRef provider = CGDataProviderCreateWithData (0, srcData.data, srcData.lineStride * srcData.height, 0);
CGImageRef imageRef = CGImageCreate (srcData.width, srcData.height,
8, srcData.pixelStride * 8, srcData.lineStride,


+ 1
- 1
src/text/juce_XmlDocument.cpp View File

@@ -353,7 +353,7 @@ XmlElement* XmlDocument::readNextElement (const bool alsoParseSubElements) throw
}
}
node = new XmlElement (input, tagLen);
node = new XmlElement (String (input, tagLen));
input += tagLen;
XmlElement::XmlAttributeNode* lastAttribute = 0;


+ 20
- 35
src/text/juce_XmlElement.cpp View File

@@ -69,15 +69,6 @@ XmlElement::XmlElement (int /*dummy*/) throw()
{
}
XmlElement::XmlElement (const tchar* const tagName_,
const int nameLen) throw()
: tagName (tagName_, nameLen),
firstChildElement (0),
nextElement (0),
attributes (0)
{
}
XmlElement::XmlElement (const XmlElement& other) throw()
: tagName (other.tagName),
firstChildElement (0),
@@ -383,7 +374,7 @@ void XmlElement::writeElementAsText (OutputStream& outputStream,
const String XmlElement::createDocument (const String& dtdToUse,
const bool allOnOneLine,
const bool includeXmlHeader,
const tchar* const encodingType,
const String& encodingType,
const int lineWrapLength) const throw()
{
MemoryOutputStream mem (2048, 4096);
@@ -396,7 +387,7 @@ void XmlElement::writeToStream (OutputStream& output,
const String& dtdToUse,
const bool allOnOneLine,
const bool includeXmlHeader,
const tchar* const encodingType,
const String& encodingType,
const int lineWrapLength) const throw()
{
if (includeXmlHeader)
@@ -424,7 +415,7 @@ void XmlElement::writeToStream (OutputStream& output,
bool XmlElement::writeToFile (const File& file,
const String& dtdToUse,
const tchar* const encodingType,
const String& encodingType,
const int lineWrapLength) const throw()
{
if (file.hasWriteAccess())
@@ -445,7 +436,7 @@ bool XmlElement::writeToFile (const File& file,
}
//==============================================================================
bool XmlElement::hasTagName (const tchar* const tagNameWanted) const throw()
bool XmlElement::hasTagName (const String& tagNameWanted) const throw()
{
#ifdef JUCE_DEBUG
// if debugging, check that the case is actually the same, because
@@ -465,7 +456,7 @@ bool XmlElement::hasTagName (const tchar* const tagNameWanted) const throw()
#endif
}
XmlElement* XmlElement::getNextElementWithTagName (const tchar* const requiredTagName) const
XmlElement* XmlElement::getNextElementWithTagName (const String& requiredTagName) const
{
XmlElement* e = nextElement;
@@ -525,7 +516,7 @@ const String& XmlElement::getAttributeValue (const int index) const throw()
return String::empty;
}
bool XmlElement::hasAttribute (const tchar* const attributeName) const throw()
bool XmlElement::hasAttribute (const String& attributeName) const throw()
{
const XmlAttributeNode* att = attributes;
@@ -541,8 +532,8 @@ bool XmlElement::hasAttribute (const tchar* const attributeName) const throw()
}
//==============================================================================
const String XmlElement::getStringAttribute (const tchar* const attributeName,
const tchar* const defaultReturnValue) const throw()
const String XmlElement::getStringAttribute (const String& attributeName,
const String& defaultReturnValue) const throw()
{
const XmlAttributeNode* att = attributes;
@@ -557,7 +548,7 @@ const String XmlElement::getStringAttribute (const tchar* const attributeName,
return defaultReturnValue;
}
int XmlElement::getIntAttribute (const tchar* const attributeName,
int XmlElement::getIntAttribute (const String& attributeName,
const int defaultReturnValue) const throw()
{
const XmlAttributeNode* att = attributes;
@@ -573,7 +564,7 @@ int XmlElement::getIntAttribute (const tchar* const attributeName,
return defaultReturnValue;
}
double XmlElement::getDoubleAttribute (const tchar* const attributeName,
double XmlElement::getDoubleAttribute (const String& attributeName,
const double defaultReturnValue) const throw()
{
const XmlAttributeNode* att = attributes;
@@ -589,7 +580,7 @@ double XmlElement::getDoubleAttribute (const tchar* const attributeName,
return defaultReturnValue;
}
bool XmlElement::getBoolAttribute (const tchar* const attributeName,
bool XmlElement::getBoolAttribute (const String& attributeName,
const bool defaultReturnValue) const throw()
{
const XmlAttributeNode* att = attributes;
@@ -616,8 +607,8 @@ bool XmlElement::getBoolAttribute (const tchar* const attributeName,
return defaultReturnValue;
}
bool XmlElement::compareAttribute (const tchar* const attributeName,
const tchar* const stringToCompareAgainst,
bool XmlElement::compareAttribute (const String& attributeName,
const String& stringToCompareAgainst,
const bool ignoreCase) const throw()
{
const XmlAttributeNode* att = attributes;
@@ -639,7 +630,7 @@ bool XmlElement::compareAttribute (const tchar* const attributeName,
}
//==============================================================================
void XmlElement::setAttribute (const tchar* const attributeName,
void XmlElement::setAttribute (const String& attributeName,
const String& value) throw()
{
#ifdef JUCE_DEBUG
@@ -681,25 +672,19 @@ void XmlElement::setAttribute (const tchar* const attributeName,
}
}
void XmlElement::setAttribute (const tchar* const attributeName,
const tchar* const text) throw()
{
setAttribute (attributeName, String (text));
}
void XmlElement::setAttribute (const tchar* const attributeName,
void XmlElement::setAttribute (const String& attributeName,
const int number) throw()
{
setAttribute (attributeName, String (number));
}
void XmlElement::setAttribute (const tchar* const attributeName,
void XmlElement::setAttribute (const String& attributeName,
const double number) throw()
{
setAttribute (attributeName, String (number));
}
void XmlElement::removeAttribute (const tchar* const attributeName) throw()
void XmlElement::removeAttribute (const String& attributeName) throw()
{
XmlAttributeNode* att = attributes;
XmlAttributeNode* lastAtt = 0;
@@ -761,7 +746,7 @@ XmlElement* XmlElement::getChildElement (const int index) const throw()
return child;
}
XmlElement* XmlElement::getChildByName (const tchar* const childName) const throw()
XmlElement* XmlElement::getChildByName (const String& childName) const throw()
{
XmlElement* child = firstChildElement;
@@ -995,7 +980,7 @@ void XmlElement::deleteAllChildElements() throw()
}
}
void XmlElement::deleteAllChildElementsWithTagName (const tchar* const name) throw()
void XmlElement::deleteAllChildElementsWithTagName (const String& name) throw()
{
XmlElement* child = firstChildElement;
@@ -1122,7 +1107,7 @@ const String XmlElement::getAllSubText() const throw()
return result;
}
const String XmlElement::getChildElementAllSubText (const tchar* const childTagName,
const String XmlElement::getChildElementAllSubText (const String& childTagName,
const String& defaultReturnValue) const throw()
{
const XmlElement* const child = getChildByName (childTagName);


+ 23
- 39
src/text/juce_XmlElement.h View File

@@ -192,7 +192,7 @@ public:
const String createDocument (const String& dtdToUse,
const bool allOnOneLine = false,
const bool includeXmlHeader = true,
const tchar* const encodingType = JUCE_T("UTF-8"),
const String& encodingType = JUCE_T("UTF-8"),
const int lineWrapLength = 60) const throw();
/** Writes the document to a stream as UTF-8.
@@ -214,7 +214,7 @@ public:
const String& dtdToUse,
const bool allOnOneLine = false,
const bool includeXmlHeader = true,
const tchar* const encodingType = JUCE_T("UTF-8"),
const String& encodingType = JUCE_T("UTF-8"),
const int lineWrapLength = 60) const throw();
/** Writes the element to a file as an XML document.
@@ -238,7 +238,7 @@ public:
*/
bool writeToFile (const File& destinationFile,
const String& dtdToUse,
const tchar* const encodingType = JUCE_T("UTF-8"),
const String& encodingType = JUCE_T("UTF-8"),
const int lineWrapLength = 60) const throw();
//==============================================================================
@@ -257,7 +257,7 @@ public:
@see getTagName
*/
bool hasTagName (const tchar* const possibleTagName) const throw();
bool hasTagName (const String& possibleTagName) const throw();
//==============================================================================
/** Returns the number of XML attributes this element contains.
@@ -289,7 +289,7 @@ public:
// Attribute-handling methods..
/** Checks whether the element contains an attribute with a certain name. */
bool hasAttribute (const tchar* const attributeName) const throw();
bool hasAttribute (const String& attributeName) const throw();
/** Returns the value of a named attribute.
@@ -297,8 +297,8 @@ public:
@param defaultReturnValue a value to return if the element doesn't have an attribute
with this name
*/
const String getStringAttribute (const tchar* const attributeName,
const tchar* const defaultReturnValue = 0) const throw();
const String getStringAttribute (const String& attributeName,
const String& defaultReturnValue = String::empty) const throw();
/** Compares the value of a named attribute with a value passed-in.
@@ -308,8 +308,8 @@ public:
@returns true if the value of the attribute is the same as the string passed-in;
false if it's different (or if no such attribute exists)
*/
bool compareAttribute (const tchar* const attributeName,
const tchar* const stringToCompareAgainst,
bool compareAttribute (const String& attributeName,
const String& stringToCompareAgainst,
const bool ignoreCase = false) const throw();
/** Returns the value of a named attribute as an integer.
@@ -320,9 +320,9 @@ public:
@param attributeName the name of the attribute to look up
@param defaultReturnValue a value to return if the element doesn't have an attribute
with this name
@see setAttribute (const tchar* const, int)
@see setAttribute
*/
int getIntAttribute (const tchar* const attributeName,
int getIntAttribute (const String& attributeName,
const int defaultReturnValue = 0) const throw();
/** Returns the value of a named attribute as floating-point.
@@ -333,9 +333,9 @@ public:
@param attributeName the name of the attribute to look up
@param defaultReturnValue a value to return if the element doesn't have an attribute
with this name
@see setAttribute (const tchar* const, double)
@see setAttribute
*/
double getDoubleAttribute (const tchar* const attributeName,
double getDoubleAttribute (const String& attributeName,
const double defaultReturnValue = 0.0) const throw();
/** Returns the value of a named attribute as a boolean.
@@ -348,7 +348,7 @@ public:
@param defaultReturnValue a value to return if the element doesn't have an attribute
with this name
*/
bool getBoolAttribute (const tchar* const attributeName,
bool getBoolAttribute (const String& attributeName,
const bool defaultReturnValue = false) const throw();
/** Adds a named attribute to the element.
@@ -364,24 +364,9 @@ public:
@param newValue the value to set it to
@see removeAttribute
*/
void setAttribute (const tchar* const attributeName,
void setAttribute (const String& attributeName,
const String& newValue) throw();
/** Adds a named attribute to the element.
If the element already contains an attribute with this name, it's value will
be updated to the new value. If there's no such attribute yet, a new one will
be added.
Note that there are other setAttribute() methods that take integers,
doubles, etc. to make it easy to store numbers.
@param attributeName the name of the attribute to set
@param newValue the value to set it to
*/
void setAttribute (const tchar* const attributeName,
const tchar* const newValue) throw();
/** Adds a named attribute to the element, setting it to an integer value.
If the element already contains an attribute with this name, it's value will
@@ -394,7 +379,7 @@ public:
@param attributeName the name of the attribute to set
@param newValue the value to set it to
*/
void setAttribute (const tchar* const attributeName,
void setAttribute (const String& attributeName,
const int newValue) throw();
/** Adds a named attribute to the element, setting it to a floating-point value.
@@ -409,7 +394,7 @@ public:
@param attributeName the name of the attribute to set
@param newValue the value to set it to
*/
void setAttribute (const tchar* const attributeName,
void setAttribute (const String& attributeName,
const double newValue) throw();
/** Removes a named attribute from the element.
@@ -417,7 +402,7 @@ public:
@param attributeName the name of the attribute to remove
@see removeAllAttributes
*/
void removeAttribute (const tchar* const attributeName) throw();
void removeAttribute (const String& attributeName) throw();
/** Removes all attributes from this element.
*/
@@ -460,7 +445,7 @@ public:
@see getNextElement, isTextElement, forEachXmlChildElement
*/
inline XmlElement* getNextElement() const throw() { return nextElement; }
inline XmlElement* getNextElement() const throw() { return nextElement; }
/** Returns the next of this element's siblings which has the specified tag
name.
@@ -470,7 +455,7 @@ public:
@see getNextElement, forEachXmlChildElementWithTagName
*/
XmlElement* getNextElementWithTagName (const tchar* const requiredTagName) const;
XmlElement* getNextElementWithTagName (const String& requiredTagName) const;
/** Returns the number of sub-elements in this element.
@@ -494,7 +479,7 @@ public:
@returns the first element with this tag name, or 0 if none is found
@see getNextElement, isTextElement, getChildElement
*/
XmlElement* getChildByName (const tchar* const tagNameToLookFor) const throw();
XmlElement* getChildByName (const String& tagNameToLookFor) const throw();
//==============================================================================
/** Appends an element to this element's list of children.
@@ -551,7 +536,7 @@ public:
@see removeChildElement
*/
void deleteAllChildElementsWithTagName (const tchar* const tagName) throw();
void deleteAllChildElementsWithTagName (const String& tagName) throw();
/** Returns true if the given element is a child of this one. */
bool containsChildElement (const XmlElement* const possibleChild) const throw();
@@ -653,7 +638,7 @@ public:
@see getAllSubText
*/
const String getChildElementAllSubText (const tchar* const childTagName,
const String getChildElementAllSubText (const String& childTagName,
const String& defaultReturnValue) const throw();
/** Appends a section of text to this element.
@@ -698,7 +683,6 @@ private:
XmlAttributeNode* attributes;
XmlElement (int) throw(); // for internal use
XmlElement (const tchar* const tagNameText, const int nameLen) throw();
void copyChildrenAndAttributesFrom (const XmlElement& other) throw();


Loading…
Cancel
Save