123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- /*
- ==============================================================================
- This file is part of the juce_core module of the JUCE library.
- Copyright (c) 2013 - Raw Material Software Ltd.
- Permission to use, copy, modify, and/or distribute this software for any purpose with
- or without fee is hereby granted, provided that the above copyright notice and this
- permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
- NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- ------------------------------------------------------------------------------
- NOTE! This permissive ISC license applies ONLY to files within the juce_core module!
- All other JUCE modules are covered by a dual GPL/commercial license, so if you are
- using any other modules, be sure to check that you also comply with their license.
- For more details, visit www.juce.com
- ==============================================================================
- */
- #ifndef JUCE_PROPERTYSET_H_INCLUDED
- #define JUCE_PROPERTYSET_H_INCLUDED
- //==============================================================================
- /**
- A set of named property values, which can be strings, integers, floating point, etc.
- Effectively, this just wraps a StringPairArray in an interface that makes it easier
- to load and save types other than strings.
- See the PropertiesFile class for a subclass of this, which automatically broadcasts change
- messages and saves/loads the list from a file.
- */
- class JUCE_API PropertySet
- {
- public:
- //==============================================================================
- /** Creates an empty PropertySet.
- @param ignoreCaseOfKeyNames if true, the names of properties are compared in a
- case-insensitive way
- */
- PropertySet (bool ignoreCaseOfKeyNames = false);
- /** Creates a copy of another PropertySet. */
- PropertySet (const PropertySet& other);
- /** Copies another PropertySet over this one. */
- PropertySet& operator= (const PropertySet& other);
- /** Destructor. */
- virtual ~PropertySet();
- //==============================================================================
- /** Returns one of the properties as a string.
- If the value isn't found in this set, then this will look for it in a fallback
- property set (if you've specified one with the setFallbackPropertySet() method),
- and if it can't find one there, it'll return the default value passed-in.
- @param keyName the name of the property to retrieve
- @param defaultReturnValue a value to return if the named property doesn't actually exist
- */
- String getValue (StringRef keyName, const String& defaultReturnValue = String()) const noexcept;
- /** Returns one of the properties as an integer.
- If the value isn't found in this set, then this will look for it in a fallback
- property set (if you've specified one with the setFallbackPropertySet() method),
- and if it can't find one there, it'll return the default value passed-in.
- @param keyName the name of the property to retrieve
- @param defaultReturnValue a value to return if the named property doesn't actually exist
- */
- int getIntValue (StringRef keyName, int defaultReturnValue = 0) const noexcept;
- /** Returns one of the properties as an double.
- If the value isn't found in this set, then this will look for it in a fallback
- property set (if you've specified one with the setFallbackPropertySet() method),
- and if it can't find one there, it'll return the default value passed-in.
- @param keyName the name of the property to retrieve
- @param defaultReturnValue a value to return if the named property doesn't actually exist
- */
- double getDoubleValue (StringRef keyName, double defaultReturnValue = 0.0) const noexcept;
- /** 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.
- If the value isn't found in this set, then this will look for it in a fallback
- property set (if you've specified one with the setFallbackPropertySet() method),
- and if it can't find one there, it'll return the default value passed-in.
- @param keyName the name of the property to retrieve
- @param defaultReturnValue a value to return if the named property doesn't actually exist
- */
- bool getBoolValue (StringRef keyName, bool defaultReturnValue = false) const noexcept;
- /** Returns one of the properties as an XML element.
- The result will a new XMLElement object that the caller must delete. If may return nullptr
- if the key isn't found, or if the entry contains an string that isn't valid XML.
- If the value isn't found in this set, then this will look for it in a fallback
- property set (if you've specified one with the setFallbackPropertySet() method),
- and if it can't find one there, it'll return the default value passed-in.
- @param keyName the name of the property to retrieve
- */
- XmlElement* getXmlValue (StringRef keyName) const;
- //==============================================================================
- /** Sets a named property.
- @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
- */
- void setValue (const String& keyName, const var& value);
- /** Sets a named property to an XML element.
- @param keyName the name of the property to set. (This mustn't be an empty string)
- @param xml the new element to set it to. If this is zero, the value will be set to
- an empty string
- @see getXmlValue
- */
- void setValue (const String& keyName, const XmlElement* xml);
- /** This copies all the values from a source PropertySet to this one.
- This won't remove any existing settings, it just adds any that it finds in the source set.
- */
- void addAllPropertiesFrom (const PropertySet& source);
- //==============================================================================
- /** Deletes a property.
- @param keyName the name of the property to delete. (This mustn't be an empty string)
- */
- void removeValue (StringRef keyName);
- /** Returns true if the properies include the given key. */
- bool containsKey (StringRef keyName) const noexcept;
- /** Removes all values. */
- void clear();
- //==============================================================================
- /** Returns the keys/value pair array containing all the properties. */
- StringPairArray& getAllProperties() noexcept { return properties; }
- /** Returns the lock used when reading or writing to this set */
- const CriticalSection& getLock() const noexcept { return lock; }
- //==============================================================================
- /** Returns an XML element which encapsulates all the items in this property set.
- The string parameter is the tag name that should be used for the node.
- @see restoreFromXml
- */
- XmlElement* createXml (const String& nodeName) const;
- /** Reloads a set of properties that were previously stored as XML.
- The node passed in must have been created by the createXml() method.
- @see createXml
- */
- void restoreFromXml (const XmlElement& xml);
- //==============================================================================
- /** Sets up a second PopertySet that will be used to look up any values that aren't
- set in this one.
- If you set this up to be a pointer to a second property set, then whenever one
- of the getValue() methods fails to find an entry in this set, it will look up that
- value in the fallback set, and if it finds it, it will return that.
- Make sure that you don't delete the fallback set while it's still being used by
- another set! To remove the fallback set, just call this method with a null pointer.
- @see getFallbackPropertySet
- */
- void setFallbackPropertySet (PropertySet* fallbackProperties) noexcept;
- /** Returns the fallback property set.
- @see setFallbackPropertySet
- */
- PropertySet* getFallbackPropertySet() const noexcept { return fallbackProperties; }
- protected:
- /** Subclasses can override this to be told when one of the properies has been changed. */
- virtual void propertyChanged();
- private:
- StringPairArray properties;
- PropertySet* fallbackProperties;
- CriticalSection lock;
- bool ignoreCaseOfKeys;
- JUCE_LEAK_DETECTOR (PropertySet)
- };
- #endif // JUCE_PROPERTYSET_H_INCLUDED
|