24 #include <QStringList>
26 #include <QTextStream>
31 #include <kstandarddirs.h>
33 class ChatWindowStyle::Private
50 QString fileTransferIncomingHtml;
52 QString outgoingStateSendingHtml;
55 QString outgoingStateUnknownHtml;
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));
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()
208 QDir variantDir(variantDirPath);
213 for(it = variantList.
constBegin(); it != itEnd; ++it)
215 QString variantName = *it, variantPath;
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 );
227 d->compactVariants.insert( variantName,
true );
230 variantPath =
QString(
"Variants/%1").
arg(*it);
231 d->variantsList.insert(variantName, variantPath);
235 void ChatWindowStyle::readStyleFiles()
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");
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");
258 fileAccess.
open(QIODevice::ReadOnly);
261 d->headerHtml = headerStream.readAll();
262 kDebug(14000) <<
"Header HTML: " << d->headerHtml;
269 fileAccess.
open(QIODevice::ReadOnly);
272 d->footerHtml = headerStream.readAll();
273 kDebug(14000) <<
"Footer HTML: " << d->footerHtml;
280 fileAccess.
open(QIODevice::ReadOnly);
283 d->incomingHtml = headerStream.readAll();
284 kDebug(14000) <<
"Incoming HTML: " << d->incomingHtml;
291 fileAccess.
open(QIODevice::ReadOnly);
294 d->nextIncomingHtml = headerStream.readAll();
295 kDebug(14000) <<
"NextIncoming HTML: " << d->nextIncomingHtml;
302 fileAccess.
open(QIODevice::ReadOnly);
305 d->outgoingHtml = headerStream.readAll();
306 kDebug(14000) <<
"Outgoing HTML: " << d->outgoingHtml;
313 fileAccess.
open(QIODevice::ReadOnly);
316 d->nextOutgoingHtml = headerStream.readAll();
317 kDebug(14000) <<
"NextOutgoing HTML: " << d->nextOutgoingHtml;
324 fileAccess.
open(QIODevice::ReadOnly);
327 d->statusHtml = headerStream.readAll();
328 kDebug(14000) <<
"Status HTML: " << d->statusHtml;
336 fileAccess.
open(QIODevice::ReadOnly);
339 d->actionIncomingHtml = headerStream.readAll();
340 kDebug(14000) <<
"ActionIncoming HTML: " << d->actionIncomingHtml;
347 fileAccess.
open(QIODevice::ReadOnly);
350 d->actionOutgoingHtml = headerStream.readAll();
351 kDebug(14000) <<
"ActionOutgoing HTML: " << d->actionOutgoingHtml;
358 fileAccess.
open(QIODevice::ReadOnly);
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;
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 );
392 fileAccess.
open(QIODevice::ReadOnly);
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;
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 );
425 fileAccess.
open(QIODevice::ReadOnly);
428 d->outgoingStateUnknownHtml = headerStream.readAll();
429 kDebug(14000) <<
"Outgoing StateUnknown HTML: " << d->outgoingStateUnknownHtml;
436 fileAccess.
open(QIODevice::ReadOnly);
439 d->outgoingStateSendingHtml = headerStream.readAll();
440 kDebug(14000) <<
"Outgoing StateSending HTML: " << d->outgoingStateSendingHtml;
447 fileAccess.
open(QIODevice::ReadOnly);
450 d->outgoingStateSentHtml = headerStream.readAll();
451 kDebug(14000) <<
"Outgoing StateSent HTML: " << d->outgoingStateSentHtml;
458 fileAccess.
open(QIODevice::ReadOnly);
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() ) {
StyleBuildMode
This enum specifies the mode of the constructor.
QString getOutgoingStateErrorHtml() const
QString getOutgoingHtml() const
QString getIncomingHtml() const
QString & prepend(QChar ch)
const T & at(int i) const
void setFileName(const QString &name)
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
int lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QString getActionIncomingHtml() const
int count(const T &value) const
QString fromUtf8(const char *str, int size)
QString & insert(int position, QChar ch)
QString compact(const QString &variant) const
Return the compact version of the given style variant.
QString getFooterHtml() const
QString getFileTransferIncomingHtml() const
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
bool isValid() const
Checks if the style is valid.
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
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.
QTextCodec * codecForName(const QByteArray &name)
QString left(int n) const
QString getStatusHtml() const
const_iterator constEnd() const
const_iterator constBegin() const
QString getOutgoingStateSentHtml() const
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QString getVoiceClipIncomingHtml() const
QString getOutgoingStateSendingHtml() const
QString getNextOutgoingHtml() const