summaryrefslogtreecommitdiffstats
path: root/src/base/Configuration.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/Configuration.h')
-rw-r--r--src/base/Configuration.h211
1 files changed, 211 insertions, 0 deletions
diff --git a/src/base/Configuration.h b/src/base/Configuration.h
new file mode 100644
index 0000000..23b3776
--- /dev/null
+++ b/src/base/Configuration.h
@@ -0,0 +1,211 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ 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 <string>
+#include <vector>
+
+#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 <PropertyType P>
+ void
+ set(const PropertyName &name,
+ typename PropertyDefn<P>::basic_type value);
+
+ /**
+ * get() with a default value
+ */
+ template <PropertyType P>
+ typename PropertyDefn<P>::basic_type
+ get(const PropertyName &name,
+ typename PropertyDefn<P>::basic_type defaultVal) const;
+
+ /**
+ * regular get()
+ */
+ template <PropertyType P>
+ typename PropertyDefn<P>::basic_type get(const PropertyName &name) const;
+
+ // For exporting -- doesn't write the <configuration> 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<std::string> 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<PropertyName> getFixedKeys();
+}
+
+class DocumentConfiguration : public Configuration
+{
+public:
+ DocumentConfiguration();
+ DocumentConfiguration(const DocumentConfiguration &);
+ ~DocumentConfiguration();
+
+ DocumentConfiguration& operator=(const DocumentConfiguration &);
+
+ // for exporting -- doesn't write the <configuration> 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 <PropertyType P>
+void
+Configuration::set(const PropertyName &name,
+ typename PropertyDefn<P>::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<PropertyStore<P> *>(sb))->setData(value);
+
+ } else {
+
+ PropertyStoreBase *p = new PropertyStore<P>(value);
+ insert(PropertyPair(name, p));
+
+ }
+
+}
+
+template <PropertyType P>
+typename PropertyDefn<P>::basic_type
+Configuration::get(const PropertyName &name,
+ typename PropertyDefn<P>::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<PropertyStore<P> *>(sb))->getData();
+ } else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+}
+
+template <PropertyType P>
+typename PropertyDefn<P>::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<PropertyStore<P> *>(sb))->getData();
+ } else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+}
+
+
+}
+
+#endif // _AUDIODEVICE_H_