1 /***************************************************************************
2 * This file is part of KWorship. *
3 * Copyright 2008 James Hogan <james@albanarts.com> *
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. *
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. *
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 ***************************************************************************/
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>
38 /// Get a factory object.
39 KwPlaylistItem::Factory
* KwPlaylistItem::factory()
46 * Constructors + destructor.
49 /// Default constructor.
50 KwPlaylistItem::KwPlaylistItem()
52 , KwCssScope(KwDisplayStyles::schema())
54 , m_domPreserve(m_domDocument
.createDocumentFragment())
58 /// Construct from a DOM element.
59 KwPlaylistItem::KwPlaylistItem(const QDomElement
& element
, KwResourceManager
* resourceManager
)
60 : KwCssScope(KwDisplayStyles::schema())
62 , m_domPreserve(m_domDocument
.createDocumentFragment())
64 // Import the children of element into m_domPreserve
65 QDomNodeList children
= element
.childNodes();
66 for (int i
= 0; i
< children
.size(); ++i
)
68 QDomNode child
= children
.item(i
);
69 if (child
.isElement())
71 QDomElement childElement
= child
.toElement();
72 if (childElement
.tagName() == "resource")
74 QString name
= childElement
.attribute("name");
77 setResource(name
, new KwResourceLink(childElement
, resourceManager
));
78 // Don't preserve this resource
82 else if (childElement
.tagName() == "style")
84 importStylesFromDom(childElement
, resourceManager
);
88 QDomNode preserved
= m_domDocument
.importNode(child
, true); // deep copy
89 m_domPreserve
.appendChild(preserved
);
94 KwPlaylistItem::~KwPlaylistItem()
96 // Delete resource links
97 Resources::iterator it
;
98 for (it
= m_resources
.begin(); it
!= m_resources
.end(); ++it
)
108 /// Create an item from a DOM element.
109 KwPlaylistItem
* KwPlaylistItem::createFromDom(const QDomElement
& element
, KwResourceManager
* resourceManager
)
112 QString type
= element
.attribute("type");
113 KwPlaylistItem
* item
= factory()->construct(type
, element
, resourceManager
);
116 item
= new KwPlaylistUnknown(element
, resourceManager
);
121 /// Export this item to the DOM.
122 void KwPlaylistItem::exportToDom(QDomDocument
& document
, QDomElement
& element
, KwResourceManager
* resourceManager
) const
124 // Add an item element with type attribute and child elements determined by type
125 QDomElement itemElement
= document
.createElement("playlist_item");
126 element
.appendChild(itemElement
);
127 QString type
= itemType();
128 itemElement
.setAttribute("type", type
);
132 QDomElement styleElem
= document
.createElement("style");
133 itemElement
.appendChild(styleElem
);
134 exportStylesToDom(document
, styleElem
, resourceManager
);
137 exportDetailsToDom(document
, itemElement
, resourceManager
);
139 // Export resources after type specific stuff so they can be modified at the last minute
140 Resources::const_iterator it
;
141 for (it
= m_resources
.constBegin(); it
!= m_resources
.constEnd(); ++it
)
143 if (!(*it
).link
->isNull())
145 QDomElement resourceElement
= document
.createElement("resource");
146 resourceElement
.setAttribute("name", (*it
).name
);
147 itemElement
.appendChild(resourceElement
);
149 (*it
).link
->exportToDom(document
, resourceElement
, resourceManager
);
153 // Add preserve elements as well
154 QDomNode importedFragment
= document
.importNode(m_domPreserve
, true);
155 itemElement
.appendChild(importedFragment
);
162 /// Indicate that elements of a particular tag name have been handled.
163 void KwPlaylistItem::elementsHandled(const QString
& tagName
)
165 QDomElement current
= m_domPreserve
.firstChildElement(tagName
);
166 while (!current
.isNull())
168 m_domPreserve
.removeChild(current
);
169 current
= current
.nextSiblingElement(tagName
);
173 /// Indicate that the first elements of a particular tag name have been handled.
174 void KwPlaylistItem::elementHandled(const QString
& tagName
)
176 QDomElement current
= m_domPreserve
.firstChildElement(tagName
);
177 if (!current
.isNull())
179 m_domPreserve
.removeChild(current
);
183 /// Get a resource by name.
184 KwResourceLink
* KwPlaylistItem::getResource(const QString
& name
, bool create
)
186 Resources::iterator it
;
187 for (it
= m_resources
.begin(); it
!= m_resources
.end(); ++it
)
189 if ((*it
).name
== name
)
196 Resource resource
= { name
, new KwResourceLink
};
197 m_resources
.push_back(resource
);
198 return resource
.link
;
203 /// Set a resource associated with a name.
204 KwResourceLink
* KwPlaylistItem::setResource(const QString
& name
, KwResourceLink
* link
)
206 deleteResource(name
);
207 Resource resource
= { name
, link
};
208 m_resources
.push_back(resource
);
212 /// Delete a resource.
213 void KwPlaylistItem::deleteResource(const QString
& name
)
215 Resources::iterator it
;
216 for (it
= m_resources
.begin(); it
!= m_resources
.end(); ++it
)
218 if ((*it
).name
== name
)
221 m_resources
.erase(it
);