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"
30 #include <QDomDocument>
31 #include <QDomElement>
37 /// Get a factory object.
38 KwPlaylistItem::Factory
* KwPlaylistItem::factory()
45 * Constructors + destructor.
48 /// Default constructor.
49 KwPlaylistItem::KwPlaylistItem()
52 , m_domPreserve(m_domDocument
.createDocumentFragment())
56 /// Construct from a DOM element.
57 KwPlaylistItem::KwPlaylistItem(const QDomElement
& element
, KwResourceManager
* resourceManager
)
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");
75 setResource(name
, new KwResourceLink(childElement
, resourceManager
));
76 // Don't preserve this resource
80 else if (childElement
.tagName() == "style")
82 importStylesFromDom(childElement
, resourceManager
);
86 QDomNode preserved
= m_domDocument
.importNode(child
, true); // deep copy
87 m_domPreserve
.appendChild(preserved
);
92 KwPlaylistItem::~KwPlaylistItem()
94 // Delete resource links
95 Resources::iterator it
;
96 for (it
= m_resources
.begin(); it
!= m_resources
.end(); ++it
)
106 /// Create an item from a DOM element.
107 KwPlaylistItem
* KwPlaylistItem::createFromDom(const QDomElement
& element
, KwResourceManager
* resourceManager
)
110 QString type
= element
.attribute("type");
111 KwPlaylistItem
* item
= factory()->construct(type
, element
, resourceManager
);
114 item
= new KwPlaylistUnknown(element
, resourceManager
);
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
);
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
);
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
)
194 Resource resource
= { name
, new KwResourceLink
};
195 m_resources
.push_back(resource
);
196 return resource
.link
;
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
);
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
)
219 m_resources
.erase(it
);