-rw-r--r-- | korganizer/calendarview.cpp | 202 | ||||
-rw-r--r-- | korganizer/calendarview.h | 1 |
2 files changed, 201 insertions, 2 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index a1b1d71..8269910 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -752,250 +752,448 @@ void CalendarView::conflictAll() { nextConflict ( true, true ); } void CalendarView::conflictAllday() { nextConflict ( false, true ); } void CalendarView::conflictNotAll() { nextConflict ( false, false ); } void CalendarView::setCalReadOnly( int id, bool readO ) { if ( readO ) { emit save(); } mCalendar->setReadOnly( id, readO ); } void CalendarView::setScrollBarStep(int val ) { #ifdef DESKTOP_VERSION mDateScrollBar->setLineStep ( val ); #endif } void CalendarView::scrollBarValue(int val ) { #ifdef DESKTOP_VERSION if ( QApplication::desktop()->width() < 800 ) return; static bool block = false; if ( block ) return; block = true; int count = mNavigator->selectedDates().count(); int day = mNavigator->selectedDates().first().dayOfYear(); int stepdays = val; if ( mDateScrollBar->lineStep () <= count ) { //val = val/mDateScrollBar->lineStep ()*mDateScrollBar->lineStep(); //qDebug("VAL %d ",val ); stepdays = (val-day)/mDateScrollBar->lineStep ()*mDateScrollBar->lineStep(); stepdays = day+stepdays; if ( stepdays < 0 ) stepdays = 0; } if ( stepdays == day ) { block = false; return; } int year = mNavigator->selectedDates().first().year(); QDate d ( year,1,1 ); mNavigator->selectDates( d.addDays( stepdays-1) , count ); block = false; #endif } void CalendarView::updateView(const QDate &start, const QDate &end) { #ifdef DESKTOP_VERSION if ( ! mDateScrollBar->draggingSlider () ) { int dof = start.dayOfYear(); //qDebug("dof %d day %d val %d ", dof, start.dayOfYear(),mDateScrollBar->value() ); if ( dof != mDateScrollBar->value() ) { mDateScrollBar->blockSignals( true ); mDateScrollBar->setValue( start.dayOfYear()); mDateScrollBar->blockSignals( false ); } } #endif mTodoList->updateView(); mViewManager->updateView(start, end); //mDateNavigator->updateView(); } void CalendarView::checkFiles() { QString message; QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars; KopiCalendarFile * cal = calendars.first(); while ( cal ) { if ( cal->mErrorOnLoad ) { message += cal->mName +"\n"+KGlobal::formatMessage ( "(" +i18n( "Filepath: ")+ cal->mFileName+")" ,0 )+"\n"; } cal = calendars.next(); } if ( !message.isEmpty() ) { message = KGlobal::formatMessage( i18n("Calendar(s) not loaded:"),0 )+"\n" + message +KGlobal::formatMessage(i18n("You can try to reload the calendar in the Resource View!"),0); KMessageBox::error(this,message, i18n("Loding of calendar(s) failed")); } static bool firstTime = true; if ( firstTime ) { firstTime = false; QTimer::singleShot( 2000, this, SLOT ( checkAlarms() )); } } void CalendarView::checkAlarms() { - - KConfig *config = KOGlobals::config(); config->setGroup( "AppRun" ); QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) ); int daysto = dt.daysTo( QDate::currentDate() ); int days = config->readNumEntry( "LatestProgramStopDays" , daysto); dt = dt.addDays( days ); int secto = dt.secsTo( QDateTime::currentDateTime() ); int secs = config->readNumEntry( "LatestProgramStopSecs" , secto) - 30; //qDebug("KO: Reading program stop %d ", secs); //secs -= ( 3600 * 24*3 ); // debug only QDateTime latest = dt.addSecs ( secs ); qDebug("KO: Last termination on %s ", latest.toString().latin1()); //qDebug("KO: Current Time %s ",QDateTime::currentDateTime().toString().latin1() ); QPtrList<Incidence> el = mCalendar->rawIncidences(); QPtrList<Incidence> al; Incidence* inL = el.first(); QDateTime cur = QDateTime::currentDateTime().addSecs(-59); qDebug("KO: Checking alarm until %s ", cur.toString().latin1()); 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 < cur ) { al.append( inL ); //qDebug("found missed alarm: %s ", inL->summary().latin1() ); } } inL = el.next(); } if ( al.count() ) { QDialog* dia = new QDialog( this, "huhu", false, WDestructiveClose | WStyle_StaysOnTop ); dia->setCaption( i18n("KO/Pi: Missing alarms!") ); QVBoxLayout* lay = new QVBoxLayout( dia ); lay->setSpacing( 0 ); lay->setMargin( 0 ); MissedAlarmTextBrowser* matb = new MissedAlarmTextBrowser ( dia, al, latest ); connect( matb, SIGNAL( showIncidence( QString ) ),SLOT( showIncidence( QString ) )); lay->addWidget( matb ); if ( QApplication::desktop()->width() == 480 || QApplication::desktop()->width() == 640 ) { int wid = 210; int x = QApplication::desktop()->width() - wid - 7; int y = QApplication::desktop()->height() - wid - 70; dia->setGeometry ( x,y,wid,wid); } else { int si = 220; if ( QApplication::desktop()->width() > 470 ) si = 400; dia->resize(si,si/2); } dia->setBackgroundColor( QColor( 255, 255, 255 ) ); dia->show(); } +#if 0 + // for creating timetracker test data + qDebug("CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCc "); + Todo * nt; + mCalendar->close(); + { + Todo * root1 = new Todo; + mCalendar->addTodo( root1 ); + root1->setSummary( "Project_1"); + root1->setPriority( 1 ); + root1->setDescription( "This is a test description of a root Project" ); + root1->setPercentComplete( 20 ); + updateView(); + QDateTime start = QDateTime ( QDate( 2004,11,1), QTime ( 7,30,0) ); + QDateTime end = QDateTime ( QDate( 2005,8,1), QTime ( 0,0,0) ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Planning_Project_1"); + nt->setPriority( 1 ); + nt->setDescription( "This is a test description of Planning_Project_1" ); + nt->setPercentComplete( 20 ); + + + Todo * sub1 = nt; + sub1->setRelatedTo( root1 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Planning_Project_1: Lutz"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workLutz11 = nt; + workLutz11->setRelatedTo( sub1 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Planning_Project_1: Norbert"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workNorbert11 = nt; + workNorbert11->setRelatedTo( sub1 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Work on 1"); + nt->setPriority( 1 ); + nt->setDescription( "This is a test description of Work Project_1" ); + nt->setPercentComplete( 20 ); + + Todo * sub2 = nt; + sub2->setRelatedTo( root1 ); + + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Work on 1: Lutz"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workLutz12 = nt; + workLutz12->setRelatedTo( sub2 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Work on 1: Norbert"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workNorbert12 = nt; + workNorbert12->setRelatedTo( sub2 ); + + int secLenRunning = 7200; + int secLenPausing = 3600 * 3; + int dayInterval = 1; + //createRunningDate4Todo( root1, start, end, secLenRunning, secLenPausing, dayInterval ); + createRunningDate4Todo( root1, start, end, secLenRunning*24, secLenPausing, 14 ); + createRunningDate4Todo( sub1, start.addSecs( secLenRunning ), start.addDays( 10 ), secLenRunning*4, secLenPausing, 1); + createRunningDate4Todo( sub2, start.addDays( 8 ), end, secLenRunning*4, secLenPausing, 3); + createRunningDate4Todo( workLutz11, start, start.addDays( 8 ), secLenRunning, secLenPausing, 0); + createRunningDate4Todo( workNorbert11, start, start.addDays( 8 ), secLenRunning*2, secLenPausing, 1); + createRunningDate4Todo( workLutz12, start.addDays( 8 ),end, secLenRunning*5, secLenPausing, 3); + createRunningDate4Todo( workNorbert11, start.addDays( 8 ), end, secLenRunning, secLenPausing*3, 0); + + } + + { + Todo * root1 = new Todo; + mCalendar->addTodo( root1 ); + root1->setSummary( "Project_2"); + root1->setPriority( 1 ); + root1->setDescription( "This is a test description of a root Project 2" ); + root1->setPercentComplete( 20 ); + updateView(); + QDateTime start = QDateTime ( QDate( 2004,11,1), QTime ( 7,30,0) ); + QDateTime end = QDateTime ( QDate( 2005,8,1), QTime ( 0,0,0) ); + int secLenRunning = 7200; + int secLenPausing = 3600 * 3; + int dayInterval = 1; + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Planning_Project_2"); + nt->setPriority( 1 ); + nt->setDescription( "This is a test description of Planning_Project_2" ); + nt->setPercentComplete( 20 ); + + + Todo * sub1 = nt; + sub1->setRelatedTo( root1 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Planning_Project_2: Lutz"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workLutz11 = nt; + workLutz11->setRelatedTo( sub1 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Planning_Project_2: Norbert"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workNorbert11 = nt; + workNorbert11->setRelatedTo( sub1 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Work on 2"); + nt->setPriority( 1 ); + nt->setDescription( "This is a test description of Work Project_2" ); + nt->setPercentComplete( 20 ); + + Todo * sub2 = nt; + sub2->setRelatedTo( root1 ); + + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Work on 2: Lutz"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workLutz12 = nt; + workLutz12->setRelatedTo( sub2 ); + + nt = new Todo; + mCalendar->addTodo( nt ); + nt->setSummary( "Work on 2: Norbert"); + nt->setPriority( 1 ); + nt->setDescription( "This todo counts the actual work of a person on a project" ); + nt->setPercentComplete( 20 ); + Todo * workNorbert12 = nt; + workNorbert12->setRelatedTo( sub2 ); + createRunningDate4Todo( root1, start, end, secLenRunning, secLenPausing, 10 ); + createRunningDate4Todo( sub1, start.addSecs( secLenRunning*3 ), start.addDays( 20 ), secLenRunning*2, secLenPausing, 2); + createRunningDate4Todo( sub2, start.addDays( 8 ), end, secLenRunning*3, secLenPausing, 7); + createRunningDate4Todo( workLutz11, start, start.addDays( 18 ), secLenRunning/2, secLenPausing*5, 0); + createRunningDate4Todo( workNorbert11, start.addDays( 8 ), start.addDays( 18 ), secLenRunning*5, secLenPausing*5, 1); + createRunningDate4Todo( workLutz12, start.addDays( 8 ),end, secLenRunning, secLenPausing*8, 0); + createRunningDate4Todo( workNorbert11, start.addDays( 28 ), end, secLenRunning/8, secLenPausing*6, 0); + } + updateView(); +#endif +} +void CalendarView::createRunningDate4Todo( Todo * runT, QDateTime start , QDateTime end, int secLenRunning, int secLenPausing,int dayInterval ) +{ + static int ccc = 0; + ++ccc; + QDateTime t_start = start; + runT->setPriority( 5 ); + runT->setPercentComplete( 0 ); + int count = 0; + int prio = 5; + int complete = 0; + while ( t_start < end ) { + ++count; + if ( count > ccc ) { + count = 0; + --prio; + if ( prio == 0 ) prio = 5; + complete += 20; + if ( complete > 100 ) complete = 0; + runT->setPriority( prio ); + runT->setPercentComplete( complete ); + } + runT->setRunning( true ); + runT->saveRunningInfo( "Additional tt comment: running on "+ t_start.toString(), t_start, t_start.addSecs( secLenRunning ) ); + if ( dayInterval ) + t_start = t_start.addDays( dayInterval ); + else { + t_start = t_start.addSecs( secLenRunning + secLenPausing ); + } } +} + 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( 2000, 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; int len = mess.mid( 13 ).find("+++"); if ( len < 2 ) error = true; else { tempfilename = mess.mid( 13, len ); if ( !QFile::exists( tempfilename ) ) error = true; } if ( ! error ) { filename = tempfilename; } mAlarmMessage = mess.mid( 13+len+3 ); //qDebug("suspend file %s ",tempfilename.latin1() ); startAlarm( mAlarmMessage, filename); return; } if ( mess.left( 11 ) == "timer_alarm") { //mTimerTime = 0; startAlarm( mess.mid( 11 ), filename ); return; } if ( mess.left( 10 ) == "proc_alarm") { bool error = false; int len = mess.mid( 10 ).find("+++"); if ( len < 2 ) error = true; else { tempfilename = mess.mid( 10, len ); if ( !QFile::exists( tempfilename ) ) error = true; } if ( error ) { mAlarmMessage = "Procedure Alarm\nError - File not found\n"; mAlarmMessage += mess.mid( 10+len+3+9 ); } else { //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent"); //qDebug("-----system command %s ",tempfilename.latin1() ); #ifndef _WIN32_ if ( vfork () == 0 ) { execl ( tempfilename.latin1(), 0 ); return; } #else QProcess* p = new QProcess(); p->addArgument( tempfilename.latin1() ); p->start(); return; #endif diff --git a/korganizer/calendarview.h b/korganizer/calendarview.h index 1debef7..b223315 100644 --- a/korganizer/calendarview.h +++ b/korganizer/calendarview.h @@ -419,192 +419,193 @@ class CalendarView : public KOrg::CalendarViewBase, public KCal::Calendar::Obser /** set state of calendar to read-only */ void setReadOnly(bool readOnly=true); void eventUpdated(Incidence *); /* iTIP scheduling actions */ void schedule_publish(Incidence *incidence = 0); void schedule_request(Incidence *incidence = 0); void schedule_refresh(Incidence *incidence = 0); void schedule_cancel(Incidence *incidence = 0); void schedule_add(Incidence *incidence = 0); void schedule_reply(Incidence *incidence = 0); void schedule_counter(Incidence *incidence = 0); void schedule_declinecounter(Incidence *incidence = 0); void schedule_publish_freebusy(int daysToPublish = 30); void openAddressbook(); void editFilters(); void toggleFilerEnabled(); QPtrList<CalFilter> filters(); void toggleFilter(); void showFilter(bool visible); void updateFilter(); void filterEdited(); void selectFilter( int ); KOFilterView *filterView(); void showIntro(); /** Move the curdatepient view date to today */ void goToday(); /** Move to the next date(s) in the current view */ void goNext(); /** Move to the previous date(s) in the current view */ void goPrevious(); /** Move to the next date(s) in the current view */ void goNextMonth(); /** Move to the previous date(s) in the current view */ void goPreviousMonth(); void toggleExpand(); void toggleDateNavigatorWidget(); void toggleAllDaySize(); /** Look for new messages in the inbox */ void lookForIncomingMessages(); /** Look for new messages in the outbox */ void lookForOutgoingMessages(); void processMainViewSelection( Incidence * ); void processTodoListSelection( Incidence * ); void processIncidenceSelection( Incidence * ); void purgeCompleted(); bool removeCompletedSubTodos( Todo* ); void slotCalendarChanged(); bool importBday(); bool addAnniversary( QDate data, QString name, KCal::Attendee* a , bool birthday ); bool importQtopia( const QString &categoriesFile, const QString &datebookFile, const QString &tasklistFile ); void syncExternal( int mode ); void slotSelectPickerDate( QDate ) ; void showDatePicker() ; void showDatePickerPopup() ; void moveIncidence(Incidence *) ; void beamIncidence(Incidence *) ; void beamCalendar() ; void beamFilteredCalendar() ; void beamIncidenceList(QPtrList<Incidence>) ; void manageCategories(); void editCategories(); int addCategories(); void removeCategories(); void setSyncDevice( QString ); void setSyncName( QString ); void showDay( QDate ); void undo_delete(); protected slots: void resetFocus(); void scrollBarValue(int); void slotViewerClosed(); void timerAlarm(); void suspendAlarm(); void beamDone( Ir *ir ); /** Select a view or adapt the current view to display the specified dates. */ void showDates( const KCal::DateList & ); void selectWeekNum ( int ); void checkConflictForEvent(); public: + void createRunningDate4Todo( Todo * runT, QDateTime start , QDateTime end, int secLenRunning, int secLenPausing,int dayInterval ); // show a standard warning // returns KMsgBox::yesNoCancel() int msgCalModified(); virtual bool sync(KSyncManager* manager, QString filename, int mode); virtual bool syncExternal(KSyncManager* manager, QString resource); virtual void removeSyncInfo( QString syncProfile); void setSyncManager(KSyncManager* manager); void setLoadedFileVersion(QDateTime); bool checkFileVersion(QString fn); bool checkAllFileVersions(); bool checkFileChanged(QString fn); Event* getLastSyncEvent(); /** Adapt navigation units correpsonding to step size of navigation of the * current view. */ void adaptNavigationUnits(); bool synchronizeCalendar( Calendar* local, Calendar* remote, int mode ); int takeEvent( Incidence* local, Incidence* remote, int mode, bool full = false ); //Attendee* getYourAttendee(Event *event); void setBlockShowDates( bool b ) { mBlockShowDates = b ;} void setScrollBarStep(int val ); protected: Event *mConflictingEvent; void schedule(Scheduler::Method, Incidence *incidence = 0); // returns KMsgBox::OKCandel() int msgItemDelete(const QString name); void showEventEditor(); void showTodoEditor(); Todo *selectedTodo(); private: #ifdef DESKTOP_VERSION QScrollBar * mDateScrollBar; #endif QDateTime mNextAlarmDateTime; bool mViewerCallerIsSearchDialog; bool mBlockShowDates; KSyncManager* mSyncManager; AlarmDialog * mAlarmDialog; QString mAlarmNotification; QString mSuspendAlarmNotification; QTimer* mSuspendTimer; QTimer* mAlarmTimer; QTimer* mRecheckAlarmTimer; void computeAlarm( QString ); void startAlarm( QString, QString ); void setSyncEventsReadOnly(); QDateTime loadedFileVersion; void checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete ); void checkExternalId( Incidence * inc ); int mGlobalSyncMode; QString mCurrentSyncDevice; QString mCurrentSyncName; void init(); int mDatePickerMode; bool mFlagEditDescription; QDateTime mLastCalendarSync; void createPrinter(); void calendarModified( bool, Calendar * ); CalPrinter *mCalPrinter; QSplitter *mPanner; QSplitter *mLeftSplitter; KDGanttMinimizeSplitter *mLeftFrame, *mMainFrame; QWidgetStack *mRightFrame; KDatePicker* mDatePicker; QVBox* mDateFrame; DateNavigatorContainer *mDateNavigator; // widget showing small month view. KOFilterView *mFilterView; KOCalEditView *mCalEditView; ResourceView *mResourceView; // calendar object for this viewing instance Calendar *mCalendar; CalendarResourceManager *mResourceManager; FileStorage *mStorage; DateNavigator *mNavigator; KOViewManager *mViewManager; KODialogManager *mDialogManager; // Calendar filters QPtrList<CalFilter> mFilters; |