Some DOM code in place for export of style scopes, but without CSS translation
[kworship.git] / kworship / playlist / KwPlaylistItem.cpp
blobaf1360500967ecd8c49cb1907c19f583f969500a
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"
30 #include <QDomDocument>
31 #include <QDomElement>
34 * Item factory
37 /// Get a factory object.
38 KwPlaylistItem::Factory* KwPlaylistItem::factory()
40 static Factory fac;
41 return &fac;
45 * Constructors + destructor.
48 /// Default constructor.
49 KwPlaylistItem::KwPlaylistItem()
50 : KwCssScope()
51 , m_domDocument()
52 , m_domPreserve(m_domDocument.createDocumentFragment())
56 /// Construct from a DOM element.
57 KwPlaylistItem::KwPlaylistItem(const QDomElement& element, KwResourceManager* resourceManager)
58 : KwCssScope()
59 , m_domDocument()
60 , m_domPreserve(m_domDocument.createDocumentFragment())
62 // Import the children of element into m_domPreserve
63 QDomNodeList children = element.childNodes();
64 for (int i = 0; i < children.size(); ++i)
66 QDomNode child = children.item(i);
67 if (child.isElement())
69 QDomElement childElement = child.toElement();
70 if (childElement.tagName() == "resource")
72 QString name = childElement.attribute("name");
73 if (!name.isEmpty())
75 setResource(name, new KwResourceLink(childElement, resourceManager));
76 // Don't preserve this resource
77 continue;
80 else if (childElement.tagName() == "style")
82 importStylesFromDom(childElement, resourceManager);
83 continue;
86 QDomNode preserved = m_domDocument.importNode(child, true); // deep copy
87 m_domPreserve.appendChild(preserved);
91 /// Destructor.
92 KwPlaylistItem::~KwPlaylistItem()
94 // Delete resource links
95 Resources::iterator it;
96 for (it = m_resources.begin(); it != m_resources.end(); ++it)
98 delete (*it).link;
103 * DOM Translation.
106 /// Create an item from a DOM element.
107 KwPlaylistItem* KwPlaylistItem::createFromDom(const QDomElement& element, KwResourceManager* resourceManager)
109 // Look at the type
110 QString type = element.attribute("type");
111 KwPlaylistItem* item = factory()->construct(type, element, resourceManager);
112 if (0 == item)
114 item = new KwPlaylistUnknown(element, resourceManager);
116 return item;
119 /// Export this item to the DOM.
120 void KwPlaylistItem::exportToDom(QDomDocument& document, QDomElement& element, KwResourceManager* resourceManager) const
122 // Add an item element with type attribute and child elements determined by type
123 QDomElement itemElement = document.createElement("playlist_item");
124 element.appendChild(itemElement);
125 QString type = itemType();
126 itemElement.setAttribute("type", type);
128 if (!isScopeEmpty())
130 QDomElement styleElem = document.createElement("style");
131 itemElement.appendChild(styleElem);
132 exportStylesToDom(document, styleElem, resourceManager);
135 exportDetailsToDom(document, itemElement, resourceManager);
137 // Export resources after type specific stuff so they can be modified at the last minute
138 Resources::const_iterator it;
139 for (it = m_resources.constBegin(); it != m_resources.constEnd(); ++it)
141 if (!(*it).link->isNull())
143 QDomElement resourceElement = document.createElement("resource");
144 resourceElement.setAttribute("name", (*it).name);
145 itemElement.appendChild(resourceElement);
147 (*it).link->exportToDom(document, resourceElement, resourceManager);
151 // Add preserve elements as well
152 QDomNode importedFragment = document.importNode(m_domPreserve, true);
153 itemElement.appendChild(importedFragment);
157 * Protected methods
160 /// Indicate that elements of a particular tag name have been handled.
161 void KwPlaylistItem::elementsHandled(const QString& tagName)
163 QDomElement current = m_domPreserve.firstChildElement(tagName);
164 while (!current.isNull())
166 m_domPreserve.removeChild(current);
167 current = current.nextSiblingElement(tagName);
171 /// Indicate that the first elements of a particular tag name have been handled.
172 void KwPlaylistItem::elementHandled(const QString& tagName)
174 QDomElement current = m_domPreserve.firstChildElement(tagName);
175 if (!current.isNull())
177 m_domPreserve.removeChild(current);
181 /// Get a resource by name.
182 KwResourceLink* KwPlaylistItem::getResource(const QString& name, bool create)
184 Resources::iterator it;
185 for (it = m_resources.begin(); it != m_resources.end(); ++it)
187 if ((*it).name == name)
189 return (*it).link;
192 if (create)
194 Resource resource = { name, new KwResourceLink };
195 m_resources.push_back(resource);
196 return resource.link;
198 return 0;
201 /// Set a resource associated with a name.
202 KwResourceLink* KwPlaylistItem::setResource(const QString& name, KwResourceLink* link)
204 deleteResource(name);
205 Resource resource = { name, link };
206 m_resources.push_back(resource);
207 return link;
210 /// Delete a resource.
211 void KwPlaylistItem::deleteResource(const QString& name)
213 Resources::iterator it;
214 for (it = m_resources.begin(); it != m_resources.end(); ++it)
216 if ((*it).name == name)
218 delete (*it).link;
219 m_resources.erase(it);