24 #include <QStringList>
26 #include <QTextStream>
31 #include <kstandarddirs.h>
33 class ChatWindowStyle::Private
39 QString currentVariantPath;
44 QString nextIncomingHtml;
46 QString nextOutgoingHtml;
48 QString actionIncomingHtml;
49 QString actionOutgoingHtml;
50 QString fileTransferIncomingHtml;
51 QString voiceClipIncomingHtml;
52 QString outgoingStateSendingHtml;
53 QString outgoingStateErrorHtml;
54 QString outgoingStateSentHtml;
55 QString outgoingStateUnknownHtml;
57 QHash<QString, bool> compactVariants;
63 init(styleName, styleBuildMode);
69 d->currentVariantPath = variantPath;
70 init(styleName, styleBuildMode);
73 void ChatWindowStyle::init(
const QString &styleName, StyleBuildMode styleBuildMode)
75 QStringList styleDirs = KGlobal::dirs()->findDirs(
"appdata", QString(
"styles/%1/Contents/Resources/").arg(styleName));
76 if(styleDirs.isEmpty())
78 kDebug(14000) <<
"Failed to find style" << styleName;
81 d->styleName = styleName;
82 if(styleDirs.count() > 1)
83 kDebug(14000) <<
"found several styles with the same name. using first";
84 d->baseHref = styleDirs.at(0);
85 kDebug(14000) <<
"Using style:" << d->baseHref;
101 return ( !d->statusHtml.isEmpty() && !d->fileTransferIncomingHtml.isEmpty() && !d->nextIncomingHtml.isEmpty()
102 && !d->incomingHtml.isEmpty() && !d->nextOutgoingHtml.isEmpty() && !d->outgoingHtml.isEmpty() );
108 if( d->variantsList.isEmpty() )
112 return d->variantsList;
127 return d->headerHtml;
132 return d->footerHtml;
137 return d->incomingHtml;
142 return d->nextIncomingHtml;
147 return d->outgoingHtml;
152 return d->nextOutgoingHtml;
157 return d->statusHtml;
162 return d->actionIncomingHtml;
167 return d->actionOutgoingHtml;
172 return d->fileTransferIncomingHtml;
177 return d->voiceClipIncomingHtml;
182 return d->outgoingStateSendingHtml;
187 return d->outgoingStateSentHtml;
192 return d->outgoingStateErrorHtml;
197 return d->outgoingStateUnknownHtml;
202 return ( !d->actionIncomingHtml.isEmpty() && !d->actionOutgoingHtml.isEmpty() );
205 void ChatWindowStyle::listVariants()
207 QString variantDirPath = d->baseHref + QString::fromUtf8(
"Variants/");
208 QDir variantDir(variantDirPath);
210 QStringList variantList = variantDir.entryList( QStringList(
"*.css") );
211 QStringList::ConstIterator it, itEnd = variantList.constEnd();
212 QLatin1String compactVersionPrefix(
"_compact_");
213 for(it = variantList.constBegin(); it != itEnd; ++it)
215 QString variantName = *it, variantPath;
217 variantName = variantName.left(variantName.lastIndexOf(
"."));
218 if ( variantName.startsWith( compactVersionPrefix ) ) {
219 if ( variantName == compactVersionPrefix ) {
220 d->compactVariants.insert(
"",
true );
224 QString compactVersionFilename = *it;
225 QString compactVersionPath = variantDirPath + compactVersionFilename.prepend( compactVersionPrefix );
226 if ( QFile::exists( compactVersionPath )) {
227 d->compactVariants.insert( variantName,
true );
230 variantPath = QString(
"Variants/%1").arg(*it);
231 d->variantsList.insert(variantName, variantPath);
235 void ChatWindowStyle::readStyleFiles()
237 QString headerFile = d->baseHref + QString(
"Header.html");
238 QString footerFile = d->baseHref + QString(
"Footer.html");
239 QString incomingFile = d->baseHref + QString(
"Incoming/Content.html");
240 QString nextIncomingFile = d->baseHref + QString(
"Incoming/NextContent.html");
241 QString outgoingFile = d->baseHref + QString(
"Outgoing/Content.html");
242 QString nextOutgoingFile = d->baseHref + QString(
"Outgoing/NextContent.html");
243 QString statusFile = d->baseHref + QString(
"Status.html");
244 QString actionIncomingFile = d->baseHref + QString(
"Incoming/Action.html");
245 QString actionOutgoingFile = d->baseHref + QString(
"Outgoing/Action.html");
246 QString fileTransferIncomingFile = d->baseHref + QString(
"Incoming/FileTransferRequest.html");
247 QString voiceClipIncomingFile = d->baseHref + QString(
"Incoming/voiceClipRequest.html");
248 QString outgoingStateUnknownFile = d->baseHref + QString(
"Outgoing/StateUnknown.html");
249 QString outgoingStateSendingFile = d->baseHref + QString(
"Outgoing/StateSending.html");
250 QString outgoingStateSentFile = d->baseHref + QString(
"Outgoing/StateSent.html");
251 QString outgoingStateErrorFile = d->baseHref + QString(
"Outgoing/StateError.html");
255 if( QFile::exists(headerFile) )
257 fileAccess.setFileName(headerFile);
258 fileAccess.open(QIODevice::ReadOnly);
259 QTextStream headerStream(&fileAccess);
260 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
261 d->headerHtml = headerStream.readAll();
262 kDebug(14000) <<
"Header HTML: " << d->headerHtml;
266 if( QFile::exists(footerFile) )
268 fileAccess.setFileName(footerFile);
269 fileAccess.open(QIODevice::ReadOnly);
270 QTextStream headerStream(&fileAccess);
271 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
272 d->footerHtml = headerStream.readAll();
273 kDebug(14000) <<
"Footer HTML: " << d->footerHtml;
277 if( QFile::exists(incomingFile) )
279 fileAccess.setFileName(incomingFile);
280 fileAccess.open(QIODevice::ReadOnly);
281 QTextStream headerStream(&fileAccess);
282 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
283 d->incomingHtml = headerStream.readAll();
284 kDebug(14000) <<
"Incoming HTML: " << d->incomingHtml;
288 if( QFile::exists(nextIncomingFile) )
290 fileAccess.setFileName(nextIncomingFile);
291 fileAccess.open(QIODevice::ReadOnly);
292 QTextStream headerStream(&fileAccess);
293 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
294 d->nextIncomingHtml = headerStream.readAll();
295 kDebug(14000) <<
"NextIncoming HTML: " << d->nextIncomingHtml;
299 if( QFile::exists(outgoingFile) )
301 fileAccess.setFileName(outgoingFile);
302 fileAccess.open(QIODevice::ReadOnly);
303 QTextStream headerStream(&fileAccess);
304 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
305 d->outgoingHtml = headerStream.readAll();
306 kDebug(14000) <<
"Outgoing HTML: " << d->outgoingHtml;
310 if( QFile::exists(nextOutgoingFile) )
312 fileAccess.setFileName(nextOutgoingFile);
313 fileAccess.open(QIODevice::ReadOnly);
314 QTextStream headerStream(&fileAccess);
315 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
316 d->nextOutgoingHtml = headerStream.readAll();
317 kDebug(14000) <<
"NextOutgoing HTML: " << d->nextOutgoingHtml;
321 if( QFile::exists(statusFile) )
323 fileAccess.setFileName(statusFile);
324 fileAccess.open(QIODevice::ReadOnly);
325 QTextStream headerStream(&fileAccess);
326 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
327 d->statusHtml = headerStream.readAll();
328 kDebug(14000) <<
"Status HTML: " << d->statusHtml;
333 if( QFile::exists(actionIncomingFile) )
335 fileAccess.setFileName(actionIncomingFile);
336 fileAccess.open(QIODevice::ReadOnly);
337 QTextStream headerStream(&fileAccess);
338 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
339 d->actionIncomingHtml = headerStream.readAll();
340 kDebug(14000) <<
"ActionIncoming HTML: " << d->actionIncomingHtml;
344 if( QFile::exists(actionOutgoingFile) )
346 fileAccess.setFileName(actionOutgoingFile);
347 fileAccess.open(QIODevice::ReadOnly);
348 QTextStream headerStream(&fileAccess);
349 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
350 d->actionOutgoingHtml = headerStream.readAll();
351 kDebug(14000) <<
"ActionOutgoing HTML: " << d->actionOutgoingHtml;
355 if( QFile::exists(fileTransferIncomingFile) )
357 fileAccess.setFileName(fileTransferIncomingFile);
358 fileAccess.open(QIODevice::ReadOnly);
359 QTextStream headerStream(&fileAccess);
360 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
361 d->fileTransferIncomingHtml = headerStream.readAll();
362 kDebug(14000) <<
"fileTransferIncoming HTML: " << d->fileTransferIncomingHtml;
366 if ( d->fileTransferIncomingHtml.isEmpty() ||
367 ( !d->fileTransferIncomingHtml.contains(
"saveFileHandlerId" ) &&
368 !d->fileTransferIncomingHtml.contains(
"saveFileAsHandlerId" ) ) )
370 d->fileTransferIncomingHtml = d->incomingHtml;
371 QString message = QString(
"%message%\n"
373 " <div style=\"width:37px; float:left;\">\n"
374 " <img src=\"%fileIconPath%\" style=\"width:32px; height:32px; vertical-align:middle;\" />\n"
377 " <span><b>%fileName%</b> (%fileSize%)</span><br>\n"
379 " <input id=\"%saveFileAsHandlerId%\" type=\"button\" value=\"%1\">\n"
380 " <input id=\"%cancelRequestHandlerId%\" type=\"button\" value=\"%2\">\n"
384 .arg( i18n(
"Download" ), i18n(
"Cancel" ) );
385 d->fileTransferIncomingHtml.replace( QLatin1String(
"%message%"), message );
389 if( QFile::exists(voiceClipIncomingFile) )
391 fileAccess.setFileName(voiceClipIncomingFile);
392 fileAccess.open(QIODevice::ReadOnly);
393 QTextStream headerStream(&fileAccess);
394 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
395 d->voiceClipIncomingHtml = headerStream.readAll();
396 kDebug(14000) <<
"voiceClipIncoming HTML: " << d->voiceClipIncomingHtml;
400 if ( d->voiceClipIncomingHtml.isEmpty() ||
401 ( !d->voiceClipIncomingHtml.contains(
"playVoiceHandlerId" ) &&
402 !d->voiceClipIncomingHtml.contains(
"saveAsVoiceHandlerId" ) ) )
404 d->voiceClipIncomingHtml = d->incomingHtml;
405 QString message = QString(
"%message%\n"
407 " <div style=\"width:37px; float:left;\">\n"
408 " <img src=\"%fileIconPath%\" style=\"width:32px; height:32px; vertical-align:middle;\" />\n"
412 " <input id=\"%playVoiceHandlerId%\" type=\"button\" value=\"%1\">\n"
413 " <input id=\"%saveAsVoiceHandlerId%\" type=\"button\" value=\"%2\">\n"
417 .arg( i18n(
"Play" ), i18n(
"Save as" ) );
418 d->voiceClipIncomingHtml.replace( QLatin1String(
"%message%"), message );
422 if( QFile::exists(outgoingStateUnknownFile) )
424 fileAccess.setFileName(outgoingStateUnknownFile);
425 fileAccess.open(QIODevice::ReadOnly);
426 QTextStream headerStream(&fileAccess);
427 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
428 d->outgoingStateUnknownHtml = headerStream.readAll();
429 kDebug(14000) <<
"Outgoing StateUnknown HTML: " << d->outgoingStateUnknownHtml;
433 if( QFile::exists(outgoingStateSendingFile) )
435 fileAccess.setFileName(outgoingStateSendingFile);
436 fileAccess.open(QIODevice::ReadOnly);
437 QTextStream headerStream(&fileAccess);
438 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
439 d->outgoingStateSendingHtml = headerStream.readAll();
440 kDebug(14000) <<
"Outgoing StateSending HTML: " << d->outgoingStateSendingHtml;
444 if( QFile::exists(outgoingStateSentFile) )
446 fileAccess.setFileName(outgoingStateSentFile);
447 fileAccess.open(QIODevice::ReadOnly);
448 QTextStream headerStream(&fileAccess);
449 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
450 d->outgoingStateSentHtml = headerStream.readAll();
451 kDebug(14000) <<
"Outgoing StateSent HTML: " << d->outgoingStateSentHtml;
455 if( QFile::exists(outgoingStateErrorFile) )
457 fileAccess.setFileName(outgoingStateErrorFile);
458 fileAccess.open(QIODevice::ReadOnly);
459 QTextStream headerStream(&fileAccess);
460 headerStream.setCodec(QTextCodec::codecForName(
"UTF-8"));
461 d->outgoingStateErrorHtml = headerStream.readAll();
462 kDebug(14000) <<
"Outgoing StateError HTML: " << d->outgoingStateErrorHtml;
469 d->variantsList.clear();
476 if ( d->compactVariants.contains( styleVariant ) ) {
477 return d->compactVariants.value( styleVariant );
484 QString compacted = styleVariant;
485 if ( styleVariant.isEmpty() ) {
486 return QLatin1String(
"Variants/_compact_.css" );
488 return compacted.insert( compacted.lastIndexOf(
'/') + 1, QString(
"_compact_") );
StyleBuildMode
This enum specifies the mode of the constructor.
QString getOutgoingStateErrorHtml() const
QString getOutgoingHtml() const
QString getIncomingHtml() const
bool hasActionTemplate() const
Check if the style has the support for Kopete Action template (Kopete extension)
QString getHeaderHtml() const
QString getNextIncomingHtml() const
QString getActionOutgoingHtml() const
QString getActionIncomingHtml() const
QString compact(const QString &variant) const
Return the compact version of the given style variant.
QString getFooterHtml() const
QString getFileTransferIncomingHtml() const
bool isValid() const
Checks if the style is valid.
bool hasCompact(const QString &variant) const
Check if the supplied variant has a compact form.
void reload()
Reload style from disk.
QString getStyleName() const
Get the style path.
QString getStyleBaseHref() const
Get the style resource directory.
StyleVariants getVariants()
Get the list of all variants for this theme.
QHash< QString, QString > StyleVariants
StyleVariants is a typedef to a QHash key = Variant Name value = Path to variant CSS file...
QString getOutgoingStateUnknownHtml() const
ChatWindowStyle(const QString &styleName, StyleBuildMode styleBuildMode=StyleBuildNormal)
Build a single chat window style.
QString getStatusHtml() const
QString getOutgoingStateSentHtml() const
QString getVoiceClipIncomingHtml() const
QString getOutgoingStateSendingHtml() const
QString getNextOutgoingHtml() const