/* * Copyright (c) 2013 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swift/QtUI/Roster/RosterTooltip.h> #include <QApplication> #include <QObject> #include <QString> #include <Swiften/Base/Path.h> #include <Swift/Controllers/Roster/ContactRosterItem.h> #include <Swift/Controllers/StatusUtil.h> #include <Swift/Controllers/Translator.h> #include <Swift/QtUI/QtResourceHelper.h> #include <Swift/QtUI/QtScaledAvatarCache.h> #include <Swift/QtUI/QtSwiftUtil.h> #include <Swift/QtUI/QtUtilities.h> using namespace QtUtilities; namespace Swift { QString RosterTooltip::buildDetailedTooltip(ContactRosterItem* contact, QtScaledAvatarCache* cachedImageScaler) { QString tooltipTemplate; if (QApplication::layoutDirection() == Qt::RightToLeft) { tooltipTemplate = QString( "<table style='white-space:pre'>" "<tr>" "<td>" "<img src=\"%1\" />" "</td>" "<td>" "<p style='font-size: 14px'>%3 %2</p>" "<table><tr><td valign='middle'>%5</td><td valign='middle'>%4</td></tr></table>" "%6" "%7" "%8" "%9" "</td>" "</tr>" "</table>"); } else { tooltipTemplate = QString( "<table style='white-space:pre'>" "<tr>" "<td>" "<img src=\"%1\" />" "</td>" "<td>" "<p style='font-size: 14px'>%2 %3</p>" "<table><tr><td valign='middle'>%4</td><td valign='middle'>%5</td></tr></table>" "%6" "%7" "%8" "%9" "</td>" "</tr>" "</table>"); } // prepare tooltip QString fullName = P2QSTRING(contact->getDisplayName()); QString vCardSummary; VCard::ref vCard = contact->getVCard(); if (vCard) { fullName = P2QSTRING(vCard->getFullName()).trimmed(); if (fullName.isEmpty()) { fullName = (P2QSTRING(vCard->getGivenName()) + " " + P2QSTRING(vCard->getFamilyName())).trimmed(); } if (fullName.isEmpty()) { fullName = P2QSTRING(contact->getDisplayName()); } vCardSummary = buildVCardSummary(vCard); } else { contact->onVCardRequested(); } QString scaledAvatarPath = cachedImageScaler->getScaledAvatarPath(P2QSTRING(contact->getAvatarPath().empty() ? ":/icons/avatar.svg" : pathToString(contact->getAvatarPath()))); QString bareJID = contact->getDisplayJID().toString().empty() ? "" : "( " + P2QSTRING(contact->getDisplayJID().toString()) + " )"; QString presenceIconTag = QString("<img src='%1' />").arg(statusShowTypeToIconPath(contact->getStatusShow())); QString statusMessage = contact->getStatusText().empty() ? QObject::tr("(No message)") : P2QSTRING(contact->getStatusText()); boost::posix_time::ptime idleTime = contact->getIdle(); QString idleString; if (!idleTime.is_not_a_date_time()) { idleString = QObject::tr("Idle since %1").arg(P2QSTRING(Swift::Translator::getInstance()->ptimeToHumanReadableString(idleTime))); idleString = htmlEscape(idleString) + "<br/>"; } boost::posix_time::ptime lastSeenTime = contact->getOfflineSince(); QString lastSeen; if (!lastSeenTime.is_not_a_date_time()) { lastSeen = QObject::tr("Last seen %1").arg(P2QSTRING(Swift::Translator::getInstance()->ptimeToHumanReadableString(lastSeenTime))); lastSeen = htmlEscape(lastSeen) + "<br/>"; } QString mucOccupant= P2QSTRING(contact->getMUCAffiliationText()); if (!mucOccupant.isEmpty()) { mucOccupant = htmlEscape(mucOccupant) + "<br/>"; } return tooltipTemplate.arg(scaledAvatarPath, htmlEscape(fullName), htmlEscape(bareJID), presenceIconTag, htmlEscape(statusMessage), mucOccupant, idleString, lastSeen, vCardSummary); } QString RosterTooltip::buildVCardSummary(VCard::ref vcard) { QString summary; summary = "<table>"; // star | name | content QString currentBlock; foreach (const VCard::Telephone& tel, vcard->getTelephones()) { QString type = tel.isFax ? QObject::tr("Fax") : QObject::tr("Telephone"); QString field = buildVCardField(tel.isPreferred, type, htmlEscape(P2QSTRING(tel.number))); if (tel.isPreferred) { currentBlock = field; break; } currentBlock += field; } summary += currentBlock; currentBlock = ""; foreach (const VCard::EMailAddress& mail, vcard->getEMailAddresses()) { QString field = buildVCardField(mail.isPreferred, QObject::tr("E-Mail"), htmlEscape(P2QSTRING(mail.address))); if (mail.isPreferred) { currentBlock = field; break; } currentBlock += field; } summary += currentBlock; currentBlock = ""; foreach (const VCard::Organization& org, vcard->getOrganizations()) { QString field = buildVCardField(false, QObject::tr("Organization"), htmlEscape(P2QSTRING(org.name))); currentBlock += field; } summary += currentBlock; currentBlock = ""; foreach(const std::string& title, vcard->getTitles()) { QString field = buildVCardField(false, QObject::tr("Title"), htmlEscape(P2QSTRING(title))); currentBlock += field; } summary += currentBlock; summary += "</table>"; return summary; } QString RosterTooltip::buildVCardField(bool preferred, const QString& name, const QString& content) { QString rowTemplate; if (QApplication::layoutDirection() == Qt::RightToLeft) { rowTemplate = QString("<tr><td>%3</td><td valign='middle'><strong>%2</strong></td><td valign='middle'>%1</td></tr>"); } else { rowTemplate = QString("<tr><td>%1</td><td valign='middle'><strong>%2</strong></td><td valign='middle'>%3</td></tr>"); } return rowTemplate.arg(preferred ? "<img src=':/icons/star-checked.png' />" : "", name, content); } }