summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--korganizer/calendarview.cpp202
-rw-r--r--korganizer/calendarview.h1
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;