Diffstat (limited to 'korganizer/koeventviewer.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | korganizer/koeventviewer.cpp | 510 |
1 files changed, 510 insertions, 0 deletions
diff --git a/korganizer/koeventviewer.cpp b/korganizer/koeventviewer.cpp new file mode 100644 index 0000000..9f8bd9b --- a/dev/null +++ b/korganizer/koeventviewer.cpp @@ -0,0 +1,510 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include <qcstring.h> +#include <qwhatsthis.h> +#include <qdialog.h> +#include <qapplication.h> +#include <qlabel.h> +#include <qlayout.h> + +#include <klocale.h> +#include <kapplication.h> +#include <libkcal/event.h> +#include <libkcal/todo.h> +#include <kdebug.h> +#include <kiconloader.h> +#include <krun.h> +#include <kglobal.h> +#include <kprocess.h> +#include "koprefs.h" + +#include <libkdepim/addresseeview.h> +#include <kabc/stdaddressbook.h> + +#ifndef KORG_NODCOP +#include <dcopclient.h> +#include "korganizer.h" +#include "koprefs.h" +#include "actionmanager.h" +#endif + +#include "koeventviewer.h" +#include "koeventviewer.moc" +#ifndef KORG_NOKABC +#include <kabc/stdaddressbook.h> +#define size count +#endif +KOEventViewer::KOEventViewer(QWidget *parent,const char *name) + : QTextBrowser(parent,name) +{ + mSyncMode = false; + mColorMode = 0; +} + +KOEventViewer::~KOEventViewer() +{ +} + +void KOEventViewer::setSource(const QString& n) +{ + KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); + KABC::AddressBook::Iterator it; + for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { + // LR I do not understand, why the uid string is different on zaurus and desktop +#ifdef DESKTOP_VERSION + QString uid = "uid://"+(*it).uid(); +#else + QString uid = "uid:"+(*it).uid(); +#endif + //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1()); + if (n == uid ) { + //qDebug("found %s ",(*it).mobileHomePhone().latin1() ); + QDialog dia( this,"dia123", true ); + dia.setCaption( i18n("Details of attendee") ); + QVBoxLayout lay ( &dia ); + KPIM::AddresseeView av ( &dia ); + av.setAddressee( (*it) ); + lay.addWidget( &av ); + if ( QApplication::desktop()->width() < 480 ) + dia.resize( 220, 240); + else { + dia.resize( 400,400); + + } + dia.exec(); + break; + } + } + + +#ifndef KORG_NODCOP + kdDebug() << "KOEventViewer::setSource(): " << n << endl; + QString tmpStr; + if (n.startsWith("mailto:")) { + KApplication::kApplication()->invokeMailer(n.mid(7),QString::null); + //emit showIncidence(n); + return; + } else if (n.startsWith("uid:")) { + DCOPClient *client = KApplication::kApplication()->dcopClient(); + const QByteArray noParamData; + const QByteArray paramData; + QByteArray replyData; + QCString replyTypeStr; +#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData)) + bool foundAbbrowser = PING_ABBROWSER; + + if (foundAbbrowser) { + //KAddressbook is already running, so just DCOP to it to bring up the contact editor + //client->send("kaddressbook","KAddressBookIface", + QDataStream arg(paramData, IO_WriteOnly); + arg << n.mid(6); + client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData); + return; + } else { + /* + KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater. + We start it without its main interface + */ + KIconLoader* iconLoader = new KIconLoader(); + QString iconPath = iconLoader->iconPath("go",KIcon::Small); + ActionManager::setStartedKAddressBook(true); + tmpStr = "kaddressbook --editor-only --uid "; + tmpStr += KProcess::quote(n.mid(6)); + KRun::runCommand(tmpStr,"KAddressBook",iconPath); + return; + } + } else { + //QTextBrowser::setSource(n); + } +#endif +} + +void KOEventViewer::addTag(const QString & tag,const QString & text) +{ + int number=text.contains("\n"); + QString str = "<" + tag + ">"; + QString tmpText=text; + QString tmpStr=str; + if(number !=-1) + { + if (number > 0) { + int pos=0; + QString tmp; + for(int i=0;i<=number;i++) { + pos=tmpText.find("\n"); + tmp=tmpText.left(pos); + tmpText=tmpText.right(tmpText.length()-pos-1); + tmpStr+=tmp+"<br>"; + } + } + else tmpStr += tmpText; + tmpStr+="</" + tag + ">"; + mText.append(tmpStr); + } + else + { + str += text + "</" + tag + ">"; + mText.append(str); + } +} + +void KOEventViewer::setColorMode( int m ) +{ + mColorMode = m; +} +void KOEventViewer::appendEvent(Event *event, int mode ) +{ + mCurrentIncidence = event; + bool shortDate = KOPrefs::instance()->mShortDateInViewer; + topLevelWidget()->setCaption(i18n("Event Viewer")); + if ( mode == 0 ) { + addTag("h2",event->summary()); + } + else { + if ( mColorMode == 1 ) { + mText +="<font color=\"#00A000\">"; + } + if ( mColorMode == 2 ) { + mText +="<font color=\"#C00000\">"; + } + // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; + if ( mode == 1 ) { + addTag("h2",i18n( "Local: " ) +event->summary()); + } else { + addTag("h2",i18n( "Remote: " ) +event->summary()); + } + addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); + if ( mColorMode ) + mText += "</font>"; + } + if (event->cancelled ()) { + mText +="<font color=\"#B00000\">"; + addTag("i",i18n("This event has been cancelled!")); + mText.append("<br>"); + mText += "</font>"; + } + if (!event->location().isEmpty()) { + addTag("b",i18n("Location: ")); + mText.append(event->location()+"<br>"); + } + if (event->doesFloat()) { + if (event->isMultiDay()) { + mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") + .arg(event->dtStartDateStr(shortDate)) + .arg(event->dtEndDateStr(shortDate))); + } else { + mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); + } + } else { + if (event->isMultiDay()) { + mText.append(i18n("<p><b>From:</b> %1</p> ") + .arg(event->dtStartStr( shortDate))); + mText.append(i18n("<p><b>To:</b> %1</p>") + .arg(event->dtEndStr(shortDate))); + } else { + mText.append(i18n("<p><b>On:</b> %1</p> ") + .arg(event->dtStartDateStr( shortDate ))); + mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") + .arg(event->dtStartTimeStr()) + .arg(event->dtEndTimeStr())); + } + } + + if (event->recurrence()->doesRecur()) { + + QString recurText = event->recurrence()->recurrenceText(); + addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); + bool last; + QDate start = QDate::currentDate(); + QDate next; + next = event->recurrence()->getPreviousDate( start , &last ); + if ( !last ) { + next = event->recurrence()->getNextDate( start.addDays( - 1 ) ); + addTag("p",i18n("<b>Next recurrence is on:</b>") ); + addTag("p", KGlobal::locale()->formatDate( next, shortDate )); + } else { + addTag("p",i18n("<b>Last recurrence was on:</b>") ); + addTag("p", KGlobal::locale()->formatDate( next, shortDate )); + } + } + + + if (event->isAlarmEnabled()) { + Alarm *alarm =event->alarms().first() ; + QDateTime t = alarm->time(); + int min = t.secsTo( event->dtStart() )/60; + QString s =i18n("( %1 min before )").arg( min ); + addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); + addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); + //addTag("p",s); + } + + addTag("b",i18n("Access: ")); + mText.append(event->secrecyStr()+"<br>"); + if (!event->description().isEmpty()) { + addTag("p",i18n("<b>Details: </b>")); + addTag("p",event->description()); + } + + formatCategories(event); + + formatReadOnly(event); + formatAttendees(event); + + setText(mText); + //QWhatsThis::add(this,mText); + +} + +void KOEventViewer::appendTodo(Todo *event, int mode ) +{ + mCurrentIncidence = event; + topLevelWidget()->setCaption(i18n("Todo Viewer")); + bool shortDate = KOPrefs::instance()->mShortDateInViewer; + if (mode == 0 ) + addTag("h2",event->summary()); + else { + if ( mColorMode == 1 ) { + mText +="<font color=\"#00A000\">"; + } + if ( mColorMode == 2 ) { + mText +="<font color=\"#B00000\">"; + } + if ( mode == 1 ) { + addTag("h2",i18n( "Local: " ) +event->summary()); + } else { + addTag("h2",i18n( "Remote: " ) +event->summary()); + } + addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); + if ( mColorMode ) + mText += "</font>"; + } + if (event->cancelled ()) { + mText +="<font color=\"#B00000\">"; + addTag("i",i18n("This todo has been cancelled!")); + mText.append("<br>"); + mText += "</font>"; + } + + if (!event->location().isEmpty()) { + addTag("b",i18n("Location: ")); + mText.append(event->location()+"<br>"); + } + if (event->hasDueDate()) { + mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer))); + } + addTag("b",i18n("Access: ")); + mText.append(event->secrecyStr()+"<br>"); + if (!event->description().isEmpty()) { + addTag("p",i18n("<b>Details: </b>")); + addTag("p",event->description()); + } + + formatCategories(event); + + mText.append(i18n("<p><b>Priority:</b> %2</p>") + .arg(QString::number(event->priority()))); + + mText.append(i18n("<p><i>%1 % completed</i></p>") + .arg(event->percentComplete())); + + formatReadOnly(event); + formatAttendees(event); + + setText(mText); +} + +void KOEventViewer::formatCategories(Incidence *event) +{ + if (!event->categoriesStr().isEmpty()) { + if (event->categories().count() == 1) { + addTag("h3",i18n("Category")); + } else { + addTag("h3",i18n("Categories")); + } + addTag("p",event->categoriesStr()); + } +} +void KOEventViewer::formatAttendees(Incidence *event) +{ + QPtrList<Attendee> attendees = event->attendees(); + if (attendees.count()) { + + + QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); + addTag("h3",i18n("Organizer")); + mText.append("<ul><li>"); +#ifndef KORG_NOKABC + + KABC::AddressBook *add_book = KABC::StdAddressBook::self(); + KABC::Addressee::List addressList; + addressList = add_book->findByEmail(event->organizer()); + KABC::Addressee o = addressList.first(); + if (!o.isEmpty() && addressList.size()<2) { + mText += "<a href=\"uid:" + o.uid() + "\">"; + mText += o.formattedName(); + mText += "</a>\n"; + } else { + mText.append(event->organizer()); + } +#else + mText.append(event->organizer()); +#endif + + if (iconPath) { + mText += " <a href=\"mailto:" + event->organizer() + "\">"; + mText += "<IMG src=\"" + iconPath + "\">"; + mText += "</a>\n"; + } + mText.append("</li></ul>"); + + addTag("h3",i18n("Attendees")); + Attendee *a; + mText.append("<ul>"); + for(a=attendees.first();a;a=attendees.next()) { +#ifndef KORG_NOKABC + if (a->name().isEmpty()) { + addressList = add_book->findByEmail(a->email()); + KABC::Addressee o = addressList.first(); + if (!o.isEmpty() && addressList.size()<2) { + mText += "<a href=\"uid:" + o.uid() + "\">"; + mText += o.formattedName(); + mText += "</a>\n"; + } else { + mText += "<li>"; + mText.append(a->email()); + mText += "\n"; + } + } else { + mText += "<li><a href=\"uid:" + a->uid() + "\">"; + if (!a->name().isEmpty()) mText += a->name(); + else mText += a->email(); + mText += "</a>\n"; + } +#else + //qDebug("nokabc "); + mText += "<li><a href=\"uid:" + a->uid() + "\">"; + if (!a->name().isEmpty()) mText += a->name(); + else mText += a->email(); + mText += "</a>\n"; +#endif + + if (!a->email().isEmpty()) { + if (iconPath) { + mText += "<a href=\"mailto:" + a->name() +" "+ "<" + a->email() + ">" + "\">"; + mText += "<IMG src=\"" + iconPath + "\">"; + mText += "</a>\n"; + } + } + if (a->status() != Attendee::NeedsAction ) + mText +="[" + a->statusStr() + "] "; + if (a->role() == Attendee::Chair ) + mText +="(" + a->roleStr().left(1) + ".)"; + } + mText.append("</li></ul>"); + } + +} +void KOEventViewer::appendJournal(Journal *jour, int mode ) +{ + bool shortDate = KOPrefs::instance()->mShortDateInViewer; + if (mode == 0 ) + addTag("h2",i18n("Journal from: ")); + else { + if ( mode == 1 ) { + addTag("h2",i18n( "Local: " ) +i18n("Journal from: ")); + } else { + addTag("h2",i18n( "Remote: " ) +i18n("Journal from: ")); + } + addTag("h3",i18n( "Last modified " ) + KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) ); + } + topLevelWidget()->setCaption("Journal Viewer"); + mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer))); + if (!jour->description().isEmpty()) { + addTag("p",jour->description()); + } + setText(mText); +} + +void KOEventViewer::formatReadOnly(Incidence *event) +{ + if (event->isReadOnly()) { + addTag("p","<em>(" + i18n("read-only") + ")</em>"); + } +} +void KOEventViewer::setSyncMode( bool b ) +{ + mSyncMode = b; +} + + +void KOEventViewer::setTodo(Todo *event, bool clearV ) +{ + if ( clearV ) + clearEvents(); + if ( mSyncMode ) { + if ( clearV ) + appendTodo(event,1 ); + else + appendTodo(event,2); + } else + appendTodo(event); +} +void KOEventViewer::setJournal(Journal *event, bool clearV ) +{ + if ( clearV ) + clearEvents(); + if ( mSyncMode ) { + if ( clearV ) + appendJournal(event, 1); + else + appendJournal(event, 2); + } else + appendJournal(event); +} + +void KOEventViewer::setEvent(Event *event) +{ + clearEvents(); + if ( mSyncMode ) + appendEvent(event, 1); + else + appendEvent(event); +} + +void KOEventViewer::addEvent(Event *event) +{ + if ( mSyncMode ) + appendEvent(event, 2); + else + appendEvent(event); +} + +void KOEventViewer::clearEvents(bool now) +{ + mText = ""; + if (now) setText(mText); +} + +void KOEventViewer::addText(QString text) +{ + mText.append(text); + setText(mText); +} |