diff options
Diffstat (limited to 'src/entry.h')
-rw-r--r-- | src/entry.h | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/entry.h b/src/entry.h new file mode 100644 index 0000000..bff3d7d --- /dev/null +++ b/src/entry.h @@ -0,0 +1,256 @@ +/*************************************************************************** + copyright : (C) 2001-2006 by Robby Stephenson + email : robby@periapsis.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#ifndef TELLICO_ENTRY_H +#define TELLICO_ENTRY_H + +#include "datavectors.h" + +#include <qstringlist.h> +#include <qstring.h> +#include <qobject.h> + +#include <functional> + +namespace Tellico { + namespace Data { + class Collection; + +/** + * The EntryGroup is simply a vector of entries which knows the name of its group, + * and the name of the field to which that group belongs. + * + * An example for a book collection would be a group of books, all written by + * David Weber. The @ref groupName() would be "Weber, David" and the + * @ref fieldName() would be "author". + * + * It's a QObject because EntryGroupItem holds a QGuardedPtr + * + * @author Robby Stephenson + */ +class EntryGroup : public QObject, public EntryVec { +Q_OBJECT + +public: + EntryGroup(const QString& group, const QString& field); + ~EntryGroup(); + + const QString& groupName() const { return m_group; } + const QString& fieldName() const { return m_field; } + +private: + QString m_group; + QString m_field; +}; + +/** + * The Entry class represents a book, a CD, or whatever is the basic entity + * in the collection. + * + * Each Entry object has a set of field values, such as title, artist, or format, + * and must belong to a collection. A unique id number identifies each entry. + * + * @see Field + * + * @author Robby Stephenson + */ +class Entry : public KShared { + +public: + /** + * The constructor, which automatically sets the id to the current number + * of entries in the collection. + * + * @param coll A pointer to the parent collection object + */ + Entry(CollPtr coll); + Entry(CollPtr coll, int id); + /** + * The copy constructor, needed since the id must be different. + */ + Entry(const Entry& entry); + /** + * The assignment operator is overloaded, since the id must be different. + */ + Entry& operator=(const Entry& other); + /** + * two entries are equal if all their field values are equal, except for + * file catalogs which match on the url only + */ + bool operator==(const Entry& other); + + ~Entry(); + + /** + * Every entry has a title. + * + * @return The entry title + */ + QString title() const; + /** + * Returns the value of the field with a given key name. If the key doesn't + * exist, the method returns @ref QString::null. + * + * @param fieldName The field name + * @param formatted Whether to format the field or not. + * @return The value of the field + */ + QString field(const QString& fieldName, bool formatted=false) const; + QString field(Data::FieldPtr field, bool formatted=false) const; + /** + * Returns the formatted value of the field with a given key name. If the + * key doesn't exist, the method returns @ref QString::null. The value is cached, + * so the first time the value is requested, @ref Field::format is called. + * The second time, that lookup isn't necessary. + * + * @param fieldName The field name + * @return The formatted value of the field + */ + QString formattedField(const QString& fieldName) const; + QString formattedField(Data::FieldPtr field) const; + /** + * Splits a field value. This is faster than calling Data::Field::split() since + * a regexp is not used, only a string. + * + * @param field The field name + * @param format Whether to format the values or not + * @return The list of field values + */ + QStringList fields(const QString& fieldName, bool formatted) const; + QStringList fields(Data::FieldPtr field, bool formatted) const; + /** + * Sets the value of an field for the entry. The method first verifies that + * the value is allowed for that particular key. + * + * @param fieldName The name of the field + * @param value The value of the field + * @return A boolean indicating whether or not the field was successfully set + */ + bool setField(const QString& fieldName, const QString& value); + bool setField(Data::FieldPtr field, const QString& value); + /** + * Returns a pointer to the parent collection of the entry. + * + * @return The collection pointer + */ + CollPtr collection() const; + /** + * Changes the collection owner of the entry + */ + void setCollection(CollPtr coll); + /** + * Returns the id of the entry + * + * @return The id + */ + long id() const { return m_id; } + void setId(long id) { m_id = id; } + /** + * Adds the entry to a group. The group list within the entry is updated + * and the entry is added to the group. + * + * @param group The group + * @return a bool indicating if it was successfully added. If the entry was already + * in the group, the return value is false + */ + bool addToGroup(EntryGroup* group); + /** + * Removes the entry from a group. The group list within the entry is updated + * and the entry is removed from the group. + * + * @param group The group + * @return a bool indicating if the group was successfully removed + */ + bool removeFromGroup(EntryGroup* group); + void clearGroups(); + /** + * Returns a list of the groups to which the entry belongs + * + * @return The list of groups + */ + const PtrVector<EntryGroup>& groups() const { return m_groups; } + /** + * Returns a list containing the names of the groups for + * a certain field to which the entry belongs + * + * @param fieldName The name of the field + * @return The list of names + */ + QStringList groupNamesByFieldName(const QString& fieldName) const; + /** + * Returns a list of all the field values contained in the entry. + * + * @return The list of field values + */ + QStringList fieldValues() const { return m_fields.values(); } + /** + * Returns a list of all the formatted field values contained in the entry. + * + * @return The list of field values + */ + QStringList formattedFieldValues() const { return m_formattedFields.values(); } + /** + * Returns a boolean indicating if the entry's parent collection recognizes + * it existence, that is, the parent collection has this entry in its list. + * + * @return Whether the entry is owned or not + */ + bool isOwned(); + /** + * Removes the formatted value of the field from the map. This should be used when + * the field's format flag has changed. + * + * @param name The name of the field that changed. QString::null means invalidate all fields. + */ + void invalidateFormattedFieldValue(const QString& name=QString::null); + + static int compareValues(EntryPtr entry1, EntryPtr entry2, FieldPtr field); + static int compareValues(EntryPtr entry1, EntryPtr entry2, const QString& field, ConstCollPtr coll); + + /** + * Construct the derived valued for an field. The format string should be + * of the form "%{name1} %{name2}" where the names are replaced by the value + * of that field for the entry. Whether or not formatting is done on the + * strings themselves should be taken into account. + * + * @param formatString The format string + * @param formatted Whether the inserted values should be formatted. + * @return The constructed field value + */ + static QString dependentValue(ConstEntryPtr e, const QString& formatString, bool formatted); + +private: + CollPtr m_coll; + long m_id; + StringMap m_fields; + mutable StringMap m_formattedFields; + PtrVector<EntryGroup> m_groups; +}; + +class EntryCmp : public std::binary_function<EntryPtr, EntryPtr, bool> { + +public: + EntryCmp(const QString& field) : m_field(field) {} + + bool operator()(EntryPtr e1, EntryPtr e2) const { + return e1->field(m_field) < e2->field(m_field); + } + +private: + QString m_field; +}; + + } // end namespace +} // end namespace + +#endif |