void AdiumThemeView::addStatusMessage(const AdiumThemeStatusInfo& statusMessage)
{
    QString styleHtml;
    bool consecutiveMessage = false;
    bool willAddMoreContentObjects = false; // TODO Find out how this is used in Adium
    bool replaceLastContent = false; // TODO use this

    // statusMessage is const, we need a non-const one to append message classes
    AdiumThemeStatusInfo message(statusMessage);

    if (m_lastContent.type() == message.type() && !m_chatStyle->disableCombineConsecutive()) {
        consecutiveMessage = true;
        message.appendMessageClass(QLatin1String("consecutive"));
    }

    m_lastContent = AdiumThemeContentInfo(statusMessage.type());

    switch (message.type()) {
    case AdiumThemeMessageInfo::Status:
        styleHtml = m_chatStyle->getStatusHtml();
        break;
    case AdiumThemeMessageInfo::HistoryStatus:
        styleHtml = m_chatStyle->getStatusHistoryHtml();
        break;
    default:
        kWarning() << "Unexpected message type to addStatusMessage";
    }

    replaceStatusKeywords(styleHtml, message);

    AppendMode mode = appendMode(message,
                                 consecutiveMessage,
                                 willAddMoreContentObjects,
                                 replaceLastContent);

    appendMessage(styleHtml, mode);
}
void AppearanceConfigTab::sendDemoMessages()
{
    //add a fake message
    AdiumThemeContentInfo message(AdiumThemeMessageInfo::HistoryRemoteToLocal);
    message.setMessage(i18nc("Example message in preview conversation","Ok!"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Larry Demo"));
    message.setService(i18nc("XMPP Protocol name" , "Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::HistoryRemoteToLocal);
    message.setMessage(i18nc("Example message in preview conversation","Bye Bye"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Larry Demo"));
    message.setService(i18n("Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::HistoryLocalToRemote);
    message.setMessage(i18nc("Example message in preview conversation","Have fun!"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Ted Example"));
    message.setService(i18n("Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::HistoryLocalToRemote);
    message.setMessage(i18nc("Example message in preview conversation","cya"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Ted Example"));
    message.setService(i18n("Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    AdiumThemeStatusInfo statusMessage(true);
    statusMessage.setMessage(i18nc("Example message", "Ted Example waves."));
    statusMessage.setTime(QDateTime::currentDateTime());
    statusMessage.setService(i18n("Jabber"));
    ui->chatView->addAdiumStatusMessage(statusMessage);

    statusMessage = AdiumThemeStatusInfo(true);
    statusMessage.setMessage(i18nc("Example message in preview conversation","Ted Example has left the chat.")); //FIXME sync this with chat text logic.
    statusMessage.setTime(QDateTime::currentDateTime());
    statusMessage.setService(i18n("Jabber"));
    statusMessage.setStatus(QLatin1String("away"));
    ui->chatView->addAdiumStatusMessage(statusMessage);

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::RemoteToLocal);
    message.setMessage(i18nc("Example message in preview conversation","Hello Ted"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Larry Demo"));
    message.setService(i18n("Jabber"));
    message.appendMessageClass(QLatin1String("mention"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::RemoteToLocal);
    message.setMessage(i18nc("Example message in preview conversation","What's up?"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Larry Demo"));
    message.setService(i18n("Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::LocalToRemote);
    message.setMessage(i18nc("Example message in preview conversation","Check out which cool adium themes work "
                            "<a href=\"http://community.kde.org/KTp/Components/Chat_Window/Themes\">"
                            "here</a>!"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Ted Example"));
    message.setService(i18n("Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    if ( m_groupChat == true) {
        message = AdiumThemeContentInfo(AdiumThemeMessageInfo::RemoteToLocal);
        message.setMessage(i18nc("Example message in preview conversation","Hello"));
        message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
        message.setSenderScreenName(i18nc("Example name", "Bob Example"));
        message.setService(i18n("Jabber"));
        message.setTime(QDateTime::currentDateTime());
        ui->chatView->addAdiumContentMessage(message);
    }

    message = AdiumThemeContentInfo(AdiumThemeMessageInfo::LocalToRemote);
    message.setMessage(i18nc("Example message in preview conversation","A different example message"));
    message.setSenderDisplayName(i18nc("Example email", "*****@*****.**"));
    message.setSenderScreenName(i18nc("Example name", "Ted Example"));
    message.setService(i18n("Jabber"));
    message.setTime(QDateTime::currentDateTime());
    ui->chatView->addAdiumContentMessage(message);

    if (ui->chatView->showPresenceChanges()) {
        statusMessage = AdiumThemeStatusInfo();
        statusMessage.setMessage(i18nc("Example message in preview conversation","Ted Example is now Away.")); //FIXME sync this with chat text logic.
        statusMessage.setTime(QDateTime::currentDateTime());
        statusMessage.setService(i18n("Jabber"));
        statusMessage.setStatus(QLatin1String("away"));
        ui->chatView->addAdiumStatusMessage(statusMessage);

        statusMessage = AdiumThemeStatusInfo();
        statusMessage.setMessage(i18nc("Example message in preview conversations","Ted Example has left the chat.")); //FIXME sync this with chat text logic.
        statusMessage.setTime(QDateTime::currentDateTime());
        statusMessage.setService(i18n("Jabber"));
        statusMessage.setStatus(QLatin1String("away"));
        ui->chatView->addAdiumStatusMessage(statusMessage);
    }
}
void AdiumThemeView::initialise(const AdiumThemeHeaderInfo &chatInfo)
{
    QString headerHtml;
    QString templateHtml = m_chatStyle->getTemplateHtml();
    QString footerHtml = replaceHeaderKeywords(m_chatStyle->getFooterHtml(), chatInfo);
    QString extraStyleHtml = m_chatStyle->messageViewVersion() < 3 ? QLatin1String("")
                                                                   : QLatin1String("@import url( \"main.css\" );");
    m_lastContent = AdiumThemeContentInfo();

    if (templateHtml.isEmpty()) {
        // if templateHtml is empty, we failed to load the fallback template file
        KMessageBox::error(this, i18n("Missing required file Template.html - check your installation."));
    }

    if (m_displayHeader) {
        if (chatInfo.isGroupChat()) {
            // In group chats header should be replaced by topic
            headerHtml = replaceHeaderKeywords(m_chatStyle->getTopicHtml(), chatInfo);
        } else {
            headerHtml = replaceHeaderKeywords(m_chatStyle->getHeaderHtml(), chatInfo);
        }
    } //otherwise leave as blank.

    // set fontFamily and fontSize
    if (m_useCustomFont) {
        // use user specified fontFamily and Size
        settings()->setFontFamily(QWebSettings::StandardFont, m_fontFamily);
        settings()->setFontSize(QWebSettings::DefaultFontSize, m_fontSize);

        // since some themes are pretty odd and hardcode fonts to the css we need to override that
        // with some extra css. this may not work for all themes!
        extraStyleHtml.append (
            QString(QLatin1String("\n* {font-family:\"%1\" !important;font-size:%2pt !important};"))
            .arg( m_fontFamily )
            .arg( m_fontSize )
        );
    } else {
        // FIXME: we should inform the user if the chatStyle want's to use a fontFamily which is not present on the system
        QFontDatabase fontDB = QFontDatabase();
        kDebug() << "Theme font installed: " << m_chatStyle->defaultFontFamily()
        << fontDB.families().contains(m_chatStyle->defaultFontFamily());

        // use theme fontFamily/Size, if not existent, it falls back to systems default font
        settings()->setFontFamily(QWebSettings::StandardFont, m_chatStyle->defaultFontFamily());
        settings()->setFontSize(QWebSettings::DefaultFontSize, m_chatStyle->defaultFontSize());
    }

    //The templateHtml is in a horrific NSString format.
    //Want to use this rather than roll our own, as that way we can get templates from themes too
    //"%@" is each argument.
    // all other %'s are escaped.

    // first is baseref
    // second is extra style code (This is sometimes missing !!!!)
    // third is variant CSS
    // 4th is header
    // 5th is footer

    templateHtml.replace(QLatin1String("%%"), QLatin1String("%"));

    int numberOfPlaceholders = templateHtml.count(QLatin1String("%@"));

    int index = 0;
    index = templateHtml.indexOf(QLatin1String("%@"), index);
    templateHtml.replace(index, 2, QString(QLatin1String("file:///")).append(m_chatStyle->getStyleBaseHref()));

    if (numberOfPlaceholders == 5) {
        index = templateHtml.indexOf(QLatin1String("%@"), index);
        templateHtml.replace(index, 2, extraStyleHtml);
    }

    index = templateHtml.indexOf(QLatin1String("%@"), index);
    templateHtml.replace(index, 2, m_variantPath);

    index = templateHtml.indexOf(QLatin1String("%@"), index);
    templateHtml.replace(index, 2, headerHtml);

    index = templateHtml.indexOf(QLatin1String("%@"), index);
    templateHtml.replace(index, 2, footerHtml);

    setHtml(templateHtml);

    //hidden HTML debugging mode. Should have no visible way to turn it on.
    if (m_webInspector) {
        QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
    }
}