You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/entry.h

259 lines
8.1 KiB

/***************************************************************************
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 <tqstringlist.h>
#include <tqstring.h>
#include <tqobject.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 TQObject because EntryGroupItem holds a TQGuardedPtr
*
* @author Robby Stephenson
*/
class EntryGroup : public TQObject, public EntryVec {
Q_OBJECT
public:
EntryGroup(const TQString& group, const TQString& field);
~EntryGroup();
const TQString& groupName() const { return m_group; }
const TQString& fieldName() const { return m_field; }
private:
TQString m_group;
TQString 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 TDEShared {
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);
~Entry();
/**
* Every entry has a title.
*
* @return The entry title
*/
TQString title() const;
/**
* Returns the value of the field with a given key name. If the key doesn't
* exist, the method returns @ref TQString().
*
* @param fieldName The field name
* @param formatted Whether to format the field or not.
* @return The value of the field
*/
TQString field(const TQString& fieldName, bool formatted=false) const;
TQString 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 TQString(). 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
*/
TQString formattedField(const TQString& fieldName) const;
TQString 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
*/
TQStringList fields(const TQString& fieldName, bool formatted) const;
TQStringList 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 TQString& fieldName, const TQString& value);
bool setField(Data::FieldPtr field, const TQString& 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
*/
TQStringList groupNamesByFieldName(const TQString& fieldName) const;
/**
* Returns a list of all the field values contained in the entry.
*
* @return The list of field values
*/
TQStringList 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
*/
TQStringList 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. TQString() means invalidate all fields.
*/
void invalidateFormattedFieldValue(const TQString& name=TQString());
static int compareValues(EntryPtr entry1, EntryPtr entry2, FieldPtr field);
static int compareValues(EntryPtr entry1, EntryPtr entry2, const TQString& 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 TQString dependentValue(ConstEntryPtr e, const TQString& formatString, bool formatted);
private:
/**
* 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);
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 TQString& field) : m_field(field) {}
bool operator()(EntryPtr e1, EntryPtr e2) const {
return e1->field(m_field) < e2->field(m_field);
}
private:
TQString m_field;
};
} // end namespace
} // end namespace
#endif