/* Rosegarden A sequencer and musical notation editor. This program is Copyright 2000-2008 Guillaume Laurent , Chris Cannam , Richard Bown The moral right of the authors to claim authorship of this work has been asserted. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ // Class to hold extraenous bits of configuration which // don't sit inside the Composition itself - sequencer // and other general stuff that we want to keep separate. // // #include #include #include "Instrument.h" #include "RealTime.h" #include "PropertyMap.h" #include "Exception.h" #include "XmlExportable.h" #ifndef _CONFIGURATION_H_ #define _CONFIGURATION_H_ namespace Rosegarden { class Configuration : public PropertyMap, public XmlExportable { public: class NoData : public Exception { public: NoData(std::string property, std::string file, int line) : Exception("No data found for property " + property, file, line) { } }; class BadType : public Exception { public: BadType(std::string property, std::string expected, std::string actual, std::string file, int line) : Exception("Bad type for " + property + " (expected " + expected + ", found " + actual + ")", file, line) { } }; Configuration() {;} Configuration(const Configuration &); ~Configuration(); bool has(const PropertyName &name) const; template void set(const PropertyName &name, typename PropertyDefn

::basic_type value); /** * get() with a default value */ template typename PropertyDefn

::basic_type get(const PropertyName &name, typename PropertyDefn

::basic_type defaultVal) const; /** * regular get() */ template typename PropertyDefn

::basic_type get(const PropertyName &name) const; // For exporting -- doesn't write the part of // the element in case you want to write it into another element // virtual std::string toXmlString(); /// Return all the contained property names in alphabetical order std::vector getPropertyNames(); // Assignment // Configuration& operator=(const Configuration &); private: }; namespace CompositionMetadataKeys { extern const PropertyName Composer; extern const PropertyName Arranger; extern const PropertyName Copyright; extern const PropertyName Title; extern const PropertyName Subtitle; // The following are recognized only by LilyPond output extern const PropertyName Subsubtitle; extern const PropertyName Dedication; extern const PropertyName Poet; extern const PropertyName Meter; extern const PropertyName Opus; extern const PropertyName Instrument; extern const PropertyName Piece; extern const PropertyName Tagline; std::vector getFixedKeys(); } class DocumentConfiguration : public Configuration { public: DocumentConfiguration(); DocumentConfiguration(const DocumentConfiguration &); ~DocumentConfiguration(); DocumentConfiguration& operator=(const DocumentConfiguration &); // for exporting -- doesn't write the part of // the element in case you want to write it into another element // virtual std::string toXmlString(); // Property names static const PropertyName SequencerOptions; static const PropertyName ZoomLevel; static const PropertyName TransportMode; }; template void Configuration::set(const PropertyName &name, typename PropertyDefn

::basic_type value) { iterator i = find(name); if (i != end()) { // A property with the same name has // already been set - recycle it, just change the data PropertyStoreBase *sb = i->second; (static_cast *>(sb))->setData(value); } else { PropertyStoreBase *p = new PropertyStore

(value); insert(PropertyPair(name, p)); } } template typename PropertyDefn

::basic_type Configuration::get(const PropertyName &name, typename PropertyDefn

::basic_type defaultVal) const { const_iterator i = find(name); if (i == end()) return defaultVal; PropertyStoreBase *sb = i->second; if (sb->getType() == P) { return (static_cast *>(sb))->getData(); } else { throw BadType(name.getName(), PropertyDefn

::typeName(), sb->getTypeName(), __FILE__, __LINE__); } } template typename PropertyDefn

::basic_type Configuration::get(const PropertyName &name) const { const_iterator i = find(name); if (i == end()) throw NoData(name.getName(), __FILE__, __LINE__); PropertyStoreBase *sb = i->second; if (sb->getType() == P) { return (static_cast *>(sb))->getData(); } else { throw BadType(name.getName(), PropertyDefn

::typeName(), sb->getTypeName(), __FILE__, __LINE__); } } } #endif // _AUDIODEVICE_H_