27#ifdef KALARMCAL_USE_KRESOURCES
31#include <klocalizedstring.h>
37const int MAIL_FROM_LINE = 0;
38const int MAIL_TO_LINE = 1;
39const int MAIL_CC_LINE = 2;
40const int MAIL_MIN_LINES = 4;
46class AlarmText::Private
49 enum Type { None, Email, Script, Todo };
50 QString displayText()
const;
52 static void initialise();
53 static void setUpTranslations();
54 static int emailHeaderCount(
const QStringList&);
55 static QString todoTitle(
const QString& text);
57 static QString mFromPrefix;
58 static QString mToPrefix;
59 static QString mCcPrefix;
60 static QString mDatePrefix;
61 static QString mSubjectPrefix;
62 static QString mTitlePrefix;
63 static QString mLocnPrefix;
64 static QString mDuePrefix;
65 static QString mFromPrefixEn;
66 static QString mToPrefixEn;
67 static QString mCcPrefixEn;
68 static QString mDatePrefixEn;
69 static QString mSubjectPrefixEn;
70 static bool mInitialised;
72 QString mBody, mFrom, mTo, mCc, mTime, mSubject;
73 unsigned long mKMailSerialNum;
78QString AlarmText::Private::mFromPrefix;
79QString AlarmText::Private::mToPrefix;
80QString AlarmText::Private::mCcPrefix;
81QString AlarmText::Private::mDatePrefix;
82QString AlarmText::Private::mSubjectPrefix;
83QString AlarmText::Private::mTitlePrefix;
84QString AlarmText::Private::mLocnPrefix;
85QString AlarmText::Private::mDuePrefix;
86QString AlarmText::Private::mFromPrefixEn;
87QString AlarmText::Private::mToPrefixEn;
88QString AlarmText::Private::mCcPrefixEn;
89QString AlarmText::Private::mDatePrefixEn;
90QString AlarmText::Private::mSubjectPrefixEn;
91bool AlarmText::Private::mInitialised =
false;
93void AlarmText::Private::initialise()
98 mFromPrefixEn = QLatin1String(
"From:");
99 mToPrefixEn = QLatin1String(
"To:");
100 mCcPrefixEn = QLatin1String(
"Cc:");
101 mDatePrefixEn = QLatin1String(
"Date:");
102 mSubjectPrefixEn = QLatin1String(
"Subject:");
109 Private::initialise();
114 : d(new Private(*other.d))
118AlarmText::~AlarmText()
123AlarmText& AlarmText::operator=(
const AlarmText& other)
134 if (text.startsWith(QLatin1String(
"#!")))
135 d->mType = Private::Script;
141 d->mType = Private::Script;
145 const QString& subject,
const QString& body,
unsigned long kmailSerialNumber)
148 d->mType = Private::Email;
158#ifndef KALARMCAL_USE_KRESOURCES
165 d->mType = Private::Todo;
166 d->mSubject = todo->summary();
167 d->mBody = todo->description();
168 d->mTo = todo->location();
169 if (todo->hasDueDate())
171 KDateTime due = todo->dtDue(
false);
172 if (todo->hasStartDate() && todo->dtStart() != due)
174 d->mTime = todo->allDay() ? KGlobal::locale()->formatDate(due.date(), KLocale::ShortDate)
175 : KGlobal::locale()->formatDateTime(due.dateTime());
185 return d->displayText();
188QString AlarmText::Private::displayText()
const
196 text = mFromPrefix + QLatin1Char(
'\t') + mFrom + QLatin1Char(
'\n');
197 text += mToPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
199 text += mCcPrefix + QLatin1Char(
'\t') + mCc + QLatin1Char(
'\n');
200 if (!mTime.isEmpty())
201 text += mDatePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
202 text += mSubjectPrefix + QLatin1Char(
'\t') + mSubject;
203 if (!mBody.isEmpty())
205 text += QLatin1String(
"\n\n");
212 if (!mSubject.isEmpty())
213 text = mTitlePrefix + QLatin1Char(
'\t') + mSubject + QLatin1Char(
'\n');
215 text += mLocnPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
216 if (!mTime.isEmpty())
217 text += mDuePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
218 if (!mBody.isEmpty())
221 text += QLatin1Char(
'\n');
228 return !text.isEmpty() ? text : mBody;
233 return (d->mType == Private::Email) ? d->mTo : QString();
238 return (d->mType == Private::Email) ? d->mFrom : QString();
243 return (d->mType == Private::Email) ? d->mCc : QString();
248 return (d->mType == Private::Email) ? d->mTime : QString();
253 return (d->mType == Private::Email) ? d->mSubject : QString();
258 return (d->mType == Private::Email) ? d->mBody : QString();
263 return (d->mType == Private::Todo) ? d->mSubject : QString();
268 return (d->mType == Private::Todo) ? d->mTo : QString();
273 return (d->mType == Private::Todo) ? d->mTime : QString();
278 return (d->mType == Private::Todo) ? d->mBody : QString();
286 if (!d->mBody.isEmpty())
288 if (d->mType != Private::Email)
290 return d->mFrom.isEmpty() && d->mTo.isEmpty() && d->mCc.isEmpty() && d->mTime.isEmpty() && d->mSubject.isEmpty();
295 return d->mType == Private::Email;
300 return d->mType == Private::Script;
305 return d->mType == Private::Todo;
310 return d->mKMailSerialNum;
321 static const QRegExp localfile(QLatin1String(
"^file:/+"));
326 text =
event.audioFile();
327 if (localfile.indexIn(text) >= 0)
328 text = text.mid(localfile.matchedLength() - 1);
331 text =
event.emailSubject();
334 text =
event.cleanText();
335 if (localfile.indexIn(text) >= 0)
336 text = text.mid(localfile.matchedLength() - 1);
339 text =
event.cleanText();
343 text =
event.cleanText();
356 subject = Private::todoTitle(text);
369 if (text.count(QLatin1Char(
'\n')) < maxLines)
372 for (
int i = 0; i < maxLines; ++i)
374 newline = text.indexOf(QLatin1Char(
'\n'), newline + 1);
378 if (newline ==
static_cast<int>(text.length()) - 1)
379 return text.left(newline);
382 return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QLatin1String(
"...");
390 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
391 return Private::emailHeaderCount(lines);
401 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
402 const int n = Private::emailHeaderCount(lines);
406 return lines[n-1].mid(Private::mSubjectPrefix.length()).trimmed();
407 QString h = lines[0];
408 for (
int i = 1; i < n; ++i)
410 h += QLatin1Char(
'\n');
424 Private::initialise();
425 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
426 const int maxn = lines.count();
427 if (maxn >= MAIL_MIN_LINES
428 && lines[MAIL_FROM_LINE].startsWith(Private::mFromPrefixEn)
429 && lines[MAIL_TO_LINE].startsWith(Private::mToPrefixEn))
431 int n = MAIL_CC_LINE;
432 if (lines[MAIL_CC_LINE].startsWith(Private::mCcPrefixEn))
435 && lines[n].startsWith(Private::mDatePrefixEn)
436 && lines[n+1].startsWith(Private::mSubjectPrefixEn))
438 Private::setUpTranslations();
440 dispText = Private::mFromPrefix + lines[MAIL_FROM_LINE].mid(Private::mFromPrefixEn.length()) + QLatin1Char(
'\n');
441 dispText += Private::mToPrefix + lines[MAIL_TO_LINE].mid(Private::mToPrefixEn.length()) + QLatin1Char(
'\n');
442 if (n > MAIL_CC_LINE)
443 dispText += Private::mCcPrefix + lines[MAIL_CC_LINE].mid(Private::mCcPrefixEn.length()) + QLatin1Char(
'\n');
444 dispText += Private::mDatePrefix + lines[n].mid(Private::mDatePrefixEn.length()) + QLatin1Char(
'\n');
445 dispText += Private::mSubjectPrefix + lines[n+1].mid(Private::mSubjectPrefixEn.length());
446 int i = text.indexOf(Private::mSubjectPrefixEn);
447 i = text.indexOf(QLatin1Char(
'\n'), i);
449 dispText += text.mid(i);
464 Private::setUpTranslations();
465 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
466 const int maxn = lines.count();
467 if (maxn >= MAIL_MIN_LINES
468 && lines[MAIL_FROM_LINE].startsWith(Private::mFromPrefix)
469 && lines[MAIL_TO_LINE].startsWith(Private::mToPrefix))
471 int n = MAIL_CC_LINE;
472 if (lines[MAIL_CC_LINE].startsWith(Private::mCcPrefix))
475 && lines[n].startsWith(Private::mDatePrefix)
476 && lines[n+1].startsWith(Private::mSubjectPrefix))
480 calText = Private::mFromPrefixEn + lines[MAIL_FROM_LINE].mid(Private::mFromPrefix.length()) + QLatin1Char(
'\n');
481 calText += Private::mToPrefixEn + lines[MAIL_TO_LINE].mid(Private::mToPrefix.length()) + QLatin1Char(
'\n');
482 if (n > MAIL_CC_LINE)
483 calText += Private::mCcPrefixEn + lines[MAIL_CC_LINE].mid(Private::mCcPrefix.length()) + QLatin1Char(
'\n');
484 calText += Private::mDatePrefixEn + lines[n].mid(Private::mDatePrefix.length()) + QLatin1Char(
'\n');
485 calText += Private::mSubjectPrefixEn + lines[n+1].mid(Private::mSubjectPrefix.length());
486 int i = text.indexOf(Private::mSubjectPrefix);
487 i = text.indexOf(QLatin1Char(
'\n'), i);
489 calText += text.mid(i);
496void AlarmText::Private::clear()
511void AlarmText::Private::setUpTranslations()
514 if (mFromPrefix.isNull())
516 mFromPrefix = i18nc(
"@info/plain 'From' email address",
"From:");
517 mToPrefix = i18nc(
"@info/plain Email addressee",
"To:");
518 mCcPrefix = i18nc(
"@info/plain Copy-to in email headers",
"Cc:");
519 mDatePrefix = i18nc(
"@info/plain",
"Date:");
520 mSubjectPrefix = i18nc(
"@info/plain Email subject",
"Subject:");
522 mTitlePrefix = i18nc(
"@info/plain Todo calendar item's title field",
"To-do:");
523 mLocnPrefix = i18nc(
"@info/plain Todo calendar item's location field",
"Location:");
524 mDuePrefix = i18nc(
"@info/plain Todo calendar item's due date/time",
"Due:");
532int AlarmText::Private::emailHeaderCount(
const QStringList& lines)
535 const int maxn = lines.count();
536 if (maxn >= MAIL_MIN_LINES
537 && lines[MAIL_FROM_LINE].startsWith(mFromPrefix)
538 && lines[MAIL_TO_LINE].startsWith(mToPrefix))
540 int n = MAIL_CC_LINE;
541 if (lines[MAIL_CC_LINE].startsWith(mCcPrefix))
544 && lines[n].startsWith(mDatePrefix)
545 && lines[n+1].startsWith(mSubjectPrefix))
554QString AlarmText::Private::todoTitle(
const QString& text)
557 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
559 for (n = 0; n < lines.count() && lines[n].contains(QLatin1Char(
'\t')); ++n) ;
564 if (lines[i].startsWith(mTitlePrefix + QLatin1Char(
'\t')))
566 title = lines[i].mid(mTitlePrefix.length()).trimmed();
569 if (i < n && lines[i].startsWith(mLocnPrefix + QLatin1Char(
'\t')))
571 if (i < n && lines[i].startsWith(mDuePrefix + QLatin1Char(
'\t')))
576 if (!title.isEmpty())
578 if (n < lines.count())
Parses email, todo and script alarm texts.
void setText(const QString &text)
Set the alarm text.
QString body() const
Return the email message body.
QString summary() const
Return the summary text for a todo.
QString location() const
Return the location text for a todo.
bool isEmail() const
Return whether the instance contains the text of an email.
QString cc() const
Return the 'Cc' header parameter for an email alarm.
QString due() const
Return the due date text for a todo.
static QString fromCalendarText(const QString &text, bool &email)
Translate an alarm calendar text to a display text.
QString subject() const
Return the 'Subject' header parameter for an email alarm.
void setEmail(const QString &to, const QString &from, const QString &cc, const QString &time, const QString &subject, const QString &body, unsigned long kmailSerialNumber=0)
Set the instance contents to be an email.
AlarmText(const QString &text=QString())
Constructor which sets the alarm text.
unsigned long kmailSerialNumber() const
Return the kmail serial number of an email.
QString time() const
Return the 'Date' header parameter for an email alarm.
QString from() const
Return the 'From' header parameter for an email alarm.
QString displayText() const
Return the text for a text message alarm, in display format.
static QString emailHeaders(const QString &text, bool subjectOnly)
Check whether a text is an email (with at least To and From headers), and if so return its headers or...
bool isEmpty() const
Return whether there is any text.
QString description() const
Return the description text for a todo.
bool isScript() const
Return whether the instance contains the text of a script.
static bool checkIfEmail(const QString &text)
Return whether a text is an email, with at least To and From headers.
void setScript(const QString &text)
Set the instance contents to be a script.
bool isTodo() const
Return whether the instance contains the text of a todo.
static QString toCalendarText(const QString &text)
Return the text for an alarm message text, in alarm calendar format.
void setTodo(const KCalCore::Todo::Ptr &todo)
Set the instance contents to be a todo.
QString to() const
Return the 'To' header parameter for an email alarm.
KAEvent represents a KAlarm event.
@ FILE
display the contents of a file
@ COMMAND
execute a command
@ MESSAGE
display a message text
@ AUDIO
play an audio file
SubAction actionSubType() const
Return the action sub-type of the event's main alarm.
QSharedPointer< Todo > Ptr