New css schema object for constructing property values from strings
[kworship.git] / kworship / playlist / KwPlaylistItem.cpp
blobea42be239f4c6b46a959d32160884dffb6746e3f
1 /***************************************************************************
2 * This file is part of KWorship. *
3 * Copyright 2008 James Hogan <james@albanarts.com> *
4 * *
5 * KWorship is free software: you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation, either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * KWorship is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with KWorship. If not, write to the Free Software Foundation, *
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ***************************************************************************/
20 /**
21 * @file KwPlaylistItem.cpp
22 * @brief An item that can be added to a playlist.
23 * @author James Hogan <james@albanarts.com>
26 #include "KwPlaylistItem.h"
27 #include "KwPlaylistUnknown.h"
28 #include "KwResourceLink.h"
29 #include <KwDisplayStyles.h>
31 #include <QDomDocument>
32 #include <QDomElement>
35 * Item factory
38 /// Get a factory object.
39 KwPlaylistItem::Factory* KwPlaylistItem::factory()
41 static Factory fac;
42 return &fac;
46 * Constructors + destructor.
49 /// Default constructor.
50 KwPlaylistItem::KwPlaylistItem()
51 : KwCssScope(KwDisplayStyles::schema())
52 , m_domDocument()
53 , m_domPreserve(m_domDocument.createDocumentFragment())
57 /// Construct from a DOM element.
58 KwPlaylistItem::KwPlaylistItem(const QDomElement& element, KwResourceManager* resourceManager)
59 : KwCssScope(KwDisplayStyles::schema())
60 , m_domDocument()
61 , m_domPreserve(m_domDocument.createDocumentFragment())
63 // Import the children of element into m_domPreserve
64 QDomNodeList children = element.childNodes();
65 for (int i = 0; i < children.size(); ++i)
67 QDomNode child = children.item(i);
68 if (child.isElement())
70 QDomElement childElement = child.toElement();
71 if (childElement.tagName() == "resource")
73 QString name = childElement.attribute("name");
74 if (!name.isEmpty())
76 setResource(name, new KwResourceLink(childElement, resourceManager));
77 // Don't preserve this resource
78 continue;
81 else if (childElement.tagName() == "style")
83 importStylesFromDom(childElement, resourceManager);
84 continue;
87 QDomNode preserved = m_domDocument.importNode(child, true); // deep copy
88 m_domPreserve.appendChild(preserved);
92 /// Destructor.
93 KwPlaylistItem::~KwPlaylistItem()
95 // Delete resource links
96 Resources::iterator it;
97 for (it = m_resources.begin(); it != m_resources.end(); ++it)
99 delete (*it).link;
104 * DOM Translation.
107 /// Create an item from a DOM element.
108 KwPlaylistItem* KwPlaylistItem::createFromDom(const QDomElement& element, KwResourceManager* resourceManager)
110 // Look at the type
111 QString type = element.attribute("type");
112 KwPlaylistItem* item = factory()->construct(type, element, resourceManager);
113 if (0 == item)
115 item = new KwPlaylistUnknown(element, resourceManager);
117 return item;
120 /// Export this item to the DOM.
121 void KwPlaylistItem::exportToDom(QDomDocument& document, QDomElement& element, KwResourceManager* resourceManager) const
123 // Add an item element with type attribute and child elements determined by type
124 QDomElement itemElement = document.createElement("playlist_item");
125 element.appendChild(itemElement);
126 QString type = itemType();
127 itemElement.setAttribute("type", type);
129 if (!isScopeEmpty())
131 QDomElement styleElem = document.createElement("style");
132 itemElement.appendChild(styleElem);
133 exportStylesToDom(document, styleElem, resourceManager);
136 exportDetailsToDom(document, itemElement, resourceManager);
138 // Export resources after type specific stuff so they can be modified at the last minute
139 Resources::const_iterator it;
140 for (it = m_resources.constBegin(); it != m_resources.constEnd(); ++it)
142 if (!(*it).link->isNull())
144 QDomElement resourceElement = document.createElement("resource");
145 resourceElement.setAttribute("name", (*it).name);
146 itemElement.appendChild(resourceElement);
148 (*it).link->exportToDom(document, resourceElement, resourceManager);
152 // Add preserve elements as well
153 QDomNode importedFragment = document.importNode(m_domPreserve, true);
154 itemElement.appendChild(importedFragment);
158 * Protected methods
161 /// Indicate that elements of a particular tag name have been handled.
162 void KwPlaylistItem::elementsHandled(const QString& tagName)
164 QDomElement current = m_domPreserve.firstChildElement(tagName);
165 while (!current.isNull())
167 m_domPreserve.removeChild(current);
168 current = current.nextSiblingElement(tagName);
172 /// Indicate that the first elements of a particular tag name have been handled.
173 void KwPlaylistItem::elementHandled(const QString& tagName)
175 QDomElement current = m_domPreserve.firstChildElement(tagName);
176 if (!current.isNull())
178 m_domPreserve.removeChild(current);
182 /// Get a resource by name.
183 KwResourceLink* KwPlaylistItem::getResource(const QString& name, bool create)
185 Resources::iterator it;
186 for (it = m_resources.begin(); it != m_resources.end(); ++it)
188 if ((*it).name == name)
190 return (*it).link;
193 if (create)
195 Resource resource = { name, new KwResourceLink };
196 m_resources.push_back(resource);
197 return resource.link;
199 return 0;
202 /// Set a resource associated with a name.
203 KwResourceLink* KwPlaylistItem::setResource(const QString& name, KwResourceLink* link)
205 deleteResource(name);
206 Resource resource = { name, link };
207 m_resources.push_back(resource);
208 return link;
211 /// Delete a resource.
212 void KwPlaylistItem::deleteResource(const QString& name)
214 Resources::iterator it;
215 for (it = m_resources.begin(); it != m_resources.end(); ++it)
217 if ((*it).name == name)
219 delete (*it).link;
220 m_resources.erase(it);