-rw-r--r-- | korganizer/calendarview.cpp | 167 |
1 files changed, 165 insertions, 2 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index 503ef12..36db9c4 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -93,96 +93,214 @@ #include "calprinter.h" #endif #ifndef KORG_NOPLUGINS #include "kocore.h" #endif #include "koeventeditor.h" #include "kotodoeditor.h" #include "koprefs.h" #include "koeventviewerdialog.h" #include "publishdialog.h" #include "kofilterview.h" #include "koglobals.h" #include "koviewmanager.h" #include "koagendaview.h" #include "kodialogmanager.h" #include "outgoingdialog.h" #include "incomingdialog.h" #include "datenavigatorcontainer.h" #include "statusdialog.h" #include "kdatenavigator.h" #include "kotodoview.h" #include "datenavigator.h" #include "resourceview.h" #include "navigatorbar.h" #include "searchdialog.h" #include "mainwindow.h" #include "calendarview.h" #ifndef DESKTOP_VERSION #include <qtopia/alarmserver.h> #endif #ifndef _WIN32_ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #else #include <qprocess.h> #endif #ifdef DESKTOP_VERSION #include <kabc/stdaddressbook.h> #endif using namespace KOrg; using namespace KCal; extern int globalFlagBlockAgenda; extern int globalFlagBlockStartup; +MissedAlarmTextBrowser::MissedAlarmTextBrowser(QWidget *parent, QPtrList<Incidence> alarms,QDateTime start ) : QTextBrowser(parent) + +{ + mAlarms = alarms; + setBackgroundColor( QColor( 86, 153, 205 ) ); + QString mText = "<table width=\"100%\">\n"; + //mText += "<tr bgcolor=\"#3679AD\"><td><h2>"; +#ifdef DESKTOP_VERSION + mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h1>"; +#else + mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h2>"; +#endif + // mText += "<img src=\""; + // mText += ipath; + // mText += "\">"; + //mEventDate = QDate::currentDate(); +#ifdef DESKTOP_VERSION + mText += "<font color=\"#FFFFFF\"> <em>" + i18n("You missed the alarms for the following events or todos:")+"</em></font></h1>"; +#else + mText += "<font color=\"#FFFFFF\"> <em>" + i18n("You missed the alarms for the following events or todos:")+"</em></font></h2>"; +#endif + mText += "</td></tr>\n<tr bgcolor=\"#FF997D\"><td>"; + + Incidence * inc = getNextInc( start ); + int time = 0; + mText += "<table>"; + while ( inc ) { + QDateTime dt ; + QString tempText = "<a "; + bool ok; + dt = inc->getNextOccurence( start, &ok ); + if ( !ok ) continue; + if ( inc->type() == "Event" ) { + tempText += "href=\"event:"; + } else if ( inc->type() == "Todo" ) { + tempText += "href=\"todo:"; + } + tempText += inc->uid() + "\">"; + if ( inc->type() == "Todo" ) + tempText += i18n("Todo: "); + if ( inc->summary().length() > 0 ) + tempText += inc->summary(); + else + tempText += i18n("-no summary-"); + QString timestr; + if (!inc->doesFloat()) + timestr = KGlobal::locale()->formatDateTime( dt, KOPrefs::instance()->mShortDateInViewer) +": "; + else + timestr = KGlobal::locale()->formatDate( dt.date() , KOPrefs::instance()->mShortDateInViewer) +": "; + if ( dt.date() == QDate::currentDate() && time == 0 ) { + time = 1; + mText +="</table>"; + mText += "</td></tr>\n<tr bgcolor=\"#FFDC64\"><td>"; + mText += "<table>"; + + } + if ( dt.date() > QDate::currentDate() && time != 2 ) { + time = 2; + mText +="</table>"; + mText += "</td></tr>\n<tr bgcolor=\"#6AFF6A\"><td>"; + mText += "<table>"; + } + mText +="<tr><td><b>"; + mText += timestr; + mText += "</b></td><td>"; + mText += tempText; + mText += "</td></tr>\n"; + inc = getNextInc( start ); + } + mText +="</table>"; + setText( mText ); +} + +Incidence * MissedAlarmTextBrowser::getNextInc( QDateTime start ) +{ + QDateTime dt ; + Incidence * retInc; + Incidence * inc = mAlarms.first(); + if ( inc == 0 ) + return 0; + bool ok; + dt = inc->getNextOccurence( start, &ok ); + if ( ! ok ) return 0; + QDateTime dtn ; + retInc = inc; + inc = mAlarms.next(); + while ( inc ) { + dtn = inc->getNextOccurence( start, &ok ); + if ( ! ok ) return 0; + if ( dtn < dt ) { + dt = dtn; + retInc = inc; + } + inc = mAlarms.next(); + } + mAlarms.remove( retInc ); + return retInc; + +} +void MissedAlarmTextBrowser::setSource(const QString & n) +{ + if (n.startsWith("event:")) { +#ifdef DESKTOP_VERSION + emit showIncidence(n.mid(8)); +#else + emit showIncidence(n.mid(6)); +#endif + return; + } else if (n.startsWith("todo:")) { +#ifdef DESKTOP_VERSION + emit showIncidence(n.mid(7)); +#else + emit showIncidence(n.mid(5)); +#endif + return; + } +} + class KOBeamPrefs : public QDialog { public: KOBeamPrefs( QWidget *parent=0, const char *name=0 ) : QDialog( parent, name, true ) { setCaption( i18n("Beam Options") ); QVBoxLayout* lay = new QVBoxLayout( this ); lay->setSpacing( 3 ); lay->setMargin( 3 ); QButtonGroup* format = new QButtonGroup( 1, Horizontal, i18n("File format"), this ); lay->addWidget( format ); format->setExclusive ( true ) ; QButtonGroup* time = new QButtonGroup(1, Horizontal, i18n("Time format"), this ); lay->addWidget( time ); time->setExclusive ( true ) ; vcal = new QRadioButton(" vCalendar ", format ); ical = new QRadioButton(" iCalendar ", format ); vcal->setChecked( true ); tz = new QRadioButton(i18n(" With timezone "), time ); local = new QRadioButton(i18n(" Local time "), time ); tz->setChecked( true ); QPushButton * ok = new QPushButton( i18n("Beam via IR!"), this ); lay->addWidget( ok ); QPushButton * cancel = new QPushButton( i18n("Cancel"), this ); lay->addWidget( cancel ); connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) ); connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) ); resize( 200, 200 ); } bool beamVcal() { return vcal->isChecked(); } bool beamLocal() { return local->isChecked(); } private: QRadioButton* vcal, *ical, *local, *tz; }; class KOCatPrefs : public QDialog { public: KOCatPrefs( QWidget *parent=0, const char *name=0 ) : QDialog( parent, name, true ) { setCaption( i18n("Manage new Categories") ); QVBoxLayout* lay = new QVBoxLayout( this ); lay->setSpacing( 3 ); lay->setMargin( 3 ); QLabel * lab = new QLabel( i18n("After importing/loading/syncing\nthere may be new categories in\nevents or todos\nwhich are not in the category list.\nPlease choose what to do:\n "), this ); lay->addWidget( lab ); @@ -461,97 +579,135 @@ void CalendarView::init() mDateFrame = new QVBox(0,0,WType_Popup); //mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised); mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised ); mDateFrame->setLineWidth(3); mDateFrame->hide(); mDateFrame->setCaption( i18n( "Pick a date to display")); mDatePicker = new KDatePicker ( mDateFrame , QDate::currentDate() ); connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(slotSelectPickerDate(QDate))); mEventEditor = mDialogManager->getEventEditor(); mTodoEditor = mDialogManager->getTodoEditor(); mFlagEditDescription = false; mSuspendTimer = new QTimer( this ); mAlarmTimer = new QTimer( this ); mRecheckAlarmTimer = new QTimer( this ); connect( mRecheckAlarmTimer, SIGNAL( timeout () ), SLOT( recheckTimerAlarm() ) ); connect( mSuspendTimer, SIGNAL( timeout () ), SLOT( suspendAlarm() ) ); connect( mAlarmTimer, SIGNAL( timeout () ), SLOT( timerAlarm() ) ); mAlarmDialog = new AlarmDialog( this ); connect( mAlarmDialog, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addSuspendAlarm(const QDateTime &, const QString & ) ) ); mAlarmDialog->setServerNotification( false ); mAlarmDialog->setSuspendTime( KOPrefs::instance()->mAlarmSuspendTime ); #ifndef DESKTOP_VERSION //US listen for arriving address resultsets connect(ExternalAppHandler::instance(), SIGNAL(receivedBirthdayListEvent(const QString&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&)), this, SLOT(insertBirthdays(const QString&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&))); #endif mDateNavigator->setCalendar( mCalendar ); } CalendarView::~CalendarView() { // kdDebug() << "~CalendarView()" << endl; //qDebug("CalendarView::~CalendarView() "); delete mDialogManager; delete mViewManager; delete mStorage; delete mDateFrame ; delete beamDialog; delete mEventViewerDialog; //kdDebug() << "~CalendarView() done" << endl; } +void CalendarView::checkAlarms() +{ + KConfig *config = KOGlobals::config(); + config->setGroup( "AppRun" ); + QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) ); + int secs = config->readNumEntry( "LatestProgramStop" ) - 30; + //secs -= ( 3600 * 24*3 ); // debug only + QDateTime latest = dt.addSecs ( secs ); + qDebug("KO: Last termination on %s ", latest.toString().latin1()); + QPtrList<Incidence> el = mCalendar->rawIncidences(); + QPtrList<Incidence> al; + Incidence* inL = el.first(); + while ( inL ) { + bool ok = false; + int offset = 0; + QDateTime next = inL->getNextAlarmDateTime(& ok, &offset, latest ) ; + if ( ok ) { + //qDebug("OK %s",next.toString().latin1()); + if ( next < QDateTime::currentDateTime() ) { + al.append( inL ); + qDebug("found missed alarm: %s ", inL->summary().latin1() ); + } + } + inL = el.next(); + } + if ( al.count() ) { + QDialog dia ( this, "huhu", true ); + dia.setCaption( i18n("KO/Pi: Missing alarm notification!") ); + QVBoxLayout* lay = new QVBoxLayout( &dia ); + lay->setSpacing( 3 ); + lay->setMargin( 3 ); + MissedAlarmTextBrowser* matb = new MissedAlarmTextBrowser ( &dia, al, latest ); + connect( matb, SIGNAL( showIncidence( QString ) ),SLOT( showIncidence( QString ) )); + lay->addWidget( matb ); + dia.resize(240,240); + dia.exec(); + } +} void CalendarView::showDay( QDate d ) { dateNavigator()->blockSignals( true ); dateNavigator()->selectDate( d ); dateNavigator()->blockSignals( false ); mViewManager->showDayView(); //dateNavigator()->selectDate( d ); } void CalendarView::timerAlarm() { //qDebug("CalendarView::timerAlarm() "); computeAlarm(mAlarmNotification ); } void CalendarView::suspendAlarm() { //qDebug(" CalendarView::suspendAlarm() "); computeAlarm(mSuspendAlarmNotification ); } void CalendarView::startAlarm( QString mess , QString filename) { topLevelWidget()->showNormal(); topLevelWidget()->setActiveWindow(); topLevelWidget()->raise(); mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount ); QTimer::singleShot( 3000, this, SLOT( checkNextTimerAlarm() ) ); } void CalendarView::checkNextTimerAlarm() { mCalendar->checkAlarmForIncidence( 0, true ); } void CalendarView::computeAlarm( QString msg ) { QString mess = msg; QString mAlarmMessage = mess.mid( 9 ); QString filename = MainWindow::resourcePath(); filename += "koalarm.wav"; QString tempfilename; if ( mess.left( 13 ) == "suspend_alarm") { bool error = false; @@ -1924,97 +2080,99 @@ void CalendarView::readSettings() mLeftFrame->setSizes(sizes); sizes = config->readIntListEntry("Main Splitter Frame"); resetval = 0; maxVal = 0; if (sizes.count() != 2) { if ( !KOPrefs::instance()->mVerticalScreen ) { resetval = mDateNavigator->sizeHint().width()+2; } else { resetval = mDateNavigator->sizeHint().height()+2; } } if ( resetval ) { sizes.clear(); if ( !KOPrefs::instance()->mVerticalScreen ) { maxVal = QApplication::desktop()->width() -10; } else { maxVal = QApplication::desktop()->height()-10; } sizes << resetval; if ( maxVal < resetval + resetval) resetval = maxVal - resetval; sizes << resetval; } mMainFrame->setSizes(sizes); if ( dateCount == 5 ) mNavigator->selectWorkWeek(); else if ( dateCount == 7 ) mNavigator->selectWeek(); else mNavigator->selectDates( dateCount ); // mViewManager->readSettings( config ); updateConfig(); globalFlagBlockAgenda = 2; mViewManager->readSettings( config ); QTimer::singleShot( 1, mDateNavigator, SLOT ( setResizeEnabled() ) ); } void CalendarView::writeSettings() { // kdDebug() << "CalendarView::writeSettings" << endl; KConfig *config = KOGlobals::config(); mViewManager->writeSettings( config ); mTodoList->saveLayout(config,QString("Todo Layout")); mDialogManager->writeSettings( config ); //KOPrefs::instance()->usrWriteConfig(); KOPrefs::instance()->writeConfig(); writeFilterSettings(config); - + config->setGroup( "AppRun" ); + QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) ); + config->writeEntry( "LatestProgramStop", dt.secsTo( QDateTime::currentDateTime() ) ); config->setGroup( "Views" ); config->writeEntry( "ShownDatesCount", mNavigator->selectedDates().count() ); QValueList<int> listINT = mLeftFrame->sizes(); config->writeEntry("Left Splitter Frame",listINT); QValueList<int> listINT2 = mMainFrame->sizes(); config->writeEntry("Main Splitter Frame",listINT2); #ifdef DESKTOP_VERSION config->setGroup("WidgetLayout"); QStringList list ;//= config->readListEntry("MainLayout"); int x,y,w,h; QWidget* wid; wid = topLevelWidget(); x = wid->geometry().x(); y = wid->geometry().y(); w = wid->width(); h = wid->height(); list.clear(); list << QString::number( x ); list << QString::number( y ); list << QString::number( w ); list << QString::number( h ); config->writeEntry("MainLayout",list ); wid = mEventEditor; x = wid->geometry().x(); y = wid->geometry().y(); w = wid->width(); h = wid->height(); list.clear(); list << QString::number( x ); list << QString::number( y ); list << QString::number( w ); list << QString::number( h ); config->writeEntry("EditEventLayout",list ); wid = mTodoEditor; x = wid->geometry().x(); y = wid->geometry().y(); w = wid->width(); h = wid->height(); list.clear(); list << QString::number( x ); list << QString::number( y ); list << QString::number( w ); list << QString::number( h ); config->writeEntry("EditTodoLayout",list ); wid = getEventViewerDialog(); @@ -3876,97 +4034,102 @@ Todo *CalendarView::selectedTodo() incidence = mTodoList->selectedIncidences().first(); if ( incidence && incidence->type() == "Todo" ) { return static_cast<Todo *>( incidence ); } return 0; } void CalendarView::dialogClosing(Incidence *in) { // mDialogList.remove(in); } void CalendarView::showIncidence() { mViewerCallerIsSearchDialog = false; Incidence *incidence = currentSelection(); if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); if ( incidence ) { ShowIncidenceVisitor v; v.act( incidence, this ); } } void CalendarView::editIncidenceDescription() { mFlagEditDescription = true; editIncidence(); mFlagEditDescription = false; } void CalendarView::editIncidence() { // qDebug("editIncidence() "); Incidence *incidence = currentSelection(); if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); if ( incidence ) { EditIncidenceVisitor v; v.act( incidence, this ); } } void CalendarView::deleteIncidence() { Incidence *incidence = currentSelection(); if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); if ( incidence ) { deleteIncidence(incidence); } } - +void CalendarView::showIncidence(QString uid) +{ + Incidence *inc = mCalendar->incidence( uid ); + if ( inc ) + showIncidence( inc ); +} void CalendarView::showIncidence(Incidence *incidence) { mViewerCallerIsSearchDialog = false; //qDebug("%x %x ",sender (), mDialogManager->getSearchDialog() ); if ( sender() && mDialogManager->getSearchDialog() ) { if ( sender () == mDialogManager->getSearchDialog()->listview() ) { mViewerCallerIsSearchDialog = true; } } if ( incidence ) { ShowIncidenceVisitor v; v.act( incidence, this ); } } void CalendarView::editIncidence(Incidence *incidence) { if ( incidence ) { EditIncidenceVisitor v; v.act( incidence, this ); } } void CalendarView::deleteIncidence(Incidence *incidence) { //qDebug(" CalendarView::deleteIncidence "); if ( incidence ) { DeleteIncidenceVisitor v; v.act( incidence, this ); } } void CalendarView::lookForOutgoingMessages() { OutgoingDialog *ogd = mDialogManager->outgoingDialog(); ogd->loadMessages(); } void CalendarView::lookForIncomingMessages() { IncomingDialog *icd = mDialogManager->incomingDialog(); icd->retrieve(); } bool CalendarView::removeCompletedSubTodos( Todo* t ) |