diff options
Diffstat (limited to 'kalarm/alarmtext.cpp')
-rw-r--r-- | kalarm/alarmtext.cpp | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/kalarm/alarmtext.cpp b/kalarm/alarmtext.cpp new file mode 100644 index 000000000..2162f62a4 --- /dev/null +++ b/kalarm/alarmtext.cpp @@ -0,0 +1,288 @@ +/* + * alarmtext.cpp - text/email alarm text conversion + * Program: kalarm + * Copyright (C) 2004, 2005 by David Jarvie <software@astrojar.org.uk> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kalarm.h" +#include <qstringlist.h> +#include <klocale.h> + +#include "alarmevent.h" +#include "editdlg.h" +#include "alarmtext.h" + + +QString AlarmText::mFromPrefix; +QString AlarmText::mToPrefix; +QString AlarmText::mCcPrefix; +QString AlarmText::mDatePrefix; +QString AlarmText::mSubjectPrefix; +QString AlarmText::mFromPrefixEn = QString::fromLatin1("From:"); +QString AlarmText::mToPrefixEn = QString::fromLatin1("To:"); +QString AlarmText::mCcPrefixEn = QString::fromLatin1("Cc:"); +QString AlarmText::mDatePrefixEn = QString::fromLatin1("Date:"); +QString AlarmText::mSubjectPrefixEn = QString::fromLatin1("Subject:"); + + +void AlarmText::setText(const QString& text) +{ + mBody = text; + mIsScript = text.startsWith(QString::fromLatin1("#!")); + mIsEmail = false; + mTo = mFrom = mCc = mTime = mSubject = QString::null; + mKMailSerialNum = 0; +} + +void AlarmText::setEmail(const QString& to, const QString& from, const QString& cc, const QString& time, + const QString& subject, const QString& body, unsigned long kmailSerialNumber) +{ + mIsScript = false; + mIsEmail = true; + mTo = to; + mFrom = from; + mCc = cc; + mTime = time; + mSubject = subject; + mBody = body; + mKMailSerialNum = kmailSerialNumber; +} + +/****************************************************************************** +* Return the text for a text message alarm, in display format. +*/ +QString AlarmText::displayText() const +{ + if (mIsEmail) + { + // Format the email into a text alarm + setUpTranslations(); + QString text; + text = mFromPrefix + '\t' + mFrom + '\n'; + text += mToPrefix + '\t' + mTo + '\n'; + if (!mCc.isEmpty()) + text += mCcPrefix + '\t' + mCc + '\n'; + if (!mTime.isEmpty()) + text += mDatePrefix + '\t' + mTime + '\n'; + text += mSubjectPrefix + '\t' + mSubject; + if (!mBody.isEmpty()) + { + text += "\n\n"; + text += mBody; + } + return text; + } + return mBody; +} + +/****************************************************************************** +* Return whether there is any text. +*/ +bool AlarmText::isEmpty() const +{ + if (!mBody.isEmpty()) + return false; + if (!mIsEmail) + return true; + return mFrom.isEmpty() && mTo.isEmpty() && mCc.isEmpty() && mTime.isEmpty() && mSubject.isEmpty(); +} + +/****************************************************************************** +* Check whether a text is an email. +*/ +bool AlarmText::checkIfEmail(const QString& text) +{ + QStringList lines = QStringList::split('\n', text); + return emailHeaderCount(lines); +} + +/****************************************************************************** +* Check whether a text is an email. +* Reply = number of email header lines, or 0 if not an email. +*/ +int AlarmText::emailHeaderCount(const QStringList& lines) +{ + setUpTranslations(); + int maxn = lines.count(); + if (maxn >= 4 + && lines[0].startsWith(mFromPrefix) + && lines[1].startsWith(mToPrefix)) + { + int n = 2; + if (lines[2].startsWith(mCcPrefix)) + ++n; + if (maxn > n + 1 + && lines[n].startsWith(mDatePrefix) + && lines[n+1].startsWith(mSubjectPrefix)) + return n+2; + } + return 0; +} + +/****************************************************************************** +* Check whether a text is an email, and if so return its headers or optionally +* only its subject line. +* Reply = headers/subject line, or QString::null if not the text of an email. +*/ +QString AlarmText::emailHeaders(const QString& text, bool subjectOnly) +{ + QStringList lines = QStringList::split('\n', text); + int n = emailHeaderCount(lines); + if (!n) + return QString::null; + if (subjectOnly) + return lines[n-1].mid(mSubjectPrefix.length()).stripWhiteSpace(); + QString h = lines[0]; + for (int i = 1; i < n; ++i) + { + h += '\n'; + h += lines[i]; + } + return h; +} + +/****************************************************************************** +* Translate an alarm calendar text to a display text. +* Translation is needed for email texts, since the alarm calendar stores +* untranslated email prefixes. +* 'email' is set to indicate whether it is an email text. +*/ +QString AlarmText::fromCalendarText(const QString& text, bool& email) +{ + QStringList lines = QStringList::split('\n', text); + int maxn = lines.count(); + if (maxn >= 4 + && lines[0].startsWith(mFromPrefixEn) + && lines[1].startsWith(mToPrefixEn)) + { + int n = 2; + if (lines[2].startsWith(mCcPrefixEn)) + ++n; + if (maxn > n + 1 + && lines[n].startsWith(mDatePrefixEn) + && lines[n+1].startsWith(mSubjectPrefixEn)) + { + setUpTranslations(); + QString dispText; + dispText = mFromPrefix + lines[0].mid(mFromPrefixEn.length()) + '\n'; + dispText += mToPrefix + lines[1].mid(mToPrefixEn.length()) + '\n'; + if (n == 3) + dispText += mCcPrefix + lines[2].mid(mCcPrefixEn.length()) + '\n'; + dispText += mDatePrefix + lines[n].mid(mDatePrefixEn.length()) + '\n'; + dispText += mSubjectPrefix + lines[n+1].mid(mSubjectPrefixEn.length()); + int i = text.find(mSubjectPrefixEn); + i = text.find('\n', i); + if (i > 0) + dispText += text.mid(i); + email = true; + return dispText; + } + } + email = false; + return text; +} + +/****************************************************************************** +* Return the text for a text message alarm, in alarm calendar format. +* (The prefix strings are untranslated in the calendar.) +*/ +QString AlarmText::toCalendarText(const QString& text) +{ + setUpTranslations(); + QStringList lines = QStringList::split('\n', text); + int maxn = lines.count(); + if (maxn >= 4 + && lines[0].startsWith(mFromPrefix) + && lines[1].startsWith(mToPrefix)) + { + int n = 2; + if (lines[2].startsWith(mCcPrefix)) + ++n; + if (maxn > n + 1 + && lines[n].startsWith(mDatePrefix) + && lines[n+1].startsWith(mSubjectPrefix)) + { + // Format the email into a text alarm + QString calText; + calText = mFromPrefixEn + lines[0].mid(mFromPrefix.length()) + '\n'; + calText += mToPrefixEn + lines[1].mid(mToPrefix.length()) + '\n'; + if (n == 3) + calText += mCcPrefixEn + lines[2].mid(mCcPrefix.length()) + '\n'; + calText += mDatePrefixEn + lines[n].mid(mDatePrefix.length()) + '\n'; + calText += mSubjectPrefixEn + lines[n+1].mid(mSubjectPrefix.length()); + int i = text.find(mSubjectPrefix); + i = text.find('\n', i); + if (i > 0) + calText += text.mid(i); + return calText; + } + } + return text; +} + +/****************************************************************************** +* Set up messages used by executeDropEvent() and emailHeaders(). +*/ +void AlarmText::setUpTranslations() +{ + if (mFromPrefix.isNull()) + { + mFromPrefix = EditAlarmDlg::i18n_EmailFrom(); + mToPrefix = EditAlarmDlg::i18n_EmailTo(); + mCcPrefix = i18n("Copy-to in email headers", "Cc:"); + mDatePrefix = i18n("Date:"); + mSubjectPrefix = EditAlarmDlg::i18n_EmailSubject(); + } +} + +/****************************************************************************** +* Return the alarm summary text for either single line or tooltip display. +* The maximum number of line returned is determined by 'maxLines'. +* If 'truncated' is non-null, it will be set true if the text returned has been +* truncated, other than to strip a trailing newline. +*/ +QString AlarmText::summary(const KAEvent& event, int maxLines, bool* truncated) +{ + QString text = (event.action() == KAEvent::EMAIL) ? event.emailSubject() : event.cleanText(); + if (event.action() == KAEvent::MESSAGE) + { + // If the message is the text of an email, return its headers or just subject line + QString subject = emailHeaders(text, (maxLines <= 1)); + if (!subject.isNull()) + { + if (truncated) + *truncated = true; + return subject; + } + } + if (truncated) + *truncated = false; + if (text.contains('\n') < maxLines) + return text; + int newline = -1; + for (int i = 0; i < maxLines; ++i) + { + newline = text.find('\n', newline + 1); + if (newline < 0) + return text; // not truncated after all !?! + } + if (newline == static_cast<int>(text.length()) - 1) + return text.left(newline); // text ends in newline + if (truncated) + *truncated = true; + return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QString::fromLatin1("..."); +} |