/*************************************************************************** * Copyright (C) 2001 by Bernd Gehrmann * * bernd@kdevelop.org * * jakob@simon-gaarde.dk * * * * 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. * * * ***************************************************************************/ #ifndef _DOMUTIL_H_ #define _DOMUTIL_H_ #include #include #include #include #include /** @file domutil.h Utility functions to operate on %DOM. */ struct DomAttribute { QString name; QString value; }; struct DomPathElement { QString tagName; QValueList attribute; int matchNumber; // for use when more than one element matches the path }; typedef QValueList DomPath; /** * Utility class for conveniently accessing data in a %DOM tree. */ class DomUtil { public: typedef QPair Pair; typedef QValueList PairList; /** * Remove all child elements from a given element. */ static void makeEmpty( QDomElement& ); /** * Reads a string entry. */ static QString readEntry(const QDomDocument &doc, const QString &path, const QString &defaultEntry = QString::null); /** * Reads a number entry. */ static int readIntEntry(const QDomDocument &doc, const QString &path, int defaultEntry = 0); /** * Reads a boolean entry. The strings "true" and "TRUE" are interpreted * as true, all other as false. */ static bool readBoolEntry(const QDomDocument &doc, const QString &path, bool defaultEntry = false); /** * Reads a list entry. See writeListEntry(). */ static QStringList readListEntry(const QDomDocument &doc, const QString &path, const QString &tag); /** * Reads a list of string pairs. See writePairListEntry(). */ static PairList readPairListEntry(const QDomDocument &doc, const QString &path, const QString &tag, const QString &firstAttr, const QString &secondAttr); /** * Reads a string to string map. See writeMapEntry() */ static QMap readMapEntry(const QDomDocument &doc, const QString &path); /** * Retrieves an element by path, return null if any item along * the path does not exist. */ static QDomElement elementByPath( const QDomDocument& doc, const QString& path ); /** * Retrieves an element by path, creating the necessary nodes. */ static QDomElement createElementByPath( QDomDocument& doc, const QString& path ); /** * Retrieves a child element, creating it if it does not exist. * The return value is guaranteed to be non isNull() */ static QDomElement namedChildElement( QDomElement& el, const QString& name ); /** Writes a string entry. For example, \verbatim writeEntry(doc, "/general/special", "foo"); \endverbatim creates the %DOM fragment: \verbatim foo \endverbatim */ static void writeEntry(QDomDocument &doc, const QString &path, const QString &value); /** * Writes a number entry. */ static void writeIntEntry(QDomDocument &doc, const QString &path, int value); /** * Writes a boolean entry. Booleans are stored as "true", "false" resp. */ static void writeBoolEntry(QDomDocument &doc, const QString &path, bool value); /** Writes a string list element. The list elements are separated by tag. For example, \verbatim QStringList l; l << "one" << "two"; writeListEntry(doc, "/general/special", "el", l); \endverbatim creates the %DOM fragment: \verbatim onetwo \endverbatim */ static void writeListEntry(QDomDocument &doc, const QString &path, const QString &tag, const QStringList &value); /** Writes a list of string pairs. The list elements are stored in the attributes firstAttr and secondAttr of elements named tag. For example, \verbatim DomUtil::PairList l; l << DomUtil::StringPair("one", "1"); l << DomUtil::StringPair("two", "2"); writePairListEntry(doc, "/general/special", "el", "first", "second", l); \endverbatim creates the %DOM fragment: \verbatim \endverbatim */ static void writePairListEntry(QDomDocument &doc, const QString &path, const QString &tag, const QString &firstAttr, const QString &secondAttr, const PairList &value); /** * Writes a string to string map. This map is stored in a way, that it can be read with * readMapEntry() and readEntry() */ static void writeMapEntry(QDomDocument &doc, const QString& path, const QMap &map); /** * Resolves an extended path * Extended path format: * pathpart: tag[|attr1=value[;attr2=value;..][|matchNumber]] * where matchNumber is zero-based * path: pathpart[/pathpart/..] */ static DomPath resolvPathStringExt(const QString pathstring); /** Retrieve an element specified with extended path examples: - 1: "widget|class=QDialog/property|name=geometry" or "widget|class=QDialog/property||1" - 2: "widget/property|name=caption/string" or "widget/property||2/string" . \verbatim KdevFormName <-- 1. reaches this node 0 0 600 480 KdevFormCaption <-- 2. reaches this node \endverbatim */ static QDomElement elementByPathExt(QDomDocument &doc, const QString &pathstring); /** * Open file - filename - and set setContents of doc */ static bool openDOMFile(QDomDocument &doc, QString filename); /** * Store contents of doc in file - filename. Existing file will be truncated! */ static bool saveDOMFile(QDomDocument &doc, QString filename); /** * Remove all child text nodes of parent described in pathExt */ static bool removeTextNodes(QDomDocument doc,QString pathExt); /** * Add child text node to parent described in pathExt */ static bool appendText(QDomDocument doc, QString pathExt, QString text); /** * Replace all chilt text nodes of parent described in pathExt with one new. */ static bool replaceText(QDomDocument doc, QString pathExt, QString text); private: static QString readEntryAux(const QDomDocument &doc, const QString &path); }; #endif