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()
51 : KwCssScope(KwDisplayStyles::schema())
53 , m_domPreserve(m_domDocument
.createDocumentFragment())
57 /// Construct from a DOM element.
58 KwPlaylistItem::KwPlaylistItem(const QDomElement
& element
, KwResourceManager
* resourceManager
)
59 : KwCssScope(KwDisplayStyles::schema())
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");
76 setResource(name
, new KwResourceLink(childElement
, resourceManager
));
77 // Don't preserve this resource
81 else if (childElement
.tagName() == "style")
83 importStylesFromDom(childElement
, resourceManager
);
87 QDomNode preserved
= m_domDocument
.importNode(child
, true); // deep copy
88 m_domPreserve
.appendChild(preserved
);
93 KwPlaylistItem::~KwPlaylistItem()
95 // Delete resource links
96 Resources::iterator it
;
97 for (it
= m_resources
.begin(); it
!= m_resources
.end(); ++it
)
107 /// Create an item from a DOM element.
108 KwPlaylistItem
* KwPlaylistItem::createFromDom(const QDomElement
& element
, KwResourceManager
* resourceManager
)
111 QString type
= element
.attribute("type");
112 KwPlaylistItem
* item
= factory()->construct(type
, element
, resourceManager
);
115 item
= new KwPlaylistUnknown(element
, resourceManager
);
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
);
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
);
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
)
195 Resource resource
= { name
, new KwResourceLink
};
196 m_resources
.push_back(resource
);
197 return resource
.link
;
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
);
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
)
220 m_resources
.erase(it
);