summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-07-27 22:26:08 (UTC)
committer zautrix <zautrix>2005-07-27 22:26:08 (UTC)
commit0e38cffd7ba745f237c659e1c48080fcb25b126c (patch) (unidiff)
tree6069600e18bae5300c6ce427735457dbfed93141
parent136f9082862e7a56abb3a201e96f5e7386c4f1b9 (diff)
downloadkdepimpi-0e38cffd7ba745f237c659e1c48080fcb25b126c.zip
kdepimpi-0e38cffd7ba745f237c659e1c48080fcb25b126c.tar.gz
kdepimpi-0e38cffd7ba745f237c659e1c48080fcb25b126c.tar.bz2
rec changes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/calendarview.cpp2
-rw-r--r--korganizer/koagenda.cpp4
-rw-r--r--korganizer/koagendaitem.cpp2
-rw-r--r--korganizer/koagendaview.cpp2
-rw-r--r--korganizer/kodaymatrix.cpp2
-rw-r--r--korganizer/koeditorrecurrence.cpp172
-rw-r--r--korganizer/koeventviewer.cpp6
-rw-r--r--korganizer/kolistview.cpp4
-rw-r--r--korganizer/komonthview.cpp6
-rw-r--r--korganizer/kotodoeditor.cpp3
-rw-r--r--korganizer/kowhatsnextview.cpp4
-rw-r--r--libkcal/event.cpp1
-rw-r--r--libkcal/icalformatimpl.cpp24
-rw-r--r--libkcal/incidence.cpp63
-rw-r--r--libkcal/incidence.h5
-rw-r--r--libkcal/kincidenceformatter.cpp4
-rw-r--r--libkcal/vcalformat.cpp4
-rw-r--r--libkcal/vcalformat.h2
18 files changed, 175 insertions, 135 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index a76f2ed..a9d42f0 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -2994,1537 +2994,1537 @@ void CalendarView::slotSelectPickerDate( QDate d)
2994 if ( to->hasDueDate() ) 2994 if ( to->hasDueDate() )
2995 tim = to->dtDue().time(); 2995 tim = to->dtDue().time();
2996 else { 2996 else {
2997 tim = QTime ( 0,0,0 ); 2997 tim = QTime ( 0,0,0 );
2998 to->setFloats( true ); 2998 to->setFloats( true );
2999 to->setHasDueDate( true ); 2999 to->setHasDueDate( true );
3000 } 3000 }
3001 QDateTime dt ( d,tim ); 3001 QDateTime dt ( d,tim );
3002 to->setDtDue( dt ); 3002 to->setDtDue( dt );
3003 3003
3004 if ( to->hasStartDate() ) { 3004 if ( to->hasStartDate() ) {
3005 if ( len>0 ) 3005 if ( len>0 )
3006 to->setDtStart(to->dtDue().addSecs( -len )); 3006 to->setDtStart(to->dtDue().addSecs( -len ));
3007 else 3007 else
3008 if (to->dtStart() > to->dtDue() ) 3008 if (to->dtStart() > to->dtDue() )
3009 to->setDtStart(to->dtDue().addDays( -3 )); 3009 to->setDtStart(to->dtDue().addDays( -3 ));
3010 } 3010 }
3011 3011
3012 todoChanged( to ); 3012 todoChanged( to );
3013 } else if ( mMoveIncidence->typeID() == eventID ) { 3013 } else if ( mMoveIncidence->typeID() == eventID ) {
3014 if ( mMoveIncidence->doesRecur() ) { 3014 if ( mMoveIncidence->doesRecur() ) {
3015#if 0 3015#if 0
3016 // PENDING implement this 3016 // PENDING implement this
3017 Incidence* newInc = mMoveIncidence->recreateCloneException( mMoveIncidenceOldDate ); 3017 Incidence* newInc = mMoveIncidence->recreateCloneException( mMoveIncidenceOldDate );
3018 mCalendar()->addIncidence( newInc ); 3018 mCalendar()->addIncidence( newInc );
3019 if ( mMoveIncidence->typeID() == todoID ) 3019 if ( mMoveIncidence->typeID() == todoID )
3020 emit todoMoved((Todo*)mMoveIncidence, KOGlobals::EVENTEDITED ); 3020 emit todoMoved((Todo*)mMoveIncidence, KOGlobals::EVENTEDITED );
3021 else 3021 else
3022 emit incidenceChanged(mMoveIncidence, KOGlobals::EVENTEDITED); 3022 emit incidenceChanged(mMoveIncidence, KOGlobals::EVENTEDITED);
3023 mMoveIncidence = newInc; 3023 mMoveIncidence = newInc;
3024 3024
3025#endif 3025#endif
3026 } 3026 }
3027 QTime tim = mMoveIncidence->dtStart().time(); 3027 QTime tim = mMoveIncidence->dtStart().time();
3028 int secs = mMoveIncidence->dtStart().secsTo( mMoveIncidence->dtEnd()); 3028 int secs = mMoveIncidence->dtStart().secsTo( mMoveIncidence->dtEnd());
3029 QDateTime dt ( d,tim ); 3029 QDateTime dt ( d,tim );
3030 mMoveIncidence->setDtStart( dt ); 3030 mMoveIncidence->setDtStart( dt );
3031 ((Event*)mMoveIncidence)->setDtEnd( dt.addSecs( secs ) ); 3031 ((Event*)mMoveIncidence)->setDtEnd( dt.addSecs( secs ) );
3032 changeEventDisplay((Event*)mMoveIncidence, KOGlobals::EVENTEDITED); 3032 changeEventDisplay((Event*)mMoveIncidence, KOGlobals::EVENTEDITED);
3033 } else if ( mMoveIncidence->typeID() == journalID ) { 3033 } else if ( mMoveIncidence->typeID() == journalID ) {
3034 QTime tim = mMoveIncidence->dtStart().time(); 3034 QTime tim = mMoveIncidence->dtStart().time();
3035 QDateTime dt ( d,tim ); 3035 QDateTime dt ( d,tim );
3036 mMoveIncidence->setDtStart( dt ); 3036 mMoveIncidence->setDtStart( dt );
3037 updateView(); 3037 updateView();
3038 } 3038 }
3039 mMoveIncidence->setRevision( mMoveIncidence->revision()+1 ); 3039 mMoveIncidence->setRevision( mMoveIncidence->revision()+1 );
3040 } 3040 }
3041} 3041}
3042 3042
3043void CalendarView::removeCategories() 3043void CalendarView::removeCategories()
3044{ 3044{
3045 QPtrList<Incidence> incList = mCalendar->rawIncidences(); 3045 QPtrList<Incidence> incList = mCalendar->rawIncidences();
3046 QStringList catList = KOPrefs::instance()->mCustomCategories; 3046 QStringList catList = KOPrefs::instance()->mCustomCategories;
3047 QStringList catIncList; 3047 QStringList catIncList;
3048 QStringList newCatList; 3048 QStringList newCatList;
3049 Incidence* inc = incList.first(); 3049 Incidence* inc = incList.first();
3050 uint i; 3050 uint i;
3051 while ( inc ) { 3051 while ( inc ) {
3052 newCatList.clear(); 3052 newCatList.clear();
3053 catIncList = inc->categories() ; 3053 catIncList = inc->categories() ;
3054 for( i = 0; i< catIncList.count(); ++i ) { 3054 for( i = 0; i< catIncList.count(); ++i ) {
3055 if ( catList.contains (catIncList[i])) 3055 if ( catList.contains (catIncList[i]))
3056 newCatList.append( catIncList[i] ); 3056 newCatList.append( catIncList[i] );
3057 } 3057 }
3058 newCatList.sort(); 3058 newCatList.sort();
3059 inc->setCategories( newCatList.join(",") ); 3059 inc->setCategories( newCatList.join(",") );
3060 inc = incList.next(); 3060 inc = incList.next();
3061 } 3061 }
3062} 3062}
3063 3063
3064int CalendarView::addCategories() 3064int CalendarView::addCategories()
3065{ 3065{
3066 QPtrList<Incidence> incList = mCalendar->rawIncidences(); 3066 QPtrList<Incidence> incList = mCalendar->rawIncidences();
3067 QStringList catList = KOPrefs::instance()->mCustomCategories; 3067 QStringList catList = KOPrefs::instance()->mCustomCategories;
3068 QStringList catIncList; 3068 QStringList catIncList;
3069 Incidence* inc = incList.first(); 3069 Incidence* inc = incList.first();
3070 uint i; 3070 uint i;
3071 int count = 0; 3071 int count = 0;
3072 while ( inc ) { 3072 while ( inc ) {
3073 catIncList = inc->categories() ; 3073 catIncList = inc->categories() ;
3074 for( i = 0; i< catIncList.count(); ++i ) { 3074 for( i = 0; i< catIncList.count(); ++i ) {
3075 if ( !catList.contains (catIncList[i])) { 3075 if ( !catList.contains (catIncList[i])) {
3076 catList.append( catIncList[i] ); 3076 catList.append( catIncList[i] );
3077 //qDebug("add cat %s ", catIncList[i].latin1()); 3077 //qDebug("add cat %s ", catIncList[i].latin1());
3078 ++count; 3078 ++count;
3079 } 3079 }
3080 } 3080 }
3081 inc = incList.next(); 3081 inc = incList.next();
3082 } 3082 }
3083 catList.sort(); 3083 catList.sort();
3084 KOPrefs::instance()->mCustomCategories = catList; 3084 KOPrefs::instance()->mCustomCategories = catList;
3085 return count; 3085 return count;
3086} 3086}
3087 3087
3088void CalendarView::editCategories() 3088void CalendarView::editCategories()
3089{ 3089{
3090 qDebug("CalendarView::editCategories() "); 3090 qDebug("CalendarView::editCategories() ");
3091 KPIM::CategoryEditDialog ced (KOPrefs::instance(),this ); 3091 KPIM::CategoryEditDialog ced (KOPrefs::instance(),this );
3092 ced.exec(); 3092 ced.exec();
3093} 3093}
3094void CalendarView::manageCategories() 3094void CalendarView::manageCategories()
3095{ 3095{
3096 KOCatPrefs* cp = new KOCatPrefs(); 3096 KOCatPrefs* cp = new KOCatPrefs();
3097 cp->show(); 3097 cp->show();
3098 int w =cp->sizeHint().width() ; 3098 int w =cp->sizeHint().width() ;
3099 int h = cp->sizeHint().height() ; 3099 int h = cp->sizeHint().height() ;
3100 int dw = QApplication::desktop()->width(); 3100 int dw = QApplication::desktop()->width();
3101 int dh = QApplication::desktop()->height(); 3101 int dh = QApplication::desktop()->height();
3102 cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 3102 cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
3103 if ( !cp->exec() ) { 3103 if ( !cp->exec() ) {
3104 delete cp; 3104 delete cp;
3105 return; 3105 return;
3106 } 3106 }
3107 int count = 0; 3107 int count = 0;
3108 if ( cp->addCat() ) { 3108 if ( cp->addCat() ) {
3109 count = addCategories(); 3109 count = addCategories();
3110 if ( count ) { 3110 if ( count ) {
3111 topLevelWidget()->setCaption(QString::number( count )+ i18n(" Categories added to list! ")); 3111 topLevelWidget()->setCaption(QString::number( count )+ i18n(" Categories added to list! "));
3112 writeSettings(); 3112 writeSettings();
3113 } else 3113 } else
3114 topLevelWidget()->setCaption(QString::number( 0 )+ i18n(" Categories added to list! ")); 3114 topLevelWidget()->setCaption(QString::number( 0 )+ i18n(" Categories added to list! "));
3115 } else { 3115 } else {
3116 removeCategories(); 3116 removeCategories();
3117 updateView(); 3117 updateView();
3118 } 3118 }
3119 delete cp; 3119 delete cp;
3120} 3120}
3121 3121
3122void CalendarView::beamIncidence(Incidence * Inc) 3122void CalendarView::beamIncidence(Incidence * Inc)
3123{ 3123{
3124 QPtrList<Incidence> delSel ; 3124 QPtrList<Incidence> delSel ;
3125 delSel.append(Inc); 3125 delSel.append(Inc);
3126 beamIncidenceList( delSel ); 3126 beamIncidenceList( delSel );
3127} 3127}
3128void CalendarView::beamCalendar() 3128void CalendarView::beamCalendar()
3129{ 3129{
3130 QPtrList<Incidence> delSel = mCalendar->rawIncidences(); 3130 QPtrList<Incidence> delSel = mCalendar->rawIncidences();
3131 //qDebug("beamCalendar() "); 3131 //qDebug("beamCalendar() ");
3132 beamIncidenceList( delSel ); 3132 beamIncidenceList( delSel );
3133} 3133}
3134void CalendarView::beamFilteredCalendar() 3134void CalendarView::beamFilteredCalendar()
3135{ 3135{
3136 QPtrList<Incidence> delSel = mCalendar->incidences(); 3136 QPtrList<Incidence> delSel = mCalendar->incidences();
3137 //qDebug("beamFilteredCalendar() "); 3137 //qDebug("beamFilteredCalendar() ");
3138 beamIncidenceList( delSel ); 3138 beamIncidenceList( delSel );
3139} 3139}
3140void CalendarView::beamIncidenceList(QPtrList<Incidence> delSel ) 3140void CalendarView::beamIncidenceList(QPtrList<Incidence> delSel )
3141{ 3141{
3142 3142
3143 KOBeamPrefs beamDialog; 3143 KOBeamPrefs beamDialog;
3144 if ( beamDialog.exec () == QDialog::Rejected ) 3144 if ( beamDialog.exec () == QDialog::Rejected )
3145 return; 3145 return;
3146#ifdef DESKTOP_VERSION 3146#ifdef DESKTOP_VERSION
3147 QString fn = locateLocal( "tmp", "kopibeamfile" ); 3147 QString fn = locateLocal( "tmp", "kopibeamfile" );
3148#else 3148#else
3149 QString fn = "/tmp/kopibeamfile"; 3149 QString fn = "/tmp/kopibeamfile";
3150#endif 3150#endif
3151 QString mes; 3151 QString mes;
3152 bool createbup = true; 3152 bool createbup = true;
3153 if ( createbup ) { 3153 if ( createbup ) {
3154 QString description = "\n"; 3154 QString description = "\n";
3155 CalendarLocal* cal = new CalendarLocal(); 3155 CalendarLocal* cal = new CalendarLocal();
3156 if ( beamDialog.beamLocal() ) 3156 if ( beamDialog.beamLocal() )
3157 cal->setLocalTime(); 3157 cal->setLocalTime();
3158 else 3158 else
3159 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 3159 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
3160 Incidence *incidence = delSel.first(); 3160 Incidence *incidence = delSel.first();
3161 bool addText = false; 3161 bool addText = false;
3162 if ( delSel.count() < 10 ) 3162 if ( delSel.count() < 10 )
3163 addText = true; 3163 addText = true;
3164 else { 3164 else {
3165 description.sprintf(i18n(" %d items?"),delSel.count() ); 3165 description.sprintf(i18n(" %d items?"),delSel.count() );
3166 } 3166 }
3167 while ( incidence ) { 3167 while ( incidence ) {
3168 Incidence *in = incidence->clone(); 3168 Incidence *in = incidence->clone();
3169 if ( ! in->summary().isEmpty() ) { 3169 if ( ! in->summary().isEmpty() ) {
3170 in->setDescription(""); 3170 in->setDescription("");
3171 } else { 3171 } else {
3172 in->setSummary( in->description().left(20)); 3172 in->setSummary( in->description().left(20));
3173 in->setDescription(""); 3173 in->setDescription("");
3174 } 3174 }
3175 if ( addText ) 3175 if ( addText )
3176 description += in->summary() + "\n"; 3176 description += in->summary() + "\n";
3177 cal->addIncidence( in ); 3177 cal->addIncidence( in );
3178 incidence = delSel.next(); 3178 incidence = delSel.next();
3179 } 3179 }
3180 if ( beamDialog.beamVcal() ) { 3180 if ( beamDialog.beamVcal() ) {
3181 fn += ".vcs"; 3181 fn += ".vcs";
3182 FileStorage storage( cal, fn, new VCalFormat ); 3182 FileStorage storage( cal, fn, new VCalFormat );
3183 storage.save(); 3183 storage.save();
3184 } else { 3184 } else {
3185 fn += ".ics"; 3185 fn += ".ics";
3186 FileStorage storage( cal, fn, new ICalFormat( ) ); 3186 FileStorage storage( cal, fn, new ICalFormat( ) );
3187 storage.save(); 3187 storage.save();
3188 } 3188 }
3189 delete cal; 3189 delete cal;
3190 mes = i18n("KO/Pi: Ready for beaming"); 3190 mes = i18n("KO/Pi: Ready for beaming");
3191 topLevelWidget()->setCaption(mes); 3191 topLevelWidget()->setCaption(mes);
3192 KApplication::convert2latin1( fn ); 3192 KApplication::convert2latin1( fn );
3193#ifndef DESKTOP_VERSION 3193#ifndef DESKTOP_VERSION
3194 Ir *ir = new Ir( this ); 3194 Ir *ir = new Ir( this );
3195 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); 3195 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
3196 ir->send( fn, description, "text/x-vCalendar" ); 3196 ir->send( fn, description, "text/x-vCalendar" );
3197#endif 3197#endif
3198 } 3198 }
3199} 3199}
3200 3200
3201#ifndef DESKTOP_VERSION 3201#ifndef DESKTOP_VERSION
3202void CalendarView::beamDone( Ir *ir ) 3202void CalendarView::beamDone( Ir *ir )
3203{ 3203{
3204 delete ir; 3204 delete ir;
3205 topLevelWidget()->setCaption( i18n("KO/Pi: Beaming done.") ); 3205 topLevelWidget()->setCaption( i18n("KO/Pi: Beaming done.") );
3206 topLevelWidget()->raise(); 3206 topLevelWidget()->raise();
3207} 3207}
3208#else 3208#else
3209void CalendarView::beamDone( Ir *){;} 3209void CalendarView::beamDone( Ir *){;}
3210#endif 3210#endif
3211void CalendarView::moveIncidence(Incidence * inc ) 3211void CalendarView::moveIncidence(Incidence * inc )
3212{ 3212{
3213 if ( !inc ) return; 3213 if ( !inc ) return;
3214 showDatePickerPopup(); 3214 showDatePickerPopup();
3215 mDatePickerMode = 2; 3215 mDatePickerMode = 2;
3216 mMoveIncidence = inc ; 3216 mMoveIncidence = inc ;
3217 QDate da; 3217 QDate da;
3218 if ( mMoveIncidence->typeID() == todoID ) { 3218 if ( mMoveIncidence->typeID() == todoID ) {
3219 Todo * to = (Todo *) mMoveIncidence; 3219 Todo * to = (Todo *) mMoveIncidence;
3220 if ( to->hasDueDate() ) 3220 if ( to->hasDueDate() )
3221 da = to->dtDue().date(); 3221 da = to->dtDue().date();
3222 else 3222 else
3223 da = QDate::currentDate(); 3223 da = QDate::currentDate();
3224 } else { 3224 } else {
3225 da = mMoveIncidence->dtStart().date(); 3225 da = mMoveIncidence->dtStart().date();
3226 } 3226 }
3227 //PENDING set date for recurring incidence to date of recurrence 3227 //PENDING set date for recurring incidence to date of recurrence
3228 //mMoveIncidenceOldDate; 3228 //mMoveIncidenceOldDate;
3229 mDatePicker->setDate( da ); 3229 mDatePicker->setDate( da );
3230} 3230}
3231void CalendarView::showDatePickerPopup() 3231void CalendarView::showDatePickerPopup()
3232{ 3232{
3233 if ( mDateFrame->isVisible() ) 3233 if ( mDateFrame->isVisible() )
3234 mDateFrame->hide(); 3234 mDateFrame->hide();
3235 else { 3235 else {
3236 int offX = 0, offY = 0; 3236 int offX = 0, offY = 0;
3237#ifdef DESKTOP_VERSION 3237#ifdef DESKTOP_VERSION
3238 int w =mDatePicker->sizeHint().width() ; 3238 int w =mDatePicker->sizeHint().width() ;
3239 int h = mDatePicker->sizeHint().height() ; 3239 int h = mDatePicker->sizeHint().height() ;
3240 int dw = topLevelWidget()->width(); 3240 int dw = topLevelWidget()->width();
3241 int dh = topLevelWidget()->height(); 3241 int dh = topLevelWidget()->height();
3242 offX = topLevelWidget()->x(); 3242 offX = topLevelWidget()->x();
3243 offY = topLevelWidget()->y(); 3243 offY = topLevelWidget()->y();
3244#else 3244#else
3245 int w =mDatePicker->sizeHint().width() ; 3245 int w =mDatePicker->sizeHint().width() ;
3246 int h = mDatePicker->sizeHint().height() ; 3246 int h = mDatePicker->sizeHint().height() ;
3247 int dw = QApplication::desktop()->width(); 3247 int dw = QApplication::desktop()->width();
3248 int dh = QApplication::desktop()->height(); 3248 int dh = QApplication::desktop()->height();
3249#endif 3249#endif
3250 mDateFrame->setGeometry( (dw-w)/2+offX, (dh - h )/2+offY ,w,h ); 3250 mDateFrame->setGeometry( (dw-w)/2+offX, (dh - h )/2+offY ,w,h );
3251 mDateFrame->show(); 3251 mDateFrame->show();
3252 } 3252 }
3253} 3253}
3254void CalendarView::showDatePicker( ) 3254void CalendarView::showDatePicker( )
3255{ 3255{
3256 showDatePickerPopup(); 3256 showDatePickerPopup();
3257 mDatePickerMode = 1; 3257 mDatePickerMode = 1;
3258 mDatePicker->setDate( mNavigator->selectedDates().first() ); 3258 mDatePicker->setDate( mNavigator->selectedDates().first() );
3259} 3259}
3260 3260
3261void CalendarView::showEventEditor() 3261void CalendarView::showEventEditor()
3262{ 3262{
3263#ifdef DESKTOP_VERSION 3263#ifdef DESKTOP_VERSION
3264 int x,y,w,h; 3264 int x,y,w,h;
3265 x = mEventEditor->geometry().x(); 3265 x = mEventEditor->geometry().x();
3266 y = mEventEditor->geometry().y(); 3266 y = mEventEditor->geometry().y();
3267 w = mEventEditor->width(); 3267 w = mEventEditor->width();
3268 h = mEventEditor->height(); 3268 h = mEventEditor->height();
3269 mEventEditor->show(); 3269 mEventEditor->show();
3270 mEventEditor->setGeometry(x,y,w,h); 3270 mEventEditor->setGeometry(x,y,w,h);
3271#else 3271#else
3272 if ( mEventEditor->width() < QApplication::desktop()->width() -60 || mEventEditor->width() > QApplication::desktop()->width() ) { 3272 if ( mEventEditor->width() < QApplication::desktop()->width() -60 || mEventEditor->width() > QApplication::desktop()->width() ) {
3273 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") ); 3273 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") );
3274 qDebug("KO: CalendarView: recreate mEventEditor %d %d", mEventEditor->width(), QApplication::desktop()->width() ); 3274 qDebug("KO: CalendarView: recreate mEventEditor %d %d", mEventEditor->width(), QApplication::desktop()->width() );
3275 qApp->processEvents(); 3275 qApp->processEvents();
3276 delete mEventEditor; 3276 delete mEventEditor;
3277 mEventEditor = mDialogManager->getEventEditor(); 3277 mEventEditor = mDialogManager->getEventEditor();
3278 topLevelWidget()->setCaption( i18n("") ); 3278 topLevelWidget()->setCaption( i18n("") );
3279 } 3279 }
3280 mEventEditor->showMaximized(); 3280 mEventEditor->showMaximized();
3281#endif 3281#endif
3282} 3282}
3283void CalendarView::showTodoEditor() 3283void CalendarView::showTodoEditor()
3284{ 3284{
3285#ifdef DESKTOP_VERSION 3285#ifdef DESKTOP_VERSION
3286 int x,y,w,h; 3286 int x,y,w,h;
3287 x = mTodoEditor->geometry().x(); 3287 x = mTodoEditor->geometry().x();
3288 y = mTodoEditor->geometry().y(); 3288 y = mTodoEditor->geometry().y();
3289 w = mTodoEditor->width(); 3289 w = mTodoEditor->width();
3290 h = mTodoEditor->height(); 3290 h = mTodoEditor->height();
3291 mTodoEditor->show(); 3291 mTodoEditor->show();
3292 mTodoEditor->setGeometry(x,y,w,h); 3292 mTodoEditor->setGeometry(x,y,w,h);
3293#else 3293#else
3294 if ( mTodoEditor->width() < QApplication::desktop()->width() -60|| mTodoEditor->width() > QApplication::desktop()->width() ) { 3294 if ( mTodoEditor->width() < QApplication::desktop()->width() -60|| mTodoEditor->width() > QApplication::desktop()->width() ) {
3295 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") ); 3295 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") );
3296 qDebug("KO: CalendarView: recreate mTodoEditor %d %d ", mTodoEditor->width() ,QApplication::desktop()->width() ); 3296 qDebug("KO: CalendarView: recreate mTodoEditor %d %d ", mTodoEditor->width() ,QApplication::desktop()->width() );
3297 qApp->processEvents(); 3297 qApp->processEvents();
3298 delete mTodoEditor; 3298 delete mTodoEditor;
3299 mTodoEditor = mDialogManager->getTodoEditor(); 3299 mTodoEditor = mDialogManager->getTodoEditor();
3300 topLevelWidget()->setCaption( i18n("") ); 3300 topLevelWidget()->setCaption( i18n("") );
3301 } 3301 }
3302 mTodoEditor->showMaximized(); 3302 mTodoEditor->showMaximized();
3303#endif 3303#endif
3304} 3304}
3305 3305
3306void CalendarView::cloneIncidence() 3306void CalendarView::cloneIncidence()
3307{ 3307{
3308 Incidence *incidence = currentSelection(); 3308 Incidence *incidence = currentSelection();
3309 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3309 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3310 if ( incidence ) { 3310 if ( incidence ) {
3311 cloneIncidence(incidence); 3311 cloneIncidence(incidence);
3312 } 3312 }
3313} 3313}
3314void CalendarView::moveIncidence() 3314void CalendarView::moveIncidence()
3315{ 3315{
3316 Incidence *incidence = currentSelection(); 3316 Incidence *incidence = currentSelection();
3317 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3317 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3318 if ( incidence ) { 3318 if ( incidence ) {
3319 moveIncidence(incidence); 3319 moveIncidence(incidence);
3320 } 3320 }
3321} 3321}
3322void CalendarView::beamIncidence() 3322void CalendarView::beamIncidence()
3323{ 3323{
3324 Incidence *incidence = currentSelection(); 3324 Incidence *incidence = currentSelection();
3325 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3325 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3326 if ( incidence ) { 3326 if ( incidence ) {
3327 beamIncidence(incidence); 3327 beamIncidence(incidence);
3328 } 3328 }
3329} 3329}
3330void CalendarView::toggleCancelIncidence() 3330void CalendarView::toggleCancelIncidence()
3331{ 3331{
3332 Incidence *incidence = currentSelection(); 3332 Incidence *incidence = currentSelection();
3333 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3333 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3334 if ( incidence ) { 3334 if ( incidence ) {
3335 cancelIncidence(incidence); 3335 cancelIncidence(incidence);
3336 } 3336 }
3337} 3337}
3338 3338
3339 3339
3340void CalendarView::cancelIncidence(Incidence * inc ) 3340void CalendarView::cancelIncidence(Incidence * inc )
3341{ 3341{
3342 inc->setCancelled( ! inc->cancelled() ); 3342 inc->setCancelled( ! inc->cancelled() );
3343 changeIncidenceDisplay( inc,KOGlobals::EVENTEDITED ); 3343 changeIncidenceDisplay( inc,KOGlobals::EVENTEDITED );
3344 updateView(); 3344 updateView();
3345} 3345}
3346void CalendarView::cloneIncidence(Incidence * orgInc ) 3346void CalendarView::cloneIncidence(Incidence * orgInc )
3347{ 3347{
3348 Incidence * newInc = orgInc->clone(); 3348 Incidence * newInc = orgInc->clone();
3349 newInc->recreate(); 3349 newInc->recreate();
3350 3350
3351 if ( newInc->typeID() == todoID ) { 3351 if ( newInc->typeID() == todoID ) {
3352 Todo* t = (Todo*) newInc; 3352 Todo* t = (Todo*) newInc;
3353 bool cloneSub = false; 3353 bool cloneSub = false;
3354 if ( orgInc->relations().count() ) { 3354 if ( orgInc->relations().count() ) {
3355 int result = KMessageBox::warningYesNoCancel(this, 3355 int result = KMessageBox::warningYesNoCancel(this,
3356 i18n("The todo\n%1\nwill be cloned!\nIt has subtodos!\nDo you want to clone\nall subtodos as well?").arg( KGlobal::formatMessage ( newInc->summary(),0 ) ), 3356 i18n("The todo\n%1\nwill be cloned!\nIt has subtodos!\nDo you want to clone\nall subtodos as well?").arg( KGlobal::formatMessage ( newInc->summary(),0 ) ),
3357 i18n("Todo has subtodos"), 3357 i18n("Todo has subtodos"),
3358 i18n("Yes"), 3358 i18n("Yes"),
3359 i18n("No")); 3359 i18n("No"));
3360 3360
3361 if ( result == KMessageBox::Cancel ) { 3361 if ( result == KMessageBox::Cancel ) {
3362 delete t; 3362 delete t;
3363 return; 3363 return;
3364 } 3364 }
3365 if (result == KMessageBox::Yes) cloneSub = true; 3365 if (result == KMessageBox::Yes) cloneSub = true;
3366 } 3366 }
3367 showTodoEditor(); 3367 showTodoEditor();
3368 mTodoEditor->editTodo( t ); 3368 mTodoEditor->editTodo( t );
3369 if ( mTodoEditor->exec() ) { 3369 if ( mTodoEditor->exec() ) {
3370 if ( cloneSub ) { 3370 if ( cloneSub ) {
3371 orgInc->cloneRelations( t ); 3371 orgInc->cloneRelations( t );
3372 mCalendar->addIncidenceBranch( t ); 3372 mCalendar->addIncidenceBranch( t );
3373 updateView(); 3373 updateView();
3374 3374
3375 } else { 3375 } else {
3376 mCalendar->addTodo( t ); 3376 mCalendar->addTodo( t );
3377 updateView(); 3377 updateView();
3378 } 3378 }
3379 } else { 3379 } else {
3380 delete t; 3380 delete t;
3381 } 3381 }
3382 } 3382 }
3383 else if ( newInc->typeID() == eventID ) { 3383 else if ( newInc->typeID() == eventID ) {
3384 Event* e = (Event*) newInc; 3384 Event* e = (Event*) newInc;
3385 showEventEditor(); 3385 showEventEditor();
3386 mEventEditor->editEvent( e ); 3386 mEventEditor->editEvent( e );
3387 if ( mEventEditor->exec() ) { 3387 if ( mEventEditor->exec() ) {
3388 mCalendar->addEvent( e ); 3388 mCalendar->addEvent( e );
3389 updateView(); 3389 updateView();
3390 } else { 3390 } else {
3391 delete e; 3391 delete e;
3392 } 3392 }
3393 } if ( newInc->typeID() == journalID ) { 3393 } if ( newInc->typeID() == journalID ) {
3394 mCalendar->addJournal( (Journal*) newInc ); 3394 mCalendar->addJournal( (Journal*) newInc );
3395 editJournal( (Journal*) newInc ); 3395 editJournal( (Journal*) newInc );
3396 } 3396 }
3397 setActiveWindow(); 3397 setActiveWindow();
3398} 3398}
3399 3399
3400void CalendarView::newEvent() 3400void CalendarView::newEvent()
3401{ 3401{
3402 // TODO: Replace this code by a common eventDurationHint of KOBaseView. 3402 // TODO: Replace this code by a common eventDurationHint of KOBaseView.
3403 KOAgendaView *aView = mViewManager->agendaView(); 3403 KOAgendaView *aView = mViewManager->agendaView();
3404 if (aView) { 3404 if (aView) {
3405 if (aView->selectionStart().isValid()) { 3405 if (aView->selectionStart().isValid()) {
3406 if (aView->selectedIsAllDay()) { 3406 if (aView->selectedIsAllDay()) {
3407 newEvent(aView->selectionStart(),aView->selectionEnd(),true); 3407 newEvent(aView->selectionStart(),aView->selectionEnd(),true);
3408 } else { 3408 } else {
3409 newEvent(aView->selectionStart(),aView->selectionEnd()); 3409 newEvent(aView->selectionStart(),aView->selectionEnd());
3410 } 3410 }
3411 return; 3411 return;
3412 } 3412 }
3413 } 3413 }
3414 3414
3415 QDate date = mNavigator->selectedDates().first(); 3415 QDate date = mNavigator->selectedDates().first();
3416#if 0 3416#if 0
3417 QDateTime current = QDateTime::currentDateTime(); 3417 QDateTime current = QDateTime::currentDateTime();
3418 if ( date <= current.date() ) { 3418 if ( date <= current.date() ) {
3419 int hour = current.time().hour() +1; 3419 int hour = current.time().hour() +1;
3420 newEvent( QDateTime( current.date(), QTime( hour, 0, 0 ) ), 3420 newEvent( QDateTime( current.date(), QTime( hour, 0, 0 ) ),
3421 QDateTime( current.date(), QTime( hour+ KOPrefs::instance()->mDefaultDuration, 0, 0 ) ) ); 3421 QDateTime( current.date(), QTime( hour+ KOPrefs::instance()->mDefaultDuration, 0, 0 ) ) );
3422 } else 3422 } else
3423#endif 3423#endif
3424 newEvent( QDateTime( date, QTime( KOPrefs::instance()->mStartTime, 0, 0 ) ), 3424 newEvent( QDateTime( date, QTime( KOPrefs::instance()->mStartTime, 0, 0 ) ),
3425 QDateTime( date, QTime( KOPrefs::instance()->mStartTime + 3425 QDateTime( date, QTime( KOPrefs::instance()->mStartTime +
3426 KOPrefs::instance()->mDefaultDuration, 0, 0 ) ) ); 3426 KOPrefs::instance()->mDefaultDuration, 0, 0 ) ) );
3427} 3427}
3428 3428
3429void CalendarView::newEvent(QDateTime fh) 3429void CalendarView::newEvent(QDateTime fh)
3430{ 3430{
3431 newEvent(fh, 3431 newEvent(fh,
3432 QDateTime(fh.addSecs(3600*KOPrefs::instance()->mDefaultDuration))); 3432 QDateTime(fh.addSecs(3600*KOPrefs::instance()->mDefaultDuration)));
3433} 3433}
3434 3434
3435void CalendarView::newEvent(QDate dt) 3435void CalendarView::newEvent(QDate dt)
3436{ 3436{
3437 newEvent(QDateTime(dt, QTime(0,0,0)), 3437 newEvent(QDateTime(dt, QTime(0,0,0)),
3438 QDateTime(dt, QTime(0,0,0)), true); 3438 QDateTime(dt, QTime(0,0,0)), true);
3439} 3439}
3440void CalendarView::newEvent(QDateTime fromHint, QDateTime toHint) 3440void CalendarView::newEvent(QDateTime fromHint, QDateTime toHint)
3441{ 3441{
3442 newEvent(fromHint, toHint, false); 3442 newEvent(fromHint, toHint, false);
3443} 3443}
3444void CalendarView::newEvent(QDateTime fromHint, QDateTime toHint, bool allDay) 3444void CalendarView::newEvent(QDateTime fromHint, QDateTime toHint, bool allDay)
3445{ 3445{
3446 3446
3447 showEventEditor(); 3447 showEventEditor();
3448 mEventEditor->newEvent(fromHint,toHint,allDay); 3448 mEventEditor->newEvent(fromHint,toHint,allDay);
3449 if ( mFilterView->filtersEnabled() ) { 3449 if ( mFilterView->filtersEnabled() ) {
3450 CalFilter *filter = mFilterView->selectedFilter(); 3450 CalFilter *filter = mFilterView->selectedFilter();
3451 if (filter && filter->showCategories()) { 3451 if (filter && filter->showCategories()) {
3452 mEventEditor->setCategories(filter->categoryList().join(",") ); 3452 mEventEditor->setCategories(filter->categoryList().join(",") );
3453 } 3453 }
3454 if ( filter ) 3454 if ( filter )
3455 mEventEditor->setSecrecy( filter->getSecrecy() ); 3455 mEventEditor->setSecrecy( filter->getSecrecy() );
3456 } 3456 }
3457 mEventEditor->exec(); 3457 mEventEditor->exec();
3458 setActiveWindow(); 3458 setActiveWindow();
3459} 3459}
3460void CalendarView::todoAdded(Todo * t) 3460void CalendarView::todoAdded(Todo * t)
3461{ 3461{
3462 3462
3463 changeTodoDisplay ( t ,KOGlobals::EVENTADDED); 3463 changeTodoDisplay ( t ,KOGlobals::EVENTADDED);
3464 updateTodoViews(); 3464 updateTodoViews();
3465} 3465}
3466void CalendarView::todoChanged(Todo * t) 3466void CalendarView::todoChanged(Todo * t)
3467{ 3467{
3468 emit todoModified( t, 4 ); 3468 emit todoModified( t, 4 );
3469 // updateTodoViews(); 3469 // updateTodoViews();
3470} 3470}
3471void CalendarView::todoToBeDeleted(Todo *) 3471void CalendarView::todoToBeDeleted(Todo *)
3472{ 3472{
3473 //qDebug("todoToBeDeleted(Todo *) "); 3473 //qDebug("todoToBeDeleted(Todo *) ");
3474 updateTodoViews(); 3474 updateTodoViews();
3475} 3475}
3476void CalendarView::todoDeleted() 3476void CalendarView::todoDeleted()
3477{ 3477{
3478 //qDebug(" todoDeleted()"); 3478 //qDebug(" todoDeleted()");
3479 updateTodoViews(); 3479 updateTodoViews();
3480} 3480}
3481 3481
3482 3482
3483void CalendarView::newTodoDateTime( QDateTime dt, bool allday ) 3483void CalendarView::newTodoDateTime( QDateTime dt, bool allday )
3484{ 3484{
3485 showTodoEditor(); 3485 showTodoEditor();
3486 mTodoEditor->newTodo(dt,0,allday); 3486 mTodoEditor->newTodo(dt,0,allday);
3487 if ( mFilterView->filtersEnabled() ) { 3487 if ( mFilterView->filtersEnabled() ) {
3488 CalFilter *filter = mFilterView->selectedFilter(); 3488 CalFilter *filter = mFilterView->selectedFilter();
3489 if (filter && filter->showCategories()) { 3489 if (filter && filter->showCategories()) {
3490 mTodoEditor->setCategories(filter->categoryList().join(",") ); 3490 mTodoEditor->setCategories(filter->categoryList().join(",") );
3491 } 3491 }
3492 if ( filter ) 3492 if ( filter )
3493 mTodoEditor->setSecrecy( filter->getSecrecy() ); 3493 mTodoEditor->setSecrecy( filter->getSecrecy() );
3494 } 3494 }
3495 mTodoEditor->exec(); 3495 mTodoEditor->exec();
3496 setActiveWindow(); 3496 setActiveWindow();
3497} 3497}
3498 3498
3499void CalendarView::newTodo() 3499void CalendarView::newTodo()
3500{ 3500{
3501 newTodoDateTime( QDateTime(),true ); 3501 newTodoDateTime( QDateTime(),true );
3502} 3502}
3503 3503
3504void CalendarView::newSubTodo() 3504void CalendarView::newSubTodo()
3505{ 3505{
3506 Todo *todo = selectedTodo(); 3506 Todo *todo = selectedTodo();
3507 if ( todo ) newSubTodo( todo ); 3507 if ( todo ) newSubTodo( todo );
3508} 3508}
3509 3509
3510void CalendarView::newSubTodo(Todo *parentEvent) 3510void CalendarView::newSubTodo(Todo *parentEvent)
3511{ 3511{
3512 3512
3513 showTodoEditor(); 3513 showTodoEditor();
3514 mTodoEditor->newTodo(QDateTime(),parentEvent,true); 3514 mTodoEditor->newTodo(QDateTime(),parentEvent,true);
3515 mTodoEditor->exec(); 3515 mTodoEditor->exec();
3516 setActiveWindow(); 3516 setActiveWindow();
3517} 3517}
3518 3518
3519void CalendarView::newFloatingEvent() 3519void CalendarView::newFloatingEvent()
3520{ 3520{
3521 DateList tmpList = mNavigator->selectedDates(); 3521 DateList tmpList = mNavigator->selectedDates();
3522 QDate date = tmpList.first(); 3522 QDate date = tmpList.first();
3523 3523
3524 newEvent( QDateTime( date, QTime( 12, 0, 0 ) ), 3524 newEvent( QDateTime( date, QTime( 12, 0, 0 ) ),
3525 QDateTime( date, QTime( 12, 0, 0 ) ), true ); 3525 QDateTime( date, QTime( 12, 0, 0 ) ), true );
3526} 3526}
3527 3527
3528 3528
3529void CalendarView::editEvent( Event *event ) 3529void CalendarView::editEvent( Event *event )
3530{ 3530{
3531 3531
3532 if ( !event ) return; 3532 if ( !event ) return;
3533 if ( event->isReadOnly() ) { 3533 if ( event->isReadOnly() ) {
3534 showEvent( event ); 3534 showEvent( event );
3535 return; 3535 return;
3536 } 3536 }
3537 showEventEditor(); 3537 showEventEditor();
3538 mEventEditor->editEvent( event , mFlagEditDescription); 3538 mEventEditor->editEvent( event , mFlagEditDescription);
3539 mEventEditor->exec(); 3539 mEventEditor->exec();
3540 setActiveWindow(); 3540 setActiveWindow();
3541 3541
3542} 3542}
3543void CalendarView::editJournal( Journal *jour ) 3543void CalendarView::editJournal( Journal *jour )
3544{ 3544{
3545 if ( !jour ) return; 3545 if ( !jour ) return;
3546 mDialogManager->hideSearchDialog(); 3546 mDialogManager->hideSearchDialog();
3547 mViewManager->showJournalView(); 3547 mViewManager->showJournalView();
3548 mNavigator->slotDaySelect( jour->dtStart().date() ); 3548 mNavigator->slotDaySelect( jour->dtStart().date() );
3549} 3549}
3550void CalendarView::editTodo( Todo *todo ) 3550void CalendarView::editTodo( Todo *todo )
3551{ 3551{
3552 if ( !todo ) return; 3552 if ( !todo ) return;
3553 3553
3554 if ( todo->isReadOnly() ) { 3554 if ( todo->isReadOnly() ) {
3555 showTodo( todo ); 3555 showTodo( todo );
3556 return; 3556 return;
3557 } 3557 }
3558 showTodoEditor(); 3558 showTodoEditor();
3559 mTodoEditor->editTodo( todo ,mFlagEditDescription); 3559 mTodoEditor->editTodo( todo ,mFlagEditDescription);
3560 mTodoEditor->exec(); 3560 mTodoEditor->exec();
3561 setActiveWindow(); 3561 setActiveWindow();
3562 3562
3563} 3563}
3564 3564
3565KOEventViewerDialog* CalendarView::getEventViewerDialog() 3565KOEventViewerDialog* CalendarView::getEventViewerDialog()
3566{ 3566{
3567 if ( !mEventViewerDialog ) { 3567 if ( !mEventViewerDialog ) {
3568 mEventViewerDialog = new KOEventViewerDialog(0); 3568 mEventViewerDialog = new KOEventViewerDialog(0);
3569 connect( mEventViewerDialog, SIGNAL( editIncidence( Incidence* )), this, SLOT(editIncidence( Incidence* ) ) ); 3569 connect( mEventViewerDialog, SIGNAL( editIncidence( Incidence* )), this, SLOT(editIncidence( Incidence* ) ) );
3570 connect( this, SIGNAL(configChanged()), mEventViewerDialog, SLOT(updateConfig())); 3570 connect( this, SIGNAL(configChanged()), mEventViewerDialog, SLOT(updateConfig()));
3571 connect( mEventViewerDialog, SIGNAL(jumpToTime( const QDate &)), 3571 connect( mEventViewerDialog, SIGNAL(jumpToTime( const QDate &)),
3572 dateNavigator(), SLOT( selectWeek( const QDate & ) ) ); 3572 dateNavigator(), SLOT( selectWeek( const QDate & ) ) );
3573 connect( mEventViewerDialog, SIGNAL(showAgendaView( bool ) ), 3573 connect( mEventViewerDialog, SIGNAL(showAgendaView( bool ) ),
3574 viewManager(), SLOT( showAgendaView( bool ) ) ); 3574 viewManager(), SLOT( showAgendaView( bool ) ) );
3575 connect( mEventViewerDialog, SIGNAL(signalViewerClosed()), 3575 connect( mEventViewerDialog, SIGNAL(signalViewerClosed()),
3576 this, SLOT( slotViewerClosed() ) ); 3576 this, SLOT( slotViewerClosed() ) );
3577 connect( mEventViewerDialog, SIGNAL( todoCompleted(Todo *) ), 3577 connect( mEventViewerDialog, SIGNAL( todoCompleted(Todo *) ),
3578 this, SLOT( todoChanged(Todo *) ) ); 3578 this, SLOT( todoChanged(Todo *) ) );
3579 connect( mEventViewerDialog, SIGNAL( showIncidence( QString ) ),SLOT( showIncidence( QString ) )); 3579 connect( mEventViewerDialog, SIGNAL( showIncidence( QString ) ),SLOT( showIncidence( QString ) ));
3580 mEventViewerDialog->resize( 640, 480 ); 3580 mEventViewerDialog->resize( 640, 480 );
3581 3581
3582 } 3582 }
3583 return mEventViewerDialog; 3583 return mEventViewerDialog;
3584} 3584}
3585void CalendarView::showEvent(Event *event) 3585void CalendarView::showEvent(Event *event)
3586{ 3586{
3587 getEventViewerDialog()->setEvent(event); 3587 getEventViewerDialog()->setEvent(event);
3588 getEventViewerDialog()->showMe(); 3588 getEventViewerDialog()->showMe();
3589} 3589}
3590 3590
3591void CalendarView::showTodo(Todo *event) 3591void CalendarView::showTodo(Todo *event)
3592{ 3592{
3593 getEventViewerDialog()->setTodo(event); 3593 getEventViewerDialog()->setTodo(event);
3594 getEventViewerDialog()->showMe(); 3594 getEventViewerDialog()->showMe();
3595} 3595}
3596void CalendarView::showJournal( Journal *jour ) 3596void CalendarView::showJournal( Journal *jour )
3597{ 3597{
3598 getEventViewerDialog()->setJournal(jour); 3598 getEventViewerDialog()->setJournal(jour);
3599 getEventViewerDialog()->showMe(); 3599 getEventViewerDialog()->showMe();
3600 3600
3601} 3601}
3602// void CalendarView::todoModified (Todo *event, int changed) 3602// void CalendarView::todoModified (Todo *event, int changed)
3603// { 3603// {
3604// // if (mDialogList.find (event) != mDialogList.end ()) { 3604// // if (mDialogList.find (event) != mDialogList.end ()) {
3605// // kdDebug() << "Todo modified and open" << endl; 3605// // kdDebug() << "Todo modified and open" << endl;
3606// // KOTodoEditor* temp = (KOTodoEditor *) mDialogList[event]; 3606// // KOTodoEditor* temp = (KOTodoEditor *) mDialogList[event];
3607// // temp->modified (changed); 3607// // temp->modified (changed);
3608 3608
3609// // } 3609// // }
3610 3610
3611// mViewManager->updateView(); 3611// mViewManager->updateView();
3612// } 3612// }
3613 3613
3614void CalendarView::appointment_show() 3614void CalendarView::appointment_show()
3615{ 3615{
3616 Event *anEvent = 0; 3616 Event *anEvent = 0;
3617 3617
3618 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first(); 3618 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first();
3619 3619
3620 if (mViewManager->currentView()->isEventView()) { 3620 if (mViewManager->currentView()->isEventView()) {
3621 if ( incidence && incidence->typeID() == eventID ) { 3621 if ( incidence && incidence->typeID() == eventID ) {
3622 anEvent = static_cast<Event *>(incidence); 3622 anEvent = static_cast<Event *>(incidence);
3623 } 3623 }
3624 } 3624 }
3625 3625
3626 if (!anEvent) { 3626 if (!anEvent) {
3627 KNotifyClient::beep(); 3627 KNotifyClient::beep();
3628 return; 3628 return;
3629 } 3629 }
3630 3630
3631 showEvent(anEvent); 3631 showEvent(anEvent);
3632} 3632}
3633 3633
3634void CalendarView::appointment_edit() 3634void CalendarView::appointment_edit()
3635{ 3635{
3636 Event *anEvent = 0; 3636 Event *anEvent = 0;
3637 3637
3638 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first(); 3638 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first();
3639 3639
3640 if (mViewManager->currentView()->isEventView()) { 3640 if (mViewManager->currentView()->isEventView()) {
3641 if ( incidence && incidence->typeID() == eventID ) { 3641 if ( incidence && incidence->typeID() == eventID ) {
3642 anEvent = static_cast<Event *>(incidence); 3642 anEvent = static_cast<Event *>(incidence);
3643 } 3643 }
3644 } 3644 }
3645 3645
3646 if (!anEvent) { 3646 if (!anEvent) {
3647 KNotifyClient::beep(); 3647 KNotifyClient::beep();
3648 return; 3648 return;
3649 } 3649 }
3650 3650
3651 editEvent(anEvent); 3651 editEvent(anEvent);
3652} 3652}
3653 3653
3654void CalendarView::appointment_delete() 3654void CalendarView::appointment_delete()
3655{ 3655{
3656 Event *anEvent = 0; 3656 Event *anEvent = 0;
3657 3657
3658 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first(); 3658 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first();
3659 3659
3660 if (mViewManager->currentView()->isEventView()) { 3660 if (mViewManager->currentView()->isEventView()) {
3661 if ( incidence && incidence->typeID() == eventID ) { 3661 if ( incidence && incidence->typeID() == eventID ) {
3662 anEvent = static_cast<Event *>(incidence); 3662 anEvent = static_cast<Event *>(incidence);
3663 } 3663 }
3664 } 3664 }
3665 3665
3666 if (!anEvent) { 3666 if (!anEvent) {
3667 KNotifyClient::beep(); 3667 KNotifyClient::beep();
3668 return; 3668 return;
3669 } 3669 }
3670 3670
3671 deleteEvent(anEvent); 3671 deleteEvent(anEvent);
3672} 3672}
3673 3673
3674void CalendarView::todo_resub( Todo * parent, Todo * sub ) 3674void CalendarView::todo_resub( Todo * parent, Todo * sub )
3675{ 3675{
3676 if (!sub) return; 3676 if (!sub) return;
3677 if ( sub->relatedTo() == parent ) 3677 if ( sub->relatedTo() == parent )
3678 return; 3678 return;
3679 sub->setRelatedTo(parent); 3679 sub->setRelatedTo(parent);
3680 sub->updated(); 3680 sub->updated();
3681 setModified(true); 3681 setModified(true);
3682 updateView(); 3682 updateView();
3683} 3683}
3684void CalendarView::todo_unsub(Todo *anTodo ) 3684void CalendarView::todo_unsub(Todo *anTodo )
3685{ 3685{
3686 todo_resub( 0, anTodo ); 3686 todo_resub( 0, anTodo );
3687} 3687}
3688 3688
3689void CalendarView::deleteTodo(Todo *todo) 3689void CalendarView::deleteTodo(Todo *todo)
3690{ 3690{
3691 if (!todo) { 3691 if (!todo) {
3692 KNotifyClient::beep(); 3692 KNotifyClient::beep();
3693 return; 3693 return;
3694 } 3694 }
3695 if (KOPrefs::instance()->mConfirm) { 3695 if (KOPrefs::instance()->mConfirm) {
3696 QString text = KGlobal::formatMessage ( todo->summary(),0 ); 3696 QString text = KGlobal::formatMessage ( todo->summary(),0 );
3697 if (!todo->relations().isEmpty()) { 3697 if (!todo->relations().isEmpty()) {
3698 text += i18n("\nhas sub-todos.\nAll completed sub-todos\nwill be deleted as well!"); 3698 text += i18n("\nhas sub-todos.\nAll completed sub-todos\nwill be deleted as well!");
3699 3699
3700 } 3700 }
3701 switch (msgItemDelete(i18n("Todo:") +"\n"+text)) { 3701 switch (msgItemDelete(i18n("Todo:") +"\n"+text)) {
3702 case KMessageBox::Continue: // OK 3702 case KMessageBox::Continue: // OK
3703 bool deleteT = false; 3703 bool deleteT = false;
3704 if (!todo->relations().isEmpty()) { 3704 if (!todo->relations().isEmpty()) {
3705 deleteT = removeCompletedSubTodos( todo ); 3705 deleteT = removeCompletedSubTodos( todo );
3706 } 3706 }
3707 // deleteT == true: todo already deleted in removeCompletedSubTodos 3707 // deleteT == true: todo already deleted in removeCompletedSubTodos
3708 if ( !deleteT ) { 3708 if ( !deleteT ) {
3709 checkExternalId( todo ); 3709 checkExternalId( todo );
3710 calendar()->deleteTodo(todo); 3710 calendar()->deleteTodo(todo);
3711 changeTodoDisplay( todo,KOGlobals::EVENTDELETED ); 3711 changeTodoDisplay( todo,KOGlobals::EVENTDELETED );
3712 updateView(); 3712 updateView();
3713 } 3713 }
3714 break; 3714 break;
3715 } // switch 3715 } // switch
3716 } else { 3716 } else {
3717 checkExternalId( todo ); 3717 checkExternalId( todo );
3718 mCalendar->deleteTodo(todo); 3718 mCalendar->deleteTodo(todo);
3719 changeTodoDisplay( todo,KOGlobals::EVENTDELETED ); 3719 changeTodoDisplay( todo,KOGlobals::EVENTDELETED );
3720 updateView(); 3720 updateView();
3721 } 3721 }
3722 3722
3723 emit updateSearchDialog(); 3723 emit updateSearchDialog();
3724} 3724}
3725void CalendarView::deleteJournal(Journal *jour) 3725void CalendarView::deleteJournal(Journal *jour)
3726{ 3726{
3727 if (!jour) { 3727 if (!jour) {
3728 KNotifyClient::beep(); 3728 KNotifyClient::beep();
3729 return; 3729 return;
3730 } 3730 }
3731 if (KOPrefs::instance()->mConfirm) { 3731 if (KOPrefs::instance()->mConfirm) {
3732 3732
3733 QString des; 3733 QString des;
3734 if ( !jour->summary().isEmpty() ) { 3734 if ( !jour->summary().isEmpty() ) {
3735 des = jour->summary(); 3735 des = jour->summary();
3736 } else { 3736 } else {
3737 des = jour->description().left(30); 3737 des = jour->description().left(30);
3738 des = des.simplifyWhiteSpace (); 3738 des = des.simplifyWhiteSpace ();
3739 des.replace (QRegExp ("\\n"),"" ); 3739 des.replace (QRegExp ("\\n"),"" );
3740 des.replace (QRegExp ("\\r"),"" ); 3740 des.replace (QRegExp ("\\r"),"" );
3741 } 3741 }
3742 switch (msgItemDelete( i18n("Journal:") +"\n"+KGlobal::formatMessage ( des,0 ))) { 3742 switch (msgItemDelete( i18n("Journal:") +"\n"+KGlobal::formatMessage ( des,0 ))) {
3743 case KMessageBox::Continue: // OK 3743 case KMessageBox::Continue: // OK
3744 calendar()->deleteJournal(jour); 3744 calendar()->deleteJournal(jour);
3745 updateView(); 3745 updateView();
3746 break; 3746 break;
3747 } // switch 3747 } // switch
3748 } else { 3748 } else {
3749 calendar()->deleteJournal(jour);; 3749 calendar()->deleteJournal(jour);;
3750 updateView(); 3750 updateView();
3751 } 3751 }
3752 emit updateSearchDialog(); 3752 emit updateSearchDialog();
3753} 3753}
3754 3754
3755void CalendarView::deleteEvent(Event *anEvent) 3755void CalendarView::deleteEvent(Event *anEvent)
3756{ 3756{
3757 if (!anEvent) { 3757 if (!anEvent) {
3758 KNotifyClient::beep(); 3758 KNotifyClient::beep();
3759 return; 3759 return;
3760 } 3760 }
3761 3761
3762 if (anEvent->recurrence()->doesRecur()) { 3762 if (anEvent->doesRecur()) {
3763 QDate itemDate = mViewManager->currentSelectionDate(); 3763 QDate itemDate = mViewManager->currentSelectionDate();
3764 int km; 3764 int km;
3765 if (!itemDate.isValid()) { 3765 if (!itemDate.isValid()) {
3766 //kdDebug() << "Date Not Valid" << endl; 3766 //kdDebug() << "Date Not Valid" << endl;
3767 if (KOPrefs::instance()->mConfirm) { 3767 if (KOPrefs::instance()->mConfirm) {
3768 km = KMessageBox::warningContinueCancel(this,KGlobal::formatMessage ( anEvent->summary(),0 ) + 3768 km = KMessageBox::warningContinueCancel(this,KGlobal::formatMessage ( anEvent->summary(),0 ) +
3769 i18n("\nThis event recurs\nover multiple dates.\nAre you sure you want\nto delete this event\nand all its recurrences?"), 3769 i18n("\nThis event recurs\nover multiple dates.\nAre you sure you want\nto delete this event\nand all its recurrences?"),
3770 i18n("KO/Pi Confirmation"),i18n("Delete All")); 3770 i18n("KO/Pi Confirmation"),i18n("Delete All"));
3771 if ( km == KMessageBox::Continue ) 3771 if ( km == KMessageBox::Continue )
3772 km = KMessageBox::No; // No = all below 3772 km = KMessageBox::No; // No = all below
3773 } else 3773 } else
3774 km = KMessageBox::No; 3774 km = KMessageBox::No;
3775 } else { 3775 } else {
3776 km = KMessageBox::warningYesNoCancel(this,KGlobal::formatMessage ( anEvent->summary(),0 ) + 3776 km = KMessageBox::warningYesNoCancel(this,KGlobal::formatMessage ( anEvent->summary(),0 ) +
3777 i18n("\nThis event recurs\nover multiple dates.\nDo you want to delete\nall it's recurrences,\nor only the current one on:\n")+ 3777 i18n("\nThis event recurs\nover multiple dates.\nDo you want to delete\nall it's recurrences,\nor only the current one on:\n")+
3778 KGlobal::locale()->formatDate(itemDate)+i18n(" ?\n\nDelete:\n"), 3778 KGlobal::locale()->formatDate(itemDate)+i18n(" ?\n\nDelete:\n"),
3779 i18n("KO/Pi Confirmation"),i18n("Current"), 3779 i18n("KO/Pi Confirmation"),i18n("Current"),
3780 i18n("All")); 3780 i18n("All"));
3781 } 3781 }
3782 switch(km) { 3782 switch(km) {
3783 3783
3784 case KMessageBox::No: // Continue // all 3784 case KMessageBox::No: // Continue // all
3785 //qDebug("KMessageBox::No "); 3785 //qDebug("KMessageBox::No ");
3786 if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0) 3786 if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0)
3787 schedule(Scheduler::Cancel,anEvent); 3787 schedule(Scheduler::Cancel,anEvent);
3788 3788
3789 checkExternalId( anEvent); 3789 checkExternalId( anEvent);
3790 mCalendar->deleteEvent(anEvent); 3790 mCalendar->deleteEvent(anEvent);
3791 changeEventDisplay(anEvent,KOGlobals::EVENTDELETED); 3791 changeEventDisplay(anEvent,KOGlobals::EVENTDELETED);
3792 break; 3792 break;
3793 3793
3794 // Disabled because it does not work 3794 // Disabled because it does not work
3795 //#if 0 3795 //#if 0
3796 case KMessageBox::Yes: // just this one 3796 case KMessageBox::Yes: // just this one
3797 //QDate qd = mNavigator->selectedDates().first(); 3797 //QDate qd = mNavigator->selectedDates().first();
3798 //if (!qd.isValid()) { 3798 //if (!qd.isValid()) {
3799 // kdDebug() << "no date selected, or invalid date" << endl; 3799 // kdDebug() << "no date selected, or invalid date" << endl;
3800 // KNotifyClient::beep(); 3800 // KNotifyClient::beep();
3801 // return; 3801 // return;
3802 //} 3802 //}
3803 //while (!anEvent->recursOn(qd)) qd = qd.addDays(1); 3803 //while (!anEvent->recursOn(qd)) qd = qd.addDays(1);
3804 if (itemDate!=QDate(1,1,1) || itemDate.isValid()) { 3804 if (itemDate!=QDate(1,1,1) || itemDate.isValid()) {
3805 anEvent->addExDate(itemDate); 3805 anEvent->addExDate(itemDate);
3806 int duration = anEvent->recurrence()->duration(); 3806 int duration = anEvent->recurrence()->duration();
3807 if ( duration > 0 ) { 3807 if ( duration > 0 ) {
3808 anEvent->recurrence()->setDuration( duration - 1 ); 3808 anEvent->recurrence()->setDuration( duration - 1 );
3809 } 3809 }
3810 changeEventDisplay(anEvent, KOGlobals::EVENTEDITED); 3810 changeEventDisplay(anEvent, KOGlobals::EVENTEDITED);
3811 } 3811 }
3812 break; 3812 break;
3813 //#endif 3813 //#endif
3814 } // switch 3814 } // switch
3815 } else { 3815 } else {
3816 if (KOPrefs::instance()->mConfirm) { 3816 if (KOPrefs::instance()->mConfirm) {
3817 switch (KMessageBox::warningContinueCancel(this,KGlobal::formatMessage ( anEvent->summary(),0 ) + 3817 switch (KMessageBox::warningContinueCancel(this,KGlobal::formatMessage ( anEvent->summary(),0 ) +
3818 i18n("\nAre you sure you want\nto delete this event?"), 3818 i18n("\nAre you sure you want\nto delete this event?"),
3819 i18n("KO/Pi Confirmation"),i18n("Delete"))) { 3819 i18n("KO/Pi Confirmation"),i18n("Delete"))) {
3820 case KMessageBox::Continue: // OK 3820 case KMessageBox::Continue: // OK
3821 if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0) 3821 if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0)
3822 schedule(Scheduler::Cancel,anEvent); 3822 schedule(Scheduler::Cancel,anEvent);
3823 checkExternalId( anEvent); 3823 checkExternalId( anEvent);
3824 mCalendar->deleteEvent(anEvent); 3824 mCalendar->deleteEvent(anEvent);
3825 changeEventDisplay(anEvent, KOGlobals::EVENTDELETED); 3825 changeEventDisplay(anEvent, KOGlobals::EVENTDELETED);
3826 break; 3826 break;
3827 } // switch 3827 } // switch
3828 } else { 3828 } else {
3829 if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0) 3829 if (anEvent->organizer()==KOPrefs::instance()->email() && anEvent->attendeeCount()>0)
3830 schedule(Scheduler::Cancel,anEvent); 3830 schedule(Scheduler::Cancel,anEvent);
3831 checkExternalId( anEvent); 3831 checkExternalId( anEvent);
3832 mCalendar->deleteEvent(anEvent); 3832 mCalendar->deleteEvent(anEvent);
3833 changeEventDisplay(anEvent, KOGlobals::EVENTDELETED); 3833 changeEventDisplay(anEvent, KOGlobals::EVENTDELETED);
3834 } 3834 }
3835 } // if-else 3835 } // if-else
3836 emit updateSearchDialog(); 3836 emit updateSearchDialog();
3837} 3837}
3838 3838
3839bool CalendarView::deleteEvent(const QString &uid) 3839bool CalendarView::deleteEvent(const QString &uid)
3840{ 3840{
3841 Event *ev = mCalendar->event(uid); 3841 Event *ev = mCalendar->event(uid);
3842 if (ev) { 3842 if (ev) {
3843 deleteEvent(ev); 3843 deleteEvent(ev);
3844 return true; 3844 return true;
3845 } else { 3845 } else {
3846 return false; 3846 return false;
3847 } 3847 }
3848} 3848}
3849 3849
3850/*****************************************************************************/ 3850/*****************************************************************************/
3851 3851
3852void CalendarView::action_mail() 3852void CalendarView::action_mail()
3853{ 3853{
3854#ifndef KORG_NOMAIL 3854#ifndef KORG_NOMAIL
3855 KOMailClient mailClient; 3855 KOMailClient mailClient;
3856 3856
3857 Incidence *incidence = currentSelection(); 3857 Incidence *incidence = currentSelection();
3858 3858
3859 if (!incidence) { 3859 if (!incidence) {
3860 KMessageBox::sorry(this,i18n("Can't generate mail:\nNo event selected.")); 3860 KMessageBox::sorry(this,i18n("Can't generate mail:\nNo event selected."));
3861 return; 3861 return;
3862 } 3862 }
3863 if(incidence->attendeeCount() == 0 ) { 3863 if(incidence->attendeeCount() == 0 ) {
3864 KMessageBox::sorry(this, 3864 KMessageBox::sorry(this,
3865 i18n("Can't generate mail:\nNo attendees defined.\n")); 3865 i18n("Can't generate mail:\nNo attendees defined.\n"));
3866 return; 3866 return;
3867 } 3867 }
3868 3868
3869 CalendarLocal cal_tmp; 3869 CalendarLocal cal_tmp;
3870 Event *event = 0; 3870 Event *event = 0;
3871 Event *ev = 0; 3871 Event *ev = 0;
3872 if ( incidence && incidence->typeID() == eventID ) { 3872 if ( incidence && incidence->typeID() == eventID ) {
3873 event = static_cast<Event *>(incidence); 3873 event = static_cast<Event *>(incidence);
3874 ev = new Event(*event); 3874 ev = new Event(*event);
3875 cal_tmp.addEvent(ev); 3875 cal_tmp.addEvent(ev);
3876 } 3876 }
3877 ICalFormat mForm(); 3877 ICalFormat mForm();
3878 QString attachment = mForm.toString( &cal_tmp ); 3878 QString attachment = mForm.toString( &cal_tmp );
3879 if (ev) delete(ev); 3879 if (ev) delete(ev);
3880 3880
3881 mailClient.mailAttendees(currentSelection(), attachment); 3881 mailClient.mailAttendees(currentSelection(), attachment);
3882 3882
3883#endif 3883#endif
3884 3884
3885#if 0 3885#if 0
3886 Event *anEvent = 0; 3886 Event *anEvent = 0;
3887 if (mViewManager->currentView()->isEventView()) { 3887 if (mViewManager->currentView()->isEventView()) {
3888 anEvent = dynamic_cast<Event *>((mViewManager->currentView()->selectedIncidences()).first()); 3888 anEvent = dynamic_cast<Event *>((mViewManager->currentView()->selectedIncidences()).first());
3889 } 3889 }
3890 3890
3891 if (!anEvent) { 3891 if (!anEvent) {
3892 KMessageBox::sorry(this,i18n("Can't generate mail:\nNo event selected.")); 3892 KMessageBox::sorry(this,i18n("Can't generate mail:\nNo event selected."));
3893 return; 3893 return;
3894 } 3894 }
3895 if(anEvent->attendeeCount() == 0 ) { 3895 if(anEvent->attendeeCount() == 0 ) {
3896 KMessageBox::sorry(this, 3896 KMessageBox::sorry(this,
3897 i18n("Can't generate mail:\nNo attendees defined.\n")); 3897 i18n("Can't generate mail:\nNo attendees defined.\n"));
3898 return; 3898 return;
3899 } 3899 }
3900 3900
3901 mailobject.emailEvent(anEvent); 3901 mailobject.emailEvent(anEvent);
3902#endif 3902#endif
3903} 3903}
3904 3904
3905 3905
3906void CalendarView::schedule_publish(Incidence *incidence) 3906void CalendarView::schedule_publish(Incidence *incidence)
3907{ 3907{
3908 Event *event = 0; 3908 Event *event = 0;
3909 Todo *todo = 0; 3909 Todo *todo = 0;
3910 3910
3911 if (incidence == 0) { 3911 if (incidence == 0) {
3912 incidence = mViewManager->currentView()->selectedIncidences().first(); 3912 incidence = mViewManager->currentView()->selectedIncidences().first();
3913 if (incidence == 0) { 3913 if (incidence == 0) {
3914 incidence = mTodoList->selectedIncidences().first(); 3914 incidence = mTodoList->selectedIncidences().first();
3915 } 3915 }
3916 } 3916 }
3917 if ( incidence && incidence->typeID() == eventID ) { 3917 if ( incidence && incidence->typeID() == eventID ) {
3918 event = static_cast<Event *>(incidence); 3918 event = static_cast<Event *>(incidence);
3919 } else { 3919 } else {
3920 if ( incidence && incidence->typeID() == todoID ) { 3920 if ( incidence && incidence->typeID() == todoID ) {
3921 todo = static_cast<Todo *>(incidence); 3921 todo = static_cast<Todo *>(incidence);
3922 } 3922 }
3923 } 3923 }
3924 3924
3925 if (!event && !todo) { 3925 if (!event && !todo) {
3926 KMessageBox::sorry(this,i18n("No event selected.")); 3926 KMessageBox::sorry(this,i18n("No event selected."));
3927 return; 3927 return;
3928 } 3928 }
3929 3929
3930 PublishDialog *publishdlg = new PublishDialog(); 3930 PublishDialog *publishdlg = new PublishDialog();
3931 if (incidence->attendeeCount()>0) { 3931 if (incidence->attendeeCount()>0) {
3932 QPtrList<Attendee> attendees = incidence->attendees(); 3932 QPtrList<Attendee> attendees = incidence->attendees();
3933 attendees.first(); 3933 attendees.first();
3934 while ( attendees.current()!=0 ) { 3934 while ( attendees.current()!=0 ) {
3935 publishdlg->addAttendee(attendees.current()); 3935 publishdlg->addAttendee(attendees.current());
3936 attendees.next(); 3936 attendees.next();
3937 } 3937 }
3938 } 3938 }
3939 bool send = true; 3939 bool send = true;
3940 if ( KOPrefs::instance()->mMailClient == KOPrefs::MailClientSendmail ) { 3940 if ( KOPrefs::instance()->mMailClient == KOPrefs::MailClientSendmail ) {
3941 if ( publishdlg->exec() != QDialog::Accepted ) 3941 if ( publishdlg->exec() != QDialog::Accepted )
3942 send = false; 3942 send = false;
3943 } 3943 }
3944 if ( send ) { 3944 if ( send ) {
3945 OutgoingDialog *dlg = mDialogManager->outgoingDialog(); 3945 OutgoingDialog *dlg = mDialogManager->outgoingDialog();
3946 if ( event ) { 3946 if ( event ) {
3947 Event *ev = new Event(*event); 3947 Event *ev = new Event(*event);
3948 ev->registerObserver(0); 3948 ev->registerObserver(0);
3949 ev->clearAttendees(); 3949 ev->clearAttendees();
3950 if (!dlg->addMessage(ev,Scheduler::Publish,publishdlg->addresses())) { 3950 if (!dlg->addMessage(ev,Scheduler::Publish,publishdlg->addresses())) {
3951 delete(ev); 3951 delete(ev);
3952 } 3952 }
3953 } else { 3953 } else {
3954 if ( todo ) { 3954 if ( todo ) {
3955 Todo *ev = new Todo(*todo); 3955 Todo *ev = new Todo(*todo);
3956 ev->registerObserver(0); 3956 ev->registerObserver(0);
3957 ev->clearAttendees(); 3957 ev->clearAttendees();
3958 if (!dlg->addMessage(ev,Scheduler::Publish,publishdlg->addresses())) { 3958 if (!dlg->addMessage(ev,Scheduler::Publish,publishdlg->addresses())) {
3959 delete(ev); 3959 delete(ev);
3960 } 3960 }
3961 } 3961 }
3962 } 3962 }
3963 } 3963 }
3964 delete publishdlg; 3964 delete publishdlg;
3965} 3965}
3966 3966
3967void CalendarView::schedule_request(Incidence *incidence) 3967void CalendarView::schedule_request(Incidence *incidence)
3968{ 3968{
3969 schedule(Scheduler::Request,incidence); 3969 schedule(Scheduler::Request,incidence);
3970} 3970}
3971 3971
3972void CalendarView::schedule_refresh(Incidence *incidence) 3972void CalendarView::schedule_refresh(Incidence *incidence)
3973{ 3973{
3974 schedule(Scheduler::Refresh,incidence); 3974 schedule(Scheduler::Refresh,incidence);
3975} 3975}
3976 3976
3977void CalendarView::schedule_cancel(Incidence *incidence) 3977void CalendarView::schedule_cancel(Incidence *incidence)
3978{ 3978{
3979 schedule(Scheduler::Cancel,incidence); 3979 schedule(Scheduler::Cancel,incidence);
3980} 3980}
3981 3981
3982void CalendarView::schedule_add(Incidence *incidence) 3982void CalendarView::schedule_add(Incidence *incidence)
3983{ 3983{
3984 schedule(Scheduler::Add,incidence); 3984 schedule(Scheduler::Add,incidence);
3985} 3985}
3986 3986
3987void CalendarView::schedule_reply(Incidence *incidence) 3987void CalendarView::schedule_reply(Incidence *incidence)
3988{ 3988{
3989 schedule(Scheduler::Reply,incidence); 3989 schedule(Scheduler::Reply,incidence);
3990} 3990}
3991 3991
3992void CalendarView::schedule_counter(Incidence *incidence) 3992void CalendarView::schedule_counter(Incidence *incidence)
3993{ 3993{
3994 schedule(Scheduler::Counter,incidence); 3994 schedule(Scheduler::Counter,incidence);
3995} 3995}
3996 3996
3997void CalendarView::schedule_declinecounter(Incidence *incidence) 3997void CalendarView::schedule_declinecounter(Incidence *incidence)
3998{ 3998{
3999 schedule(Scheduler::Declinecounter,incidence); 3999 schedule(Scheduler::Declinecounter,incidence);
4000} 4000}
4001 4001
4002void CalendarView::schedule_publish_freebusy(int daysToPublish) 4002void CalendarView::schedule_publish_freebusy(int daysToPublish)
4003{ 4003{
4004 QDateTime start = QDateTime::currentDateTime(); 4004 QDateTime start = QDateTime::currentDateTime();
4005 QDateTime end = start.addDays(daysToPublish); 4005 QDateTime end = start.addDays(daysToPublish);
4006 4006
4007 FreeBusy *freebusy = new FreeBusy(mCalendar, start, end); 4007 FreeBusy *freebusy = new FreeBusy(mCalendar, start, end);
4008 freebusy->setOrganizer(KOPrefs::instance()->email()); 4008 freebusy->setOrganizer(KOPrefs::instance()->email());
4009 4009
4010 4010
4011 PublishDialog *publishdlg = new PublishDialog(); 4011 PublishDialog *publishdlg = new PublishDialog();
4012 if ( publishdlg->exec() == QDialog::Accepted ) { 4012 if ( publishdlg->exec() == QDialog::Accepted ) {
4013 OutgoingDialog *dlg = mDialogManager->outgoingDialog(); 4013 OutgoingDialog *dlg = mDialogManager->outgoingDialog();
4014 if (!dlg->addMessage(freebusy,Scheduler::Publish,publishdlg->addresses())) { 4014 if (!dlg->addMessage(freebusy,Scheduler::Publish,publishdlg->addresses())) {
4015 delete(freebusy); 4015 delete(freebusy);
4016 } 4016 }
4017 } 4017 }
4018 delete publishdlg; 4018 delete publishdlg;
4019} 4019}
4020 4020
4021void CalendarView::schedule(Scheduler::Method method, Incidence *incidence) 4021void CalendarView::schedule(Scheduler::Method method, Incidence *incidence)
4022{ 4022{
4023 Event *event = 0; 4023 Event *event = 0;
4024 Todo *todo = 0; 4024 Todo *todo = 0;
4025 4025
4026 if (incidence == 0) { 4026 if (incidence == 0) {
4027 incidence = mViewManager->currentView()->selectedIncidences().first(); 4027 incidence = mViewManager->currentView()->selectedIncidences().first();
4028 if (incidence == 0) { 4028 if (incidence == 0) {
4029 incidence = mTodoList->selectedIncidences().first(); 4029 incidence = mTodoList->selectedIncidences().first();
4030 } 4030 }
4031 } 4031 }
4032 if ( incidence && incidence->typeID() == eventID ) { 4032 if ( incidence && incidence->typeID() == eventID ) {
4033 event = static_cast<Event *>(incidence); 4033 event = static_cast<Event *>(incidence);
4034 } 4034 }
4035 if ( incidence && incidence->typeID() == todoID ) { 4035 if ( incidence && incidence->typeID() == todoID ) {
4036 todo = static_cast<Todo *>(incidence); 4036 todo = static_cast<Todo *>(incidence);
4037 } 4037 }
4038 4038
4039 if (!event && !todo) { 4039 if (!event && !todo) {
4040 KMessageBox::sorry(this,i18n("No event selected.")); 4040 KMessageBox::sorry(this,i18n("No event selected."));
4041 return; 4041 return;
4042 } 4042 }
4043 4043
4044 if( incidence->attendeeCount() == 0 && method != Scheduler::Publish ) { 4044 if( incidence->attendeeCount() == 0 && method != Scheduler::Publish ) {
4045 KMessageBox::sorry(this,i18n("The event has no attendees.")); 4045 KMessageBox::sorry(this,i18n("The event has no attendees."));
4046 return; 4046 return;
4047 } 4047 }
4048 4048
4049 Event *ev = 0; 4049 Event *ev = 0;
4050 if (event) ev = new Event(*event); 4050 if (event) ev = new Event(*event);
4051 Todo *to = 0; 4051 Todo *to = 0;
4052 if (todo) to = new Todo(*todo); 4052 if (todo) to = new Todo(*todo);
4053 4053
4054 if (method == Scheduler::Reply || method == Scheduler::Refresh) { 4054 if (method == Scheduler::Reply || method == Scheduler::Refresh) {
4055 Attendee *me = incidence->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email()); 4055 Attendee *me = incidence->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email());
4056 if (!me) { 4056 if (!me) {
4057 KMessageBox::sorry(this,i18n("Could not find your attendee entry.\nPlease check the emails.")); 4057 KMessageBox::sorry(this,i18n("Could not find your attendee entry.\nPlease check the emails."));
4058 return; 4058 return;
4059 } 4059 }
4060 if (me->status()==Attendee::NeedsAction && me->RSVP() && method==Scheduler::Reply) { 4060 if (me->status()==Attendee::NeedsAction && me->RSVP() && method==Scheduler::Reply) {
4061 StatusDialog *statdlg = new StatusDialog(this); 4061 StatusDialog *statdlg = new StatusDialog(this);
4062 if (!statdlg->exec()==QDialog::Accepted) return; 4062 if (!statdlg->exec()==QDialog::Accepted) return;
4063 me->setStatus( statdlg->status() ); 4063 me->setStatus( statdlg->status() );
4064 delete(statdlg); 4064 delete(statdlg);
4065 } 4065 }
4066 Attendee *menew = new Attendee(*me); 4066 Attendee *menew = new Attendee(*me);
4067 if (ev) { 4067 if (ev) {
4068 ev->clearAttendees(); 4068 ev->clearAttendees();
4069 ev->addAttendee(menew,false); 4069 ev->addAttendee(menew,false);
4070 } else { 4070 } else {
4071 if (to) { 4071 if (to) {
4072 todo->clearAttendees(); 4072 todo->clearAttendees();
4073 todo->addAttendee(menew,false); 4073 todo->addAttendee(menew,false);
4074 } 4074 }
4075 } 4075 }
4076 } 4076 }
4077 4077
4078 OutgoingDialog *dlg = mDialogManager->outgoingDialog(); 4078 OutgoingDialog *dlg = mDialogManager->outgoingDialog();
4079 if (ev) { 4079 if (ev) {
4080 if ( !dlg->addMessage(ev,method) ) delete(ev); 4080 if ( !dlg->addMessage(ev,method) ) delete(ev);
4081 } else { 4081 } else {
4082 if (to) { 4082 if (to) {
4083 if ( !dlg->addMessage(to,method) ) delete(to); 4083 if ( !dlg->addMessage(to,method) ) delete(to);
4084 } 4084 }
4085 } 4085 }
4086} 4086}
4087 4087
4088void CalendarView::openAddressbook() 4088void CalendarView::openAddressbook()
4089{ 4089{
4090 KRun::runCommand("kaddressbook"); 4090 KRun::runCommand("kaddressbook");
4091} 4091}
4092 4092
4093void CalendarView::setModified(bool modified) 4093void CalendarView::setModified(bool modified)
4094{ 4094{
4095 //qDebug("CalendarView::setModified %d ", modified); 4095 //qDebug("CalendarView::setModified %d ", modified);
4096 if ( modified ) 4096 if ( modified )
4097 emit signalmodified(); 4097 emit signalmodified();
4098 mModified = modified; 4098 mModified = modified;
4099 if ( mModified ) 4099 if ( mModified )
4100 emit modifiedChanged(mModified); 4100 emit modifiedChanged(mModified);
4101 4101
4102} 4102}
4103 4103
4104bool CalendarView::isReadOnly() 4104bool CalendarView::isReadOnly()
4105{ 4105{
4106 return mReadOnly; 4106 return mReadOnly;
4107} 4107}
4108 4108
4109void CalendarView::setReadOnly(bool readOnly) 4109void CalendarView::setReadOnly(bool readOnly)
4110{ 4110{
4111 if (mReadOnly != readOnly) { 4111 if (mReadOnly != readOnly) {
4112 mReadOnly = readOnly; 4112 mReadOnly = readOnly;
4113 emit readOnlyChanged(mReadOnly); 4113 emit readOnlyChanged(mReadOnly);
4114 } 4114 }
4115} 4115}
4116 4116
4117bool CalendarView::isModified() 4117bool CalendarView::isModified()
4118{ 4118{
4119 return mModified; 4119 return mModified;
4120} 4120}
4121void CalendarView::slotprintSelInc() 4121void CalendarView::slotprintSelInc()
4122{ 4122{
4123 if ( currentSelection() == 0 ) { 4123 if ( currentSelection() == 0 ) {
4124 KMessageBox::sorry(this,i18n("There is nothing selected!")); 4124 KMessageBox::sorry(this,i18n("There is nothing selected!"));
4125 return; 4125 return;
4126 } 4126 }
4127 showIncidence(); 4127 showIncidence();
4128 getEventViewerDialog()->print(); 4128 getEventViewerDialog()->print();
4129 4129
4130} 4130}
4131void CalendarView::printSetup() 4131void CalendarView::printSetup()
4132{ 4132{
4133#ifndef KORG_NOPRINTER 4133#ifndef KORG_NOPRINTER
4134 createPrinter(); 4134 createPrinter();
4135 4135
4136 mCalPrinter->setupPrinter(); 4136 mCalPrinter->setupPrinter();
4137#endif 4137#endif
4138} 4138}
4139 4139
4140void CalendarView::print() 4140void CalendarView::print()
4141{ 4141{
4142#ifndef KORG_NOPRINTER 4142#ifndef KORG_NOPRINTER
4143 createPrinter(); 4143 createPrinter();
4144 4144
4145 DateList tmpDateList = mNavigator->selectedDates(); 4145 DateList tmpDateList = mNavigator->selectedDates();
4146 mCalPrinter->print(CalPrinter::Month, 4146 mCalPrinter->print(CalPrinter::Month,
4147 tmpDateList.first(), tmpDateList.last()); 4147 tmpDateList.first(), tmpDateList.last());
4148#endif 4148#endif
4149} 4149}
4150 4150
4151void CalendarView::printPreview() 4151void CalendarView::printPreview()
4152{ 4152{
4153#ifndef KORG_NOPRINTER 4153#ifndef KORG_NOPRINTER
4154 kdDebug() << "CalendarView::printPreview()" << endl; 4154 kdDebug() << "CalendarView::printPreview()" << endl;
4155 4155
4156 createPrinter(); 4156 createPrinter();
4157 4157
4158 DateList tmpDateList = mNavigator->selectedDates(); 4158 DateList tmpDateList = mNavigator->selectedDates();
4159 4159
4160 mViewManager->currentView()->printPreview(mCalPrinter,tmpDateList.first(), 4160 mViewManager->currentView()->printPreview(mCalPrinter,tmpDateList.first(),
4161 tmpDateList.last()); 4161 tmpDateList.last());
4162#endif 4162#endif
4163} 4163}
4164 4164
4165void CalendarView::exportICalendar() 4165void CalendarView::exportICalendar()
4166{ 4166{
4167 QString filename = KFileDialog::getSaveFileName("icalout.ics",i18n("*.ics|ICalendars"),this); 4167 QString filename = KFileDialog::getSaveFileName("icalout.ics",i18n("*.ics|ICalendars"),this);
4168 4168
4169 // Force correct extension 4169 // Force correct extension
4170 if (filename.right(4) != ".ics") filename += ".ics"; 4170 if (filename.right(4) != ".ics") filename += ".ics";
4171 4171
4172 FileStorage storage( mCalendar, filename, new ICalFormat() ); 4172 FileStorage storage( mCalendar, filename, new ICalFormat() );
4173 storage.save(); 4173 storage.save();
4174} 4174}
4175 4175
4176bool CalendarView::exportVCalendar( QString filename ) 4176bool CalendarView::exportVCalendar( QString filename )
4177{ 4177{
4178 if (mCalendar->journals().count() > 0) { 4178 if (mCalendar->journals().count() > 0) {
4179 int result = KMessageBox::warningContinueCancel(this, 4179 int result = KMessageBox::warningContinueCancel(this,
4180 i18n("The journal entries can not be\nexported to a vCalendar file."), 4180 i18n("The journal entries can not be\nexported to a vCalendar file."),
4181 i18n("Data Loss Warning"),i18n("Proceed"),i18n("Cancel"), 4181 i18n("Data Loss Warning"),i18n("Proceed"),i18n("Cancel"),
4182 true); 4182 true);
4183 if (result != KMessageBox::Continue) return false; 4183 if (result != KMessageBox::Continue) return false;
4184 } 4184 }
4185 4185
4186 //QString filename = KFileDialog::getSaveFileName("vcalout.vcs",i18n("*.vcs|VCalendars"),this); 4186 //QString filename = KFileDialog::getSaveFileName("vcalout.vcs",i18n("*.vcs|VCalendars"),this);
4187 4187
4188 // Force correct extension 4188 // Force correct extension
4189 if (filename.right(4) != ".vcs") filename += ".vcs"; 4189 if (filename.right(4) != ".vcs") filename += ".vcs";
4190 4190
4191 FileStorage storage( mCalendar, filename, new VCalFormat ); 4191 FileStorage storage( mCalendar, filename, new VCalFormat );
4192 return storage.save(); 4192 return storage.save();
4193 4193
4194} 4194}
4195 4195
4196void CalendarView::eventUpdated(Incidence *) 4196void CalendarView::eventUpdated(Incidence *)
4197{ 4197{
4198 setModified(); 4198 setModified();
4199 // Don't call updateView here. The code, which has caused the update of the 4199 // Don't call updateView here. The code, which has caused the update of the
4200 // event is responsible for updating the view. 4200 // event is responsible for updating the view.
4201 // updateView(); 4201 // updateView();
4202} 4202}
4203 4203
4204void CalendarView::adaptNavigationUnits() 4204void CalendarView::adaptNavigationUnits()
4205{ 4205{
4206 if (mViewManager->currentView()->isEventView()) { 4206 if (mViewManager->currentView()->isEventView()) {
4207 int days = mViewManager->currentView()->currentDateCount(); 4207 int days = mViewManager->currentView()->currentDateCount();
4208 if (days == 1) { 4208 if (days == 1) {
4209 emit changeNavStringPrev(i18n("&Previous Day")); 4209 emit changeNavStringPrev(i18n("&Previous Day"));
4210 emit changeNavStringNext(i18n("&Next Day")); 4210 emit changeNavStringNext(i18n("&Next Day"));
4211 } else { 4211 } else {
4212 emit changeNavStringPrev(i18n("&Previous Week")); 4212 emit changeNavStringPrev(i18n("&Previous Week"));
4213 emit changeNavStringNext(i18n("&Next Week")); 4213 emit changeNavStringNext(i18n("&Next Week"));
4214 } 4214 }
4215 } 4215 }
4216} 4216}
4217 4217
4218void CalendarView::processMainViewSelection( Incidence *incidence ) 4218void CalendarView::processMainViewSelection( Incidence *incidence )
4219{ 4219{
4220 if ( incidence ) mTodoList->clearSelection(); 4220 if ( incidence ) mTodoList->clearSelection();
4221 processIncidenceSelection( incidence ); 4221 processIncidenceSelection( incidence );
4222} 4222}
4223 4223
4224void CalendarView::processTodoListSelection( Incidence *incidence ) 4224void CalendarView::processTodoListSelection( Incidence *incidence )
4225{ 4225{
4226 if ( incidence && mViewManager->currentView() ) { 4226 if ( incidence && mViewManager->currentView() ) {
4227 mViewManager->currentView()->clearSelection(); 4227 mViewManager->currentView()->clearSelection();
4228 } 4228 }
4229 processIncidenceSelection( incidence ); 4229 processIncidenceSelection( incidence );
4230} 4230}
4231 4231
4232void CalendarView::processIncidenceSelection( Incidence *incidence ) 4232void CalendarView::processIncidenceSelection( Incidence *incidence )
4233{ 4233{
4234 emit incidenceSelected( incidence ); 4234 emit incidenceSelected( incidence );
4235 if ( incidence == mSelectedIncidence ) return; 4235 if ( incidence == mSelectedIncidence ) return;
4236 mSelectedIncidence = incidence; 4236 mSelectedIncidence = incidence;
4237 4237
4238 if ( incidence && incidence->typeID() == eventID ) { 4238 if ( incidence && incidence->typeID() == eventID ) {
4239 Event *event = static_cast<Event *>( incidence ); 4239 Event *event = static_cast<Event *>( incidence );
4240 if ( event->organizer() == KOPrefs::instance()->email() ) { 4240 if ( event->organizer() == KOPrefs::instance()->email() ) {
4241 emit organizerEventsSelected( true ); 4241 emit organizerEventsSelected( true );
4242 } else { 4242 } else {
4243 emit organizerEventsSelected(false); 4243 emit organizerEventsSelected(false);
4244 } 4244 }
4245 if (event->attendeeByMails( KOPrefs::instance()->mAdditionalMails, 4245 if (event->attendeeByMails( KOPrefs::instance()->mAdditionalMails,
4246 KOPrefs::instance()->email() ) ) { 4246 KOPrefs::instance()->email() ) ) {
4247 emit groupEventsSelected( true ); 4247 emit groupEventsSelected( true );
4248 } else { 4248 } else {
4249 emit groupEventsSelected(false); 4249 emit groupEventsSelected(false);
4250 } 4250 }
4251 return; 4251 return;
4252 } else { 4252 } else {
4253 if ( incidence && incidence->typeID() == todoID ) { 4253 if ( incidence && incidence->typeID() == todoID ) {
4254 emit todoSelected( true ); 4254 emit todoSelected( true );
4255 Todo *event = static_cast<Todo *>( incidence ); 4255 Todo *event = static_cast<Todo *>( incidence );
4256 if ( event->organizer() == KOPrefs::instance()->email() ) { 4256 if ( event->organizer() == KOPrefs::instance()->email() ) {
4257 emit organizerEventsSelected( true ); 4257 emit organizerEventsSelected( true );
4258 } else { 4258 } else {
4259 emit organizerEventsSelected(false); 4259 emit organizerEventsSelected(false);
4260 } 4260 }
4261 if (event->attendeeByMails( KOPrefs::instance()->mAdditionalMails, 4261 if (event->attendeeByMails( KOPrefs::instance()->mAdditionalMails,
4262 KOPrefs::instance()->email() ) ) { 4262 KOPrefs::instance()->email() ) ) {
4263 emit groupEventsSelected( true ); 4263 emit groupEventsSelected( true );
4264 } else { 4264 } else {
4265 emit groupEventsSelected(false); 4265 emit groupEventsSelected(false);
4266 } 4266 }
4267 return; 4267 return;
4268 } else { 4268 } else {
4269 emit todoSelected( false ); 4269 emit todoSelected( false );
4270 emit organizerEventsSelected(false); 4270 emit organizerEventsSelected(false);
4271 emit groupEventsSelected(false); 4271 emit groupEventsSelected(false);
4272 } 4272 }
4273 return; 4273 return;
4274 } 4274 }
4275 4275
4276 /* if ( incidence && incidence->typeID() == todoID ) { 4276 /* if ( incidence && incidence->typeID() == todoID ) {
4277 emit todoSelected( true ); 4277 emit todoSelected( true );
4278 } else { 4278 } else {
4279 emit todoSelected( false ); 4279 emit todoSelected( false );
4280 }*/ 4280 }*/
4281} 4281}
4282 4282
4283 4283
4284void CalendarView::checkClipboard() 4284void CalendarView::checkClipboard()
4285{ 4285{
4286#ifndef KORG_NODND 4286#ifndef KORG_NODND
4287 if (ICalDrag::canDecode(QApplication::clipboard()->data())) { 4287 if (ICalDrag::canDecode(QApplication::clipboard()->data())) {
4288 emit pasteEnabled(true); 4288 emit pasteEnabled(true);
4289 } else { 4289 } else {
4290 emit pasteEnabled(false); 4290 emit pasteEnabled(false);
4291 } 4291 }
4292#endif 4292#endif
4293} 4293}
4294 4294
4295void CalendarView::showDates(const DateList &selectedDates) 4295void CalendarView::showDates(const DateList &selectedDates)
4296{ 4296{
4297 // kdDebug() << "CalendarView::selectDates()" << endl; 4297 // kdDebug() << "CalendarView::selectDates()" << endl;
4298 4298
4299 4299
4300 if ( !mBlockShowDates ) { 4300 if ( !mBlockShowDates ) {
4301 if ( mViewManager->currentView() ) { 4301 if ( mViewManager->currentView() ) {
4302 updateView( selectedDates.first(), selectedDates.last() ); 4302 updateView( selectedDates.first(), selectedDates.last() );
4303 } else { 4303 } else {
4304 mViewManager->showAgendaView(); 4304 mViewManager->showAgendaView();
4305 } 4305 }
4306 } 4306 }
4307 4307
4308 QDate date = selectedDates.first(); 4308 QDate date = selectedDates.first();
4309 if ( ! date.isValid() ) { 4309 if ( ! date.isValid() ) {
4310 topLevelWidget()->setCaption(""); 4310 topLevelWidget()->setCaption("");
4311 return; 4311 return;
4312 } 4312 }
4313 4313
4314 QString selDates; 4314 QString selDates;
4315 selDates = KGlobal::locale()->formatDate( date, true); 4315 selDates = KGlobal::locale()->formatDate( date, true);
4316 if (selectedDates.first() < selectedDates.last() ) 4316 if (selectedDates.first() < selectedDates.last() )
4317 selDates += " - " + KGlobal::locale()->formatDate( selectedDates.last(),true); 4317 selDates += " - " + KGlobal::locale()->formatDate( selectedDates.last(),true);
4318 else { 4318 else {
4319 QString addString; 4319 QString addString;
4320 if ( date == QDateTime::currentDateTime().date() ) 4320 if ( date == QDateTime::currentDateTime().date() )
4321 addString = i18n("Today"); 4321 addString = i18n("Today");
4322 else if ( date == QDateTime::currentDateTime().date().addDays(1) ) 4322 else if ( date == QDateTime::currentDateTime().date().addDays(1) )
4323 addString = i18n("Tomorrow"); 4323 addString = i18n("Tomorrow");
4324 else if ( date == QDateTime::currentDateTime().date().addDays(-1) ) 4324 else if ( date == QDateTime::currentDateTime().date().addDays(-1) )
4325 addString = i18n("Yesterday"); 4325 addString = i18n("Yesterday");
4326 else if ( date == QDateTime::currentDateTime().date().addDays(-2) ) 4326 else if ( date == QDateTime::currentDateTime().date().addDays(-2) )
4327 addString = i18n("Day before yesterday"); 4327 addString = i18n("Day before yesterday");
4328 else if ( date == QDateTime::currentDateTime().date().addDays(2) ) 4328 else if ( date == QDateTime::currentDateTime().date().addDays(2) )
4329 addString = i18n("Day after tomorrow"); 4329 addString = i18n("Day after tomorrow");
4330 if ( !addString.isEmpty() ) { 4330 if ( !addString.isEmpty() ) {
4331 topLevelWidget()->setCaption( addString+", " + selDates ); 4331 topLevelWidget()->setCaption( addString+", " + selDates );
4332 return; 4332 return;
4333 } 4333 }
4334 } 4334 }
4335 topLevelWidget()->setCaption( i18n("Dates: ") + selDates ); 4335 topLevelWidget()->setCaption( i18n("Dates: ") + selDates );
4336 4336
4337} 4337}
4338 4338
4339QPtrList<CalFilter> CalendarView::filters() 4339QPtrList<CalFilter> CalendarView::filters()
4340{ 4340{
4341 return mFilters; 4341 return mFilters;
4342 4342
4343} 4343}
4344void CalendarView::editFilters() 4344void CalendarView::editFilters()
4345{ 4345{
4346 // kdDebug() << "CalendarView::editFilters()" << endl; 4346 // kdDebug() << "CalendarView::editFilters()" << endl;
4347 4347
4348 CalFilter *filter = mFilters.first(); 4348 CalFilter *filter = mFilters.first();
4349 while(filter) { 4349 while(filter) {
4350 filter = mFilters.next(); 4350 filter = mFilters.next();
4351 } 4351 }
4352 4352
4353 mDialogManager->showFilterEditDialog(&mFilters); 4353 mDialogManager->showFilterEditDialog(&mFilters);
4354 updateFilter(); 4354 updateFilter();
4355} 4355}
4356void CalendarView::toggleFilter() 4356void CalendarView::toggleFilter()
4357{ 4357{
4358 if ( mLeftFrame->isHidden() ) { 4358 if ( mLeftFrame->isHidden() ) {
4359 toggleExpand(); 4359 toggleExpand();
4360 showFilter( true ); 4360 showFilter( true );
4361 } else 4361 } else
4362 showFilter(! mCalEditView->isVisible()); 4362 showFilter(! mCalEditView->isVisible());
4363} 4363}
4364 4364
4365KOFilterView *CalendarView::filterView() 4365KOFilterView *CalendarView::filterView()
4366{ 4366{
4367 return mFilterView; 4367 return mFilterView;
4368} 4368}
4369void CalendarView::selectFilter( int fil ) 4369void CalendarView::selectFilter( int fil )
4370{ 4370{
4371 mFilterView->setSelectedFilter( fil ); 4371 mFilterView->setSelectedFilter( fil );
4372 updateUnmanagedViews(); 4372 updateUnmanagedViews();
4373} 4373}
4374void CalendarView::showFilter(bool visible) 4374void CalendarView::showFilter(bool visible)
4375{ 4375{
4376#if 1 4376#if 1
4377 if (visible) { 4377 if (visible) {
4378 mCalEditView->readConfig(); 4378 mCalEditView->readConfig();
4379 mCalEditView->show(); 4379 mCalEditView->show();
4380 QValueList<int> sizes; 4380 QValueList<int> sizes;
4381 sizes = mLeftFrame->sizes(); 4381 sizes = mLeftFrame->sizes();
4382 if ( sizes.count() == 4 && sizes[3] < 20 ) { 4382 if ( sizes.count() == 4 && sizes[3] < 20 ) {
4383 sizes.clear(); 4383 sizes.clear();
4384 sizes << 100; 4384 sizes << 100;
4385 sizes << 0; 4385 sizes << 0;
4386 sizes << 0; 4386 sizes << 0;
4387 sizes << 100; 4387 sizes << 100;
4388 mLeftFrame->setSizes(sizes); 4388 mLeftFrame->setSizes(sizes);
4389 } 4389 }
4390#if 0 4390#if 0
4391 sizes = mLeftFrame->sizes(); 4391 sizes = mLeftFrame->sizes();
4392 int ccc = 0; 4392 int ccc = 0;
4393 while ( ccc < sizes.count()) { 4393 while ( ccc < sizes.count()) {
4394 qDebug("size %d %d ", ccc, sizes[ccc]); 4394 qDebug("size %d %d ", ccc, sizes[ccc]);
4395 ++ccc; 4395 ++ccc;
4396 } 4396 }
4397#endif 4397#endif
4398 4398
4399 } 4399 }
4400 else { 4400 else {
4401 mCalEditView->hide(); 4401 mCalEditView->hide();
4402 } 4402 }
4403#else 4403#else
4404 if (visible) mFilterView->show(); 4404 if (visible) mFilterView->show();
4405 else mFilterView->hide(); 4405 else mFilterView->hide();
4406#endif 4406#endif
4407} 4407}
4408void CalendarView::toggleFilerEnabled( ) 4408void CalendarView::toggleFilerEnabled( )
4409{ 4409{
4410 mFilterView->setFiltersEnabled ( !mFilterView->filtersEnabled() ); 4410 mFilterView->setFiltersEnabled ( !mFilterView->filtersEnabled() );
4411 if ( !mFilterView->filtersEnabled() ) 4411 if ( !mFilterView->filtersEnabled() )
4412 topLevelWidget()->setCaption( i18n("Filter disabled ") ); 4412 topLevelWidget()->setCaption( i18n("Filter disabled ") );
4413 updateUnmanagedViews(); 4413 updateUnmanagedViews();
4414 4414
4415} 4415}
4416void CalendarView::updateFilter() 4416void CalendarView::updateFilter()
4417{ 4417{
4418 CalFilter *filter = mFilterView->selectedFilter(); 4418 CalFilter *filter = mFilterView->selectedFilter();
4419 if (filter) { 4419 if (filter) {
4420 QString mess; 4420 QString mess;
4421 if (mFilterView->filtersEnabled()) { 4421 if (mFilterView->filtersEnabled()) {
4422 mess = i18n("Filter selected: ")+filter->name(); 4422 mess = i18n("Filter selected: ")+filter->name();
4423 filter->setEnabled(true); 4423 filter->setEnabled(true);
4424 } 4424 }
4425 else filter->setEnabled(false); 4425 else filter->setEnabled(false);
4426 mCalendar->setFilter(filter); 4426 mCalendar->setFilter(filter);
4427 updateView(); 4427 updateView();
4428 if ( !mess.isEmpty() ) 4428 if ( !mess.isEmpty() )
4429 topLevelWidget()->setCaption( mess ); 4429 topLevelWidget()->setCaption( mess );
4430 4430
4431 } 4431 }
4432 emit filtersUpdated(); 4432 emit filtersUpdated();
4433} 4433}
4434 4434
4435void CalendarView::filterEdited() 4435void CalendarView::filterEdited()
4436{ 4436{
4437 mFilterView->updateFilters(); 4437 mFilterView->updateFilters();
4438 updateFilter(); 4438 updateFilter();
4439 writeSettings(); 4439 writeSettings();
4440} 4440}
4441 4441
4442 4442
4443void CalendarView::takeOverEvent() 4443void CalendarView::takeOverEvent()
4444{ 4444{
4445 Incidence *incidence = currentSelection(); 4445 Incidence *incidence = currentSelection();
4446 4446
4447 if (!incidence) return; 4447 if (!incidence) return;
4448 4448
4449 incidence->setOrganizer(KOPrefs::instance()->email()); 4449 incidence->setOrganizer(KOPrefs::instance()->email());
4450 incidence->recreate(); 4450 incidence->recreate();
4451 incidence->setReadOnly(false); 4451 incidence->setReadOnly(false);
4452 4452
4453 updateView(); 4453 updateView();
4454} 4454}
4455 4455
4456void CalendarView::takeOverCalendar() 4456void CalendarView::takeOverCalendar()
4457{ 4457{
4458 // TODO: Create Calendar::allIncidences() function and use it here 4458 // TODO: Create Calendar::allIncidences() function and use it here
4459 4459
4460 clearAllViews(); 4460 clearAllViews();
4461 QPtrList<Event> events = mCalendar->events(); 4461 QPtrList<Event> events = mCalendar->events();
4462 for(uint i=0; i<events.count(); ++i) { 4462 for(uint i=0; i<events.count(); ++i) {
4463 events.at(i)->setOrganizer(KOPrefs::instance()->email()); 4463 events.at(i)->setOrganizer(KOPrefs::instance()->email());
4464 events.at(i)->recreate(); 4464 events.at(i)->recreate();
4465 events.at(i)->setReadOnly(false); 4465 events.at(i)->setReadOnly(false);
4466 } 4466 }
4467 4467
4468 QPtrList<Todo> todos = mCalendar->todos(); 4468 QPtrList<Todo> todos = mCalendar->todos();
4469 for(uint i=0; i<todos.count(); ++i) { 4469 for(uint i=0; i<todos.count(); ++i) {
4470 todos.at(i)->setOrganizer(KOPrefs::instance()->email()); 4470 todos.at(i)->setOrganizer(KOPrefs::instance()->email());
4471 todos.at(i)->recreate(); 4471 todos.at(i)->recreate();
4472 todos.at(i)->setReadOnly(false); 4472 todos.at(i)->setReadOnly(false);
4473 } 4473 }
4474 4474
4475 QPtrList<Journal> journals = mCalendar->journals(); 4475 QPtrList<Journal> journals = mCalendar->journals();
4476 for(uint i=0; i<journals.count(); ++i) { 4476 for(uint i=0; i<journals.count(); ++i) {
4477 journals.at(i)->setOrganizer(KOPrefs::instance()->email()); 4477 journals.at(i)->setOrganizer(KOPrefs::instance()->email());
4478 journals.at(i)->recreate(); 4478 journals.at(i)->recreate();
4479 journals.at(i)->setReadOnly(false); 4479 journals.at(i)->setReadOnly(false);
4480 } 4480 }
4481 4481
4482 updateView(); 4482 updateView();
4483} 4483}
4484 4484
4485void CalendarView::showIntro() 4485void CalendarView::showIntro()
4486{ 4486{
4487 kdDebug() << "To be implemented." << endl; 4487 kdDebug() << "To be implemented." << endl;
4488} 4488}
4489 4489
4490QWidgetStack *CalendarView::viewStack() 4490QWidgetStack *CalendarView::viewStack()
4491{ 4491{
4492 return mRightFrame; 4492 return mRightFrame;
4493} 4493}
4494 4494
4495QWidget *CalendarView::leftFrame() 4495QWidget *CalendarView::leftFrame()
4496{ 4496{
4497 return ( QWidget *)mLeftFrame; 4497 return ( QWidget *)mLeftFrame;
4498} 4498}
4499 4499
4500DateNavigator *CalendarView::dateNavigator() 4500DateNavigator *CalendarView::dateNavigator()
4501{ 4501{
4502 return mNavigator; 4502 return mNavigator;
4503} 4503}
4504 4504
4505KDateNavigator* CalendarView::dateNavigatorWidget() 4505KDateNavigator* CalendarView::dateNavigatorWidget()
4506{ 4506{
4507 return mDateNavigator->navigatorView(); 4507 return mDateNavigator->navigatorView();
4508} 4508}
4509void CalendarView::toggleDateNavigatorWidget() 4509void CalendarView::toggleDateNavigatorWidget()
4510{ 4510{
4511 KOPrefs::instance()->mShowDateNavigator = !KOPrefs::instance()->mShowDateNavigator ; 4511 KOPrefs::instance()->mShowDateNavigator = !KOPrefs::instance()->mShowDateNavigator ;
4512 4512
4513 if (!KOPrefs::instance()->mShowDateNavigator ) 4513 if (!KOPrefs::instance()->mShowDateNavigator )
4514 mDateNavigator->hide(); 4514 mDateNavigator->hide();
4515 else 4515 else
4516 mDateNavigator->show(); 4516 mDateNavigator->show();
4517} 4517}
4518void CalendarView::addView(KOrg::BaseView *view) 4518void CalendarView::addView(KOrg::BaseView *view)
4519{ 4519{
4520 mViewManager->addView(view); 4520 mViewManager->addView(view);
4521} 4521}
4522 4522
4523void CalendarView::showView(KOrg::BaseView *view) 4523void CalendarView::showView(KOrg::BaseView *view)
4524{ 4524{
4525 mViewManager->showView(view, mLeftFrame->isVisible()); 4525 mViewManager->showView(view, mLeftFrame->isVisible());
4526} 4526}
4527 4527
4528Incidence *CalendarView::currentSelection() 4528Incidence *CalendarView::currentSelection()
4529{ 4529{
4530 return mViewManager->currentSelection(); 4530 return mViewManager->currentSelection();
diff --git a/korganizer/koagenda.cpp b/korganizer/koagenda.cpp
index 0dd5ef5..c738f7e 100644
--- a/korganizer/koagenda.cpp
+++ b/korganizer/koagenda.cpp
@@ -1,1770 +1,1770 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 Marcus Bains line. 5 Marcus Bains line.
6 Copyright (c) 2001 Ali Rahimi 6 Copyright (c) 2001 Ali Rahimi
7 7
8 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or 10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version. 11 (at your option) any later version.
12 12
13 This program is distributed in the hope that it will be useful, 13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details. 16 GNU General Public License for more details.
17 17
18 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 21
22 As a special exception, permission is given to link this program 22 As a special exception, permission is given to link this program
23 with any edition of Qt, and distribute the resulting executable, 23 with any edition of Qt, and distribute the resulting executable,
24 without including the source code for Qt in the source distribution. 24 without including the source code for Qt in the source distribution.
25*/ 25*/
26 26
27#ifndef _WIN32_ 27#ifndef _WIN32_
28#define protected public 28#define protected public
29#include <qwidget.h> 29#include <qwidget.h>
30#undef protected 30#undef protected
31#endif 31#endif
32#include <qintdict.h> 32#include <qintdict.h>
33#include <qdatetime.h> 33#include <qdatetime.h>
34#include <qapplication.h> 34#include <qapplication.h>
35#include <qpopupmenu.h> 35#include <qpopupmenu.h>
36#include <qcursor.h> 36#include <qcursor.h>
37#include <qpainter.h> 37#include <qpainter.h>
38 38
39#include <kdebug.h> 39#include <kdebug.h>
40#include <klocale.h> 40#include <klocale.h>
41#include <kiconloader.h> 41#include <kiconloader.h>
42#include <kglobal.h> 42#include <kglobal.h>
43 43
44#include "koagendaitem.h" 44#include "koagendaitem.h"
45#include "koprefs.h" 45#include "koprefs.h"
46#include "koglobals.h" 46#include "koglobals.h"
47 47
48#include "koagenda.h" 48#include "koagenda.h"
49 49
50#include <libkcal/event.h> 50#include <libkcal/event.h>
51#include <libkcal/todo.h> 51#include <libkcal/todo.h>
52 52
53#ifndef DESKTOP_VERSION 53#ifndef DESKTOP_VERSION
54#include <qpe/qpeapplication.h> 54#include <qpe/qpeapplication.h>
55#endif 55#endif
56 56
57//extern bool globalFlagBlockPainting; 57//extern bool globalFlagBlockPainting;
58extern int globalFlagBlockAgenda; 58extern int globalFlagBlockAgenda;
59extern int globalFlagBlockAgendaItemPaint; 59extern int globalFlagBlockAgendaItemPaint;
60extern int globalFlagBlockAgendaItemUpdate; 60extern int globalFlagBlockAgendaItemUpdate;
61extern int globalFlagBlockStartup; 61extern int globalFlagBlockStartup;
62 62
63 63
64//////////////////////////////////////////////////////////////////////////// 64////////////////////////////////////////////////////////////////////////////
65MarcusBains::MarcusBains(KOAgenda *_agenda,const char *name) 65MarcusBains::MarcusBains(KOAgenda *_agenda,const char *name)
66 : QFrame(_agenda->viewport(),name), agenda(_agenda) 66 : QFrame(_agenda->viewport(),name), agenda(_agenda)
67{ 67{
68 setLineWidth(0); 68 setLineWidth(0);
69 setMargin(0); 69 setMargin(0);
70 setBackgroundColor(Qt::red); 70 setBackgroundColor(Qt::red);
71 minutes = new QTimer(this); 71 minutes = new QTimer(this);
72 connect(minutes, SIGNAL(timeout()), this, SLOT(updateLoc())); 72 connect(minutes, SIGNAL(timeout()), this, SLOT(updateLoc()));
73 minutes->start(0, true); 73 minutes->start(0, true);
74 mTimeBox = new QLabel(this); 74 mTimeBox = new QLabel(this);
75 mTimeBox->setAlignment(Qt::AlignRight | Qt::AlignBottom); 75 mTimeBox->setAlignment(Qt::AlignRight | Qt::AlignBottom);
76 QPalette pal = mTimeBox->palette(); 76 QPalette pal = mTimeBox->palette();
77 pal.setColor(QColorGroup::Foreground, Qt::red); 77 pal.setColor(QColorGroup::Foreground, Qt::red);
78 mTimeBox->setPalette(pal); 78 mTimeBox->setPalette(pal);
79 //mTimeBox->setAutoMask(true); 79 //mTimeBox->setAutoMask(true);
80 80
81 agenda->addChild(mTimeBox); 81 agenda->addChild(mTimeBox);
82 82
83 oldToday = -1; 83 oldToday = -1;
84} 84}
85 85
86MarcusBains::~MarcusBains() 86MarcusBains::~MarcusBains()
87{ 87{
88 //delete minutes; 88 //delete minutes;
89} 89}
90 90
91int MarcusBains::todayColumn() 91int MarcusBains::todayColumn()
92{ 92{
93 QDate currentDate = QDate::currentDate(); 93 QDate currentDate = QDate::currentDate();
94 94
95 DateList dateList = agenda->dateList(); 95 DateList dateList = agenda->dateList();
96 DateList::ConstIterator it; 96 DateList::ConstIterator it;
97 int col = 0; 97 int col = 0;
98 for(it = dateList.begin(); it != dateList.end(); ++it) { 98 for(it = dateList.begin(); it != dateList.end(); ++it) {
99 if((*it) == currentDate) 99 if((*it) == currentDate)
100 return KOGlobals::self()->reverseLayout() ? 100 return KOGlobals::self()->reverseLayout() ?
101 agenda->columns() - 1 - col : col; 101 agenda->columns() - 1 - col : col;
102 ++col; 102 ++col;
103 } 103 }
104 104
105 return -1; 105 return -1;
106} 106}
107void MarcusBains::updateLoc() 107void MarcusBains::updateLoc()
108{ 108{
109 updateLocation(); 109 updateLocation();
110} 110}
111void MarcusBains::updateLocation(bool recalculate) 111void MarcusBains::updateLocation(bool recalculate)
112{ 112{
113 113
114 QTime tim = QTime::currentTime(); 114 QTime tim = QTime::currentTime();
115 //qDebug(" MarcusBains::updateLocation %s ", tim.toString().latin1()); 115 //qDebug(" MarcusBains::updateLocation %s ", tim.toString().latin1());
116 if((tim.hour() == 0) && (oldTime.hour()==23)) 116 if((tim.hour() == 0) && (oldTime.hour()==23))
117 recalculate = true; 117 recalculate = true;
118 118
119 int mins = tim.hour()*60 + tim.minute(); 119 int mins = tim.hour()*60 + tim.minute();
120 int minutesPerCell = 24 * 60 / agenda->rows(); 120 int minutesPerCell = 24 * 60 / agenda->rows();
121 int y = mins*agenda->gridSpacingY()/minutesPerCell; 121 int y = mins*agenda->gridSpacingY()/minutesPerCell;
122 int today = recalculate ? todayColumn() : oldToday; 122 int today = recalculate ? todayColumn() : oldToday;
123 int x = agenda->gridSpacingX()*today; 123 int x = agenda->gridSpacingX()*today;
124 bool disabled = !(KOPrefs::instance()->mMarcusBainsEnabled); 124 bool disabled = !(KOPrefs::instance()->mMarcusBainsEnabled);
125 125
126 oldTime = tim; 126 oldTime = tim;
127 oldToday = today; 127 oldToday = today;
128 128
129 if(disabled || (today<0)) { 129 if(disabled || (today<0)) {
130 hide(); mTimeBox->hide(); 130 hide(); mTimeBox->hide();
131 return; 131 return;
132 } else { 132 } else {
133 show(); mTimeBox->show(); 133 show(); mTimeBox->show();
134 } 134 }
135 135
136 if(recalculate) 136 if(recalculate)
137 setFixedSize(agenda->gridSpacingX(),1); 137 setFixedSize(agenda->gridSpacingX(),1);
138 agenda->moveChild(this, x, y); 138 agenda->moveChild(this, x, y);
139 raise(); 139 raise();
140 140
141 if(recalculate) 141 if(recalculate)
142 //mTimeBox->setFont(QFont("helvetica",10)); 142 //mTimeBox->setFont(QFont("helvetica",10));
143 mTimeBox->setFont(KOPrefs::instance()->mMarcusBainsFont); 143 mTimeBox->setFont(KOPrefs::instance()->mMarcusBainsFont);
144 144
145 mTimeBox->setText(KGlobal::locale()->formatTime(tim, KOPrefs::instance()->mMarcusBainsShowSeconds)); 145 mTimeBox->setText(KGlobal::locale()->formatTime(tim, KOPrefs::instance()->mMarcusBainsShowSeconds));
146 mTimeBox->adjustSize(); 146 mTimeBox->adjustSize();
147 // the -2 below is there because there is a bug in this program 147 // the -2 below is there because there is a bug in this program
148 // somewhere, where the last column of this widget is a few pixels 148 // somewhere, where the last column of this widget is a few pixels
149 // narrower than the other columns. 149 // narrower than the other columns.
150 int offs = (today==agenda->columns()-1) ? -4 : 0; 150 int offs = (today==agenda->columns()-1) ? -4 : 0;
151 agenda->moveChild(mTimeBox, 151 agenda->moveChild(mTimeBox,
152 x+agenda->gridSpacingX()-mTimeBox->width()+offs-1, 152 x+agenda->gridSpacingX()-mTimeBox->width()+offs-1,
153 y-mTimeBox->height()); 153 y-mTimeBox->height());
154 mTimeBox->raise(); 154 mTimeBox->raise();
155 //mTimeBox->setAutoMask(true); 155 //mTimeBox->setAutoMask(true);
156 int secs = QTime::currentTime().second(); 156 int secs = QTime::currentTime().second();
157 minutes->start( (60 - secs +1)*1000 ,true); 157 minutes->start( (60 - secs +1)*1000 ,true);
158} 158}
159 159
160 160
161//////////////////////////////////////////////////////////////////////////// 161////////////////////////////////////////////////////////////////////////////
162 162
163 163
164/* 164/*
165 Create an agenda widget with rows rows and columns columns. 165 Create an agenda widget with rows rows and columns columns.
166*/ 166*/
167KOAgenda::KOAgenda(int columns,int rows,int rowSize,QWidget *parent, 167KOAgenda::KOAgenda(int columns,int rows,int rowSize,QWidget *parent,
168 const char *name,WFlags f) : 168 const char *name,WFlags f) :
169 QScrollView(parent,name,f) 169 QScrollView(parent,name,f)
170{ 170{
171 171
172 mAllAgendaPopup = 0; 172 mAllAgendaPopup = 0;
173 mColumns = columns; 173 mColumns = columns;
174 mRows = rows; 174 mRows = rows;
175 mGridSpacingY = rowSize; 175 mGridSpacingY = rowSize;
176 mAllDayMode = false; 176 mAllDayMode = false;
177#ifndef DESKTOP_VERSION 177#ifndef DESKTOP_VERSION
178 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); 178 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );
179#endif 179#endif
180 mHolidayMask = 0; 180 mHolidayMask = 0;
181 init(); 181 init();
182 connect ( this, SIGNAL (contentsMoving ( int , int ) ), this, SLOT ( slotContentMove(int,int)) ); 182 connect ( this, SIGNAL (contentsMoving ( int , int ) ), this, SLOT ( slotContentMove(int,int)) );
183} 183}
184 184
185/* 185/*
186 Create an agenda widget with columns columns and one row. This is used for 186 Create an agenda widget with columns columns and one row. This is used for
187 all-day events. 187 all-day events.
188*/ 188*/
189KOAgenda::KOAgenda(int columns,QWidget *parent,const char *name,WFlags f) : 189KOAgenda::KOAgenda(int columns,QWidget *parent,const char *name,WFlags f) :
190 QScrollView(parent,name,f) 190 QScrollView(parent,name,f)
191{ 191{
192 mAllAgendaPopup = 0; 192 mAllAgendaPopup = 0;
193 blockResize = false; 193 blockResize = false;
194 mColumns = columns; 194 mColumns = columns;
195 mRows = 1; 195 mRows = 1;
196 //qDebug("aaaaaaaaaaaaaaaaaaldays %d ", KOPrefs::instance()->mAllDaySize); 196 //qDebug("aaaaaaaaaaaaaaaaaaldays %d ", KOPrefs::instance()->mAllDaySize);
197 mGridSpacingY = KOPrefs::instance()->mAllDaySize; 197 mGridSpacingY = KOPrefs::instance()->mAllDaySize;
198 mAllDayMode = true; 198 mAllDayMode = true;
199#ifndef DESKTOP_VERSION 199#ifndef DESKTOP_VERSION
200 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); 200 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );
201#endif 201#endif
202 mHolidayMask = 0; 202 mHolidayMask = 0;
203 init(); 203 init();
204} 204}
205 205
206 206
207KOAgenda::~KOAgenda() 207KOAgenda::~KOAgenda()
208{ 208{
209 if(mMarcusBains) delete mMarcusBains; 209 if(mMarcusBains) delete mMarcusBains;
210 210
211} 211}
212 212
213Incidence *KOAgenda::selectedIncidence() const 213Incidence *KOAgenda::selectedIncidence() const
214{ 214{
215 return (mSelectedItem ? mSelectedItem->incidence() : 0); 215 return (mSelectedItem ? mSelectedItem->incidence() : 0);
216} 216}
217 217
218 218
219QDate KOAgenda::selectedIncidenceDate() const 219QDate KOAgenda::selectedIncidenceDate() const
220{ 220{
221 return (mSelectedItem ? mSelectedItem->itemDate() : QDate()); 221 return (mSelectedItem ? mSelectedItem->itemDate() : QDate());
222} 222}
223 223
224 224
225void KOAgenda::init() 225void KOAgenda::init()
226{ 226{
227 mPopupTimer = new QTimer(this); 227 mPopupTimer = new QTimer(this);
228 connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu())); 228 connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu()));
229 229
230 mNewItemPopup = new QPopupMenu( this ); 230 mNewItemPopup = new QPopupMenu( this );
231 connect ( mNewItemPopup, SIGNAL (activated ( int ) ), this, SLOT ( newItem(int)) ); 231 connect ( mNewItemPopup, SIGNAL (activated ( int ) ), this, SLOT ( newItem(int)) );
232 QString pathString = ""; 232 QString pathString = "";
233 if ( !KOPrefs::instance()->mToolBarMiniIcons ) { 233 if ( !KOPrefs::instance()->mToolBarMiniIcons ) {
234 if ( QApplication::desktop()->width() < 480 ) 234 if ( QApplication::desktop()->width() < 480 )
235 pathString += "icons16/"; 235 pathString += "icons16/";
236 } else 236 } else
237 pathString += "iconsmini/"; 237 pathString += "iconsmini/";
238 238
239 mNewItemPopup->insertItem ( SmallIcon( pathString +"newevent" ), i18n("New Event..."), 1 ); 239 mNewItemPopup->insertItem ( SmallIcon( pathString +"newevent" ), i18n("New Event..."), 1 );
240 mNewItemPopup->insertItem ( SmallIcon( pathString +"newtodo" ), i18n("New Todo..."),2 ); 240 mNewItemPopup->insertItem ( SmallIcon( pathString +"newtodo" ), i18n("New Todo..."),2 );
241 mNewItemPopup->insertSeparator ( ); 241 mNewItemPopup->insertSeparator ( );
242 mNewItemPopup->insertItem ( SmallIcon( pathString +"day" ), i18n("Day view"),3 ); 242 mNewItemPopup->insertItem ( SmallIcon( pathString +"day" ), i18n("Day view"),3 );
243 mNewItemPopup->insertItem ( SmallIcon( pathString +"xdays" ), i18n("Next days"),8 ); 243 mNewItemPopup->insertItem ( SmallIcon( pathString +"xdays" ), i18n("Next days"),8 );
244 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next week"),4 ); 244 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next week"),4 );
245 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next two weeks"),5 ); 245 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next two weeks"),5 );
246 mNewItemPopup->insertItem ( SmallIcon( pathString +"month" ), i18n("This month"),6 ); 246 mNewItemPopup->insertItem ( SmallIcon( pathString +"month" ), i18n("This month"),6 );
247 mNewItemPopup->insertItem ( SmallIcon( pathString +"journal" ), i18n("Journal view"),7 ); 247 mNewItemPopup->insertItem ( SmallIcon( pathString +"journal" ), i18n("Journal view"),7 );
248#ifndef _WIN32_ 248#ifndef _WIN32_
249 int wflags = viewport()-> getWFlags() |WRepaintNoErase;//WResizeNoErase 249 int wflags = viewport()-> getWFlags() |WRepaintNoErase;//WResizeNoErase
250 viewport()->setWFlags ( wflags); 250 viewport()->setWFlags ( wflags);
251#endif 251#endif
252 mGridSpacingX = 80; 252 mGridSpacingX = 80;
253 mResizeBorderWidth = 8; 253 mResizeBorderWidth = 8;
254 mScrollBorderWidth = 8; 254 mScrollBorderWidth = 8;
255 mScrollDelay = 30; 255 mScrollDelay = 30;
256 mScrollOffset = 10; 256 mScrollOffset = 10;
257 mPaintPixmap.resize( 20,20); 257 mPaintPixmap.resize( 20,20);
258 //enableClipper(true); 258 //enableClipper(true);
259 259
260 // Grab key strokes for keyboard navigation of agenda. Seems to have no 260 // Grab key strokes for keyboard navigation of agenda. Seems to have no
261 // effect. Has to be fixed. 261 // effect. Has to be fixed.
262 setFocusPolicy(WheelFocus); 262 setFocusPolicy(WheelFocus);
263 263
264 connect(&mScrollUpTimer,SIGNAL(timeout()),SLOT(scrollUp())); 264 connect(&mScrollUpTimer,SIGNAL(timeout()),SLOT(scrollUp()));
265 connect(&mScrollDownTimer,SIGNAL(timeout()),SLOT(scrollDown())); 265 connect(&mScrollDownTimer,SIGNAL(timeout()),SLOT(scrollDown()));
266 connect(&mResizeTimer,SIGNAL(timeout()),SLOT(finishResize())); 266 connect(&mResizeTimer,SIGNAL(timeout()),SLOT(finishResize()));
267 267
268 mStartCellX = 0; 268 mStartCellX = 0;
269 mStartCellY = 0; 269 mStartCellY = 0;
270 mCurrentCellX = 0; 270 mCurrentCellX = 0;
271 mCurrentCellY = 0; 271 mCurrentCellY = 0;
272 272
273 mSelectionCellX = 0; 273 mSelectionCellX = 0;
274 mSelectionYTop = 0; 274 mSelectionYTop = 0;
275 mSelectionHeight = 0; 275 mSelectionHeight = 0;
276 276
277 mOldLowerScrollValue = -1; 277 mOldLowerScrollValue = -1;
278 mOldUpperScrollValue = -1; 278 mOldUpperScrollValue = -1;
279 279
280 mClickedItem = 0; 280 mClickedItem = 0;
281 281
282 mActionItem = 0; 282 mActionItem = 0;
283 mActionType = NOP; 283 mActionType = NOP;
284 mItemMoved = false; 284 mItemMoved = false;
285 285
286 mSelectedItem = 0; 286 mSelectedItem = 0;
287 287
288 // mItems.setAutoDelete(true); 288 // mItems.setAutoDelete(true);
289 289
290 resizeContents( mGridSpacingX * mColumns + 1 , mGridSpacingY * mRows + 1 ); 290 resizeContents( mGridSpacingX * mColumns + 1 , mGridSpacingY * mRows + 1 );
291 291
292 viewport()->update(); 292 viewport()->update();
293 293
294 setMinimumSize(30, 1); 294 setMinimumSize(30, 1);
295// setMaximumHeight(mGridSpacingY * mRows + 5); 295// setMaximumHeight(mGridSpacingY * mRows + 5);
296 296
297 // Disable horizontal scrollbar. This is a hack. The geometry should be 297 // Disable horizontal scrollbar. This is a hack. The geometry should be
298 // controlled in a way that the contents horizontally always fits. Then it is 298 // controlled in a way that the contents horizontally always fits. Then it is
299 // not necessary to turn off the scrollbar. 299 // not necessary to turn off the scrollbar.
300 setHScrollBarMode(AlwaysOff); 300 setHScrollBarMode(AlwaysOff);
301 if ( ! mAllDayMode ) 301 if ( ! mAllDayMode )
302 setVScrollBarMode(AlwaysOn); 302 setVScrollBarMode(AlwaysOn);
303 else 303 else
304 setVScrollBarMode(AlwaysOff); 304 setVScrollBarMode(AlwaysOff);
305 305
306 setStartHour(KOPrefs::instance()->mDayBegins); 306 setStartHour(KOPrefs::instance()->mDayBegins);
307 307
308 calculateWorkingHours(); 308 calculateWorkingHours();
309 309
310 connect(verticalScrollBar(),SIGNAL(valueChanged(int)), 310 connect(verticalScrollBar(),SIGNAL(valueChanged(int)),
311 SLOT(checkScrollBoundaries(int))); 311 SLOT(checkScrollBoundaries(int)));
312 312
313 // Create the Marcus Bains line. 313 // Create the Marcus Bains line.
314 if(mAllDayMode) 314 if(mAllDayMode)
315 mMarcusBains = 0; 315 mMarcusBains = 0;
316 else { 316 else {
317 mMarcusBains = new MarcusBains(this); 317 mMarcusBains = new MarcusBains(this);
318 addChild(mMarcusBains); 318 addChild(mMarcusBains);
319 } 319 }
320 mPopupKind = 0; 320 mPopupKind = 0;
321 mPopupItem = 0; 321 mPopupItem = 0;
322 mInvalidPixmap = false; 322 mInvalidPixmap = false;
323 323
324} 324}
325 325
326void KOAgenda::shrinkPixmap() 326void KOAgenda::shrinkPixmap()
327{ 327{
328 mPaintPixmap.resize( 20,20); 328 mPaintPixmap.resize( 20,20);
329 mInvalidPixmap = true; 329 mInvalidPixmap = true;
330} 330}
331void KOAgenda::slotContentMove(int,int) 331void KOAgenda::slotContentMove(int,int)
332{ 332{
333 emit sendPing(); 333 emit sendPing();
334 if ( mActionType == NOP ) 334 if ( mActionType == NOP )
335 slotClearSelection(); 335 slotClearSelection();
336 if ( mSelectedItem && !mActionItem ) { 336 if ( mSelectedItem && !mActionItem ) {
337 deselectItem(); 337 deselectItem();
338 emit incidenceSelected( 0 ); 338 emit incidenceSelected( 0 );
339 } 339 }
340} 340}
341void KOAgenda::clear() 341void KOAgenda::clear()
342{ 342{
343 KOAgendaItem *item; 343 KOAgendaItem *item;
344 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 344 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
345 mUnusedItems.append( item ); 345 mUnusedItems.append( item );
346 //item->hide(); 346 //item->hide();
347 } 347 }
348 mItems.clear(); 348 mItems.clear();
349 mSelectedItem = 0; 349 mSelectedItem = 0;
350 clearSelection(); 350 clearSelection();
351} 351}
352 352
353void KOAgenda::clearSelection() 353void KOAgenda::clearSelection()
354{ 354{
355 mSelectionCellX = 0; 355 mSelectionCellX = 0;
356 mSelectionYTop = 0; 356 mSelectionYTop = 0;
357 mSelectionHeight = 0; 357 mSelectionHeight = 0;
358} 358}
359 359
360void KOAgenda::marcus_bains() 360void KOAgenda::marcus_bains()
361{ 361{
362 if(mMarcusBains) mMarcusBains->updateLocation(true); 362 if(mMarcusBains) mMarcusBains->updateLocation(true);
363} 363}
364 364
365 365
366void KOAgenda::changeColumns(int columns) 366void KOAgenda::changeColumns(int columns)
367{ 367{
368 if (columns == 0) { 368 if (columns == 0) {
369 qDebug("KOAgenda::changeColumns() called with argument 0 "); 369 qDebug("KOAgenda::changeColumns() called with argument 0 ");
370 return; 370 return;
371 } 371 }
372 clear(); 372 clear();
373 mColumns = columns; 373 mColumns = columns;
374 computeSizes(); 374 computeSizes();
375} 375}
376 376
377/* 377/*
378 This is the eventFilter function, which gets all events from the KOAgendaItems 378 This is the eventFilter function, which gets all events from the KOAgendaItems
379 contained in the agenda. It has to handle moving and resizing for all items. 379 contained in the agenda. It has to handle moving and resizing for all items.
380*/ 380*/
381bool KOAgenda::eventFilter ( QObject *object, QEvent *event ) 381bool KOAgenda::eventFilter ( QObject *object, QEvent *event )
382{ 382{
383 // kdDebug() << "KOAgenda::eventFilter" << endl; 383 // kdDebug() << "KOAgenda::eventFilter" << endl;
384 switch(event->type()) { 384 switch(event->type()) {
385 case QEvent::MouseButtonPress: 385 case QEvent::MouseButtonPress:
386 case QEvent::MouseButtonDblClick: 386 case QEvent::MouseButtonDblClick:
387 case QEvent::MouseButtonRelease: 387 case QEvent::MouseButtonRelease:
388 case QEvent::MouseMove: 388 case QEvent::MouseMove:
389 return eventFilter_mouse(object, static_cast<QMouseEvent *>(event)); 389 return eventFilter_mouse(object, static_cast<QMouseEvent *>(event));
390 390
391 case (QEvent::Leave): 391 case (QEvent::Leave):
392 if (!mActionItem) 392 if (!mActionItem)
393 setCursor(arrowCursor); 393 setCursor(arrowCursor);
394 return true; 394 return true;
395 395
396 default: 396 default:
397 return QScrollView::eventFilter(object,event); 397 return QScrollView::eventFilter(object,event);
398 } 398 }
399} 399}
400void KOAgenda::popupMenu() 400void KOAgenda::popupMenu()
401{ 401{
402 mPopupTimer->stop(); 402 mPopupTimer->stop();
403 if ( mPopupKind == 1 || mPopupKind == 3 ) { 403 if ( mPopupKind == 1 || mPopupKind == 3 ) {
404 if (mActionItem ) { 404 if (mActionItem ) {
405 endItemAction(); 405 endItemAction();
406 } 406 }
407 mLeftMouseDown = false; // no more leftMouse computation 407 mLeftMouseDown = false; // no more leftMouse computation
408 if (mPopupItem) { 408 if (mPopupItem) {
409 //mClickedItem = mPopupItem; 409 //mClickedItem = mPopupItem;
410 selectItem(mPopupItem); 410 selectItem(mPopupItem);
411 if ( mAllAgendaPopup && KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 1 ) 411 if ( mAllAgendaPopup && KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 1 )
412 mAllAgendaPopup->installEventFilter( this ); 412 mAllAgendaPopup->installEventFilter( this );
413 emit showIncidencePopupSignal(mPopupItem->incidence()); 413 emit showIncidencePopupSignal(mPopupItem->incidence());
414 414
415 } 415 }
416 } else if ( mPopupKind == 2 || mPopupKind == 4 ) { 416 } else if ( mPopupKind == 2 || mPopupKind == 4 ) {
417 if ( mLeftMouseDown ) { // we have a simulated right click - clear left mouse action 417 if ( mLeftMouseDown ) { // we have a simulated right click - clear left mouse action
418 endSelectAction( false ); // do not emit new event signal 418 endSelectAction( false ); // do not emit new event signal
419 mLeftMouseDown = false; // no more leftMouse computation 419 mLeftMouseDown = false; // no more leftMouse computation
420 } 420 }
421 if ( KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 2 ) 421 if ( KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 2 )
422 mNewItemPopup->installEventFilter( this ); 422 mNewItemPopup->installEventFilter( this );
423 mNewItemPopup->popup( mPopupPos); 423 mNewItemPopup->popup( mPopupPos);
424 424
425 } 425 }
426 mLeftMouseDown = false; 426 mLeftMouseDown = false;
427 mPopupItem = 0; 427 mPopupItem = 0;
428 mPopupKind = 0; 428 mPopupKind = 0;
429} 429}
430void KOAgenda::categoryChanged(Incidence * inc) 430void KOAgenda::categoryChanged(Incidence * inc)
431{ 431{
432 KOAgendaItem *item; 432 KOAgendaItem *item;
433 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 433 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
434 if ( item->incidence() == inc ) { 434 if ( item->incidence() == inc ) {
435 item->initColor (); 435 item->initColor ();
436 item->updateItem(); 436 item->updateItem();
437 } 437 }
438 } 438 }
439} 439}
440bool KOAgenda::eventFilter_mouse(QObject *object, QMouseEvent *me) 440bool KOAgenda::eventFilter_mouse(QObject *object, QMouseEvent *me)
441{ 441{
442 442
443 if ( mInvalidPixmap ) { 443 if ( mInvalidPixmap ) {
444 mInvalidPixmap = false; 444 mInvalidPixmap = false;
445 qDebug("KO: Upsizing Pixmaps "); 445 qDebug("KO: Upsizing Pixmaps ");
446 computeSizes(); 446 computeSizes();
447 emit updateViewSignal(); 447 emit updateViewSignal();
448 return true; 448 return true;
449 } 449 }
450 emit sendPing(); 450 emit sendPing();
451 static int startX = 0; 451 static int startX = 0;
452 static int startY = 0; 452 static int startY = 0;
453 int blockmoveDist = ( QApplication::desktop()->width() < 480 ? 7 : 9 ); 453 int blockmoveDist = ( QApplication::desktop()->width() < 480 ? 7 : 9 );
454 static bool blockMoving = true; 454 static bool blockMoving = true;
455 455
456 //qDebug("KOAgenda::eventFilter_mous "); 456 //qDebug("KOAgenda::eventFilter_mous ");
457 if ( object == mNewItemPopup ) { 457 if ( object == mNewItemPopup ) {
458 //qDebug("mNewItemPopup "); 458 //qDebug("mNewItemPopup ");
459 if ( me->type() == QEvent::MouseButtonRelease ) { 459 if ( me->type() == QEvent::MouseButtonRelease ) {
460 mNewItemPopup->removeEventFilter( this ); 460 mNewItemPopup->removeEventFilter( this );
461 int dX = me->globalPos().x() - mPopupPos.x();; 461 int dX = me->globalPos().x() - mPopupPos.x();;
462 if ( dX < 0 ) 462 if ( dX < 0 )
463 dX = -dX; 463 dX = -dX;
464 int dY = me->globalPos().y() - mPopupPos.y(); 464 int dY = me->globalPos().y() - mPopupPos.y();
465 if ( dY < 0 ) 465 if ( dY < 0 )
466 dY = -dY; 466 dY = -dY;
467 if ( dX > blockmoveDist || dY > blockmoveDist ) { 467 if ( dX > blockmoveDist || dY > blockmoveDist ) {
468 mNewItemPopup->hide(); 468 mNewItemPopup->hide();
469 } 469 }
470 } 470 }
471 return true; 471 return true;
472 } 472 }
473 if ( object == mAllAgendaPopup ) { 473 if ( object == mAllAgendaPopup ) {
474 //qDebug(" mAllAgendaPopup "); 474 //qDebug(" mAllAgendaPopup ");
475 if ( me->type() == QEvent::MouseButtonRelease ) { 475 if ( me->type() == QEvent::MouseButtonRelease ) {
476 mAllAgendaPopup->removeEventFilter( this ); 476 mAllAgendaPopup->removeEventFilter( this );
477 int dX = me->globalPos().x() - mPopupPos.x();; 477 int dX = me->globalPos().x() - mPopupPos.x();;
478 if ( dX < 0 ) 478 if ( dX < 0 )
479 dX = -dX; 479 dX = -dX;
480 int dY = me->globalPos().y() - mPopupPos.y(); 480 int dY = me->globalPos().y() - mPopupPos.y();
481 if ( dY < 0 ) 481 if ( dY < 0 )
482 dY = -dY; 482 dY = -dY;
483 if ( dX > blockmoveDist || dY > blockmoveDist ) { 483 if ( dX > blockmoveDist || dY > blockmoveDist ) {
484 mAllAgendaPopup->hide(); 484 mAllAgendaPopup->hide();
485 } 485 }
486 } 486 }
487 return true; 487 return true;
488 } 488 }
489 QPoint viewportPos; 489 QPoint viewportPos;
490 if (object != viewport()) { 490 if (object != viewport()) {
491 blockmoveDist = blockmoveDist*2; 491 blockmoveDist = blockmoveDist*2;
492 viewportPos = ((QWidget *)object)->mapToParent(me->pos()); 492 viewportPos = ((QWidget *)object)->mapToParent(me->pos());
493 } else { 493 } else {
494 viewportPos = me->pos(); 494 viewportPos = me->pos();
495 } 495 }
496 bool objIsNotViewport = (object != viewport()); 496 bool objIsNotViewport = (object != viewport());
497 bool leftButt = false; 497 bool leftButt = false;
498#ifdef DESKTOP_VERSION 498#ifdef DESKTOP_VERSION
499 leftButt = (me->button() == LeftButton); 499 leftButt = (me->button() == LeftButton);
500#endif 500#endif
501 switch (me->type()) { 501 switch (me->type()) {
502 case QEvent::MouseButtonPress: 502 case QEvent::MouseButtonPress:
503 if (me->button() == LeftButton) { 503 if (me->button() == LeftButton) {
504 mPopupTimer->start( 600 ); 504 mPopupTimer->start( 600 );
505 mLeftMouseDown = true; 505 mLeftMouseDown = true;
506 } 506 }
507 blockMoving = true; 507 blockMoving = true;
508 startX = viewportPos.x(); 508 startX = viewportPos.x();
509 startY = viewportPos.y(); 509 startY = viewportPos.y();
510 mPopupPos = me->globalPos(); 510 mPopupPos = me->globalPos();
511 if ( objIsNotViewport && !leftButt ) { 511 if ( objIsNotViewport && !leftButt ) {
512 KOAgendaItem * tempItem = (KOAgendaItem *)object; 512 KOAgendaItem * tempItem = (KOAgendaItem *)object;
513 if (mAllDayMode) { 513 if (mAllDayMode) {
514 if ( tempItem->height() > 10 ) { 514 if ( tempItem->height() > 10 ) {
515 int minV = tempItem->height()/4; 515 int minV = tempItem->height()/4;
516 if ( minV > (blockmoveDist/2)-2 ) { 516 if ( minV > (blockmoveDist/2)-2 ) {
517 if ( minV > blockmoveDist ) 517 if ( minV > blockmoveDist )
518 minV = blockmoveDist; 518 minV = blockmoveDist;
519 else 519 else
520 minV = (blockmoveDist/2); 520 minV = (blockmoveDist/2);
521 } 521 }
522 bool border = false; 522 bool border = false;
523 int diff = tempItem->y() - viewportPos.y(); 523 int diff = tempItem->y() - viewportPos.y();
524 if ( diff < 0 ) 524 if ( diff < 0 )
525 diff *= -1; 525 diff *= -1;
526 if ( diff < minV ) { 526 if ( diff < minV ) {
527 border = true; 527 border = true;
528 objIsNotViewport = false; 528 objIsNotViewport = false;
529 } 529 }
530 if ( ! border ) { 530 if ( ! border ) {
531 diff = tempItem->y() + tempItem->height()- viewportPos.y(); 531 diff = tempItem->y() + tempItem->height()- viewportPos.y();
532 if ( diff < 0 ) 532 if ( diff < 0 )
533 diff *= -1; 533 diff *= -1;
534 if ( diff < minV ) { 534 if ( diff < minV ) {
535 border = true; 535 border = true;
536 objIsNotViewport = false; 536 objIsNotViewport = false;
537 } 537 }
538 } 538 }
539 } 539 }
540 } else { // not allday 540 } else { // not allday
541 if ( tempItem->width() > 10 ) { 541 if ( tempItem->width() > 10 ) {
542 int minH = tempItem->width()/4; 542 int minH = tempItem->width()/4;
543 if ( minH > (blockmoveDist/2)-2 ) { 543 if ( minH > (blockmoveDist/2)-2 ) {
544 if ( minH > blockmoveDist ) 544 if ( minH > blockmoveDist )
545 minH = blockmoveDist; 545 minH = blockmoveDist;
546 else 546 else
547 minH = (blockmoveDist/2); 547 minH = (blockmoveDist/2);
548 } 548 }
549 bool border = false; 549 bool border = false;
550 int diff = tempItem->x() - viewportPos.x(); 550 int diff = tempItem->x() - viewportPos.x();
551 if ( diff < 0 ) 551 if ( diff < 0 )
552 diff *= -1; 552 diff *= -1;
553 if ( diff < minH ) { 553 if ( diff < minH ) {
554 border = true; 554 border = true;
555 objIsNotViewport = false; 555 objIsNotViewport = false;
556 } 556 }
557 if ( ! border ) { 557 if ( ! border ) {
558 diff = tempItem->x() + tempItem->width() - viewportPos.x(); 558 diff = tempItem->x() + tempItem->width() - viewportPos.x();
559 if ( diff < 0 ) 559 if ( diff < 0 )
560 diff *= -1; 560 diff *= -1;
561 if ( diff < minH ) { 561 if ( diff < minH ) {
562 border = true; 562 border = true;
563 objIsNotViewport = false; 563 objIsNotViewport = false;
564 } 564 }
565 } 565 }
566 } 566 }
567 } 567 }
568 } 568 }
569 if ( objIsNotViewport ) { 569 if ( objIsNotViewport ) {
570 mPopupItem = (KOAgendaItem *)object; 570 mPopupItem = (KOAgendaItem *)object;
571 mPopupKind = 1; 571 mPopupKind = 1;
572 if (me->button() == RightButton) { 572 if (me->button() == RightButton) {
573 mPopupKind = 3; 573 mPopupKind = 3;
574 popupMenu(); 574 popupMenu();
575 } else if (me->button() == LeftButton) { 575 } else if (me->button() == LeftButton) {
576 mActionItem = (KOAgendaItem *)object; 576 mActionItem = (KOAgendaItem *)object;
577 if (mActionItem) { 577 if (mActionItem) {
578 emit signalClearSelection(); 578 emit signalClearSelection();
579 slotClearSelection(); 579 slotClearSelection();
580 selectItem(mActionItem); 580 selectItem(mActionItem);
581 Incidence *incidence = mActionItem->incidence(); 581 Incidence *incidence = mActionItem->incidence();
582 if ( incidence->isReadOnly() /*|| incidence->recurrence()->doesRecur() */) { 582 if ( incidence->isReadOnly() /*|| incidence->doesRecur() */) {
583 mActionItem = 0; 583 mActionItem = 0;
584 } else { 584 } else {
585 startItemAction(viewportPos); 585 startItemAction(viewportPos);
586 } 586 }
587 } 587 }
588 } 588 }
589 } else { // ---------- viewport() 589 } else { // ---------- viewport()
590 mPopupItem = 0; 590 mPopupItem = 0;
591 mPopupKind = 2; 591 mPopupKind = 2;
592 selectItem(0); 592 selectItem(0);
593 mActionItem = 0; 593 mActionItem = 0;
594 if (me->button() == RightButton) { 594 if (me->button() == RightButton) {
595 int x,y; 595 int x,y;
596 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 596 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
597 int gx,gy; 597 int gx,gy;
598 contentsToGrid(x,y,gx,gy); 598 contentsToGrid(x,y,gx,gy);
599 mCurrentCellX = gx; 599 mCurrentCellX = gx;
600 mCurrentCellY = gy; 600 mCurrentCellY = gy;
601 mStartCellX = gx; 601 mStartCellX = gx;
602 mStartCellY = gy; 602 mStartCellY = gy;
603 mPopupKind = 4; 603 mPopupKind = 4;
604 popupMenu(); 604 popupMenu();
605 } else if (me->button() == LeftButton) { 605 } else if (me->button() == LeftButton) {
606 setCursor(arrowCursor); 606 setCursor(arrowCursor);
607 startSelectAction(viewportPos); 607 startSelectAction(viewportPos);
608 } 608 }
609 } 609 }
610 break; 610 break;
611 611
612 case QEvent::MouseButtonRelease: 612 case QEvent::MouseButtonRelease:
613 if (me->button() == LeftButton ) { 613 if (me->button() == LeftButton ) {
614 mPopupTimer->stop(); 614 mPopupTimer->stop();
615 } 615 }
616 if (object != viewport()) { 616 if (object != viewport()) {
617 if (me->button() == LeftButton && mLeftMouseDown) { 617 if (me->button() == LeftButton && mLeftMouseDown) {
618 if (mActionItem) { 618 if (mActionItem) {
619 QPoint clipperPos = clipper()->mapFromGlobal(viewport()->mapToGlobal(viewportPos)); 619 QPoint clipperPos = clipper()->mapFromGlobal(viewport()->mapToGlobal(viewportPos));
620 //qDebug(" %d %d %d ",clipperPos.y(),visibleHeight() , 9 ); 620 //qDebug(" %d %d %d ",clipperPos.y(),visibleHeight() , 9 );
621 if ( mActionType == MOVE && (clipperPos.y() > visibleHeight()-2 ||clipperPos.y() < 0 ) ) { 621 if ( mActionType == MOVE && (clipperPos.y() > visibleHeight()-2 ||clipperPos.y() < 0 ) ) {
622 mScrollUpTimer.stop(); 622 mScrollUpTimer.stop();
623 mScrollDownTimer.stop(); 623 mScrollDownTimer.stop();
624 mActionItem->resetMove(); 624 mActionItem->resetMove();
625 placeSubCells( mActionItem ); 625 placeSubCells( mActionItem );
626 // emit startDragSignal( mActionItem->incidence() ); 626 // emit startDragSignal( mActionItem->incidence() );
627 setCursor( arrowCursor ); 627 setCursor( arrowCursor );
628 mActionItem = 0; 628 mActionItem = 0;
629 mActionType = NOP; 629 mActionType = NOP;
630 mItemMoved = 0; 630 mItemMoved = 0;
631 mLeftMouseDown = false; 631 mLeftMouseDown = false;
632 return true; 632 return true;
633 } 633 }
634 endItemAction(); 634 endItemAction();
635 } 635 }
636 } 636 }
637 637
638 } else { // ---------- viewport() 638 } else { // ---------- viewport()
639 if (me->button() == LeftButton && mLeftMouseDown ) { //left click 639 if (me->button() == LeftButton && mLeftMouseDown ) { //left click
640 endSelectAction( true ); // emit new event signal 640 endSelectAction( true ); // emit new event signal
641 } 641 }
642 } 642 }
643 if (me->button() == LeftButton) 643 if (me->button() == LeftButton)
644 mLeftMouseDown = false; 644 mLeftMouseDown = false;
645 645
646 break; 646 break;
647 647
648 case QEvent::MouseMove: 648 case QEvent::MouseMove:
649 //qDebug("mm "); 649 //qDebug("mm ");
650 if ( !mLeftMouseDown ) 650 if ( !mLeftMouseDown )
651 return false; 651 return false;
652 if ( blockMoving ) { 652 if ( blockMoving ) {
653 int dX, dY; 653 int dX, dY;
654 dX = startX - viewportPos.x(); 654 dX = startX - viewportPos.x();
655 if ( dX < 0 ) 655 if ( dX < 0 )
656 dX = -dX; 656 dX = -dX;
657 dY = viewportPos.y() - startY; 657 dY = viewportPos.y() - startY;
658 if ( dY < 0 ) 658 if ( dY < 0 )
659 dY = -dY; 659 dY = -dY;
660 //qDebug("%d %d %d ", dX, dY , blockmoveDist ); 660 //qDebug("%d %d %d ", dX, dY , blockmoveDist );
661 if ( dX > blockmoveDist || dY > blockmoveDist ) { 661 if ( dX > blockmoveDist || dY > blockmoveDist ) {
662 blockMoving = false; 662 blockMoving = false;
663 } 663 }
664 } 664 }
665 if ( ! blockMoving ) 665 if ( ! blockMoving )
666 mPopupTimer->stop(); 666 mPopupTimer->stop();
667 if (object != viewport()) { 667 if (object != viewport()) {
668 KOAgendaItem *moveItem = (KOAgendaItem *)object; 668 KOAgendaItem *moveItem = (KOAgendaItem *)object;
669 if (!moveItem->incidence()->isReadOnly() ) { 669 if (!moveItem->incidence()->isReadOnly() ) {
670 if (!mActionItem) 670 if (!mActionItem)
671 setNoActionCursor(moveItem,viewportPos); 671 setNoActionCursor(moveItem,viewportPos);
672 else { 672 else {
673 if ( !blockMoving ) 673 if ( !blockMoving )
674 performItemAction(viewportPos); 674 performItemAction(viewportPos);
675 } 675 }
676 } 676 }
677 } else { // ---------- viewport() 677 } else { // ---------- viewport()
678 mPopupPos = viewport()->mapToGlobal( me->pos() ); 678 mPopupPos = viewport()->mapToGlobal( me->pos() );
679 if ( mActionType == SELECT ) { 679 if ( mActionType == SELECT ) {
680 performSelectAction( viewportPos ); 680 performSelectAction( viewportPos );
681 } 681 }
682 } 682 }
683 break; 683 break;
684 684
685 case QEvent::MouseButtonDblClick: 685 case QEvent::MouseButtonDblClick:
686 mPopupTimer->stop(); 686 mPopupTimer->stop();
687 if (object == viewport()) { 687 if (object == viewport()) {
688 selectItem(0); 688 selectItem(0);
689 int x,y; 689 int x,y;
690 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 690 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
691 int gx,gy; 691 int gx,gy;
692 contentsToGrid(x,y,gx,gy); 692 contentsToGrid(x,y,gx,gy);
693 emit newEventSignal(gx,gy); 693 emit newEventSignal(gx,gy);
694 } else { 694 } else {
695 KOAgendaItem *doubleClickedItem = (KOAgendaItem *)object; 695 KOAgendaItem *doubleClickedItem = (KOAgendaItem *)object;
696 selectItem(doubleClickedItem); 696 selectItem(doubleClickedItem);
697 if ( KOPrefs::instance()->mEditOnDoubleClick ) 697 if ( KOPrefs::instance()->mEditOnDoubleClick )
698 emit editIncidenceSignal(doubleClickedItem->incidence()); 698 emit editIncidenceSignal(doubleClickedItem->incidence());
699 else 699 else
700 emit showIncidenceSignal(doubleClickedItem->incidence()); 700 emit showIncidenceSignal(doubleClickedItem->incidence());
701 } 701 }
702 break; 702 break;
703 703
704 default: 704 default:
705 break; 705 break;
706 } 706 }
707 return true; 707 return true;
708 708
709} 709}
710 710
711void KOAgenda::newItem( int item ) 711void KOAgenda::newItem( int item )
712{ 712{
713 if ( item == 1 ) { //new event 713 if ( item == 1 ) { //new event
714 newEventSignal(mStartCellX ,mStartCellY ); 714 newEventSignal(mStartCellX ,mStartCellY );
715 } else 715 } else
716 if ( item == 2 ) { //new event 716 if ( item == 2 ) { //new event
717 newTodoSignal(mStartCellX ,mStartCellY ); 717 newTodoSignal(mStartCellX ,mStartCellY );
718 } else 718 } else
719 { 719 {
720 emit showDateView( item, mStartCellX ); 720 emit showDateView( item, mStartCellX );
721 // 3Day view 721 // 3Day view
722 // 4Week view 722 // 4Week view
723 // 5Month view 723 // 5Month view
724 // 6Journal view 724 // 6Journal view
725 } 725 }
726} 726}
727void KOAgenda::slotClearSelection() 727void KOAgenda::slotClearSelection()
728{ 728{
729 if (mSelectionHeight) { 729 if (mSelectionHeight) {
730 int selectionX = mSelectionCellX * mGridSpacingX; 730 int selectionX = mSelectionCellX * mGridSpacingX;
731 int top = mSelectionYTop - 2 *mGridSpacingY; 731 int top = mSelectionYTop - 2 *mGridSpacingY;
732 int hei = mSelectionHeight + 4 *mGridSpacingY; 732 int hei = mSelectionHeight + 4 *mGridSpacingY;
733 clearSelection(); 733 clearSelection();
734 repaintContents( selectionX, top, 734 repaintContents( selectionX, top,
735 mGridSpacingX, hei ,false ); 735 mGridSpacingX, hei ,false );
736 } 736 }
737 737
738} 738}
739void KOAgenda::startSelectAction(QPoint viewportPos) 739void KOAgenda::startSelectAction(QPoint viewportPos)
740{ 740{
741 741
742 emit signalClearSelection(); 742 emit signalClearSelection();
743 slotClearSelection(); 743 slotClearSelection();
744 744
745 mActionType = SELECT; 745 mActionType = SELECT;
746 746
747 int x,y; 747 int x,y;
748 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 748 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
749 int gx,gy; 749 int gx,gy;
750 contentsToGrid(x,y,gx,gy); 750 contentsToGrid(x,y,gx,gy);
751 751
752 mStartCellX = gx; 752 mStartCellX = gx;
753 mStartCellY = gy; 753 mStartCellY = gy;
754 mCurrentCellX = gx; 754 mCurrentCellX = gx;
755 mCurrentCellY = gy; 755 mCurrentCellY = gy;
756 756
757 // Store new selection 757 // Store new selection
758 mSelectionCellX = gx; 758 mSelectionCellX = gx;
759 mSelectionYTop = gy * mGridSpacingY; 759 mSelectionYTop = gy * mGridSpacingY;
760 mSelectionHeight = mGridSpacingY; 760 mSelectionHeight = mGridSpacingY;
761 761
762 // Paint new selection 762 // Paint new selection
763 repaintContents( mSelectionCellX * mGridSpacingX+1, mSelectionYTop, 763 repaintContents( mSelectionCellX * mGridSpacingX+1, mSelectionYTop,
764 mGridSpacingX-1, mSelectionHeight ); 764 mGridSpacingX-1, mSelectionHeight );
765} 765}
766 766
767void KOAgenda::performSelectAction(QPoint viewportPos) 767void KOAgenda::performSelectAction(QPoint viewportPos)
768{ 768{
769 int x,y; 769 int x,y;
770 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 770 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
771 int gx,gy; 771 int gx,gy;
772 contentsToGrid(x,y,gx,gy); 772 contentsToGrid(x,y,gx,gy);
773 773
774 QPoint clipperPos = clipper()-> 774 QPoint clipperPos = clipper()->
775 mapFromGlobal(viewport()->mapToGlobal(viewportPos)); 775 mapFromGlobal(viewport()->mapToGlobal(viewportPos));
776 776
777 // Scroll if cursor was moved to upper or lower end of agenda. 777 // Scroll if cursor was moved to upper or lower end of agenda.
778 if (clipperPos.y() < mScrollBorderWidth) { 778 if (clipperPos.y() < mScrollBorderWidth) {
779 mScrollUpTimer.start(mScrollDelay); 779 mScrollUpTimer.start(mScrollDelay);
780 } else if (visibleHeight() - clipperPos.y() < 780 } else if (visibleHeight() - clipperPos.y() <
781 mScrollBorderWidth) { 781 mScrollBorderWidth) {
782 mScrollDownTimer.start(mScrollDelay); 782 mScrollDownTimer.start(mScrollDelay);
783 } else { 783 } else {
784 mScrollUpTimer.stop(); 784 mScrollUpTimer.stop();
785 mScrollDownTimer.stop(); 785 mScrollDownTimer.stop();
786 } 786 }
787 787
788 if ( gy > mCurrentCellY ) { 788 if ( gy > mCurrentCellY ) {
789 mSelectionHeight = ( gy + 1 ) * mGridSpacingY - mSelectionYTop; 789 mSelectionHeight = ( gy + 1 ) * mGridSpacingY - mSelectionYTop;
790 790
791 791
792 repaintContents( (KOGlobals::self()->reverseLayout() ? 792 repaintContents( (KOGlobals::self()->reverseLayout() ?
793 mColumns - 1 - mSelectionCellX : mSelectionCellX) * 793 mColumns - 1 - mSelectionCellX : mSelectionCellX) *
794 mGridSpacingX, mSelectionYTop, 794 mGridSpacingX, mSelectionYTop,
795 mGridSpacingX, mSelectionHeight , false); 795 mGridSpacingX, mSelectionHeight , false);
796 796
797 mCurrentCellY = gy; 797 mCurrentCellY = gy;
798 } else if ( gy < mCurrentCellY ) { 798 } else if ( gy < mCurrentCellY ) {
799 if ( gy >= mStartCellY ) { 799 if ( gy >= mStartCellY ) {
800 int selectionHeight = mSelectionHeight; 800 int selectionHeight = mSelectionHeight;
801 mSelectionHeight = ( gy + 1 ) * mGridSpacingY - mSelectionYTop; 801 mSelectionHeight = ( gy + 1 ) * mGridSpacingY - mSelectionYTop;
802 802
803 repaintContents( (KOGlobals::self()->reverseLayout() ? 803 repaintContents( (KOGlobals::self()->reverseLayout() ?
804 mColumns - 1 - mSelectionCellX : mSelectionCellX) * 804 mColumns - 1 - mSelectionCellX : mSelectionCellX) *
805 mGridSpacingX, mSelectionYTop, 805 mGridSpacingX, mSelectionYTop,
806 mGridSpacingX, selectionHeight,false ); 806 mGridSpacingX, selectionHeight,false );
807 807
808 mCurrentCellY = gy; 808 mCurrentCellY = gy;
809 } else { 809 } else {
810 } 810 }
811 } 811 }
812} 812}
813 813
814void KOAgenda::endSelectAction( bool emitNewEvent ) 814void KOAgenda::endSelectAction( bool emitNewEvent )
815{ 815{
816 mActionType = NOP; 816 mActionType = NOP;
817 mScrollUpTimer.stop(); 817 mScrollUpTimer.stop();
818 mScrollDownTimer.stop(); 818 mScrollDownTimer.stop();
819 819
820 emit newTimeSpanSignal(mStartCellX,mStartCellY,mCurrentCellX,mCurrentCellY); 820 emit newTimeSpanSignal(mStartCellX,mStartCellY,mCurrentCellX,mCurrentCellY);
821 if ( emitNewEvent && mStartCellY < mCurrentCellY ) { 821 if ( emitNewEvent && mStartCellY < mCurrentCellY ) {
822 emit newEventSignal(mStartCellX,mStartCellY,mCurrentCellX,mCurrentCellY); 822 emit newEventSignal(mStartCellX,mStartCellY,mCurrentCellX,mCurrentCellY);
823 } 823 }
824} 824}
825 825
826void KOAgenda::startItemAction(QPoint viewportPos) 826void KOAgenda::startItemAction(QPoint viewportPos)
827{ 827{
828 int x,y; 828 int x,y;
829 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 829 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
830 int gx,gy; 830 int gx,gy;
831 contentsToGrid(x,y,gx,gy); 831 contentsToGrid(x,y,gx,gy);
832 832
833 mStartCellX = gx; 833 mStartCellX = gx;
834 mStartCellY = gy; 834 mStartCellY = gy;
835 mCurrentCellX = gx; 835 mCurrentCellX = gx;
836 mCurrentCellY = gy; 836 mCurrentCellY = gy;
837 837
838 if (mAllDayMode) { 838 if (mAllDayMode) {
839 int gridDistanceX = (x - gx * mGridSpacingX); 839 int gridDistanceX = (x - gx * mGridSpacingX);
840 if (gridDistanceX < mResizeBorderWidth && 840 if (gridDistanceX < mResizeBorderWidth &&
841 mActionItem->cellX() == mCurrentCellX) { 841 mActionItem->cellX() == mCurrentCellX) {
842 mActionType = RESIZELEFT; 842 mActionType = RESIZELEFT;
843 setCursor(sizeHorCursor); 843 setCursor(sizeHorCursor);
844 } else if ((mGridSpacingX - gridDistanceX) < mResizeBorderWidth && 844 } else if ((mGridSpacingX - gridDistanceX) < mResizeBorderWidth &&
845 mActionItem->cellXWidth() == mCurrentCellX) { 845 mActionItem->cellXWidth() == mCurrentCellX) {
846 mActionType = RESIZERIGHT; 846 mActionType = RESIZERIGHT;
847 setCursor(sizeHorCursor); 847 setCursor(sizeHorCursor);
848 } else { 848 } else {
849 mActionType = MOVE; 849 mActionType = MOVE;
850 mActionItem->startMove(); 850 mActionItem->startMove();
851 setCursor(sizeAllCursor); 851 setCursor(sizeAllCursor);
852 } 852 }
853 } else { 853 } else {
854 int gridDistanceY = (y - gy * mGridSpacingY); 854 int gridDistanceY = (y - gy * mGridSpacingY);
855 bool allowResize = ( mActionItem->incidence()->typeID() != todoID ); 855 bool allowResize = ( mActionItem->incidence()->typeID() != todoID );
856 if (allowResize && gridDistanceY < mResizeBorderWidth && 856 if (allowResize && gridDistanceY < mResizeBorderWidth &&
857 mActionItem->cellYTop() == mCurrentCellY && 857 mActionItem->cellYTop() == mCurrentCellY &&
858 !mActionItem->firstMultiItem()) { 858 !mActionItem->firstMultiItem()) {
859 mActionType = RESIZETOP; 859 mActionType = RESIZETOP;
860 setCursor(sizeVerCursor); 860 setCursor(sizeVerCursor);
861 } else if (allowResize &&(mGridSpacingY - gridDistanceY) < mResizeBorderWidth && 861 } else if (allowResize &&(mGridSpacingY - gridDistanceY) < mResizeBorderWidth &&
862 mActionItem->cellYBottom() == mCurrentCellY && 862 mActionItem->cellYBottom() == mCurrentCellY &&
863 !mActionItem->lastMultiItem()) { 863 !mActionItem->lastMultiItem()) {
864 mActionType = RESIZEBOTTOM; 864 mActionType = RESIZEBOTTOM;
865 setCursor(sizeVerCursor); 865 setCursor(sizeVerCursor);
866 } else { 866 } else {
867 mActionType = MOVE; 867 mActionType = MOVE;
868 mActionItem->startMove(); 868 mActionItem->startMove();
869 setCursor(sizeAllCursor); 869 setCursor(sizeAllCursor);
870 } 870 }
871 } 871 }
872} 872}
873 873
874void KOAgenda::performItemAction(QPoint viewportPos) 874void KOAgenda::performItemAction(QPoint viewportPos)
875{ 875{
876// kdDebug() << "viewportPos: " << viewportPos.x() << "," << viewportPos.y() << endl; 876// kdDebug() << "viewportPos: " << viewportPos.x() << "," << viewportPos.y() << endl;
877// QPoint point = viewport()->mapToGlobal(viewportPos); 877// QPoint point = viewport()->mapToGlobal(viewportPos);
878// kdDebug() << "Global: " << point.x() << "," << point.y() << endl; 878// kdDebug() << "Global: " << point.x() << "," << point.y() << endl;
879// point = clipper()->mapFromGlobal(point); 879// point = clipper()->mapFromGlobal(point);
880// kdDebug() << "clipper: " << point.x() << "," << point.y() << endl; 880// kdDebug() << "clipper: " << point.x() << "," << point.y() << endl;
881// kdDebug() << "visible height: " << visibleHeight() << endl; 881// kdDebug() << "visible height: " << visibleHeight() << endl;
882 int x,y; 882 int x,y;
883 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 883 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
884// kdDebug() << "contents: " << x << "," << y << "\n" << endl; 884// kdDebug() << "contents: " << x << "," << y << "\n" << endl;
885 int gx,gy; 885 int gx,gy;
886 contentsToGrid(x,y,gx,gy); 886 contentsToGrid(x,y,gx,gy);
887 QPoint clipperPos = clipper()-> 887 QPoint clipperPos = clipper()->
888 mapFromGlobal(viewport()->mapToGlobal(viewportPos)); 888 mapFromGlobal(viewport()->mapToGlobal(viewportPos));
889 889
890 // Cursor left active agenda area. 890 // Cursor left active agenda area.
891 // This starts a drag. 891 // This starts a drag.
892 if ( /*clipperPos.y() < 0 || clipperPos.y() > visibleHeight() ||*/ 892 if ( /*clipperPos.y() < 0 || clipperPos.y() > visibleHeight() ||*/
893 clipperPos.x() < 0 || clipperPos.x() > visibleWidth() ) { 893 clipperPos.x() < 0 || clipperPos.x() > visibleWidth() ) {
894 if ( mActionType == MOVE ) { 894 if ( mActionType == MOVE ) {
895 mScrollUpTimer.stop(); 895 mScrollUpTimer.stop();
896 mScrollDownTimer.stop(); 896 mScrollDownTimer.stop();
897 mActionItem->resetMove(); 897 mActionItem->resetMove();
898 placeSubCells( mActionItem ); 898 placeSubCells( mActionItem );
899 // emit startDragSignal( mActionItem->incidence() ); 899 // emit startDragSignal( mActionItem->incidence() );
900 setCursor( arrowCursor ); 900 setCursor( arrowCursor );
901 mActionItem = 0; 901 mActionItem = 0;
902 mActionType = NOP; 902 mActionType = NOP;
903 mItemMoved = 0; 903 mItemMoved = 0;
904 return; 904 return;
905 } 905 }
906 } else { 906 } else {
907 switch ( mActionType ) { 907 switch ( mActionType ) {
908 case MOVE: 908 case MOVE:
909 setCursor( sizeAllCursor ); 909 setCursor( sizeAllCursor );
910 break; 910 break;
911 case RESIZETOP: 911 case RESIZETOP:
912 case RESIZEBOTTOM: 912 case RESIZEBOTTOM:
913 setCursor( sizeVerCursor ); 913 setCursor( sizeVerCursor );
914 break; 914 break;
915 case RESIZELEFT: 915 case RESIZELEFT:
916 case RESIZERIGHT: 916 case RESIZERIGHT:
917 setCursor( sizeHorCursor ); 917 setCursor( sizeHorCursor );
918 break; 918 break;
919 default: 919 default:
920 setCursor( arrowCursor ); 920 setCursor( arrowCursor );
921 } 921 }
922 } 922 }
923 923
924 // Scroll if item was moved to upper or lower end of agenda. 924 // Scroll if item was moved to upper or lower end of agenda.
925 if (clipperPos.y() < mScrollBorderWidth) { 925 if (clipperPos.y() < mScrollBorderWidth) {
926 mScrollUpTimer.start(mScrollDelay); 926 mScrollUpTimer.start(mScrollDelay);
927 } else if (visibleHeight() - clipperPos.y() < 927 } else if (visibleHeight() - clipperPos.y() <
928 mScrollBorderWidth) { 928 mScrollBorderWidth) {
929 mScrollDownTimer.start(mScrollDelay); 929 mScrollDownTimer.start(mScrollDelay);
930 } else { 930 } else {
931 mScrollUpTimer.stop(); 931 mScrollUpTimer.stop();
932 mScrollDownTimer.stop(); 932 mScrollDownTimer.stop();
933 } 933 }
934 934
935 // Move or resize item if necessary 935 // Move or resize item if necessary
936 if (mCurrentCellX != gx || mCurrentCellY != gy) { 936 if (mCurrentCellX != gx || mCurrentCellY != gy) {
937 mItemMoved = true; 937 mItemMoved = true;
938 mActionItem->raise(); 938 mActionItem->raise();
939 if (mActionType == MOVE) { 939 if (mActionType == MOVE) {
940 // Move all items belonging to a multi item 940 // Move all items belonging to a multi item
941 KOAgendaItem *moveItem = mActionItem->firstMultiItem(); 941 KOAgendaItem *moveItem = mActionItem->firstMultiItem();
942 bool isMultiItem = (moveItem || mActionItem->lastMultiItem()); 942 bool isMultiItem = (moveItem || mActionItem->lastMultiItem());
943 if (!moveItem) moveItem = mActionItem; 943 if (!moveItem) moveItem = mActionItem;
944 while (moveItem) { 944 while (moveItem) {
945 int dy; 945 int dy;
946 if (isMultiItem) dy = 0; 946 if (isMultiItem) dy = 0;
947 else dy = gy - mCurrentCellY; 947 else dy = gy - mCurrentCellY;
948 moveItem->moveRelative(gx - mCurrentCellX,dy); 948 moveItem->moveRelative(gx - mCurrentCellX,dy);
949 int x,y; 949 int x,y;
950 gridToContents(moveItem->cellX(),moveItem->cellYTop(),x,y); 950 gridToContents(moveItem->cellX(),moveItem->cellYTop(),x,y);
951 moveItem->resize(mGridSpacingX * moveItem->cellWidth(), 951 moveItem->resize(mGridSpacingX * moveItem->cellWidth(),
952 mGridSpacingY * moveItem->cellHeight()); 952 mGridSpacingY * moveItem->cellHeight());
953 moveItem->raise(); 953 moveItem->raise();
954 moveChild(moveItem,x,y); 954 moveChild(moveItem,x,y);
955 moveItem = moveItem->nextMultiItem(); 955 moveItem = moveItem->nextMultiItem();
956 } 956 }
957 } else if (mActionType == RESIZETOP) { 957 } else if (mActionType == RESIZETOP) {
958 if (mCurrentCellY <= mActionItem->cellYBottom()) { 958 if (mCurrentCellY <= mActionItem->cellYBottom()) {
959 mActionItem->expandTop(gy - mCurrentCellY); 959 mActionItem->expandTop(gy - mCurrentCellY);
960 mActionItem->resize(mActionItem->width(), 960 mActionItem->resize(mActionItem->width(),
961 mGridSpacingY * mActionItem->cellHeight()); 961 mGridSpacingY * mActionItem->cellHeight());
962 int x,y; 962 int x,y;
963 gridToContents(mCurrentCellX,mActionItem->cellYTop(),x,y); 963 gridToContents(mCurrentCellX,mActionItem->cellYTop(),x,y);
964 //moveChild(mActionItem,childX(mActionItem),y); 964 //moveChild(mActionItem,childX(mActionItem),y);
965 QScrollView::moveChild( mActionItem,childX(mActionItem),y ); 965 QScrollView::moveChild( mActionItem,childX(mActionItem),y );
966 } 966 }
967 } else if (mActionType == RESIZEBOTTOM) { 967 } else if (mActionType == RESIZEBOTTOM) {
968 if (mCurrentCellY >= mActionItem->cellYTop()) { 968 if (mCurrentCellY >= mActionItem->cellYTop()) {
969 mActionItem->expandBottom(gy - mCurrentCellY); 969 mActionItem->expandBottom(gy - mCurrentCellY);
970 mActionItem->resize(mActionItem->width(), 970 mActionItem->resize(mActionItem->width(),
971 mGridSpacingY * mActionItem->cellHeight()); 971 mGridSpacingY * mActionItem->cellHeight());
972 } 972 }
973 } else if (mActionType == RESIZELEFT) { 973 } else if (mActionType == RESIZELEFT) {
974 if (mCurrentCellX <= mActionItem->cellXWidth()) { 974 if (mCurrentCellX <= mActionItem->cellXWidth()) {
975 mActionItem->expandLeft(gx - mCurrentCellX); 975 mActionItem->expandLeft(gx - mCurrentCellX);
976 mActionItem->resize(mGridSpacingX * mActionItem->cellWidth(), 976 mActionItem->resize(mGridSpacingX * mActionItem->cellWidth(),
977 mActionItem->height()); 977 mActionItem->height());
978 int x,y; 978 int x,y;
979 gridToContents(mActionItem->cellX(),mActionItem->cellYTop(),x,y); 979 gridToContents(mActionItem->cellX(),mActionItem->cellYTop(),x,y);
980 moveChild(mActionItem,x,childY(mActionItem)); 980 moveChild(mActionItem,x,childY(mActionItem));
981 } 981 }
982 } else if (mActionType == RESIZERIGHT) { 982 } else if (mActionType == RESIZERIGHT) {
983 if (mCurrentCellX >= mActionItem->cellX()) { 983 if (mCurrentCellX >= mActionItem->cellX()) {
984 mActionItem->expandRight(gx - mCurrentCellX); 984 mActionItem->expandRight(gx - mCurrentCellX);
985 mActionItem->resize(mGridSpacingX * mActionItem->cellWidth(), 985 mActionItem->resize(mGridSpacingX * mActionItem->cellWidth(),
986 mActionItem->height()); 986 mActionItem->height());
987 } 987 }
988 } 988 }
989 mCurrentCellX = gx; 989 mCurrentCellX = gx;
990 mCurrentCellY = gy; 990 mCurrentCellY = gy;
991 } 991 }
992} 992}
993 993
994void KOAgenda::endItemAction() 994void KOAgenda::endItemAction()
995{ 995{
996 996
997 if ( mItemMoved ) { 997 if ( mItemMoved ) {
998 KOAgendaItem *placeItem = mActionItem->firstMultiItem(); 998 KOAgendaItem *placeItem = mActionItem->firstMultiItem();
999 if ( !placeItem ) { 999 if ( !placeItem ) {
1000 placeItem = mActionItem; 1000 placeItem = mActionItem;
1001 } 1001 }
1002 if ( placeItem->incidence()->recurrence()->doesRecur() ) { 1002 if ( placeItem->incidence()->doesRecur() ) {
1003 Incidence* oldInc = placeItem->incidence(); 1003 Incidence* oldInc = placeItem->incidence();
1004 placeItem->recreateIncidence(); 1004 placeItem->recreateIncidence();
1005 emit addToCalSignal(placeItem->incidence(), oldInc ); 1005 emit addToCalSignal(placeItem->incidence(), oldInc );
1006 } 1006 }
1007 int type = mActionType; 1007 int type = mActionType;
1008 if ( mAllDayMode ) 1008 if ( mAllDayMode )
1009 type = -1; 1009 type = -1;
1010 KOAgendaItem *modifiedItem = placeItem; 1010 KOAgendaItem *modifiedItem = placeItem;
1011 //emit itemModified( placeItem, mActionType /*KOGlobals::EVENTEDITED */); 1011 //emit itemModified( placeItem, mActionType /*KOGlobals::EVENTEDITED */);
1012 QPtrList<KOAgendaItem> oldconflictItems ;//= placeItem->conflictItems(); 1012 QPtrList<KOAgendaItem> oldconflictItems ;//= placeItem->conflictItems();
1013 KOAgendaItem *item; 1013 KOAgendaItem *item;
1014 1014
1015 if ( placeItem->incidence()->typeID() == todoID ) { 1015 if ( placeItem->incidence()->typeID() == todoID ) {
1016 mSelectedItem = 0; 1016 mSelectedItem = 0;
1017 //qDebug("todo %d %d %d ", mCurrentCellX, modifiedItem->cellX() ,modifiedItem->cellXWidth()); 1017 //qDebug("todo %d %d %d ", mCurrentCellX, modifiedItem->cellX() ,modifiedItem->cellXWidth());
1018 modifiedItem->mLastMoveXPos = mCurrentCellX; 1018 modifiedItem->mLastMoveXPos = mCurrentCellX;
1019 emit itemModified( modifiedItem, mActionType ); 1019 emit itemModified( modifiedItem, mActionType );
1020 } 1020 }
1021 else { 1021 else {
1022 1022
1023 1023
1024 globalFlagBlockAgendaItemPaint = 1; 1024 globalFlagBlockAgendaItemPaint = 1;
1025 for ( item=oldconflictItems.first(); item != 0; 1025 for ( item=oldconflictItems.first(); item != 0;
1026 item=oldconflictItems.next() ) { 1026 item=oldconflictItems.next() ) {
1027 placeSubCells(item); 1027 placeSubCells(item);
1028 } 1028 }
1029 while ( placeItem ) { 1029 while ( placeItem ) {
1030 //qDebug("placeItem %s ", placeItem->incidence()->summary().latin1()); 1030 //qDebug("placeItem %s ", placeItem->incidence()->summary().latin1());
1031 oldconflictItems = placeItem->conflictItems(); 1031 oldconflictItems = placeItem->conflictItems();
1032 for ( item=oldconflictItems.first(); item != 0; 1032 for ( item=oldconflictItems.first(); item != 0;
1033 item=oldconflictItems.next() ) { 1033 item=oldconflictItems.next() ) {
1034 placeSubCells(item); 1034 placeSubCells(item);
1035 } 1035 }
1036 placeSubCells( placeItem ); 1036 placeSubCells( placeItem );
1037 placeItem = placeItem->nextMultiItem(); 1037 placeItem = placeItem->nextMultiItem();
1038 } 1038 }
1039 globalFlagBlockAgendaItemPaint = 0; 1039 globalFlagBlockAgendaItemPaint = 0;
1040 for ( item=oldconflictItems.first(); item != 0; 1040 for ( item=oldconflictItems.first(); item != 0;
1041 item=oldconflictItems.next() ) { 1041 item=oldconflictItems.next() ) {
1042 globalFlagBlockAgendaItemUpdate = 0; 1042 globalFlagBlockAgendaItemUpdate = 0;
1043 item->repaintMe(); 1043 item->repaintMe();
1044 globalFlagBlockAgendaItemUpdate = 1; 1044 globalFlagBlockAgendaItemUpdate = 1;
1045 item->repaint( false ); 1045 item->repaint( false );
1046 } 1046 }
1047 placeItem = modifiedItem; 1047 placeItem = modifiedItem;
1048 1048
1049 while ( placeItem ) { 1049 while ( placeItem ) {
1050 //qDebug("placeItem %s ", placeItem->incidence()->summary().latin1()); 1050 //qDebug("placeItem %s ", placeItem->incidence()->summary().latin1());
1051 globalFlagBlockAgendaItemUpdate = 0; 1051 globalFlagBlockAgendaItemUpdate = 0;
1052 placeItem->repaintMe(); 1052 placeItem->repaintMe();
1053 globalFlagBlockAgendaItemUpdate = 1; 1053 globalFlagBlockAgendaItemUpdate = 1;
1054 placeItem->repaint(false); 1054 placeItem->repaint(false);
1055 placeItem = placeItem->nextMultiItem(); 1055 placeItem = placeItem->nextMultiItem();
1056 } 1056 }
1057 emit itemModified( modifiedItem, mActionType ); 1057 emit itemModified( modifiedItem, mActionType );
1058 1058
1059 1059
1060 placeItem = modifiedItem; 1060 placeItem = modifiedItem;
1061 while ( placeItem ) { 1061 while ( placeItem ) {
1062 oldconflictItems = placeItem->conflictItems(); 1062 oldconflictItems = placeItem->conflictItems();
1063 for ( item=oldconflictItems.first(); item != 0; 1063 for ( item=oldconflictItems.first(); item != 0;
1064 item=oldconflictItems.next() ) { 1064 item=oldconflictItems.next() ) {
1065 placeSubCells(item); 1065 placeSubCells(item);
1066 } 1066 }
1067 placeSubCells( placeItem ); 1067 placeSubCells( placeItem );
1068 placeItem = placeItem->nextMultiItem(); 1068 placeItem = placeItem->nextMultiItem();
1069 1069
1070 } 1070 }
1071 placeItem = modifiedItem; 1071 placeItem = modifiedItem;
1072 while ( placeItem ) { 1072 while ( placeItem ) {
1073 oldconflictItems = placeItem->conflictItems(); 1073 oldconflictItems = placeItem->conflictItems();
1074 for ( item=oldconflictItems.first(); item != 0; 1074 for ( item=oldconflictItems.first(); item != 0;
1075 item=oldconflictItems.next() ) { 1075 item=oldconflictItems.next() ) {
1076 globalFlagBlockAgendaItemUpdate = 0; 1076 globalFlagBlockAgendaItemUpdate = 0;
1077 item->repaintMe(); 1077 item->repaintMe();
1078 globalFlagBlockAgendaItemUpdate = 1; 1078 globalFlagBlockAgendaItemUpdate = 1;
1079 item->repaint(false); 1079 item->repaint(false);
1080 } 1080 }
1081 placeItem = placeItem->nextMultiItem(); 1081 placeItem = placeItem->nextMultiItem();
1082 } 1082 }
1083 /* 1083 /*
1084 1084
1085 oldconflictItems = modifiedItem->conflictItems(); 1085 oldconflictItems = modifiedItem->conflictItems();
1086 for ( item=oldconflictItems.first(); item != 0; 1086 for ( item=oldconflictItems.first(); item != 0;
1087 item=oldconflictItems.next() ) { 1087 item=oldconflictItems.next() ) {
1088 globalFlagBlockAgendaItemUpdate = 0; 1088 globalFlagBlockAgendaItemUpdate = 0;
1089 item->paintMe(false); 1089 item->paintMe(false);
1090 globalFlagBlockAgendaItemUpdate = 1; 1090 globalFlagBlockAgendaItemUpdate = 1;
1091 item->repaint(false); 1091 item->repaint(false);
1092 } 1092 }
1093 */ 1093 */
1094 1094
1095 1095
1096 } 1096 }
1097 1097
1098 } 1098 }
1099 if ( mActionItem ) 1099 if ( mActionItem )
1100 emit incidenceSelected( mActionItem->incidence() ); 1100 emit incidenceSelected( mActionItem->incidence() );
1101 mScrollUpTimer.stop(); 1101 mScrollUpTimer.stop();
1102 mScrollDownTimer.stop(); 1102 mScrollDownTimer.stop();
1103 setCursor( arrowCursor ); 1103 setCursor( arrowCursor );
1104 mActionItem = 0; 1104 mActionItem = 0;
1105 mActionType = NOP; 1105 mActionType = NOP;
1106 mItemMoved = 0; 1106 mItemMoved = 0;
1107 1107
1108} 1108}
1109 1109
1110void KOAgenda::setNoActionCursor(KOAgendaItem *moveItem,QPoint viewportPos) 1110void KOAgenda::setNoActionCursor(KOAgendaItem *moveItem,QPoint viewportPos)
1111{ 1111{
1112// kdDebug() << "viewportPos: " << viewportPos.x() << "," << viewportPos.y() << endl; 1112// kdDebug() << "viewportPos: " << viewportPos.x() << "," << viewportPos.y() << endl;
1113// QPoint point = viewport()->mapToGlobal(viewportPos); 1113// QPoint point = viewport()->mapToGlobal(viewportPos);
1114// kdDebug() << "Global: " << point.x() << "," << point.y() << endl; 1114// kdDebug() << "Global: " << point.x() << "," << point.y() << endl;
1115// point = clipper()->mapFromGlobal(point); 1115// point = clipper()->mapFromGlobal(point);
1116// kdDebug() << "clipper: " << point.x() << "," << point.y() << endl; 1116// kdDebug() << "clipper: " << point.x() << "," << point.y() << endl;
1117 1117
1118 int x,y; 1118 int x,y;
1119 viewportToContents(viewportPos.x(),viewportPos.y(),x,y); 1119 viewportToContents(viewportPos.x(),viewportPos.y(),x,y);
1120// kdDebug() << "contents: " << x << "," << y << "\n" << endl; 1120// kdDebug() << "contents: " << x << "," << y << "\n" << endl;
1121 int gx,gy; 1121 int gx,gy;
1122 contentsToGrid(x,y,gx,gy); 1122 contentsToGrid(x,y,gx,gy);
1123 1123
1124 // Change cursor to resize cursor if appropriate 1124 // Change cursor to resize cursor if appropriate
1125 if (mAllDayMode) { 1125 if (mAllDayMode) {
1126 int gridDistanceX = (x - gx * mGridSpacingX); 1126 int gridDistanceX = (x - gx * mGridSpacingX);
1127 if (gridDistanceX < mResizeBorderWidth && 1127 if (gridDistanceX < mResizeBorderWidth &&
1128 moveItem->cellX() == gx) { 1128 moveItem->cellX() == gx) {
1129 setCursor(sizeHorCursor); 1129 setCursor(sizeHorCursor);
1130 } else if ((mGridSpacingX - gridDistanceX) < mResizeBorderWidth && 1130 } else if ((mGridSpacingX - gridDistanceX) < mResizeBorderWidth &&
1131 moveItem->cellXWidth() == gx) { 1131 moveItem->cellXWidth() == gx) {
1132 setCursor(sizeHorCursor); 1132 setCursor(sizeHorCursor);
1133 } else { 1133 } else {
1134 setCursor(arrowCursor); 1134 setCursor(arrowCursor);
1135 } 1135 }
1136 } else { 1136 } else {
1137 int gridDistanceY = (y - gy * mGridSpacingY); 1137 int gridDistanceY = (y - gy * mGridSpacingY);
1138 if (gridDistanceY < mResizeBorderWidth && 1138 if (gridDistanceY < mResizeBorderWidth &&
1139 moveItem->cellYTop() == gy && 1139 moveItem->cellYTop() == gy &&
1140 !moveItem->firstMultiItem()) { 1140 !moveItem->firstMultiItem()) {
1141 setCursor(sizeVerCursor); 1141 setCursor(sizeVerCursor);
1142 } else if ((mGridSpacingY - gridDistanceY) < mResizeBorderWidth && 1142 } else if ((mGridSpacingY - gridDistanceY) < mResizeBorderWidth &&
1143 moveItem->cellYBottom() == gy && 1143 moveItem->cellYBottom() == gy &&
1144 !moveItem->lastMultiItem()) { 1144 !moveItem->lastMultiItem()) {
1145 setCursor(sizeVerCursor); 1145 setCursor(sizeVerCursor);
1146 } else { 1146 } else {
1147 setCursor(arrowCursor); 1147 setCursor(arrowCursor);
1148 } 1148 }
1149 } 1149 }
1150} 1150}
1151 1151
1152 1152
1153/* 1153/*
1154 Place item in cell and take care that multiple items using the same cell do 1154 Place item in cell and take care that multiple items using the same cell do
1155 not overlap. This method is not yet optimal. It doesn´t use the maximum space 1155 not overlap. This method is not yet optimal. It doesn´t use the maximum space
1156 it can get in all cases. 1156 it can get in all cases.
1157 At the moment the method has a bug: When an item is placed only the sub cell 1157 At the moment the method has a bug: When an item is placed only the sub cell
1158 widths of the items are changed, which are within the Y region the item to 1158 widths of the items are changed, which are within the Y region the item to
1159 place spans. When the sub cell width change of one of this items affects a 1159 place spans. When the sub cell width change of one of this items affects a
1160 cell, where other items are, which do not overlap in Y with the item to place, 1160 cell, where other items are, which do not overlap in Y with the item to place,
1161 the display gets corrupted, although the corruption looks quite nice. 1161 the display gets corrupted, although the corruption looks quite nice.
1162*/ 1162*/
1163void KOAgenda::placeSubCells(KOAgendaItem *placeItem) 1163void KOAgenda::placeSubCells(KOAgendaItem *placeItem)
1164{ 1164{
1165 1165
1166 QPtrList<KOAgendaItem> conflictItems; 1166 QPtrList<KOAgendaItem> conflictItems;
1167 int maxSubCells = 0; 1167 int maxSubCells = 0;
1168 QIntDict<KOAgendaItem> subCellDict(7); 1168 QIntDict<KOAgendaItem> subCellDict(7);
1169 1169
1170 KOAgendaItem *item; 1170 KOAgendaItem *item;
1171 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 1171 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
1172 if (item != placeItem) { 1172 if (item != placeItem) {
1173 if (placeItem->cellX() <= item->cellXWidth() && 1173 if (placeItem->cellX() <= item->cellXWidth() &&
1174 placeItem->cellXWidth() >= item->cellX()) { 1174 placeItem->cellXWidth() >= item->cellX()) {
1175 if ((placeItem->cellYTop() <= item->cellYBottom()) && 1175 if ((placeItem->cellYTop() <= item->cellYBottom()) &&
1176 (placeItem->cellYBottom() >= item->cellYTop())) { 1176 (placeItem->cellYBottom() >= item->cellYTop())) {
1177 conflictItems.append(item); 1177 conflictItems.append(item);
1178 if (item->subCells() > maxSubCells) 1178 if (item->subCells() > maxSubCells)
1179 maxSubCells = item->subCells(); 1179 maxSubCells = item->subCells();
1180 subCellDict.insert(item->subCell(),item); 1180 subCellDict.insert(item->subCell(),item);
1181 } 1181 }
1182 } 1182 }
1183 } 1183 }
1184 } 1184 }
1185 1185
1186 if (conflictItems.count() > 0) { 1186 if (conflictItems.count() > 0) {
1187 // Look for unused sub cell and insert item 1187 // Look for unused sub cell and insert item
1188 int i; 1188 int i;
1189 for(i=0;i<maxSubCells;++i) { 1189 for(i=0;i<maxSubCells;++i) {
1190 if (!subCellDict.find(i)) { 1190 if (!subCellDict.find(i)) {
1191 placeItem->setSubCell(i); 1191 placeItem->setSubCell(i);
1192 break; 1192 break;
1193 } 1193 }
1194 } 1194 }
1195 if (i == maxSubCells) { 1195 if (i == maxSubCells) {
1196 placeItem->setSubCell(maxSubCells); 1196 placeItem->setSubCell(maxSubCells);
1197 maxSubCells++; // add new item to number of sub cells 1197 maxSubCells++; // add new item to number of sub cells
1198 } 1198 }
1199 1199
1200 // Prepare for sub cell geometry adjustment 1200 // Prepare for sub cell geometry adjustment
1201 int newSubCellWidth; 1201 int newSubCellWidth;
1202 if (mAllDayMode) newSubCellWidth = mGridSpacingY / maxSubCells; 1202 if (mAllDayMode) newSubCellWidth = mGridSpacingY / maxSubCells;
1203 else newSubCellWidth = mGridSpacingX / maxSubCells; 1203 else newSubCellWidth = mGridSpacingX / maxSubCells;
1204 conflictItems.append(placeItem); 1204 conflictItems.append(placeItem);
1205 1205
1206 1206
1207 // Adjust sub cell geometry of all direct conflict items 1207 // Adjust sub cell geometry of all direct conflict items
1208 for ( item=conflictItems.first(); item != 0; 1208 for ( item=conflictItems.first(); item != 0;
1209 item=conflictItems.next() ) { 1209 item=conflictItems.next() ) {
1210 item->setSubCells(maxSubCells); 1210 item->setSubCells(maxSubCells);
1211 if (mAllDayMode) { 1211 if (mAllDayMode) {
1212 item->resize(item->cellWidth() * mGridSpacingX, newSubCellWidth); 1212 item->resize(item->cellWidth() * mGridSpacingX, newSubCellWidth);
1213 } else { 1213 } else {
1214 item->resize(newSubCellWidth, item->cellHeight() * mGridSpacingY); 1214 item->resize(newSubCellWidth, item->cellHeight() * mGridSpacingY);
1215 } 1215 }
1216 int x,y; 1216 int x,y;
1217 gridToContents(item->cellX(),item->cellYTop(),x,y); 1217 gridToContents(item->cellX(),item->cellYTop(),x,y);
1218 if (mAllDayMode) { 1218 if (mAllDayMode) {
1219 y += item->subCell() * newSubCellWidth; 1219 y += item->subCell() * newSubCellWidth;
1220 } else { 1220 } else {
1221 x += item->subCell() * newSubCellWidth; 1221 x += item->subCell() * newSubCellWidth;
1222 } 1222 }
1223 moveChild(item,x,y); 1223 moveChild(item,x,y);
1224 // qDebug("moveChild %s %d %d ", item->incidence()->summary().latin1() ,x,y); 1224 // qDebug("moveChild %s %d %d ", item->incidence()->summary().latin1() ,x,y);
1225 //item->updateItem(); 1225 //item->updateItem();
1226 } 1226 }
1227 // Adjust sub cell geometry of all conflict items of all conflict items 1227 // Adjust sub cell geometry of all conflict items of all conflict items
1228 for ( item=conflictItems.first(); item != 0; 1228 for ( item=conflictItems.first(); item != 0;
1229 item=conflictItems.next() ) { 1229 item=conflictItems.next() ) {
1230 if ( placeItem != item ) { 1230 if ( placeItem != item ) {
1231 KOAgendaItem *item2; 1231 KOAgendaItem *item2;
1232 QPtrList<KOAgendaItem> conflictItems2 = item->conflictItems(); 1232 QPtrList<KOAgendaItem> conflictItems2 = item->conflictItems();
1233 for ( item2=conflictItems2.first(); item2 != 0; 1233 for ( item2=conflictItems2.first(); item2 != 0;
1234 item2=conflictItems2.next() ) { 1234 item2=conflictItems2.next() ) {
1235 if ( item2->subCells() != maxSubCells) { 1235 if ( item2->subCells() != maxSubCells) {
1236 item2->setSubCells(maxSubCells); 1236 item2->setSubCells(maxSubCells);
1237 if (mAllDayMode) { 1237 if (mAllDayMode) {
1238 item2->resize(item2->cellWidth() * mGridSpacingX, newSubCellWidth); 1238 item2->resize(item2->cellWidth() * mGridSpacingX, newSubCellWidth);
1239 } else { 1239 } else {
1240 item2->resize(newSubCellWidth, item2->cellHeight() * mGridSpacingY); 1240 item2->resize(newSubCellWidth, item2->cellHeight() * mGridSpacingY);
1241 } 1241 }
1242 int x,y; 1242 int x,y;
1243 gridToContents(item2->cellX(),item2->cellYTop(),x,y); 1243 gridToContents(item2->cellX(),item2->cellYTop(),x,y);
1244 if (mAllDayMode) { 1244 if (mAllDayMode) {
1245 y += item2->subCell() * newSubCellWidth; 1245 y += item2->subCell() * newSubCellWidth;
1246 } else { 1246 } else {
1247 x += item2->subCell() * newSubCellWidth; 1247 x += item2->subCell() * newSubCellWidth;
1248 } 1248 }
1249 moveChild(item2,x,y); 1249 moveChild(item2,x,y);
1250 //qDebug("setttttt %d %s",maxSubCells, item2->text().latin1() ); 1250 //qDebug("setttttt %d %s",maxSubCells, item2->text().latin1() );
1251 } 1251 }
1252 } 1252 }
1253 } 1253 }
1254 } 1254 }
1255 } else { 1255 } else {
1256 placeItem->setSubCell(0); 1256 placeItem->setSubCell(0);
1257 placeItem->setSubCells(1); 1257 placeItem->setSubCells(1);
1258 if (mAllDayMode) placeItem->resize(placeItem->width(),mGridSpacingY); 1258 if (mAllDayMode) placeItem->resize(placeItem->width(),mGridSpacingY);
1259 else placeItem->resize(mGridSpacingX,placeItem->height()); 1259 else placeItem->resize(mGridSpacingX,placeItem->height());
1260 int x,y; 1260 int x,y;
1261 gridToContents(placeItem->cellX(),placeItem->cellYTop(),x,y); 1261 gridToContents(placeItem->cellX(),placeItem->cellYTop(),x,y);
1262 moveChild(placeItem,x,y); 1262 moveChild(placeItem,x,y);
1263 } 1263 }
1264 placeItem->setConflictItems(conflictItems); 1264 placeItem->setConflictItems(conflictItems);
1265 // for ( item=conflictItems.first(); item != 0; 1265 // for ( item=conflictItems.first(); item != 0;
1266// item=conflictItems.next() ) { 1266// item=conflictItems.next() ) {
1267// //item->updateItem(); 1267// //item->updateItem();
1268// //qDebug("xxx item->updateItem() %s %d %d", item->incidence()->summary().latin1(),item->x(), item->y() ); 1268// //qDebug("xxx item->updateItem() %s %d %d", item->incidence()->summary().latin1(),item->x(), item->y() );
1269// } 1269// }
1270// placeItem->updateItem(); 1270// placeItem->updateItem();
1271} 1271}
1272 1272
1273void KOAgenda::drawContents(QPainter* p, int cx, int cy, int cw, int ch) 1273void KOAgenda::drawContents(QPainter* p, int cx, int cy, int cw, int ch)
1274{ 1274{
1275 if ( globalFlagBlockAgenda ) 1275 if ( globalFlagBlockAgenda )
1276 return; 1276 return;
1277 1277
1278 if ( mInvalidPixmap ) { 1278 if ( mInvalidPixmap ) {
1279 mInvalidPixmap = false; 1279 mInvalidPixmap = false;
1280 qDebug("KO: Upsizing Pixmaps "); 1280 qDebug("KO: Upsizing Pixmaps ");
1281 computeSizes(); 1281 computeSizes();
1282 emit updateViewSignal(); 1282 emit updateViewSignal();
1283 return; 1283 return;
1284 } 1284 }
1285 if ( ! mAllDayMode ) { 1285 if ( ! mAllDayMode ) {
1286 // currently not working for 1286 // currently not working for
1287 1287
1288 //qDebug("KOAgenda::drawContents "); 1288 //qDebug("KOAgenda::drawContents ");
1289#if 0 1289#if 0
1290 if ( mCurPixWid != contentsWidth() || mCurPixHei != contentsHeight() ) { 1290 if ( mCurPixWid != contentsWidth() || mCurPixHei != contentsHeight() ) {
1291 qDebug("WAU "); 1291 qDebug("WAU ");
1292 drawContentsToPainter(); 1292 drawContentsToPainter();
1293 } 1293 }
1294#endif 1294#endif
1295 QPaintDevice* pd = p->device(); 1295 QPaintDevice* pd = p->device();
1296 p->end(); 1296 p->end();
1297 int vx, vy; 1297 int vx, vy;
1298 int selectionX = KOGlobals::self()->reverseLayout() ? 1298 int selectionX = KOGlobals::self()->reverseLayout() ?
1299 (mColumns - 1 - mSelectionCellX) * mGridSpacingX : 1299 (mColumns - 1 - mSelectionCellX) * mGridSpacingX :
1300 mSelectionCellX * mGridSpacingX; 1300 mSelectionCellX * mGridSpacingX;
1301 contentsToViewport ( cx, cy, vx,vy); 1301 contentsToViewport ( cx, cy, vx,vy);
1302 //qDebug(" %d %d %d %d %d", cx, cy, cw,ch,mGridSpacingX-1) ; 1302 //qDebug(" %d %d %d %d %d", cx, cy, cw,ch,mGridSpacingX-1) ;
1303 1303
1304 if ( !(selectionX == cx && cy == mSelectionYTop && cw ==mGridSpacingX && ch == mSelectionHeight ) ) { 1304 if ( !(selectionX == cx && cy == mSelectionYTop && cw ==mGridSpacingX && ch == mSelectionHeight ) ) {
1305 if ( mGridSpacingX == cw && mSelectionHeight > 0 && ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) && 1305 if ( mGridSpacingX == cw && mSelectionHeight > 0 && ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) &&
1306 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) ) { 1306 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) ) {
1307 1307
1308 int vxSel, vySel; 1308 int vxSel, vySel;
1309 contentsToViewport ( selectionX, mSelectionYTop, vxSel,vySel); 1309 contentsToViewport ( selectionX, mSelectionYTop, vxSel,vySel);
1310 int off = mSelectionHeight; 1310 int off = mSelectionHeight;
1311 if ( vySel < 0 ) 1311 if ( vySel < 0 )
1312 off += vySel; 1312 off += vySel;
1313 //qDebug("OFF %d %d %d", off,vySel, vy ); 1313 //qDebug("OFF %d %d %d", off,vySel, vy );
1314 bitBlt ( pd, vx, vy+off, &mPaintPixmap, cx, cy+off, cw , ch-off ,CopyROP); 1314 bitBlt ( pd, vx, vy+off, &mPaintPixmap, cx, cy+off, cw , ch-off ,CopyROP);
1315 } else { 1315 } else {
1316 bitBlt ( pd, vx, vy, &mPaintPixmap, cx, cy, cw, ch ,CopyROP); 1316 bitBlt ( pd, vx, vy, &mPaintPixmap, cx, cy, cw, ch ,CopyROP);
1317 } 1317 }
1318 } 1318 }
1319 if ( mSelectionHeight > 0 ) { 1319 if ( mSelectionHeight > 0 ) {
1320 //qDebug("---- %d %d %d %d ", selectionX, mSelectionYTop, mGridSpacingX, mSelectionHeight ); 1320 //qDebug("---- %d %d %d %d ", selectionX, mSelectionYTop, mGridSpacingX, mSelectionHeight );
1321 if ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) && 1321 if ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) &&
1322 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) { 1322 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) {
1323 contentsToViewport ( selectionX, mSelectionYTop, vx,vy); 1323 contentsToViewport ( selectionX, mSelectionYTop, vx,vy);
1324 // bitBlt ( pd, vx+1, vy, &mHighlightPixmap, 0, mSelectionYTop, mGridSpacingX-1, mSelectionHeight ,CopyROP); 1324 // bitBlt ( pd, vx+1, vy, &mHighlightPixmap, 0, mSelectionYTop, mGridSpacingX-1, mSelectionHeight ,CopyROP);
1325 int hei = mSelectionHeight; 1325 int hei = mSelectionHeight;
1326 int offset = 0; 1326 int offset = 0;
1327 while ( hei > 0 ) { 1327 while ( hei > 0 ) {
1328 int p_hei = 5; 1328 int p_hei = 5;
1329 if ( hei < 5 ) p_hei = hei; 1329 if ( hei < 5 ) p_hei = hei;
1330 hei -= 5; 1330 hei -= 5;
1331 bitBlt ( pd, vx+1, vy+offset, &mHighlightPixmap, 0, 0, mGridSpacingX-1, p_hei ,CopyROP); 1331 bitBlt ( pd, vx+1, vy+offset, &mHighlightPixmap, 0, 0, mGridSpacingX-1, p_hei ,CopyROP);
1332 offset += 5; 1332 offset += 5;
1333 } 1333 }
1334 } 1334 }
1335 } 1335 }
1336 p->begin( pd ); 1336 p->begin( pd );
1337 } else { 1337 } else {
1338#if 0 1338#if 0
1339 qDebug("mCurPixWid %d %d ",mCurPixWid, contentsWidth() ); 1339 qDebug("mCurPixWid %d %d ",mCurPixWid, contentsWidth() );
1340 if ( mCurPixWid != contentsWidth() || mCurPixHei != contentsHeight() ) { 1340 if ( mCurPixWid != contentsWidth() || mCurPixHei != contentsHeight() ) {
1341 qDebug("WAUWAU "); 1341 qDebug("WAUWAU ");
1342 drawContentsToPainter(); 1342 drawContentsToPainter();
1343 } 1343 }
1344#endif 1344#endif
1345 QPaintDevice* pd = p->device(); 1345 QPaintDevice* pd = p->device();
1346 p->end(); 1346 p->end();
1347 int vx, vy; 1347 int vx, vy;
1348 int selectionX = KOGlobals::self()->reverseLayout() ? 1348 int selectionX = KOGlobals::self()->reverseLayout() ?
1349 (mColumns - 1 - mSelectionCellX) * mGridSpacingX : 1349 (mColumns - 1 - mSelectionCellX) * mGridSpacingX :
1350 mSelectionCellX * mGridSpacingX; 1350 mSelectionCellX * mGridSpacingX;
1351 contentsToViewport ( cx, cy, vx,vy); 1351 contentsToViewport ( cx, cy, vx,vy);
1352 // qDebug(" %d %d %d %d ", cx, cy, cw,ch) ; 1352 // qDebug(" %d %d %d %d ", cx, cy, cw,ch) ;
1353 if ( !(selectionX == cx && cy == mSelectionYTop && cw ==mGridSpacingX && ch == mSelectionHeight ) ) 1353 if ( !(selectionX == cx && cy == mSelectionYTop && cw ==mGridSpacingX && ch == mSelectionHeight ) )
1354 bitBlt ( pd, vx, vy, &mPaintPixmap, cx, cy, cw, ch ,CopyROP); 1354 bitBlt ( pd, vx, vy, &mPaintPixmap, cx, cy, cw, ch ,CopyROP);
1355 1355
1356 if ( mSelectionHeight > 0 ) { 1356 if ( mSelectionHeight > 0 ) {
1357 //qDebug("---- %d %d %d %d ", selectionX, mSelectionYTop, mGridSpacingX, mSelectionHeight ); 1357 //qDebug("---- %d %d %d %d ", selectionX, mSelectionYTop, mGridSpacingX, mSelectionHeight );
1358 if ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) && 1358 if ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) &&
1359 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) { 1359 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) {
1360 contentsToViewport ( selectionX, mSelectionYTop, vx,vy); 1360 contentsToViewport ( selectionX, mSelectionYTop, vx,vy);
1361 //bitBlt ( pd, vx+1, vy, &mHighlightPixmap, 0, mSelectionYTop, mGridSpacingX-1, mSelectionHeight ,CopyROP); 1361 //bitBlt ( pd, vx+1, vy, &mHighlightPixmap, 0, mSelectionYTop, mGridSpacingX-1, mSelectionHeight ,CopyROP);
1362 int hei = mSelectionHeight; 1362 int hei = mSelectionHeight;
1363 int offset = 0; 1363 int offset = 0;
1364 while ( hei > 0 ) { 1364 while ( hei > 0 ) {
1365 int p_hei = 5; 1365 int p_hei = 5;
1366 if ( hei < 5 ) p_hei = hei; 1366 if ( hei < 5 ) p_hei = hei;
1367 hei -= 5; 1367 hei -= 5;
1368 bitBlt ( pd, vx+1, vy+offset, &mHighlightPixmap, 0, 0, mGridSpacingX-1, p_hei ,CopyROP); 1368 bitBlt ( pd, vx+1, vy+offset, &mHighlightPixmap, 0, 0, mGridSpacingX-1, p_hei ,CopyROP);
1369 offset += 5; 1369 offset += 5;
1370 } 1370 }
1371 } 1371 }
1372 } 1372 }
1373 p->begin( pd ); 1373 p->begin( pd );
1374 } 1374 }
1375 1375
1376} 1376}
1377 1377
1378void KOAgenda::finishUpdate() 1378void KOAgenda::finishUpdate()
1379{ 1379{
1380 1380
1381 KOAgendaItem *item; 1381 KOAgendaItem *item;
1382 globalFlagBlockAgendaItemPaint = 1; 1382 globalFlagBlockAgendaItemPaint = 1;
1383 // Adjust sub cell geometry of all conflict items of all conflict items of all conflict items ... of the conflict item with the max number of conflictitems 1383 // Adjust sub cell geometry of all conflict items of all conflict items of all conflict items ... of the conflict item with the max number of conflictitems
1384 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 1384 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
1385 if ( !item->checkLayout() ) { 1385 if ( !item->checkLayout() ) {
1386 //qDebug(" conflictitem found "); 1386 //qDebug(" conflictitem found ");
1387 int newSubCellWidth; 1387 int newSubCellWidth;
1388 if (mAllDayMode) newSubCellWidth = mGridSpacingY / item->subCells(); 1388 if (mAllDayMode) newSubCellWidth = mGridSpacingY / item->subCells();
1389 else newSubCellWidth = mGridSpacingX / item->subCells(); 1389 else newSubCellWidth = mGridSpacingX / item->subCells();
1390 1390
1391 if (mAllDayMode) { 1391 if (mAllDayMode) {
1392 item->resize(item->cellWidth() * mGridSpacingX, newSubCellWidth); 1392 item->resize(item->cellWidth() * mGridSpacingX, newSubCellWidth);
1393 } else { 1393 } else {
1394 item->resize(newSubCellWidth, item->cellHeight() * mGridSpacingY); 1394 item->resize(newSubCellWidth, item->cellHeight() * mGridSpacingY);
1395 } 1395 }
1396 int x,y; 1396 int x,y;
1397 gridToContents(item->cellX(),item->cellYTop(),x,y); 1397 gridToContents(item->cellX(),item->cellYTop(),x,y);
1398 if (mAllDayMode) { 1398 if (mAllDayMode) {
1399 y += item->subCell() * newSubCellWidth; 1399 y += item->subCell() * newSubCellWidth;
1400 } else { 1400 } else {
1401 x += item->subCell() * newSubCellWidth; 1401 x += item->subCell() * newSubCellWidth;
1402 } 1402 }
1403 moveChild(item,x,y); 1403 moveChild(item,x,y);
1404 } 1404 }
1405 } 1405 }
1406 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 1406 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
1407 if ( !item->isVisible() ) 1407 if ( !item->isVisible() )
1408 item->show(); 1408 item->show();
1409 1409
1410 } 1410 }
1411 globalFlagBlockAgendaItemUpdate = 0; 1411 globalFlagBlockAgendaItemUpdate = 0;
1412 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 1412 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
1413 item->repaintMe( ); 1413 item->repaintMe( );
1414 } 1414 }
1415 globalFlagBlockAgendaItemUpdate = 1; 1415 globalFlagBlockAgendaItemUpdate = 1;
1416 qApp->processEvents(); 1416 qApp->processEvents();
1417 globalFlagBlockAgendaItemPaint = 0; 1417 globalFlagBlockAgendaItemPaint = 0;
1418 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 1418 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
1419 item->repaint( false ); 1419 item->repaint( false );
1420 } 1420 }
1421 marcus_bains(); 1421 marcus_bains();
1422} 1422}
1423 1423
1424/* 1424/*
1425 Draw grid in the background of the agenda. 1425 Draw grid in the background of the agenda.
1426*/ 1426*/
1427void KOAgenda::drawContentsToPainter( QPainter* paint, bool backgroundOnly )// int cx, int cy, int cw, int ch) 1427void KOAgenda::drawContentsToPainter( QPainter* paint, bool backgroundOnly )// int cx, int cy, int cw, int ch)
1428{ 1428{
1429 1429
1430 1430
1431 if ( ! mGridSpacingX || ! mGridSpacingY ||! mHolidayMask ) 1431 if ( ! mGridSpacingX || ! mGridSpacingY ||! mHolidayMask )
1432 return; 1432 return;
1433 if ( globalFlagBlockAgenda > 1 && globalFlagBlockAgenda < 4 ) 1433 if ( globalFlagBlockAgenda > 1 && globalFlagBlockAgenda < 4 )
1434 return; 1434 return;
1435 int cx = 0, cy = 0, cw = contentsWidth(), ch = contentsHeight(); 1435 int cx = 0, cy = 0, cw = contentsWidth(), ch = contentsHeight();
1436 if ( ch < 1 ) 1436 if ( ch < 1 )
1437 ch = 1; 1437 ch = 1;
1438 if ( mPaintPixmap.width() < contentsWidth()+42 || mPaintPixmap.height() < ch ) { 1438 if ( mPaintPixmap.width() < contentsWidth()+42 || mPaintPixmap.height() < ch ) {
1439 mPaintPixmap.resize( contentsWidth()+42, ch ); 1439 mPaintPixmap.resize( contentsWidth()+42, ch );
1440 } 1440 }
1441 mCurPixWid = contentsWidth(); 1441 mCurPixWid = contentsWidth();
1442 mCurPixHei = ch; 1442 mCurPixHei = ch;
1443 if ( mHighlightPixmap.width() < mGridSpacingX-1 ) { 1443 if ( mHighlightPixmap.width() < mGridSpacingX-1 ) {
1444 mHighlightPixmap.resize( mGridSpacingX-1, 5 ); 1444 mHighlightPixmap.resize( mGridSpacingX-1, 5 );
1445 mHighlightPixmap.fill ( KOPrefs::instance()->mHighlightColor ); 1445 mHighlightPixmap.fill ( KOPrefs::instance()->mHighlightColor );
1446 } 1446 }
1447 mPixPainter.begin( &mPaintPixmap) ; 1447 mPixPainter.begin( &mPaintPixmap) ;
1448 //qDebug("wid %d hei %d ",mPaintPixmap.width(),mPaintPixmap.height() ); 1448 //qDebug("wid %d hei %d ",mPaintPixmap.width(),mPaintPixmap.height() );
1449 QPainter * p ; 1449 QPainter * p ;
1450 if (paint == 0) { 1450 if (paint == 0) {
1451 mPaintPixmap.fill(KOPrefs::instance()->mAgendaBgColor); 1451 mPaintPixmap.fill(KOPrefs::instance()->mAgendaBgColor);
1452 p = &mPixPainter; 1452 p = &mPixPainter;
1453 } 1453 }
1454 else 1454 else
1455 p = paint ; 1455 p = paint ;
1456 // qDebug("++++++KOAgenda::drawContentsTo Painter %d %d %d %d ", cx, cy, cw, ch); 1456 // qDebug("++++++KOAgenda::drawContentsTo Painter %d %d %d %d ", cx, cy, cw, ch);
1457 1457
1458 //--cx;++cw; 1458 //--cx;++cw;
1459 int lGridSpacingY = mGridSpacingY*2; 1459 int lGridSpacingY = mGridSpacingY*2;
1460 int selDay; 1460 int selDay;
1461 QDate curDate = QDate::currentDate(); 1461 QDate curDate = QDate::currentDate();
1462 if ( !backgroundOnly ) { 1462 if ( !backgroundOnly ) {
1463 for ( selDay = 0; selDay < mSelectedDates.count(); ++selDay) 1463 for ( selDay = 0; selDay < mSelectedDates.count(); ++selDay)
1464 { 1464 {
1465 if ( mSelectedDates[selDay] == curDate && KOPrefs::instance()->mHighlightCurrentDay) { 1465 if ( mSelectedDates[selDay] == curDate && KOPrefs::instance()->mHighlightCurrentDay) {
1466 int x1 = cx; 1466 int x1 = cx;
1467 int y1 = 0; 1467 int y1 = 0;
1468 if (y1 < cy) y1 = cy; 1468 if (y1 < cy) y1 = cy;
1469 int x2 = cx+cw-1; 1469 int x2 = cx+cw-1;
1470 int y2 = contentsHeight(); 1470 int y2 = contentsHeight();
1471 if (y2 > cy+ch-1) y2=cy+ch-1; 1471 if (y2 > cy+ch-1) y2=cy+ch-1;
1472 if (x2 >= x1 && y2 >= y1) { 1472 if (x2 >= x1 && y2 >= y1) {
1473 int gxStart = selDay; 1473 int gxStart = selDay;
1474 int gxEnd = gxStart ; 1474 int gxEnd = gxStart ;
1475 int xStart = KOGlobals::self()->reverseLayout() ? 1475 int xStart = KOGlobals::self()->reverseLayout() ?
1476 (mColumns - 1 - gxStart)*mGridSpacingX : 1476 (mColumns - 1 - gxStart)*mGridSpacingX :
1477 gxStart*mGridSpacingX; 1477 gxStart*mGridSpacingX;
1478 if (xStart < x1) xStart = x1; 1478 if (xStart < x1) xStart = x1;
1479 int xEnd = KOGlobals::self()->reverseLayout() ? 1479 int xEnd = KOGlobals::self()->reverseLayout() ?
1480 (mColumns - gxStart)*mGridSpacingX-1 : 1480 (mColumns - gxStart)*mGridSpacingX-1 :
1481 (gxStart+1)*mGridSpacingX-1; 1481 (gxStart+1)*mGridSpacingX-1;
1482 if (xEnd > x2) xEnd = x2; 1482 if (xEnd > x2) xEnd = x2;
1483 if ( KOPrefs::instance()->mUseHighlightLightColor ) 1483 if ( KOPrefs::instance()->mUseHighlightLightColor )
1484 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1, 1484 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1,
1485 KOPrefs::instance()->mAgendaBgColor.light()); 1485 KOPrefs::instance()->mAgendaBgColor.light());
1486 else 1486 else
1487 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1, 1487 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1,
1488 KOPrefs::instance()->mAgendaBgColor.dark()); 1488 KOPrefs::instance()->mAgendaBgColor.dark());
1489 1489
1490 } 1490 }
1491 } 1491 }
1492 } 1492 }
1493 } 1493 }
1494 // Highlight working hours 1494 // Highlight working hours
1495 1495
1496 if ( !backgroundOnly ) 1496 if ( !backgroundOnly )
1497 if (mWorkingHoursEnable) { 1497 if (mWorkingHoursEnable) {
1498 int x1 = cx; 1498 int x1 = cx;
1499 int y1 = mWorkingHoursYTop; 1499 int y1 = mWorkingHoursYTop;
1500 if (y1 < cy) y1 = cy; 1500 if (y1 < cy) y1 = cy;
1501 int x2 = cx+cw-1; 1501 int x2 = cx+cw-1;
1502 // int x2 = mGridSpacingX * 5 - 1; 1502 // int x2 = mGridSpacingX * 5 - 1;
1503 // if (x2 > cx+cw-1) x2 = cx + cw - 1; 1503 // if (x2 > cx+cw-1) x2 = cx + cw - 1;
1504 int y2 = mWorkingHoursYBottom; 1504 int y2 = mWorkingHoursYBottom;
1505 if (y2 > cy+ch-1) y2=cy+ch-1; 1505 if (y2 > cy+ch-1) y2=cy+ch-1;
1506 1506
1507 if (x2 >= x1 && y2 >= y1) { 1507 if (x2 >= x1 && y2 >= y1) {
1508 // qDebug("x1 %d mGridSpacingX %d ", x1, mGridSpacingX ); 1508 // qDebug("x1 %d mGridSpacingX %d ", x1, mGridSpacingX );
1509 int gxStart = x1/mGridSpacingX; 1509 int gxStart = x1/mGridSpacingX;
1510 int gxEnd = x2/mGridSpacingX; 1510 int gxEnd = x2/mGridSpacingX;
1511 while(gxStart <= gxEnd) { 1511 while(gxStart <= gxEnd) {
1512 if (gxStart < int(mHolidayMask->count()) && 1512 if (gxStart < int(mHolidayMask->count()) &&
1513 !mHolidayMask->at(gxStart)) { 1513 !mHolidayMask->at(gxStart)) {
1514 int xStart = KOGlobals::self()->reverseLayout() ? 1514 int xStart = KOGlobals::self()->reverseLayout() ?
1515 (mColumns - 1 - gxStart)*mGridSpacingX : 1515 (mColumns - 1 - gxStart)*mGridSpacingX :
1516 gxStart*mGridSpacingX; 1516 gxStart*mGridSpacingX;
1517 if (xStart < x1) xStart = x1; 1517 if (xStart < x1) xStart = x1;
1518 int xEnd = KOGlobals::self()->reverseLayout() ? 1518 int xEnd = KOGlobals::self()->reverseLayout() ?
1519 (mColumns - gxStart)*mGridSpacingX-1 : 1519 (mColumns - gxStart)*mGridSpacingX-1 :
1520 (gxStart+1)*mGridSpacingX-1; 1520 (gxStart+1)*mGridSpacingX-1;
1521 if (xEnd > x2) xEnd = x2; 1521 if (xEnd > x2) xEnd = x2;
1522 if ( mSelectedDates[gxStart] == curDate && KOPrefs::instance()->mHighlightCurrentDay ) { 1522 if ( mSelectedDates[gxStart] == curDate && KOPrefs::instance()->mHighlightCurrentDay ) {
1523 if ( KOPrefs::instance()->mUseHighlightLightColor ) 1523 if ( KOPrefs::instance()->mUseHighlightLightColor )
1524 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1, 1524 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1,
1525 KOPrefs::instance()->mWorkingHoursColor.light()); 1525 KOPrefs::instance()->mWorkingHoursColor.light());
1526 else 1526 else
1527 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1, 1527 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1,
1528 KOPrefs::instance()->mWorkingHoursColor.dark()); 1528 KOPrefs::instance()->mWorkingHoursColor.dark());
1529 } else { 1529 } else {
1530 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1, 1530 p->fillRect(xStart,y1,xEnd-xStart+1,y2-y1+1,
1531 KOPrefs::instance()->mWorkingHoursColor); 1531 KOPrefs::instance()->mWorkingHoursColor);
1532 } 1532 }
1533 } 1533 }
1534 ++gxStart; 1534 ++gxStart;
1535 } 1535 }
1536 } 1536 }
1537 } 1537 }
1538 /* 1538 /*
1539 int selectionX = KOGlobals::self()->reverseLayout() ? 1539 int selectionX = KOGlobals::self()->reverseLayout() ?
1540 (mColumns - 1 - mSelectionCellX) * mGridSpacingX : 1540 (mColumns - 1 - mSelectionCellX) * mGridSpacingX :
1541 mSelectionCellX * mGridSpacingX; 1541 mSelectionCellX * mGridSpacingX;
1542 1542
1543 // Draw selection 1543 // Draw selection
1544 if ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) && 1544 if ( ( cx + cw ) >= selectionX && cx <= ( selectionX + mGridSpacingX ) &&
1545 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) { 1545 ( cy + ch ) >= mSelectionYTop && cy <= ( mSelectionYTop + mSelectionHeight ) ) {
1546 // TODO: paint only part within cx,cy,cw,ch 1546 // TODO: paint only part within cx,cy,cw,ch
1547 p->fillRect( selectionX, mSelectionYTop, mGridSpacingX, 1547 p->fillRect( selectionX, mSelectionYTop, mGridSpacingX,
1548 mSelectionHeight, KOPrefs::instance()->mHighlightColor ); 1548 mSelectionHeight, KOPrefs::instance()->mHighlightColor );
1549 } 1549 }
1550 */ 1550 */
1551 // Draw vertical lines of grid 1551 // Draw vertical lines of grid
1552 1552
1553 int x = ((int)(cx/mGridSpacingX))*mGridSpacingX; 1553 int x = ((int)(cx/mGridSpacingX))*mGridSpacingX;
1554 if ( mGridSpacingX > 0 ) { 1554 if ( mGridSpacingX > 0 ) {
1555 while (x < cx + cw) { 1555 while (x < cx + cw) {
1556 p->drawLine(x,cy,x,cy+ch); 1556 p->drawLine(x,cy,x,cy+ch);
1557 x+=mGridSpacingX; 1557 x+=mGridSpacingX;
1558 } 1558 }
1559 } 1559 }
1560 // Draw horizontal lines of grid 1560 // Draw horizontal lines of grid
1561 int y = ((int)(cy/lGridSpacingY))*lGridSpacingY; 1561 int y = ((int)(cy/lGridSpacingY))*lGridSpacingY;
1562 if ( lGridSpacingY > 0 ) { 1562 if ( lGridSpacingY > 0 ) {
1563 while (y < cy + ch) { 1563 while (y < cy + ch) {
1564 p->setPen( SolidLine ); 1564 p->setPen( SolidLine );
1565 p->drawLine(cx,y,cx+cw,y); 1565 p->drawLine(cx,y,cx+cw,y);
1566 y+=lGridSpacingY; 1566 y+=lGridSpacingY;
1567 p->setPen( DotLine ); 1567 p->setPen( DotLine );
1568 p->drawLine(cx,y,cx+cw,y); 1568 p->drawLine(cx,y,cx+cw,y);
1569 y+=lGridSpacingY; 1569 y+=lGridSpacingY;
1570 } 1570 }
1571 p->setPen( SolidLine ); 1571 p->setPen( SolidLine );
1572 } 1572 }
1573 mPixPainter.end() ; 1573 mPixPainter.end() ;
1574} 1574}
1575 1575
1576/* 1576/*
1577 Convert srcollview contents coordinates to agenda grid coordinates. 1577 Convert srcollview contents coordinates to agenda grid coordinates.
1578*/ 1578*/
1579void KOAgenda::contentsToGrid (int x, int y, int& gx, int& gy) 1579void KOAgenda::contentsToGrid (int x, int y, int& gx, int& gy)
1580{ 1580{
1581 gx = KOGlobals::self()->reverseLayout() ? mColumns - 1 - x/mGridSpacingX : 1581 gx = KOGlobals::self()->reverseLayout() ? mColumns - 1 - x/mGridSpacingX :
1582 x/mGridSpacingX; 1582 x/mGridSpacingX;
1583 gy = y/mGridSpacingY; 1583 gy = y/mGridSpacingY;
1584} 1584}
1585 1585
1586/* 1586/*
1587 Convert agenda grid coordinates to scrollview contents coordinates. 1587 Convert agenda grid coordinates to scrollview contents coordinates.
1588*/ 1588*/
1589void KOAgenda::gridToContents (int gx, int gy, int& x, int& y) 1589void KOAgenda::gridToContents (int gx, int gy, int& x, int& y)
1590{ 1590{
1591 x = KOGlobals::self()->reverseLayout() ? (mColumns - 1 - gx)*mGridSpacingX: 1591 x = KOGlobals::self()->reverseLayout() ? (mColumns - 1 - gx)*mGridSpacingX:
1592 gx*mGridSpacingX; 1592 gx*mGridSpacingX;
1593 y = gy*mGridSpacingY; 1593 y = gy*mGridSpacingY;
1594} 1594}
1595 1595
1596 1596
1597/* 1597/*
1598 Return Y coordinate corresponding to time. Coordinates are rounded to fit into 1598 Return Y coordinate corresponding to time. Coordinates are rounded to fit into
1599 the grid. 1599 the grid.
1600*/ 1600*/
1601int KOAgenda::timeToY(const QTime &time) 1601int KOAgenda::timeToY(const QTime &time)
1602{ 1602{
1603 int minutesPerCell = 24 * 60 / mRows; 1603 int minutesPerCell = 24 * 60 / mRows;
1604 int timeMinutes = time.hour() * 60 + time.minute(); 1604 int timeMinutes = time.hour() * 60 + time.minute();
1605 int Y = (timeMinutes + (minutesPerCell / 2)) / minutesPerCell; 1605 int Y = (timeMinutes + (minutesPerCell / 2)) / minutesPerCell;
1606 return Y; 1606 return Y;
1607} 1607}
1608 1608
1609 1609
1610/* 1610/*
1611 Return time corresponding to cell y coordinate. Coordinates are rounded to 1611 Return time corresponding to cell y coordinate. Coordinates are rounded to
1612 fit into the grid. 1612 fit into the grid.
1613*/ 1613*/
1614QTime KOAgenda::gyToTime(int gy) 1614QTime KOAgenda::gyToTime(int gy)
1615{ 1615{
1616 1616
1617 int secondsPerCell = 24 * 60 * 60/ mRows; 1617 int secondsPerCell = 24 * 60 * 60/ mRows;
1618 1618
1619 int timeSeconds = secondsPerCell * gy; 1619 int timeSeconds = secondsPerCell * gy;
1620 1620
1621 QTime time( 0, 0, 0 ); 1621 QTime time( 0, 0, 0 );
1622 if ( timeSeconds < 24 * 60 * 60 ) { 1622 if ( timeSeconds < 24 * 60 * 60 ) {
1623 time = time.addSecs(timeSeconds); 1623 time = time.addSecs(timeSeconds);
1624 } else { 1624 } else {
1625 time.setHMS( 23, 59, 59 ); 1625 time.setHMS( 23, 59, 59 );
1626 } 1626 }
1627 1627
1628 return time; 1628 return time;
1629} 1629}
1630 1630
1631void KOAgenda::setStartHour(int startHour) 1631void KOAgenda::setStartHour(int startHour)
1632{ 1632{
1633 int startCell = startHour * mRows / 24; 1633 int startCell = startHour * mRows / 24;
1634 setContentsPos(0,startCell * gridSpacingY()); 1634 setContentsPos(0,startCell * gridSpacingY());
1635} 1635}
1636QTime KOAgenda::getEndTime() 1636QTime KOAgenda::getEndTime()
1637{ 1637{
1638 int tim = (contentsY ()+viewport()->height())*24/contentsHeight (); 1638 int tim = (contentsY ()+viewport()->height())*24/contentsHeight ();
1639 if ( tim > 23 ) 1639 if ( tim > 23 )
1640 return QTime ( 23,59,59); 1640 return QTime ( 23,59,59);
1641 return QTime ( tim,0,0); 1641 return QTime ( tim,0,0);
1642} 1642}
1643void KOAgenda::hideUnused() 1643void KOAgenda::hideUnused()
1644{ 1644{
1645 // experimental only 1645 // experimental only
1646 // return; 1646 // return;
1647 KOAgendaItem *item; 1647 KOAgendaItem *item;
1648 for ( item=mUnusedItems.first(); item != 0; item=mUnusedItems.next() ) { 1648 for ( item=mUnusedItems.first(); item != 0; item=mUnusedItems.next() ) {
1649 item->hide(); 1649 item->hide();
1650 } 1650 }
1651} 1651}
1652 1652
1653 1653
1654KOAgendaItem *KOAgenda::getNewItem(Incidence * event,QDate qd, QWidget* view) 1654KOAgendaItem *KOAgenda::getNewItem(Incidence * event,QDate qd, QWidget* view)
1655{ 1655{
1656 1656
1657 KOAgendaItem *fi; 1657 KOAgendaItem *fi;
1658 for ( fi=mUnusedItems.first(); fi != 0; fi=mUnusedItems.next() ) { 1658 for ( fi=mUnusedItems.first(); fi != 0; fi=mUnusedItems.next() ) {
1659 if ( fi->incidence() == event ) { 1659 if ( fi->incidence() == event ) {
1660 mUnusedItems.remove(); 1660 mUnusedItems.remove();
1661 fi->init( event, qd ); 1661 fi->init( event, qd );
1662 return fi; 1662 return fi;
1663 } 1663 }
1664 } 1664 }
1665 fi=mUnusedItems.first(); 1665 fi=mUnusedItems.first();
1666 if ( fi ) { 1666 if ( fi ) {
1667 mUnusedItems.remove(); 1667 mUnusedItems.remove();
1668 fi->init( event, qd ); 1668 fi->init( event, qd );
1669 return fi; 1669 return fi;
1670 } 1670 }
1671 // qDebug("new KOAgendaItem "); 1671 // qDebug("new KOAgendaItem ");
1672 1672
1673 KOAgendaItem* agendaItem = new KOAgendaItem( event, qd, view, mAllDayMode ); 1673 KOAgendaItem* agendaItem = new KOAgendaItem( event, qd, view, mAllDayMode );
1674 agendaItem->installEventFilter(this); 1674 agendaItem->installEventFilter(this);
1675 addChild(agendaItem,0,0); 1675 addChild(agendaItem,0,0);
1676 return agendaItem; 1676 return agendaItem;
1677} 1677}
1678KOAgendaItem * KOAgenda::getItemForTodo ( Todo * todo ) 1678KOAgendaItem * KOAgenda::getItemForTodo ( Todo * todo )
1679{ 1679{
1680 KOAgendaItem *item; 1680 KOAgendaItem *item;
1681 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 1681 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
1682 if ( item->incidence() == todo ) { 1682 if ( item->incidence() == todo ) {
1683 mItems.remove(); 1683 mItems.remove();
1684 return item; 1684 return item;
1685 } 1685 }
1686 } 1686 }
1687 return 0; 1687 return 0;
1688} 1688}
1689 1689
1690 1690
1691void KOAgenda::updateTodo( Todo * todo, int days, bool remove) 1691void KOAgenda::updateTodo( Todo * todo, int days, bool remove)
1692{ 1692{
1693 // ( todo->hasCompletedDate() && todo->completed().date() == currentDate )|| 1693 // ( todo->hasCompletedDate() && todo->completed().date() == currentDate )||
1694 KOAgendaItem *item; 1694 KOAgendaItem *item;
1695 item = getItemForTodo ( todo ); 1695 item = getItemForTodo ( todo );
1696 //qDebug("KOAgenda::updateTodo %d %d %d %d", this, todo, days, remove); 1696 //qDebug("KOAgenda::updateTodo %d %d %d %d", this, todo, days, remove);
1697 if ( item ) { 1697 if ( item ) {
1698 blockSignals( true ); 1698 blockSignals( true );
1699 //qDebug("item found "); 1699 //qDebug("item found ");
1700 item->hide(); 1700 item->hide();
1701 item->setCellX(-2, -1 ); 1701 item->setCellX(-2, -1 );
1702 item->select(false); 1702 item->select(false);
1703 mUnusedItems.append( item ); 1703 mUnusedItems.append( item );
1704 mItems.remove( item ); 1704 mItems.remove( item );
1705 QPtrList<KOAgendaItem> oldconflictItems = item->conflictItems(); 1705 QPtrList<KOAgendaItem> oldconflictItems = item->conflictItems();
1706 KOAgendaItem *itemit; 1706 KOAgendaItem *itemit;
1707 //globalFlagBlockAgendaItemPaint = 1; 1707 //globalFlagBlockAgendaItemPaint = 1;
1708 for ( itemit=oldconflictItems.first(); itemit != 0; 1708 for ( itemit=oldconflictItems.first(); itemit != 0;
1709 itemit=oldconflictItems.next() ) { 1709 itemit=oldconflictItems.next() ) {
1710 if ( itemit != item ) 1710 if ( itemit != item )
1711 placeSubCells(itemit); 1711 placeSubCells(itemit);
1712 } 1712 }
1713 qApp->processEvents(); 1713 qApp->processEvents();
1714 //globalFlagBlockAgendaItemPaint = 0; 1714 //globalFlagBlockAgendaItemPaint = 0;
1715 for ( itemit=oldconflictItems.first(); itemit != 0; 1715 for ( itemit=oldconflictItems.first(); itemit != 0;
1716 itemit=oldconflictItems.next() ) { 1716 itemit=oldconflictItems.next() ) {
1717 globalFlagBlockAgendaItemUpdate = 0; 1717 globalFlagBlockAgendaItemUpdate = 0;
1718 if ( itemit != item ) 1718 if ( itemit != item )
1719 itemit->repaintMe(); 1719 itemit->repaintMe();
1720 globalFlagBlockAgendaItemUpdate = 1; 1720 globalFlagBlockAgendaItemUpdate = 1;
1721 //qDebug("sigleshot "); 1721 //qDebug("sigleshot ");
1722 QTimer::singleShot( 0, itemit, SLOT ( repaintItem() )); 1722 QTimer::singleShot( 0, itemit, SLOT ( repaintItem() ));
1723 //itemit->repaint( false ); repaintItem() 1723 //itemit->repaint( false ); repaintItem()
1724 } 1724 }
1725 blockSignals( false ); 1725 blockSignals( false );
1726 } 1726 }
1727 if ( remove ) { 1727 if ( remove ) {
1728 //qDebug("remove****************************************** "); 1728 //qDebug("remove****************************************** ");
1729 return; 1729 return;
1730 } 1730 }
1731 if ( todo->hasCompletedDate() && !KOPrefs::instance()->mShowCompletedTodoInAgenda ) 1731 if ( todo->hasCompletedDate() && !KOPrefs::instance()->mShowCompletedTodoInAgenda )
1732 return; 1732 return;
1733 //qDebug("updateTodo+++++++++++++++++++++++++++++++++++++ "); 1733 //qDebug("updateTodo+++++++++++++++++++++++++++++++++++++ ");
1734 QDate currentDate = QDate::currentDate(); 1734 QDate currentDate = QDate::currentDate();
1735 bool overdue = (!todo->isCompleted()) && (todo->dtDue() < currentDate)&& ( KOPrefs::instance()->mShowTodoInAgenda ); 1735 bool overdue = (!todo->isCompleted()) && (todo->dtDue() < currentDate)&& ( KOPrefs::instance()->mShowTodoInAgenda );
1736 QDateTime dt; 1736 QDateTime dt;
1737 if ( todo->hasCompletedDate() ) 1737 if ( todo->hasCompletedDate() )
1738 dt = todo->completed(); 1738 dt = todo->completed();
1739 else 1739 else
1740 dt = todo->dtDue(); 1740 dt = todo->dtDue();
1741 if ( overdue ) { 1741 if ( overdue ) {
1742 days += todo->dtDue().date().daysTo( currentDate ); 1742 days += todo->dtDue().date().daysTo( currentDate );
1743 } 1743 }
1744 else 1744 else
1745 currentDate = dt.date(); 1745 currentDate = dt.date();
1746 1746
1747 if (( todo->doesFloat() || overdue) && !todo->hasCompletedDate() ) { 1747 if (( todo->doesFloat() || overdue) && !todo->hasCompletedDate() ) {
1748 if ( ! mAllDayMode ) return; 1748 if ( ! mAllDayMode ) return;
1749 // aldayagenda 1749 // aldayagenda
1750 globalFlagBlockAgendaItemPaint = 1; 1750 globalFlagBlockAgendaItemPaint = 1;
1751 item = insertAllDayItem(todo, currentDate,days, days); 1751 item = insertAllDayItem(todo, currentDate,days, days);
1752 item->show(); 1752 item->show();
1753 1753
1754 } 1754 }
1755 else { 1755 else {
1756 if ( mAllDayMode ) return; 1756 if ( mAllDayMode ) return;
1757 // mAgenda 1757 // mAgenda
1758 globalFlagBlockAgendaItemPaint = 1; 1758 globalFlagBlockAgendaItemPaint = 1;
1759 int endY = timeToY(dt.time()) - 1; 1759 int endY = timeToY(dt.time()) - 1;
1760 int hi = 12/KOPrefs::instance()->mHourSize; 1760 int hi = 12/KOPrefs::instance()->mHourSize;
1761 int startY = endY - 1-hi; 1761 int startY = endY - 1-hi;
1762 item = insertItem(todo,currentDate,days,startY,endY); 1762 item = insertItem(todo,currentDate,days,startY,endY);
1763 item->show(); 1763 item->show();
1764 } 1764 }
1765 qApp->processEvents(); 1765 qApp->processEvents();
1766 globalFlagBlockAgendaItemPaint = 0; 1766 globalFlagBlockAgendaItemPaint = 0;
1767 QPtrList<KOAgendaItem> oldconflictItems = item->conflictItems(); 1767 QPtrList<KOAgendaItem> oldconflictItems = item->conflictItems();
1768 KOAgendaItem *itemit; 1768 KOAgendaItem *itemit;
1769 for ( itemit=oldconflictItems.first(); itemit != 0; 1769 for ( itemit=oldconflictItems.first(); itemit != 0;
1770 itemit=oldconflictItems.next() ) { 1770 itemit=oldconflictItems.next() ) {
diff --git a/korganizer/koagendaitem.cpp b/korganizer/koagendaitem.cpp
index 303a92a..49ad9b8 100644
--- a/korganizer/koagendaitem.cpp
+++ b/korganizer/koagendaitem.cpp
@@ -1,850 +1,850 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18*/ 18*/
19 19
20#include <qlabel.h> 20#include <qlabel.h>
21#include <qlayout.h> 21#include <qlayout.h>
22#include <qhbox.h> 22#include <qhbox.h>
23#include <qvbox.h> 23#include <qvbox.h>
24#include <qtooltip.h> 24#include <qtooltip.h>
25#include <qwhatsthis.h> 25#include <qwhatsthis.h>
26#include <qdragobject.h> 26#include <qdragobject.h>
27#include <qdrawutil.h> 27#include <qdrawutil.h>
28#include <qpainter.h> 28#include <qpainter.h>
29 29
30#include <kiconloader.h> 30#include <kiconloader.h>
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kglobal.h> 32#include <kglobal.h>
33#include <klocale.h> 33#include <klocale.h>
34#ifndef DESKTOP_VERSION 34#ifndef DESKTOP_VERSION
35#include <qpe/qpeapplication.h> 35#include <qpe/qpeapplication.h>
36#define AGENDA_ICON_SIZE 5 36#define AGENDA_ICON_SIZE 5
37#else 37#else
38#include <qapplication.h> 38#include <qapplication.h>
39#define AGENDA_ICON_SIZE 7 39#define AGENDA_ICON_SIZE 7
40#endif 40#endif
41#include <libkcal/icaldrag.h> 41#include <libkcal/icaldrag.h>
42#include <libkcal/vcaldrag.h> 42#include <libkcal/vcaldrag.h>
43#include <libkcal/kincidenceformatter.h> 43#include <libkcal/kincidenceformatter.h>
44extern int globalFlagBlockAgenda; 44extern int globalFlagBlockAgenda;
45extern int globalFlagBlockAgendaItemPaint; 45extern int globalFlagBlockAgendaItemPaint;
46extern int globalFlagBlockAgendaItemUpdate; 46extern int globalFlagBlockAgendaItemUpdate;
47 47
48#include "koprefs.h" 48#include "koprefs.h"
49 49
50#include "koagendaitem.h" 50#include "koagendaitem.h"
51//#include "koagendaitem.moc" 51//#include "koagendaitem.moc"
52 52
53 53
54//-------------------------------------------------------------------------- 54//--------------------------------------------------------------------------
55 55
56QToolTipGroup *KOAgendaItem::mToolTipGroup = 0; 56QToolTipGroup *KOAgendaItem::mToolTipGroup = 0;
57 57
58//-------------------------------------------------------------------------- 58//--------------------------------------------------------------------------
59 59
60class KOAgendaItemWhatsThis :public QWhatsThis 60class KOAgendaItemWhatsThis :public QWhatsThis
61{ 61{
62public: 62public:
63 KOAgendaItemWhatsThis( KOAgendaItem* view ) : QWhatsThis( view ),_view (view) { }; 63 KOAgendaItemWhatsThis( KOAgendaItem* view ) : QWhatsThis( view ),_view (view) { };
64 64
65protected: 65protected:
66 virtual QString text( const QPoint& ) 66 virtual QString text( const QPoint& )
67 { 67 {
68 return _view->getWhatsThisText() ; 68 return _view->getWhatsThisText() ;
69 } 69 }
70private: 70private:
71 KOAgendaItem * _view; 71 KOAgendaItem * _view;
72}; 72};
73 73
74KOAgendaItem::KOAgendaItem(Incidence *incidence, QDate qd, QWidget *parent,bool allday, 74KOAgendaItem::KOAgendaItem(Incidence *incidence, QDate qd, QWidget *parent,bool allday,
75 const char *name,WFlags) : 75 const char *name,WFlags) :
76 QWidget(parent, name), mIncidence(incidence), mDate(qd) 76 QWidget(parent, name), mIncidence(incidence), mDate(qd)
77{ 77{
78#ifndef DESKTOP_VERSION 78#ifndef DESKTOP_VERSION
79 //QPEApplication::setStylusOperation( this, QPEApplication::RightOnHold ); 79 //QPEApplication::setStylusOperation( this, QPEApplication::RightOnHold );
80#endif 80#endif
81 mKOAgendaItemWhatsThis = new KOAgendaItemWhatsThis(this); 81 mKOAgendaItemWhatsThis = new KOAgendaItemWhatsThis(this);
82 int wflags = getWFlags() |WRepaintNoErase;// WResizeNoErase 82 int wflags = getWFlags() |WRepaintNoErase;// WResizeNoErase
83 setWFlags ( wflags); 83 setWFlags ( wflags);
84 mAllDay = allday; 84 mAllDay = allday;
85 init ( incidence, qd ); 85 init ( incidence, qd );
86 //setMouseTracking(true); 86 //setMouseTracking(true);
87 //setAcceptDrops(true); 87 //setAcceptDrops(true);
88 xPaintCoord = -1; 88 xPaintCoord = -1;
89 yPaintCoord = -1; 89 yPaintCoord = -1;
90} 90}
91QString KOAgendaItem::getWhatsThisText() 91QString KOAgendaItem::getWhatsThisText()
92{ 92{
93 if ( mIncidence ) 93 if ( mIncidence )
94 return KIncidenceFormatter::instance()->getFormattedText( mIncidence, 94 return KIncidenceFormatter::instance()->getFormattedText( mIncidence,
95 KOPrefs::instance()->mWTshowDetails, 95 KOPrefs::instance()->mWTshowDetails,
96 KOPrefs::instance()->mWTshowCreated, 96 KOPrefs::instance()->mWTshowCreated,
97 KOPrefs::instance()->mWTshowChanged); 97 KOPrefs::instance()->mWTshowChanged);
98 return "KOAgendaItem::getWhatsThisText()::internal error"; 98 return "KOAgendaItem::getWhatsThisText()::internal error";
99} 99}
100 100
101void KOAgendaItem::initColor () 101void KOAgendaItem::initColor ()
102{ 102{
103 if ( (mIncidence->typeID() == todoID ) && 103 if ( (mIncidence->typeID() == todoID ) &&
104 ( !((static_cast<Todo*>(mIncidence))->isCompleted()) && 104 ( !((static_cast<Todo*>(mIncidence))->isCompleted()) &&
105 ((static_cast<Todo*>(mIncidence))->dtDue().date() <= QDate::currentDate()) ) ) { 105 ((static_cast<Todo*>(mIncidence))->dtDue().date() <= QDate::currentDate()) ) ) {
106 if ( (static_cast<Todo*>(mIncidence))->dtDue() < QDateTime::currentDateTime().date()) 106 if ( (static_cast<Todo*>(mIncidence))->dtDue() < QDateTime::currentDateTime().date())
107 mBackgroundColor = KOPrefs::instance()->mTodoOverdueColor ; 107 mBackgroundColor = KOPrefs::instance()->mTodoOverdueColor ;
108 else 108 else
109 mBackgroundColor = KOPrefs::instance()->mTodoDueTodayColor; 109 mBackgroundColor = KOPrefs::instance()->mTodoDueTodayColor;
110 } 110 }
111 else { 111 else {
112 QStringList categories = mIncidence->categories(); 112 QStringList categories = mIncidence->categories();
113 QString cat = categories.first(); 113 QString cat = categories.first();
114 if (cat.isEmpty()) { 114 if (cat.isEmpty()) {
115 if ( (mIncidence->typeID() == todoID ) &&((static_cast<Todo*>(mIncidence))->isCompleted()) ) 115 if ( (mIncidence->typeID() == todoID ) &&((static_cast<Todo*>(mIncidence))->isCompleted()) )
116 mBackgroundColor =KOPrefs::instance()->mTodoDoneColor; 116 mBackgroundColor =KOPrefs::instance()->mTodoDoneColor;
117 else 117 else
118 mBackgroundColor =KOPrefs::instance()->defaultColor( mIncidence->calID() ); 118 mBackgroundColor =KOPrefs::instance()->defaultColor( mIncidence->calID() );
119 } else { 119 } else {
120 mBackgroundColor = *KOPrefs::instance()->categoryColor(cat); 120 mBackgroundColor = *KOPrefs::instance()->categoryColor(cat);
121 if ( (mIncidence->typeID() == todoID ) &&((static_cast<Todo*>(mIncidence))->isCompleted()) ) { 121 if ( (mIncidence->typeID() == todoID ) &&((static_cast<Todo*>(mIncidence))->isCompleted()) ) {
122 if ( mBackgroundColor == KOPrefs::instance()->mEventColor ) 122 if ( mBackgroundColor == KOPrefs::instance()->mEventColor )
123 mBackgroundColor = KOPrefs::instance()->mTodoDoneColor; 123 mBackgroundColor = KOPrefs::instance()->mTodoDoneColor;
124 } 124 }
125 } 125 }
126 126
127 } 127 }
128 128
129 QColor BackgroundColor ( mBackgroundColor ); 129 QColor BackgroundColor ( mBackgroundColor );
130 if ( mIncidence->calID() > 1 ) { 130 if ( mIncidence->calID() > 1 ) {
131 //BackgroundColor = KOPrefs::instance()->defaultColor( mIncidence->calID() ); 131 //BackgroundColor = KOPrefs::instance()->defaultColor( mIncidence->calID() );
132 } 132 }
133 mColorGroup = QColorGroup( BackgroundColor.light(), 133 mColorGroup = QColorGroup( BackgroundColor.light(),
134 BackgroundColor.dark(),BackgroundColor.light(), 134 BackgroundColor.dark(),BackgroundColor.light(),
135 BackgroundColor.dark(),BackgroundColor, black, BackgroundColor) ; 135 BackgroundColor.dark(),BackgroundColor, black, BackgroundColor) ;
136 setBackgroundColor( mBackgroundColor ); 136 setBackgroundColor( mBackgroundColor );
137 mWhiteText = (mBackgroundColor.red() + mBackgroundColor.green() + mBackgroundColor.blue() < 250); 137 mWhiteText = (mBackgroundColor.red() + mBackgroundColor.green() + mBackgroundColor.blue() < 250);
138} 138}
139void KOAgendaItem::init ( Incidence *incidence, QDate qd ) 139void KOAgendaItem::init ( Incidence *incidence, QDate qd )
140{ 140{
141 mIncidence = incidence; 141 mIncidence = incidence;
142 mDate = qd; 142 mDate = qd;
143 mFirstMultiItem = 0; 143 mFirstMultiItem = 0;
144 mNextMultiItem = 0; 144 mNextMultiItem = 0;
145 mLastMultiItem = 0; 145 mLastMultiItem = 0;
146 computeText(); 146 computeText();
147 initColor(); 147 initColor();
148 mConflictItems.clear(); 148 mConflictItems.clear();
149 setCellXY(0,0,1); 149 setCellXY(0,0,1);
150 setCellXWidth(0); 150 setCellXWidth(0);
151 setSubCell(0); 151 setSubCell(0);
152 setSubCells(1); 152 setSubCells(1);
153 setMultiItem(0,0,0); 153 setMultiItem(0,0,0);
154 startMove(); 154 startMove();
155 mSelected = true; 155 mSelected = true;
156 select(false); 156 select(false);
157 QFontMetrics fontinf(KOPrefs::instance()->mAgendaViewFont); 157 QFontMetrics fontinf(KOPrefs::instance()->mAgendaViewFont);
158 mFontPixelSize = fontinf.height();; 158 mFontPixelSize = fontinf.height();;
159 hide(); 159 hide();
160 xPaintCoord = -1; 160 xPaintCoord = -1;
161 yPaintCoord = -1; 161 yPaintCoord = -1;
162} 162}
163 163
164 164
165KOAgendaItem::~KOAgendaItem() 165KOAgendaItem::~KOAgendaItem()
166{ 166{
167#if QT_VERSION >= 0x030000 167#if QT_VERSION >= 0x030000
168 168
169#else 169#else
170 delete mKOAgendaItemWhatsThis; 170 delete mKOAgendaItemWhatsThis;
171#endif 171#endif
172 172
173} 173}
174 174
175void KOAgendaItem::recreateIncidence() 175void KOAgendaItem::recreateIncidence()
176{ 176{
177#if 0 177#if 0
178 Incidence* newInc = mIncidence->clone(); 178 Incidence* newInc = mIncidence->clone();
179 newInc->recreate(); 179 newInc->recreate();
180 if ( mIncidence->doesRecur() ) { 180 if ( mIncidence->doesRecur() ) {
181 mIncidence->addExDate( mDate ); 181 mIncidence->addExDate( mDate );
182 newInc->recurrence()->unsetRecurs(); 182 newInc->recurrence()->unsetRecurs();
183 int len = mIncidence->dtStart().secsTo( ((Event*)mIncidence)->dtEnd()); 183 int len = mIncidence->dtStart().secsTo( ((Event*)mIncidence)->dtEnd());
184 QTime tim = mIncidence->dtStart().time(); 184 QTime tim = mIncidence->dtStart().time();
185 newInc->setDtStart( QDateTime(mDate, tim) ); 185 newInc->setDtStart( QDateTime(mDate, tim) );
186 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) ); 186 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) );
187 } 187 }
188#endif 188#endif
189 mIncidence = mIncidence->recreateCloneException( mDate ); 189 mIncidence = mIncidence->recreateCloneException( mDate );
190} 190}
191bool KOAgendaItem::updateIcons(QPainter * p, bool horLayout) 191bool KOAgendaItem::updateIcons(QPainter * p, bool horLayout)
192{ 192{
193 int size = AGENDA_ICON_SIZE; 193 int size = AGENDA_ICON_SIZE;
194 194
195 int yOff = 0; 195 int yOff = 0;
196 int xOff = 0; 196 int xOff = 0;
197 int x = pos().x(); 197 int x = pos().x();
198 198
199 if ( x < 0 ) x = 0; 199 if ( x < 0 ) x = 0;
200 x += 3; 200 x += 3;
201 int y; 201 int y;
202 if ( mAllDay ) 202 if ( mAllDay )
203 y = pos().y()+3; 203 y = pos().y()+3;
204 else 204 else
205 y = mCellYTop * ( height() / cellHeight() ) +3; 205 y = mCellYTop * ( height() / cellHeight() ) +3;
206 206
207 207
208 if ( mIncidence->calID() > 1 ) { 208 if ( mIncidence->calID() > 1 ) {
209 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, KOPrefs::instance()->defaultColor( mIncidence->calID() ) ); 209 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, KOPrefs::instance()->defaultColor( mIncidence->calID() ) );
210 p->drawRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x-1, yOff*( 1 +AGENDA_ICON_SIZE)+y-1, AGENDA_ICON_SIZE+2, AGENDA_ICON_SIZE+2 ); 210 p->drawRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x-1, yOff*( 1 +AGENDA_ICON_SIZE)+y-1, AGENDA_ICON_SIZE+2, AGENDA_ICON_SIZE+2 );
211 if ( horLayout ){ 211 if ( horLayout ){
212 ++xOff; 212 ++xOff;
213 ++x; 213 ++x;
214 } 214 }
215 else { 215 else {
216 ++yOff; 216 ++yOff;
217 ++y; 217 ++y;
218 } 218 }
219 } 219 }
220 if (mIncidence->cancelled() && height() < 20 ) { 220 if (mIncidence->cancelled() && height() < 20 ) {
221 int xpos = xOff*( 1 +AGENDA_ICON_SIZE )+x; 221 int xpos = xOff*( 1 +AGENDA_ICON_SIZE )+x;
222 int ypos = yOff*( 1 +AGENDA_ICON_SIZE)+y; 222 int ypos = yOff*( 1 +AGENDA_ICON_SIZE)+y;
223 p->drawLine( xpos, ypos, xpos+AGENDA_ICON_SIZE-1, ypos+AGENDA_ICON_SIZE-1 ); 223 p->drawLine( xpos, ypos, xpos+AGENDA_ICON_SIZE-1, ypos+AGENDA_ICON_SIZE-1 );
224 p->drawLine( xpos, ypos+AGENDA_ICON_SIZE-1, xpos+AGENDA_ICON_SIZE-1, ypos ); 224 p->drawLine( xpos, ypos+AGENDA_ICON_SIZE-1, xpos+AGENDA_ICON_SIZE-1, ypos );
225 if ( horLayout ) 225 if ( horLayout )
226 ++xOff; 226 ++xOff;
227 else 227 else
228 ++yOff; 228 ++yOff;
229 } 229 }
230 if (mIncidence->isAlarmEnabled() && mIncidence->alarmEnabled()) { 230 if (mIncidence->isAlarmEnabled() && mIncidence->alarmEnabled()) {
231 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, red ); 231 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, red );
232 if ( horLayout ) 232 if ( horLayout )
233 ++xOff; 233 ++xOff;
234 else 234 else
235 ++yOff; 235 ++yOff;
236 } 236 }
237 if (mIncidence->recurrence()->doesRecur()) { 237 if (mIncidence->doesRecur()) {
238 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, blue ); 238 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, blue );
239 if ( horLayout ) 239 if ( horLayout )
240 ++xOff; 240 ++xOff;
241 else 241 else
242 ++yOff; 242 ++yOff;
243 } 243 }
244 if (mIncidence->description().length() > 0) { 244 if (mIncidence->description().length() > 0) {
245 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, darkGreen ); 245 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, darkGreen );
246 if ( horLayout ) 246 if ( horLayout )
247 ++xOff; 247 ++xOff;
248 else 248 else
249 ++yOff; 249 ++yOff;
250 } 250 }
251 if (mIncidence->isReadOnly()) { 251 if (mIncidence->isReadOnly()) {
252 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, white ); 252 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, white );
253 if ( horLayout ) 253 if ( horLayout )
254 ++xOff; 254 ++xOff;
255 else 255 else
256 ++yOff; 256 ++yOff;
257 } 257 }
258 258
259 if (mIncidence->attendeeCount()>0) { 259 if (mIncidence->attendeeCount()>0) {
260 260
261 if (mIncidence->organizer() == KOPrefs::instance()->email()) { 261 if (mIncidence->organizer() == KOPrefs::instance()->email()) {
262 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, black ); 262 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, black );
263 if ( horLayout ) 263 if ( horLayout )
264 ++xOff; 264 ++xOff;
265 else 265 else
266 ++yOff; 266 ++yOff;
267 } else { 267 } else {
268 Attendee *me = mIncidence->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email()); 268 Attendee *me = mIncidence->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email());
269 if (me!=0) { 269 if (me!=0) {
270 270
271 271
272 } else { 272 } else {
273 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, yellow ); 273 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, yellow );
274 if ( horLayout ) 274 if ( horLayout )
275 ++xOff; 275 ++xOff;
276 else 276 else
277 ++yOff; 277 ++yOff;
278 278
279 } 279 }
280 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, darkYellow ); 280 p->fillRect ( xOff*( 1 +AGENDA_ICON_SIZE )+x, yOff*( 1 +AGENDA_ICON_SIZE)+y, AGENDA_ICON_SIZE, AGENDA_ICON_SIZE, darkYellow );
281 if ( horLayout ) 281 if ( horLayout )
282 ++xOff; 282 ++xOff;
283 else 283 else
284 ++yOff; 284 ++yOff;
285 285
286 } 286 }
287 287
288 } 288 }
289 return ( yOff || xOff ); 289 return ( yOff || xOff );
290} 290}
291 291
292 292
293void KOAgendaItem::select(bool selected) 293void KOAgendaItem::select(bool selected)
294{ 294{
295 //qDebug("select %d %d",firstMultiItem(), nextMultiItem() ); 295 //qDebug("select %d %d",firstMultiItem(), nextMultiItem() );
296 if (mSelected == selected) return; 296 if (mSelected == selected) return;
297 mSelected = selected; 297 mSelected = selected;
298 if ( ! isVisible() ) 298 if ( ! isVisible() )
299 return; 299 return;
300 if ( firstMultiItem() ) 300 if ( firstMultiItem() )
301 firstMultiItem()->select( selected ); 301 firstMultiItem()->select( selected );
302 if ( !firstMultiItem() && nextMultiItem() ) { 302 if ( !firstMultiItem() && nextMultiItem() ) {
303 KOAgendaItem * placeItem = nextMultiItem(); 303 KOAgendaItem * placeItem = nextMultiItem();
304 while ( placeItem ) { 304 while ( placeItem ) {
305 placeItem->select( selected ); 305 placeItem->select( selected );
306 placeItem = placeItem->nextMultiItem(); 306 placeItem = placeItem->nextMultiItem();
307 } 307 }
308 } 308 }
309 globalFlagBlockAgendaItemUpdate = 0; 309 globalFlagBlockAgendaItemUpdate = 0;
310 paintMe( selected ); 310 paintMe( selected );
311 globalFlagBlockAgendaItemUpdate = 1; 311 globalFlagBlockAgendaItemUpdate = 1;
312 repaint( false ); 312 repaint( false );
313} 313}
314 314
315 315
316/* 316/*
317 The eventFilter has to filter the mouse events of the agenda item childs. The 317 The eventFilter has to filter the mouse events of the agenda item childs. The
318 events are fed into the event handling method of KOAgendaItem. This allows the 318 events are fed into the event handling method of KOAgendaItem. This allows the
319 KOAgenda to handle the KOAgendaItems by using an eventFilter. 319 KOAgenda to handle the KOAgendaItems by using an eventFilter.
320*/ 320*/
321bool KOAgendaItem::eventFilter ( QObject *object, QEvent *e ) 321bool KOAgendaItem::eventFilter ( QObject *object, QEvent *e )
322{ 322{
323 if (e->type() == QEvent::MouseButtonPress || 323 if (e->type() == QEvent::MouseButtonPress ||
324 e->type() == QEvent::MouseButtonDblClick || 324 e->type() == QEvent::MouseButtonDblClick ||
325 e->type() == QEvent::MouseButtonRelease || 325 e->type() == QEvent::MouseButtonRelease ||
326 e->type() == QEvent::MouseMove) { 326 e->type() == QEvent::MouseMove) {
327 QMouseEvent *me = (QMouseEvent *)e; 327 QMouseEvent *me = (QMouseEvent *)e;
328 QPoint itemPos = this->mapFromGlobal(((QWidget *)object)-> 328 QPoint itemPos = this->mapFromGlobal(((QWidget *)object)->
329 mapToGlobal(me->pos())); 329 mapToGlobal(me->pos()));
330 QMouseEvent returnEvent (e->type(),itemPos,me->button(),me->state()); 330 QMouseEvent returnEvent (e->type(),itemPos,me->button(),me->state());
331 return event(&returnEvent); 331 return event(&returnEvent);
332 } else { 332 } else {
333 return false; 333 return false;
334 } 334 }
335} 335}
336void KOAgendaItem::repaintMe( ) 336void KOAgendaItem::repaintMe( )
337{ 337{
338 paintMe ( mSelected ); 338 paintMe ( mSelected );
339} 339}
340void KOAgendaItem::paintMe( bool selected, QPainter* paint ) 340void KOAgendaItem::paintMe( bool selected, QPainter* paint )
341{ 341{
342 if ( globalFlagBlockAgendaItemUpdate && ! selected) 342 if ( globalFlagBlockAgendaItemUpdate && ! selected)
343 return; 343 return;
344 QPainter pa; 344 QPainter pa;
345 345
346 if ( mSelected ) { 346 if ( mSelected ) {
347 pa.begin( this ); 347 pa.begin( this );
348 } else { 348 } else {
349 if ( mAllDay ) 349 if ( mAllDay )
350 pa.begin( paintPixAllday() ); 350 pa.begin( paintPixAllday() );
351 else 351 else
352 pa.begin( paintPix() ); 352 pa.begin( paintPix() );
353 } 353 }
354 int x, yy, w, h; 354 int x, yy, w, h;
355 float nfh = 7.0; 355 float nfh = 7.0;
356 x = pos().x(); w = width(); h = height (); 356 x = pos().x(); w = width(); h = height ();
357 if ( mAllDay ) 357 if ( mAllDay )
358 yy = y(); 358 yy = y();
359 else 359 else
360 yy = mCellYTop * ( height() / cellHeight() ); 360 yy = mCellYTop * ( height() / cellHeight() );
361 if ( mSelected ) { 361 if ( mSelected ) {
362 pa.translate( -x, -yy ); 362 pa.translate( -x, -yy );
363 } 363 }
364 xPaintCoord= x; 364 xPaintCoord= x;
365 yPaintCoord = yy; 365 yPaintCoord = yy;
366 wPaintCoord = width(); 366 wPaintCoord = width();
367 hPaintCoord = height(); 367 hPaintCoord = height();
368 //qDebug("paintMe %s %d %d %d %d",incidence()->summary().latin1(), x, yy, width(), height()); 368 //qDebug("paintMe %s %d %d %d %d",incidence()->summary().latin1(), x, yy, width(), height());
369 if ( paint == 0 ) 369 if ( paint == 0 )
370 paint = &pa; 370 paint = &pa;
371 bool horLayout = ( w < h ); 371 bool horLayout = ( w < h );
372 int maxhei = mFontPixelSize+4; 372 int maxhei = mFontPixelSize+4;
373 if ( horLayout ) 373 if ( horLayout )
374 maxhei += AGENDA_ICON_SIZE -4; 374 maxhei += AGENDA_ICON_SIZE -4;
375 bool small = ( h < maxhei ); 375 bool small = ( h < maxhei );
376 if ( ! small ) 376 if ( ! small )
377 paint->setFont(KOPrefs::instance()->mAgendaViewFont); 377 paint->setFont(KOPrefs::instance()->mAgendaViewFont);
378 else { 378 else {
379 QFont f = KOPrefs::instance()->mAgendaViewFont; 379 QFont f = KOPrefs::instance()->mAgendaViewFont;
380 f.setBold( false ); 380 f.setBold( false );
381 int fh = f.pointSize(); 381 int fh = f.pointSize();
382 nfh = (((float)height())/(float)(mFontPixelSize+4))*fh; 382 nfh = (((float)height())/(float)(mFontPixelSize+4))*fh;
383 if ( nfh < 6 ) 383 if ( nfh < 6 )
384 nfh = 6; 384 nfh = 6;
385 f.setPointSize( nfh ); 385 f.setPointSize( nfh );
386 paint->setFont(f); 386 paint->setFont(f);
387 } 387 }
388 paint->fillRect ( x, yy, w, h, mBackgroundColor ); 388 paint->fillRect ( x, yy, w, h, mBackgroundColor );
389 static const QPixmap completedPxmp = SmallIcon("greenhook16"); 389 static const QPixmap completedPxmp = SmallIcon("greenhook16");
390 static const QPixmap overduePxmp = SmallIcon("redcross16"); 390 static const QPixmap overduePxmp = SmallIcon("redcross16");
391 if ( mIncidence->typeID() == todoID ) { 391 if ( mIncidence->typeID() == todoID ) {
392 Todo* tempTodo = static_cast<Todo*>(mIncidence); 392 Todo* tempTodo = static_cast<Todo*>(mIncidence);
393 int xx = pos().x()+(width()-completedPxmp.width()-3 ); 393 int xx = pos().x()+(width()-completedPxmp.width()-3 );
394 int yyy = yy+3; 394 int yyy = yy+3;
395 if ( tempTodo->isCompleted() ) 395 if ( tempTodo->isCompleted() )
396 paint->drawPixmap ( xx, yyy, completedPxmp ); 396 paint->drawPixmap ( xx, yyy, completedPxmp );
397 else { 397 else {
398 paint->drawPixmap ( xx, yyy, overduePxmp ); 398 paint->drawPixmap ( xx, yyy, overduePxmp );
399 399
400 } 400 }
401 } 401 }
402 bool addIcon = false; 402 bool addIcon = false;
403 if ( ! small || w > 3 * h || h > 3* w ) 403 if ( ! small || w > 3 * h || h > 3* w )
404 addIcon = updateIcons( paint, horLayout ); 404 addIcon = updateIcons( paint, horLayout );
405 405
406 //qDrawShadePanel (paint, x, yy, w, h, mColorGroup, selected , 2, 0); 406 //qDrawShadePanel (paint, x, yy, w, h, mColorGroup, selected , 2, 0);
407 qDrawWinPanel (paint, x, yy, w, h, mColorGroup, selected ,0); 407 qDrawWinPanel (paint, x, yy, w, h, mColorGroup, selected ,0);
408 //qDebug("draw rect %d %d %d %d ",x, yy, w, h ); 408 //qDebug("draw rect %d %d %d %d ",x, yy, w, h );
409 if ( ! small ) { 409 if ( ! small ) {
410 x += 3; yy += 3;w -= 6; h-= 5; 410 x += 3; yy += 3;w -= 6; h-= 5;
411 } else { 411 } else {
412 x += 2; yy += 1;w -= 4; h-= 4; 412 x += 2; yy += 1;w -= 4; h-= 4;
413 if ( nfh < 6.01 ) { 413 if ( nfh < 6.01 ) {
414 yy -= 2; 414 yy -= 2;
415 h += 4; 415 h += 4;
416 } 416 }
417 else 417 else
418 if ( nfh < h -2 ) 418 if ( nfh < h -2 )
419 ++yy; 419 ++yy;
420 } 420 }
421 int align; 421 int align;
422#ifndef DESKTOP_VERSION 422#ifndef DESKTOP_VERSION
423 align = ( AlignLeft|WordBreak|AlignTop); 423 align = ( AlignLeft|WordBreak|AlignTop);
424#else 424#else
425 align = ( AlignLeft|BreakAnywhere|WordBreak|AlignTop); 425 align = ( AlignLeft|BreakAnywhere|WordBreak|AlignTop);
426#endif 426#endif
427 if ( addIcon ) { 427 if ( addIcon ) {
428 if ( ! horLayout ) { 428 if ( ! horLayout ) {
429 x += AGENDA_ICON_SIZE+3; 429 x += AGENDA_ICON_SIZE+3;
430 w -= (AGENDA_ICON_SIZE+3); 430 w -= (AGENDA_ICON_SIZE+3);
431 } 431 }
432 else { 432 else {
433 yy+= AGENDA_ICON_SIZE+2; 433 yy+= AGENDA_ICON_SIZE+2;
434 h -=(AGENDA_ICON_SIZE+3); 434 h -=(AGENDA_ICON_SIZE+3);
435 } 435 }
436 } 436 }
437 if ( mWhiteText ) 437 if ( mWhiteText )
438 paint->setPen ( white); 438 paint->setPen ( white);
439 if ( x < 0 ) { 439 if ( x < 0 ) {
440 w = w+x-3; 440 w = w+x-3;
441 x = 3; 441 x = 3;
442 if ( !horLayout && addIcon ) 442 if ( !horLayout && addIcon )
443 x += AGENDA_ICON_SIZE+3; 443 x += AGENDA_ICON_SIZE+3;
444 if ( w > parentWidget()->width() ){ 444 if ( w > parentWidget()->width() ){
445 w = parentWidget()->width() - 6; 445 w = parentWidget()->width() - 6;
446#ifndef DESKTOP_VERSION 446#ifndef DESKTOP_VERSION
447 align = ( AlignHCenter|WordBreak|AlignTop); 447 align = ( AlignHCenter|WordBreak|AlignTop);
448#else 448#else
449 align = ( AlignHCenter|BreakAnywhere|WordBreak|AlignTop); 449 align = ( AlignHCenter|BreakAnywhere|WordBreak|AlignTop);
450#endif 450#endif
451 451
452 } 452 }
453 } 453 }
454 QRect dr; 454 QRect dr;
455 if ( w + x > parentWidget()->width() ) 455 if ( w + x > parentWidget()->width() )
456 w = parentWidget()->width()-x; 456 w = parentWidget()->width()-x;
457 paint->drawText ( x, yy, w, h, align, mDisplayedText, -1, &dr ); 457 paint->drawText ( x, yy, w, h, align, mDisplayedText, -1, &dr );
458 //qDebug("%d %d %d %d ", x, yy, w, h ); 458 //qDebug("%d %d %d %d ", x, yy, w, h );
459 if ( mIncidence->cancelled() ){ 459 if ( mIncidence->cancelled() ){
460 460
461 461
462 small = ( height() < 20 ); 462 small = ( height() < 20 );
463 463
464 if ( ! small ) { 464 if ( ! small ) {
465 QFontMetrics fm ( paint->font() ); 465 QFontMetrics fm ( paint->font() );
466 paint->drawLine(dr.left(), yy+fm.height()/2, dr.right()-2, yy+fm.height()/2); 466 paint->drawLine(dr.left(), yy+fm.height()/2, dr.right()-2, yy+fm.height()/2);
467 } 467 }
468 468
469 } 469 }
470 pa.end(); 470 pa.end();
471 471
472} 472}
473 473
474QPixmap * KOAgendaItem::paintPix() 474QPixmap * KOAgendaItem::paintPix()
475{ 475{
476 static QPixmap* mPaintPix = 0; 476 static QPixmap* mPaintPix = 0;
477 if ( ! mPaintPix ) { 477 if ( ! mPaintPix ) {
478 int w = QApplication::desktop()->width(); 478 int w = QApplication::desktop()->width();
479 int h = QApplication::desktop()->height(); 479 int h = QApplication::desktop()->height();
480 mPaintPix = new QPixmap(w,h); 480 mPaintPix = new QPixmap(w,h);
481 } 481 }
482 return mPaintPix ; 482 return mPaintPix ;
483} 483}
484QPixmap * KOAgendaItem::paintPixAllday() 484QPixmap * KOAgendaItem::paintPixAllday()
485{ 485{
486 static QPixmap* mPaintPixA = 0; 486 static QPixmap* mPaintPixA = 0;
487 if ( ! mPaintPixA ) { 487 if ( ! mPaintPixA ) {
488 int w = QApplication::desktop()->width(); 488 int w = QApplication::desktop()->width();
489 int h = QApplication::desktop()->height()/5; 489 int h = QApplication::desktop()->height()/5;
490 mPaintPixA = new QPixmap(w,h); 490 mPaintPixA = new QPixmap(w,h);
491 } 491 }
492 return mPaintPixA ; 492 return mPaintPixA ;
493} 493}
494 494
495void KOAgendaItem::repaintItem() 495void KOAgendaItem::repaintItem()
496{ 496{
497 globalFlagBlockAgendaItemPaint = 0; 497 globalFlagBlockAgendaItemPaint = 0;
498 globalFlagBlockAgenda = 0; 498 globalFlagBlockAgenda = 0;
499 repaint( false ); 499 repaint( false );
500} 500}
501void KOAgendaItem::paintEvent ( QPaintEvent *e ) 501void KOAgendaItem::paintEvent ( QPaintEvent *e )
502{ 502{
503 503
504 if ( globalFlagBlockAgendaItemPaint ) 504 if ( globalFlagBlockAgendaItemPaint )
505 return; 505 return;
506 if ( globalFlagBlockAgenda > 0 && globalFlagBlockAgenda < 5 ) 506 if ( globalFlagBlockAgenda > 0 && globalFlagBlockAgenda < 5 )
507 return; 507 return;
508 int yy; 508 int yy;
509 if ( mAllDay ) 509 if ( mAllDay )
510 yy = y(); 510 yy = y();
511 else 511 else
512 yy = mCellYTop * ( height() / cellHeight() ); 512 yy = mCellYTop * ( height() / cellHeight() );
513 int xx = x(); 513 int xx = x();
514 514
515 if ( xPaintCoord != xx || yPaintCoord != yy || 515 if ( xPaintCoord != xx || yPaintCoord != yy ||
516 wPaintCoord != width() || hPaintCoord != height()) { 516 wPaintCoord != width() || hPaintCoord != height()) {
517 xPaintCoord= xx; 517 xPaintCoord= xx;
518 yPaintCoord = yy; 518 yPaintCoord = yy;
519 wPaintCoord = width(); 519 wPaintCoord = width();
520 hPaintCoord = height(); 520 hPaintCoord = height();
521 globalFlagBlockAgendaItemUpdate = 0; 521 globalFlagBlockAgendaItemUpdate = 0;
522 paintMe( mSelected ); 522 paintMe( mSelected );
523 //qDebug("calling paintMe "); 523 //qDebug("calling paintMe ");
524 globalFlagBlockAgendaItemUpdate = 1; 524 globalFlagBlockAgendaItemUpdate = 1;
525 if ( mSelected ) 525 if ( mSelected )
526 return; 526 return;
527 } 527 }
528 int rx, ry, rw, rh; 528 int rx, ry, rw, rh;
529 rx = e->rect().x(); 529 rx = e->rect().x();
530 ry = e->rect().y(); 530 ry = e->rect().y();
531 rw = e->rect().width(); 531 rw = e->rect().width();
532 rh = e->rect().height(); 532 rh = e->rect().height();
533 //qDebug(" paintevent %s %d %d %d %d", mIncidence->summary().latin1(), x(), yy, width(), height()); 533 //qDebug(" paintevent %s %d %d %d %d", mIncidence->summary().latin1(), x(), yy, width(), height());
534 534
535 QPixmap* paintFrom ; 535 QPixmap* paintFrom ;
536 if ( mSelected ) { 536 if ( mSelected ) {
537 paintMe( mSelected ); 537 paintMe( mSelected );
538 return; 538 return;
539 } else { 539 } else {
540 if ( mAllDay ) 540 if ( mAllDay )
541 paintFrom = paintPixAllday(); 541 paintFrom = paintPixAllday();
542 else 542 else
543 paintFrom = paintPix(); 543 paintFrom = paintPix();
544 } 544 }
545 xx += rx; 545 xx += rx;
546 546
547 if ( xx < 0 ) { 547 if ( xx < 0 ) {
548 rw = rw + xx; 548 rw = rw + xx;
549 rx -= xx; 549 rx -= xx;
550 xx = 0; 550 xx = 0;
551 if ( rw <= 1 ) { 551 if ( rw <= 1 ) {
552 //qDebug("KOAgendaItem::Width1 <= 1 (%d). Returning. %s",rw,mDisplayedText.latin1()); 552 //qDebug("KOAgendaItem::Width1 <= 1 (%d). Returning. %s",rw,mDisplayedText.latin1());
553 return; 553 return;
554 } 554 }
555 } 555 }
556 if ( paintFrom->width() < xx+rw ) { 556 if ( paintFrom->width() < xx+rw ) {
557 rw = paintFrom->width() - xx; 557 rw = paintFrom->width() - xx;
558 if ( rw <= 1 ) { 558 if ( rw <= 1 ) {
559 //qDebug("KOAgendaItem::Width2 <= 1 (%d). Returning.%s ",rw,mDisplayedText.latin1() ); 559 //qDebug("KOAgendaItem::Width2 <= 1 (%d). Returning.%s ",rw,mDisplayedText.latin1() );
560 return; 560 return;
561 } 561 }
562 } 562 }
563 //qDebug("%d %d %d %d %d %d %d",rx, ry, paintFrom, xx ,yPaintCoord+ry, rw, rh); 563 //qDebug("%d %d %d %d %d %d %d",rx, ry, paintFrom, xx ,yPaintCoord+ry, rw, rh);
564 bitBlt (this, rx, ry, paintFrom, xx ,yPaintCoord+ry, rw, rh ,CopyROP); 564 bitBlt (this, rx, ry, paintFrom, xx ,yPaintCoord+ry, rw, rh ,CopyROP);
565} 565}
566void KOAgendaItem::computeText() 566void KOAgendaItem::computeText()
567{ 567{
568 mDisplayedText = mIncidence->summary(); 568 mDisplayedText = mIncidence->summary();
569 if ( (mIncidence->typeID() == todoID ) ) { 569 if ( (mIncidence->typeID() == todoID ) ) {
570 if ( static_cast<Todo*>(mIncidence)->hasDueDate() ) { 570 if ( static_cast<Todo*>(mIncidence)->hasDueDate() ) {
571 if ( static_cast<Todo*>(mIncidence)->dtDue().date() < QDate::currentDate() ) 571 if ( static_cast<Todo*>(mIncidence)->dtDue().date() < QDate::currentDate() )
572 mDisplayedText += i18n(" (") +KGlobal::locale()->formatDate((static_cast<Todo*>(mIncidence))->dtDue().date(), true)+")"; 572 mDisplayedText += i18n(" (") +KGlobal::locale()->formatDate((static_cast<Todo*>(mIncidence))->dtDue().date(), true)+")";
573 else if ( !(mIncidence->doesFloat())) 573 else if ( !(mIncidence->doesFloat()))
574 mDisplayedText += i18n(" (") +KGlobal::locale()->formatTime((static_cast<Todo*>(mIncidence))->dtDue().time())+")"; 574 mDisplayedText += i18n(" (") +KGlobal::locale()->formatTime((static_cast<Todo*>(mIncidence))->dtDue().time())+")";
575 } 575 }
576 } else { 576 } else {
577 if ( !(mIncidence->doesFloat()) && KOPrefs::instance()->mShowTimeInAgenda) 577 if ( !(mIncidence->doesFloat()) && KOPrefs::instance()->mShowTimeInAgenda)
578 mDisplayedText += ": " +KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtStart().time()) + " - " + KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtEnd().time()) ; 578 mDisplayedText += ": " +KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtStart().time()) + " - " + KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtEnd().time()) ;
579 579
580 if ( mAllDay ) { 580 if ( mAllDay ) {
581 if ( mIncidence->dtStart().date().addDays(3) < mIncidence->dtEnd().date() ) { 581 if ( mIncidence->dtStart().date().addDays(3) < mIncidence->dtEnd().date() ) {
582 if ( mIncidence->doesRecur() ) { 582 if ( mIncidence->doesRecur() ) {
583 mDisplayedText += " (" + mIncidence->recurrence()->recurrenceText() + ")"; 583 mDisplayedText += " (" + mIncidence->recurrence()->recurrenceText() + ")";
584 } else { 584 } else {
585 mDisplayedText += ": " +KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtStart().date(), true) + " - " + KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtEnd().date(), true) ; 585 mDisplayedText += ": " +KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtStart().date(), true) + " - " + KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtEnd().date(), true) ;
586 } 586 }
587 } 587 }
588 } 588 }
589 } 589 }
590 590
591 if ( !mIncidence->location().isEmpty() ) { 591 if ( !mIncidence->location().isEmpty() ) {
592 if ( mAllDay ) 592 if ( mAllDay )
593 mDisplayedText += " ("; 593 mDisplayedText += " (";
594 else 594 else
595 mDisplayedText += "\n("; 595 mDisplayedText += "\n(";
596 mDisplayedText += mIncidence->location() +")"; 596 mDisplayedText += mIncidence->location() +")";
597 } 597 }
598#ifdef DESKTOP_VERSION 598#ifdef DESKTOP_VERSION
599 QString tipText = mIncidence->summary(); 599 QString tipText = mIncidence->summary();
600 if ( !mIncidence->doesFloat() ) { 600 if ( !mIncidence->doesFloat() ) {
601 if ( mIncidence->typeID() == eventID ) { 601 if ( mIncidence->typeID() == eventID ) {
602 if ( (static_cast<Event*>(mIncidence))->isMultiDay() ) { 602 if ( (static_cast<Event*>(mIncidence))->isMultiDay() ) {
603 tipText += "\n"+i18n("From: ")+mIncidence->dtStartStr(); 603 tipText += "\n"+i18n("From: ")+mIncidence->dtStartStr();
604 tipText += "\n"+i18n("To: ")+(static_cast<Event*>(mIncidence))->dtEndStr(); 604 tipText += "\n"+i18n("To: ")+(static_cast<Event*>(mIncidence))->dtEndStr();
605 } 605 }
606 else { 606 else {
607 tipText += "\n"+i18n("Time: ")+mIncidence->dtStartTimeStr(); 607 tipText += "\n"+i18n("Time: ")+mIncidence->dtStartTimeStr();
608 tipText += " - "+(static_cast<Event*>(mIncidence))->dtEndTimeStr(); 608 tipText += " - "+(static_cast<Event*>(mIncidence))->dtEndTimeStr();
609 } 609 }
610 } 610 }
611 else if ( mIncidence->typeID() == todoID ) { 611 else if ( mIncidence->typeID() == todoID ) {
612 if (mIncidence->hasStartDate()) 612 if (mIncidence->hasStartDate())
613 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartStr(); 613 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartStr();
614 if (((Todo*)mIncidence)->hasDueDate()) 614 if (((Todo*)mIncidence)->hasDueDate())
615 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueStr(); 615 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueStr();
616 } 616 }
617 } else if ( mIncidence->typeID() == todoID ) { 617 } else if ( mIncidence->typeID() == todoID ) {
618 if (mIncidence->hasStartDate()) 618 if (mIncidence->hasStartDate())
619 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartDateStr(); 619 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartDateStr();
620 if (((Todo*)mIncidence)->hasDueDate()) 620 if (((Todo*)mIncidence)->hasDueDate())
621 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueDateStr(); 621 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueDateStr();
622 } 622 }
623 623
624 if (!mIncidence->location().isEmpty()) { 624 if (!mIncidence->location().isEmpty()) {
625 tipText += "\n"+i18n("Location: ")+mIncidence->location(); 625 tipText += "\n"+i18n("Location: ")+mIncidence->location();
626 } 626 }
627 QToolTip::add(this,tipText,toolTipGroup(),""); 627 QToolTip::add(this,tipText,toolTipGroup(),"");
628#endif 628#endif
629} 629}
630void KOAgendaItem::updateItem() 630void KOAgendaItem::updateItem()
631{ 631{
632 computeText(); 632 computeText();
633 633
634 //qDebug("KOAgendaItem:: updateItem() %s %d %d ",incidence()->summary().latin1(), x(), y()); 634 //qDebug("KOAgendaItem:: updateItem() %s %d %d ",incidence()->summary().latin1(), x(), y());
635 paintMe( mSelected ); 635 paintMe( mSelected );
636 repaint( false); 636 repaint( false);
637} 637}
638 638
639void KOAgendaItem::resizeEvent ( QResizeEvent *ev ) 639void KOAgendaItem::resizeEvent ( QResizeEvent *ev )
640{ 640{
641 //qDebug("KOAgendaItem::resizeEvent %s ", mIncidence->summary().latin1()); 641 //qDebug("KOAgendaItem::resizeEvent %s ", mIncidence->summary().latin1());
642 paintMe( mSelected ); 642 paintMe( mSelected );
643 repaint( false ); 643 repaint( false );
644} 644}
645 645
646/* 646/*
647 Return height of item in units of agenda cells 647 Return height of item in units of agenda cells
648*/ 648*/
649int KOAgendaItem::cellHeight() 649int KOAgendaItem::cellHeight()
650{ 650{
651 int ret = mCellYBottom - mCellYTop + 1; 651 int ret = mCellYBottom - mCellYTop + 1;
652 if ( ret <= 0 ) { 652 if ( ret <= 0 ) {
653 ret = 1; 653 ret = 1;
654 mCellYBottom = 0; 654 mCellYBottom = 0;
655 mCellYTop = 0; 655 mCellYTop = 0;
656 } 656 }
657 return ret; 657 return ret;
658} 658}
659 659
660/* 660/*
661 Return height of item in units of agenda cells 661 Return height of item in units of agenda cells
662*/ 662*/
663int KOAgendaItem::cellWidth() 663int KOAgendaItem::cellWidth()
664{ 664{
665 return mCellXWidth - mCellX + 1; 665 return mCellXWidth - mCellX + 1;
666} 666}
667 667
668void KOAgendaItem::setItemDate(QDate qd) 668void KOAgendaItem::setItemDate(QDate qd)
669{ 669{
670 mDate = qd; 670 mDate = qd;
671} 671}
672 672
673void KOAgendaItem::setCellXY(int X, int YTop, int YBottom) 673void KOAgendaItem::setCellXY(int X, int YTop, int YBottom)
674{ 674{
675 mCellX = X; 675 mCellX = X;
676 mCellYTop = YTop; 676 mCellYTop = YTop;
677 mCellYBottom = YBottom; 677 mCellYBottom = YBottom;
678} 678}
679 679
680void KOAgendaItem::setCellXWidth(int xwidth) 680void KOAgendaItem::setCellXWidth(int xwidth)
681{ 681{
682 mCellXWidth = xwidth; 682 mCellXWidth = xwidth;
683} 683}
684 684
685void KOAgendaItem::setCellX(int XLeft, int XRight) 685void KOAgendaItem::setCellX(int XLeft, int XRight)
686{ 686{
687 mCellX = XLeft; 687 mCellX = XLeft;
688 mCellXWidth = XRight; 688 mCellXWidth = XRight;
689} 689}
690 690
691void KOAgendaItem::setCellY(int YTop, int YBottom) 691void KOAgendaItem::setCellY(int YTop, int YBottom)
692{ 692{
693 mCellYTop = YTop; 693 mCellYTop = YTop;
694 mCellYBottom = YBottom; 694 mCellYBottom = YBottom;
695} 695}
696 696
697void KOAgendaItem::setSubCell(int subCell) 697void KOAgendaItem::setSubCell(int subCell)
698{ 698{
699 mSubCell = subCell; 699 mSubCell = subCell;
700} 700}
701 701
702void KOAgendaItem::setSubCells(int subCells) 702void KOAgendaItem::setSubCells(int subCells)
703{ 703{
704 mSubCells = subCells; 704 mSubCells = subCells;
705} 705}
706 706
707void KOAgendaItem::setMultiItem(KOAgendaItem *first,KOAgendaItem *next, 707void KOAgendaItem::setMultiItem(KOAgendaItem *first,KOAgendaItem *next,
708 KOAgendaItem *last) 708 KOAgendaItem *last)
709{ 709{
710 mFirstMultiItem = first; 710 mFirstMultiItem = first;
711 mNextMultiItem = next; 711 mNextMultiItem = next;
712 mLastMultiItem = last; 712 mLastMultiItem = last;
713} 713}
714 714
715void KOAgendaItem::startMove() 715void KOAgendaItem::startMove()
716{ 716{
717 mStartCellX = mCellX; 717 mStartCellX = mCellX;
718 mStartCellXWidth = mCellXWidth; 718 mStartCellXWidth = mCellXWidth;
719 mStartCellYTop = mCellYTop; 719 mStartCellYTop = mCellYTop;
720 mStartCellYBottom = mCellYBottom; 720 mStartCellYBottom = mCellYBottom;
721} 721}
722 722
723void KOAgendaItem::resetMove() 723void KOAgendaItem::resetMove()
724{ 724{
725 mCellX = mStartCellX; 725 mCellX = mStartCellX;
726 mCellXWidth = mStartCellXWidth; 726 mCellXWidth = mStartCellXWidth;
727 mCellYTop = mStartCellYTop; 727 mCellYTop = mStartCellYTop;
728 mCellYBottom = mStartCellYBottom; 728 mCellYBottom = mStartCellYBottom;
729} 729}
730 730
731void KOAgendaItem::moveRelative(int dx, int dy) 731void KOAgendaItem::moveRelative(int dx, int dy)
732{ 732{
733 int newX = cellX() + dx; 733 int newX = cellX() + dx;
734 int newXWidth = cellXWidth() + dx; 734 int newXWidth = cellXWidth() + dx;
735 int newYTop = cellYTop() + dy; 735 int newYTop = cellYTop() + dy;
736 int newYBottom = cellYBottom() + dy; 736 int newYBottom = cellYBottom() + dy;
737 setCellXY(newX,newYTop,newYBottom); 737 setCellXY(newX,newYTop,newYBottom);
738 setCellXWidth(newXWidth); 738 setCellXWidth(newXWidth);
739} 739}
740 740
741void KOAgendaItem::expandTop(int dy) 741void KOAgendaItem::expandTop(int dy)
742{ 742{
743 int newYTop = cellYTop() + dy; 743 int newYTop = cellYTop() + dy;
744 int newYBottom = cellYBottom(); 744 int newYBottom = cellYBottom();
745 if (newYTop > newYBottom) newYTop = newYBottom; 745 if (newYTop > newYBottom) newYTop = newYBottom;
746 setCellY(newYTop, newYBottom); 746 setCellY(newYTop, newYBottom);
747} 747}
748 748
749void KOAgendaItem::expandBottom(int dy) 749void KOAgendaItem::expandBottom(int dy)
750{ 750{
751 int newYTop = cellYTop(); 751 int newYTop = cellYTop();
752 int newYBottom = cellYBottom() + dy; 752 int newYBottom = cellYBottom() + dy;
753 if (newYBottom < newYTop) newYBottom = newYTop; 753 if (newYBottom < newYTop) newYBottom = newYTop;
754 setCellY(newYTop, newYBottom); 754 setCellY(newYTop, newYBottom);
755} 755}
756 756
757void KOAgendaItem::expandLeft(int dx) 757void KOAgendaItem::expandLeft(int dx)
758{ 758{
759 int newX = cellX() + dx; 759 int newX = cellX() + dx;
760 int newXWidth = cellXWidth(); 760 int newXWidth = cellXWidth();
761 if (newX > newXWidth) newX = newXWidth; 761 if (newX > newXWidth) newX = newXWidth;
762 setCellX(newX,newXWidth); 762 setCellX(newX,newXWidth);
763} 763}
764 764
765void KOAgendaItem::expandRight(int dx) 765void KOAgendaItem::expandRight(int dx)
766{ 766{
767 int newX = cellX(); 767 int newX = cellX();
768 int newXWidth = cellXWidth() + dx; 768 int newXWidth = cellXWidth() + dx;
769 if (newXWidth < newX) newXWidth = newX; 769 if (newXWidth < newX) newXWidth = newX;
770 setCellX(newX,newXWidth); 770 setCellX(newX,newXWidth);
771} 771}
772 772
773QToolTipGroup *KOAgendaItem::toolTipGroup() 773QToolTipGroup *KOAgendaItem::toolTipGroup()
774{ 774{
775 if (!mToolTipGroup) mToolTipGroup = new QToolTipGroup(0); 775 if (!mToolTipGroup) mToolTipGroup = new QToolTipGroup(0);
776 return mToolTipGroup; 776 return mToolTipGroup;
777} 777}
778 778
779void KOAgendaItem::dragEnterEvent( QDragEnterEvent *e ) 779void KOAgendaItem::dragEnterEvent( QDragEnterEvent *e )
780{ 780{
781#ifndef KORG_NODND 781#ifndef KORG_NODND
782 if ( ICalDrag::canDecode( e ) || VCalDrag::canDecode( e ) || 782 if ( ICalDrag::canDecode( e ) || VCalDrag::canDecode( e ) ||
783 !QTextDrag::canDecode( e ) ) { 783 !QTextDrag::canDecode( e ) ) {
784 e->ignore(); 784 e->ignore();
785 return; 785 return;
786 } 786 }
787 e->accept(); 787 e->accept();
788#endif 788#endif
789} 789}
790 790
791void KOAgendaItem::dropEvent( QDropEvent *e ) 791void KOAgendaItem::dropEvent( QDropEvent *e )
792{ 792{
793#ifndef KORG_NODND 793#ifndef KORG_NODND
794 QString text; 794 QString text;
795 if(QTextDrag::decode(e,text)) 795 if(QTextDrag::decode(e,text))
796 { 796 {
797 kdDebug() << "Dropped : " << text << endl; 797 kdDebug() << "Dropped : " << text << endl;
798 QStringList emails = QStringList::split(",",text); 798 QStringList emails = QStringList::split(",",text);
799 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { 799 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
800 kdDebug() << " Email: " << (*it) << endl; 800 kdDebug() << " Email: " << (*it) << endl;
801 int pos = (*it).find("<"); 801 int pos = (*it).find("<");
802 QString name = (*it).left(pos); 802 QString name = (*it).left(pos);
803 QString email = (*it).mid(pos); 803 QString email = (*it).mid(pos);
804 if (!email.isEmpty()) { 804 if (!email.isEmpty()) {
805 mIncidence->addAttendee(new Attendee(name,email)); 805 mIncidence->addAttendee(new Attendee(name,email));
806 } 806 }
807 } 807 }
808 } 808 }
809#endif 809#endif
810} 810}
811 811
812 812
813QPtrList<KOAgendaItem> KOAgendaItem::conflictItems() 813QPtrList<KOAgendaItem> KOAgendaItem::conflictItems()
814{ 814{
815 return mConflictItems; 815 return mConflictItems;
816} 816}
817 817
818void KOAgendaItem::setConflictItems(QPtrList<KOAgendaItem> ci) 818void KOAgendaItem::setConflictItems(QPtrList<KOAgendaItem> ci)
819{ 819{
820 mConflictItems = ci; 820 mConflictItems = ci;
821 KOAgendaItem *item; 821 KOAgendaItem *item;
822 for ( item=mConflictItems.first(); item != 0; 822 for ( item=mConflictItems.first(); item != 0;
823 item=mConflictItems.next() ) { 823 item=mConflictItems.next() ) {
824 item->addConflictItem(this); 824 item->addConflictItem(this);
825 } 825 }
826} 826}
827 827
828void KOAgendaItem::addConflictItem(KOAgendaItem *ci) 828void KOAgendaItem::addConflictItem(KOAgendaItem *ci)
829{ 829{
830 if (mConflictItems.find(ci)<0) 830 if (mConflictItems.find(ci)<0)
831 mConflictItems.append(ci); 831 mConflictItems.append(ci);
832} 832}
833 833
834bool KOAgendaItem::checkLayout() 834bool KOAgendaItem::checkLayout()
835{ 835{
836 if ( !mConflictItems.count() ) 836 if ( !mConflictItems.count() )
837 return true; 837 return true;
838 int max = 0; 838 int max = 0;
839 KOAgendaItem *item; 839 KOAgendaItem *item;
840 for ( item=mConflictItems.first(); item != 0; 840 for ( item=mConflictItems.first(); item != 0;
841 item=mConflictItems.next() ) { 841 item=mConflictItems.next() ) {
842 if ( item->subCells() > max ) 842 if ( item->subCells() > max )
843 max = item->subCells(); 843 max = item->subCells();
844 } 844 }
845 if ( max > subCells() ) { 845 if ( max > subCells() ) {
846 setSubCells( max ); 846 setSubCells( max );
847 return false; 847 return false;
848 } 848 }
849 return true; 849 return true;
850} 850}
diff --git a/korganizer/koagendaview.cpp b/korganizer/koagendaview.cpp
index a01323a..04f30bb 100644
--- a/korganizer/koagendaview.cpp
+++ b/korganizer/koagendaview.cpp
@@ -436,1255 +436,1255 @@ KOAgendaView::KOAgendaView(Calendar *cal,QWidget *parent,const char *name) :
436#ifndef DESKTOP_VERSION 436#ifndef DESKTOP_VERSION
437 mEventIndicatorTop->setPaintWidget( mSplitterAgenda ); 437 mEventIndicatorTop->setPaintWidget( mSplitterAgenda );
438#endif 438#endif
439 mDayLabelsFrame = new QHBox(agendaFrame); 439 mDayLabelsFrame = new QHBox(agendaFrame);
440 //topLayout->addWidget(mDayLabelsFrame); 440 //topLayout->addWidget(mDayLabelsFrame);
441 mDayLabels = new QFrame (mDayLabelsFrame); 441 mDayLabels = new QFrame (mDayLabelsFrame);
442 mLayoutDayLabels = new QHBoxLayout(mDayLabels); 442 mLayoutDayLabels = new QHBoxLayout(mDayLabels);
443 agendaLayout->addMultiCellWidget(mDayLabelsFrame ,0,0,0,2); 443 agendaLayout->addMultiCellWidget(mDayLabelsFrame ,0,0,0,2);
444 agendaLayout->addWidget(mEventIndicatorTop,1,1); 444 agendaLayout->addWidget(mEventIndicatorTop,1,1);
445 445
446 mEventIndicatorBottom = new EventIndicator(EventIndicator::Bottom, 446 mEventIndicatorBottom = new EventIndicator(EventIndicator::Bottom,
447 agendaFrame); 447 agendaFrame);
448 agendaLayout->addWidget(mEventIndicatorBottom,3,1); 448 agendaLayout->addWidget(mEventIndicatorBottom,3,1);
449 QWidget *dummyAgendaRight = new QWidget(agendaFrame); 449 QWidget *dummyAgendaRight = new QWidget(agendaFrame);
450 agendaLayout->addWidget(dummyAgendaRight,1,2); 450 agendaLayout->addWidget(dummyAgendaRight,1,2);
451 451
452 // Create time labels 452 // Create time labels
453 mTimeLabels = new TimeLabels(24,agendaFrame); 453 mTimeLabels = new TimeLabels(24,agendaFrame);
454 agendaLayout->addWidget(mTimeLabels,2,0); 454 agendaLayout->addWidget(mTimeLabels,2,0);
455 connect(mTimeLabels,SIGNAL( scaleChanged()), 455 connect(mTimeLabels,SIGNAL( scaleChanged()),
456 this,SLOT(updateConfig())); 456 this,SLOT(updateConfig()));
457 457
458 // Create agenda 458 // Create agenda
459 mAgenda = new KOAgenda(1,96,KOPrefs::instance()->mHourSize,agendaFrame); 459 mAgenda = new KOAgenda(1,96,KOPrefs::instance()->mHourSize,agendaFrame);
460 agendaLayout->addMultiCellWidget(mAgenda,2,2,1,2); 460 agendaLayout->addMultiCellWidget(mAgenda,2,2,1,2);
461 agendaLayout->setColStretch(1,1); 461 agendaLayout->setColStretch(1,1);
462 mAgenda->setFocusPolicy(NoFocus); 462 mAgenda->setFocusPolicy(NoFocus);
463 // Create event context menu for agenda 463 // Create event context menu for agenda
464 mAllAgendaPopup = eventPopup(); 464 mAllAgendaPopup = eventPopup();
465 465
466#if 0 466#if 0
467 mAllAgendaPopup->addAdditionalItem(QIconSet(SmallIcon("bell")), 467 mAllAgendaPopup->addAdditionalItem(QIconSet(SmallIcon("bell")),
468 i18n("Toggle Alarm"),mAgenda, 468 i18n("Toggle Alarm"),mAgenda,
469 SLOT(popupAlarm()),true); 469 SLOT(popupAlarm()),true);
470 470
471#endif 471#endif
472 connect(mAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)), 472 connect(mAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)),
473 mAllAgendaPopup,SLOT(showIncidencePopup(Incidence *))); 473 mAllAgendaPopup,SLOT(showIncidencePopup(Incidence *)));
474 474
475 connect(mAllDayAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)), 475 connect(mAllDayAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)),
476 mAllAgendaPopup,SLOT(showIncidencePopup(Incidence *))); 476 mAllAgendaPopup,SLOT(showIncidencePopup(Incidence *)));
477 477
478 connect(mAllAgendaPopup,SIGNAL(categoryChanged(Incidence *)), 478 connect(mAllAgendaPopup,SIGNAL(categoryChanged(Incidence *)),
479 this,SLOT(categoryChanged(Incidence *))); 479 this,SLOT(categoryChanged(Incidence *)));
480 480
481 481
482 mAgenda->setPopup( mAllAgendaPopup ); 482 mAgenda->setPopup( mAllAgendaPopup );
483 mAllDayAgenda->setPopup( mAllAgendaPopup ); 483 mAllDayAgenda->setPopup( mAllAgendaPopup );
484 // make connections between dependent widgets 484 // make connections between dependent widgets
485 mTimeLabels->setAgenda(mAgenda); 485 mTimeLabels->setAgenda(mAgenda);
486 486
487 // Update widgets to reflect user preferences 487 // Update widgets to reflect user preferences
488 // updateConfig(); 488 // updateConfig();
489 489
490 // createDayLabels(); 490 // createDayLabels();
491 491
492 // these blank widgets make the All Day Event box line up with the agenda 492 // these blank widgets make the All Day Event box line up with the agenda
493 dummyAllDayRight->setFixedWidth(mAgenda->verticalScrollBar()->width()); 493 dummyAllDayRight->setFixedWidth(mAgenda->verticalScrollBar()->width());
494 dummyAgendaRight->setFixedWidth(mAgenda->verticalScrollBar()->width()); 494 dummyAgendaRight->setFixedWidth(mAgenda->verticalScrollBar()->width());
495 mDummyAllDayLeft->setFixedWidth(mTimeLabels->width()); 495 mDummyAllDayLeft->setFixedWidth(mTimeLabels->width());
496 496
497 // Scrolling 497 // Scrolling
498 connect(mAgenda->verticalScrollBar(),SIGNAL(valueChanged(int)), 498 connect(mAgenda->verticalScrollBar(),SIGNAL(valueChanged(int)),
499 mTimeLabels, SLOT(positionChanged())); 499 mTimeLabels, SLOT(positionChanged()));
500 connect(mTimeLabels->verticalScrollBar(),SIGNAL(valueChanged(int)), 500 connect(mTimeLabels->verticalScrollBar(),SIGNAL(valueChanged(int)),
501 SLOT(setContentsPos(int))); 501 SLOT(setContentsPos(int)));
502 502
503 connect(mAgenda,SIGNAL(showDateView( int, int)),SLOT(slotShowDateView( int, int ))); 503 connect(mAgenda,SIGNAL(showDateView( int, int)),SLOT(slotShowDateView( int, int )));
504 connect(mAllDayAgenda,SIGNAL(showDateView( int, int )), SLOT(slotShowDateView( int, int ) )); 504 connect(mAllDayAgenda,SIGNAL(showDateView( int, int )), SLOT(slotShowDateView( int, int ) ));
505 505
506 // Create/Show/Edit/Delete Event 506 // Create/Show/Edit/Delete Event
507 connect(mAgenda,SIGNAL(newEventSignal(int,int)), 507 connect(mAgenda,SIGNAL(newEventSignal(int,int)),
508 SLOT(newEvent(int,int))); 508 SLOT(newEvent(int,int)));
509 connect(mAgenda,SIGNAL(newTodoSignal(int,int)), 509 connect(mAgenda,SIGNAL(newTodoSignal(int,int)),
510 SLOT(newTodo(int,int))); 510 SLOT(newTodo(int,int)));
511 connect(mAgenda,SIGNAL(newEventSignal(int,int,int,int)), 511 connect(mAgenda,SIGNAL(newEventSignal(int,int,int,int)),
512 SLOT(newEvent(int,int,int,int))); 512 SLOT(newEvent(int,int,int,int)));
513 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int)), 513 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int)),
514 SLOT(newEventAllDay(int,int))); 514 SLOT(newEventAllDay(int,int)));
515 connect(mAllDayAgenda,SIGNAL(newTodoSignal(int,int)), 515 connect(mAllDayAgenda,SIGNAL(newTodoSignal(int,int)),
516 SLOT(newTodoAllDay(int,int))); 516 SLOT(newTodoAllDay(int,int)));
517 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int,int,int)), 517 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int,int,int)),
518 SLOT(newEventAllDay(int,int))); 518 SLOT(newEventAllDay(int,int)));
519 connect(mAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)), 519 connect(mAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)),
520 SLOT(newTimeSpanSelected(int,int,int,int))); 520 SLOT(newTimeSpanSelected(int,int,int,int)));
521 connect(mAllDayAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)), 521 connect(mAllDayAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)),
522 SLOT(newTimeSpanSelectedAllDay(int,int,int,int))); 522 SLOT(newTimeSpanSelectedAllDay(int,int,int,int)));
523 connect(mAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView())); 523 connect(mAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView()));
524 connect(mAllDayAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView())); 524 connect(mAllDayAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView()));
525 525
526 connect(mAgenda,SIGNAL(editIncidenceSignal(Incidence *)), 526 connect(mAgenda,SIGNAL(editIncidenceSignal(Incidence *)),
527 SIGNAL(editIncidenceSignal(Incidence *))); 527 SIGNAL(editIncidenceSignal(Incidence *)));
528 connect(mAllDayAgenda,SIGNAL(editIncidenceSignal(Incidence *)), 528 connect(mAllDayAgenda,SIGNAL(editIncidenceSignal(Incidence *)),
529 SIGNAL(editIncidenceSignal(Incidence *))); 529 SIGNAL(editIncidenceSignal(Incidence *)));
530 connect(mAgenda,SIGNAL(showIncidenceSignal(Incidence *)), 530 connect(mAgenda,SIGNAL(showIncidenceSignal(Incidence *)),
531 SIGNAL(showIncidenceSignal(Incidence *))); 531 SIGNAL(showIncidenceSignal(Incidence *)));
532 connect(mAllDayAgenda,SIGNAL(showIncidenceSignal(Incidence *)), 532 connect(mAllDayAgenda,SIGNAL(showIncidenceSignal(Incidence *)),
533 SIGNAL(showIncidenceSignal(Incidence *))); 533 SIGNAL(showIncidenceSignal(Incidence *)));
534 connect(mAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)), 534 connect(mAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)),
535 SIGNAL(deleteIncidenceSignal(Incidence *))); 535 SIGNAL(deleteIncidenceSignal(Incidence *)));
536 connect(mAllDayAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)), 536 connect(mAllDayAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)),
537 SIGNAL(deleteIncidenceSignal(Incidence *))); 537 SIGNAL(deleteIncidenceSignal(Incidence *)));
538 538
539 connect(mAgenda,SIGNAL(itemModified(KOAgendaItem *, int )), 539 connect(mAgenda,SIGNAL(itemModified(KOAgendaItem *, int )),
540 SLOT(updateEventDates(KOAgendaItem *, int ))); 540 SLOT(updateEventDates(KOAgendaItem *, int )));
541 connect(mAllDayAgenda,SIGNAL(itemModified(KOAgendaItem *, int )), 541 connect(mAllDayAgenda,SIGNAL(itemModified(KOAgendaItem *, int )),
542 SLOT(updateEventDates(KOAgendaItem *, int))); 542 SLOT(updateEventDates(KOAgendaItem *, int)));
543 543
544 // event indicator update 544 // event indicator update
545 connect(mAgenda,SIGNAL(lowerYChanged(int)), 545 connect(mAgenda,SIGNAL(lowerYChanged(int)),
546 SLOT(updateEventIndicatorTop(int))); 546 SLOT(updateEventIndicatorTop(int)));
547 connect(mAgenda,SIGNAL(upperYChanged(int)), 547 connect(mAgenda,SIGNAL(upperYChanged(int)),
548 SLOT(updateEventIndicatorBottom(int))); 548 SLOT(updateEventIndicatorBottom(int)));
549 // drag signals 549 // drag signals
550 /* 550 /*
551 connect(mAgenda,SIGNAL(startDragSignal(Event *)), 551 connect(mAgenda,SIGNAL(startDragSignal(Event *)),
552 SLOT(startDrag(Event *))); 552 SLOT(startDrag(Event *)));
553 connect(mAllDayAgenda,SIGNAL(startDragSignal(Event *)), 553 connect(mAllDayAgenda,SIGNAL(startDragSignal(Event *)),
554 SLOT(startDrag(Event *))); 554 SLOT(startDrag(Event *)));
555 */ 555 */
556 // synchronize selections 556 // synchronize selections
557 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 557 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
558 mAllDayAgenda, SLOT( deselectItem() ) ); 558 mAllDayAgenda, SLOT( deselectItem() ) );
559 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 559 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
560 mAgenda, SLOT( deselectItem() ) ); 560 mAgenda, SLOT( deselectItem() ) );
561 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 561 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
562 SIGNAL( incidenceSelected( Incidence * ) ) ); 562 SIGNAL( incidenceSelected( Incidence * ) ) );
563 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 563 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
564 SIGNAL( incidenceSelected( Incidence * ) ) ); 564 SIGNAL( incidenceSelected( Incidence * ) ) );
565 connect( mAgenda, SIGNAL( resizedSignal() ), 565 connect( mAgenda, SIGNAL( resizedSignal() ),
566 SLOT( updateConfig( ) ) ); 566 SLOT( updateConfig( ) ) );
567 connect( mAgenda, SIGNAL( addToCalSignal(Incidence *, Incidence *) ), 567 connect( mAgenda, SIGNAL( addToCalSignal(Incidence *, Incidence *) ),
568 SLOT( addToCalSlot(Incidence *, Incidence * ) ) ); 568 SLOT( addToCalSlot(Incidence *, Incidence * ) ) );
569 connect( mAllDayAgenda, SIGNAL( addToCalSignal(Incidence * ,Incidence *) ), 569 connect( mAllDayAgenda, SIGNAL( addToCalSignal(Incidence * ,Incidence *) ),
570 SLOT( addToCalSlot(Incidence * , Incidence *) ) ); 570 SLOT( addToCalSlot(Incidence * , Incidence *) ) );
571 // connect( mAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) ); 571 // connect( mAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) );
572 //connect( mAllDayAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) ); 572 //connect( mAllDayAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) );
573 573
574 connect( mAllDayAgenda, SIGNAL( signalClearSelection() ),mAgenda, SLOT( slotClearSelection()) ); 574 connect( mAllDayAgenda, SIGNAL( signalClearSelection() ),mAgenda, SLOT( slotClearSelection()) );
575 connect( mAgenda, SIGNAL( signalClearSelection() ),mAllDayAgenda, SLOT( slotClearSelection()) ); 575 connect( mAgenda, SIGNAL( signalClearSelection() ),mAllDayAgenda, SLOT( slotClearSelection()) );
576#ifndef DESKTOP_VERSION 576#ifndef DESKTOP_VERSION
577 connect( mAllDayAgenda, SIGNAL( updateViewSignal() ),this, SLOT( fillAgenda()) ); 577 connect( mAllDayAgenda, SIGNAL( updateViewSignal() ),this, SLOT( fillAgenda()) );
578 connect( mAgenda, SIGNAL( updateViewSignal() ), this, SLOT( fillAgenda()) ); 578 connect( mAgenda, SIGNAL( updateViewSignal() ), this, SLOT( fillAgenda()) );
579 connect( mAllDayAgenda, SIGNAL( sendPing() ),this, SLOT( startIdleTimeout()) ); 579 connect( mAllDayAgenda, SIGNAL( sendPing() ),this, SLOT( startIdleTimeout()) );
580 connect( mAgenda, SIGNAL( sendPing() ), this, SLOT( startIdleTimeout()) ); 580 connect( mAgenda, SIGNAL( sendPing() ), this, SLOT( startIdleTimeout()) );
581 mIdleTimer = new QTimer ( this );; 581 mIdleTimer = new QTimer ( this );;
582 connect(mIdleTimer,SIGNAL(timeout()),SLOT(slotIdleTimeout())); 582 connect(mIdleTimer,SIGNAL(timeout()),SLOT(slotIdleTimeout()));
583#endif 583#endif
584} 584}
585void KOAgendaView::startIdleTimeout() 585void KOAgendaView::startIdleTimeout()
586{ 586{
587#ifndef DESKTOP_VERSION 587#ifndef DESKTOP_VERSION
588 mIdleStart = QDateTime::currentDateTime(); 588 mIdleStart = QDateTime::currentDateTime();
589 mIdleTimer->start( IDLETIMEOUT * 1000 ); 589 mIdleTimer->start( IDLETIMEOUT * 1000 );
590#endif 590#endif
591} 591}
592void KOAgendaView::slotIdleTimeout() 592void KOAgendaView::slotIdleTimeout()
593{ 593{
594#ifndef DESKTOP_VERSION 594#ifndef DESKTOP_VERSION
595 //qDebug("SECS TO %d ",mIdleStart.secsTo( QDateTime::currentDateTime() ) ); 595 //qDebug("SECS TO %d ",mIdleStart.secsTo( QDateTime::currentDateTime() ) );
596 int secsfromstart = mIdleStart.secsTo( QDateTime::currentDateTime() ); 596 int secsfromstart = mIdleStart.secsTo( QDateTime::currentDateTime() );
597 mIdleTimer->stop(); 597 mIdleTimer->stop();
598 bool isActice = topLevelWidget()->isActiveWindow(); 598 bool isActice = topLevelWidget()->isActiveWindow();
599 //qDebug("KO: Active Window %d %d", isActice, isVisible()); 599 //qDebug("KO: Active Window %d %d", isActice, isVisible());
600 // we do nothing if we wake up from a suspend 600 // we do nothing if we wake up from a suspend
601 if ( secsfromstart > IDLETIMEOUT + 30 && isActice ) { 601 if ( secsfromstart > IDLETIMEOUT + 30 && isActice ) {
602 qDebug("KO: Wakeup from suspend "); 602 qDebug("KO: Wakeup from suspend ");
603 startIdleTimeout(); 603 startIdleTimeout();
604 return; 604 return;
605 } 605 }
606 qDebug("KO: Downsizing Pixmaps "); 606 qDebug("KO: Downsizing Pixmaps ");
607 mAgenda->shrinkPixmap(); 607 mAgenda->shrinkPixmap();
608 mAllDayAgenda->shrinkPixmap(); 608 mAllDayAgenda->shrinkPixmap();
609 KOAgendaItem::paintPix()->resize( 20,20); 609 KOAgendaItem::paintPix()->resize( 20,20);
610 KOAgendaItem::paintPixAllday()->resize( 20,20); 610 KOAgendaItem::paintPixAllday()->resize( 20,20);
611#endif 611#endif
612 612
613} 613}
614void KOAgendaView::toggleAllDay() 614void KOAgendaView::toggleAllDay()
615{ 615{
616 if ( mSplitterAgenda->firstHandle() ) 616 if ( mSplitterAgenda->firstHandle() )
617 mSplitterAgenda->firstHandle()->toggle(); 617 mSplitterAgenda->firstHandle()->toggle();
618} 618}
619void KOAgendaView::addToCalSlot(Incidence * inc, Incidence * incOld ) 619void KOAgendaView::addToCalSlot(Incidence * inc, Incidence * incOld )
620{ 620{
621 calendar()->addIncidence( inc ); 621 calendar()->addIncidence( inc );
622 622
623 if ( incOld ) { 623 if ( incOld ) {
624 if ( incOld->typeID() == todoID ) 624 if ( incOld->typeID() == todoID )
625 emit todoMoved((Todo*)incOld, KOGlobals::EVENTEDITED ); 625 emit todoMoved((Todo*)incOld, KOGlobals::EVENTEDITED );
626 else 626 else
627 emit incidenceChanged(incOld, KOGlobals::EVENTEDITED); 627 emit incidenceChanged(incOld, KOGlobals::EVENTEDITED);
628 } 628 }
629 629
630} 630}
631void KOAgendaView::categoryChanged(Incidence * inc) 631void KOAgendaView::categoryChanged(Incidence * inc)
632{ 632{
633 mAgenda->categoryChanged( inc ); 633 mAgenda->categoryChanged( inc );
634 mAllDayAgenda->categoryChanged( inc ); 634 mAllDayAgenda->categoryChanged( inc );
635} 635}
636KOAgendaView::~KOAgendaView() 636KOAgendaView::~KOAgendaView()
637{ 637{
638 delete mAllAgendaPopup; 638 delete mAllAgendaPopup;
639 //delete mAllDayAgendaPopup; 639 //delete mAllDayAgendaPopup;
640 delete KOAgendaItem::paintPix(); 640 delete KOAgendaItem::paintPix();
641 delete KOAgendaItem::paintPixAllday(); 641 delete KOAgendaItem::paintPixAllday();
642} 642}
643void KOAgendaView::resizeEvent( QResizeEvent* e ) 643void KOAgendaView::resizeEvent( QResizeEvent* e )
644{ 644{
645 //qDebug("KOAgendaView::resizeEvent( QResizeEvent* e ) %d ", e->size().width()); 645 //qDebug("KOAgendaView::resizeEvent( QResizeEvent* e ) %d ", e->size().width());
646 bool uc = false; 646 bool uc = false;
647 int ow = e->oldSize().width(); 647 int ow = e->oldSize().width();
648 int oh = e->oldSize().height(); 648 int oh = e->oldSize().height();
649 int w = e->size().width(); 649 int w = e->size().width();
650 int h = e->size().height(); 650 int h = e->size().height();
651 if ( (ow > oh && w< h ) || (ow < oh && w > h ) ) { 651 if ( (ow > oh && w< h ) || (ow < oh && w > h ) ) {
652 if ( ! mBlockUpdating && !globalFlagBlockStartup && !globalFlagBlockAgenda ) 652 if ( ! mBlockUpdating && !globalFlagBlockStartup && !globalFlagBlockAgenda )
653 uc = true; 653 uc = true;
654 //qDebug("view changed %d %d %d %d ", ow, oh , w , h); 654 //qDebug("view changed %d %d %d %d ", ow, oh , w , h);
655 } 655 }
656 mUpcomingWidth = e->size().width() ; 656 mUpcomingWidth = e->size().width() ;
657 if ( mBlockUpdating || uc ) { 657 if ( mBlockUpdating || uc ) {
658 mBlockUpdating = false; 658 mBlockUpdating = false;
659 //mAgenda->setMinimumSize(800 , 600 ); 659 //mAgenda->setMinimumSize(800 , 600 );
660 //qDebug("mAgenda->resize+++++++++++++++ "); 660 //qDebug("mAgenda->resize+++++++++++++++ ");
661 updateConfig(); 661 updateConfig();
662 //qDebug("KOAgendaView::Updating now possible "); 662 //qDebug("KOAgendaView::Updating now possible ");
663 } else 663 } else
664 createDayLabels(); 664 createDayLabels();
665 //qDebug("resizeEvent end "); 665 //qDebug("resizeEvent end ");
666 666
667} 667}
668void KOAgendaView::slotDaylabelClicked( int num ) 668void KOAgendaView::slotDaylabelClicked( int num )
669{ 669{
670 670
671 QDate firstDate = mSelectedDates.first(); 671 QDate firstDate = mSelectedDates.first();
672 if ( num == -1 ) 672 if ( num == -1 )
673 emit showDateView( 6, firstDate ); 673 emit showDateView( 6, firstDate );
674 else if (num >= 0 ) { 674 else if (num >= 0 ) {
675 if ( mSelectedDates.count() == 1) 675 if ( mSelectedDates.count() == 1)
676 emit showDateView( 9, firstDate.addDays( num ) ); 676 emit showDateView( 9, firstDate.addDays( num ) );
677 else 677 else
678 emit showDateView( 3, firstDate.addDays( num ) ); 678 emit showDateView( 3, firstDate.addDays( num ) );
679 } 679 }
680 else 680 else
681 showDateView( 10, firstDate.addDays(1) ); 681 showDateView( 10, firstDate.addDays(1) );
682} 682}
683 683
684KOAgendaButton* KOAgendaView::getNewDaylabel() 684KOAgendaButton* KOAgendaView::getNewDaylabel()
685{ 685{
686 686
687 KOAgendaButton * dayLabel = new KOAgendaButton(mDayLabels); 687 KOAgendaButton * dayLabel = new KOAgendaButton(mDayLabels);
688 connect( dayLabel, SIGNAL( numClicked(int) ), this, SLOT ( slotDaylabelClicked(int) ) ); 688 connect( dayLabel, SIGNAL( numClicked(int) ), this, SLOT ( slotDaylabelClicked(int) ) );
689 mDayLabelsList.append( dayLabel ); 689 mDayLabelsList.append( dayLabel );
690 mLayoutDayLabels->addWidget(dayLabel); 690 mLayoutDayLabels->addWidget(dayLabel);
691 return dayLabel ; 691 return dayLabel ;
692} 692}
693 693
694void KOAgendaView::createDayLabels() 694void KOAgendaView::createDayLabels()
695{ 695{
696 696
697 if ( mBlockUpdating || globalFlagBlockLabel == 1) { 697 if ( mBlockUpdating || globalFlagBlockLabel == 1) {
698 // qDebug(" KOAgendaView::createDayLabels() blocked "); 698 // qDebug(" KOAgendaView::createDayLabels() blocked ");
699 return; 699 return;
700 700
701 } 701 }
702 int newHight; 702 int newHight;
703 if ( !mSelectedDates.count()) 703 if ( !mSelectedDates.count())
704 return; 704 return;
705 705
706 // ### Before deleting and recreating we could check if mSelectedDates changed... 706 // ### Before deleting and recreating we could check if mSelectedDates changed...
707 // It would remove some flickering and gain speed (since this is called by 707 // It would remove some flickering and gain speed (since this is called by
708 // each updateView() call) 708 // each updateView() call)
709 709
710 int maxWid = mUpcomingWidth - mTimeLabels->width()- mAgenda->verticalScrollBar()->width() - mAgenda->frameWidth()*2; 710 int maxWid = mUpcomingWidth - mTimeLabels->width()- mAgenda->verticalScrollBar()->width() - mAgenda->frameWidth()*2;
711 mDayLabelsFrame->setMaximumWidth( mUpcomingWidth ); 711 mDayLabelsFrame->setMaximumWidth( mUpcomingWidth );
712 if ( maxWid < 20 ) 712 if ( maxWid < 20 )
713 maxWid = 20; 713 maxWid = 20;
714 714
715 QFont dlf = KOPrefs::instance()->mTimeLabelsFont; 715 QFont dlf = KOPrefs::instance()->mTimeLabelsFont;
716 QFontMetrics fm ( dlf ); 716 QFontMetrics fm ( dlf );
717 dlf.setBold( true ); 717 dlf.setBold( true );
718 int selCount = mSelectedDates.count(); 718 int selCount = mSelectedDates.count();
719 int widModulo = maxWid - (mAgenda->gridSpacingX() * selCount)+1; 719 int widModulo = maxWid - (mAgenda->gridSpacingX() * selCount)+1;
720 QString dayTest = "Mon 20"; 720 QString dayTest = "Mon 20";
721 //QString dayTest = "Mon 20"; 721 //QString dayTest = "Mon 20";
722 int wid = fm.width( dayTest ); 722 int wid = fm.width( dayTest );
723 //maxWid -= ( selCount * 3 ); //working for QLabels 723 //maxWid -= ( selCount * 3 ); //working for QLabels
724 if ( QApplication::desktop()->width() <= 320 ) 724 if ( QApplication::desktop()->width() <= 320 )
725 maxWid -= ( selCount * 3 ); //working for QPushButton 725 maxWid -= ( selCount * 3 ); //working for QPushButton
726 else 726 else
727 maxWid -= ( selCount * 4 ); //working for QPushButton 727 maxWid -= ( selCount * 4 ); //working for QPushButton
728 if ( maxWid < 0 ) 728 if ( maxWid < 0 )
729 maxWid = 20; 729 maxWid = 20;
730 int needWid = wid * selCount; 730 int needWid = wid * selCount;
731 //qDebug("++++++++Needed : %d MaxWidth: %d", needWid, maxWid ); 731 //qDebug("++++++++Needed : %d MaxWidth: %d", needWid, maxWid );
732 //if ( needWid > maxWid ) 732 //if ( needWid > maxWid )
733 // qDebug("DAYLABELS TOOOOOOO BIG "); 733 // qDebug("DAYLABELS TOOOOOOO BIG ");
734 while ( needWid > maxWid ) { 734 while ( needWid > maxWid ) {
735 dayTest = dayTest.left( dayTest.length() - 1 ); 735 dayTest = dayTest.left( dayTest.length() - 1 );
736 wid = fm.width( dayTest ); 736 wid = fm.width( dayTest );
737 needWid = wid * selCount; 737 needWid = wid * selCount;
738 } 738 }
739 int maxLen = dayTest.length(); 739 int maxLen = dayTest.length();
740 int fontPoint = dlf.pointSize(); 740 int fontPoint = dlf.pointSize();
741 if ( maxLen < 2 ) { 741 if ( maxLen < 2 ) {
742 int fontPoint = dlf.pointSize(); 742 int fontPoint = dlf.pointSize();
743 while ( fontPoint > 4 ) { 743 while ( fontPoint > 4 ) {
744 --fontPoint; 744 --fontPoint;
745 dlf.setPointSize( fontPoint ); 745 dlf.setPointSize( fontPoint );
746 QFontMetrics f( dlf ); 746 QFontMetrics f( dlf );
747 wid = f.width( "30" ); 747 wid = f.width( "30" );
748 needWid = wid * selCount; 748 needWid = wid * selCount;
749 if ( needWid < maxWid ) 749 if ( needWid < maxWid )
750 break; 750 break;
751 } 751 }
752 maxLen = 2; 752 maxLen = 2;
753 } 753 }
754 //qDebug("Max len %d ", dayTest.length() ); 754 //qDebug("Max len %d ", dayTest.length() );
755 if ( !KOPrefs::instance()->mTimeLabelsFont.bold() ) 755 if ( !KOPrefs::instance()->mTimeLabelsFont.bold() )
756 dlf.setBold( false ); 756 dlf.setBold( false );
757 QFontMetrics tempF( dlf ); 757 QFontMetrics tempF( dlf );
758 newHight = tempF.height(); 758 newHight = tempF.height();
759 mDayLabels->setFont( dlf ); 759 mDayLabels->setFont( dlf );
760 // mLayoutDayLabels = new QHBoxLayout(mDayLabels);; 760 // mLayoutDayLabels = new QHBoxLayout(mDayLabels);;
761 // mLayoutDayLabels->addSpacing(mTimeLabels->width()); 761 // mLayoutDayLabels->addSpacing(mTimeLabels->width());
762 //mLayoutDayLabels->addSpacing( 2 ); 762 //mLayoutDayLabels->addSpacing( 2 );
763 // QFont lFont = dlf; 763 // QFont lFont = dlf;
764 bool appendLabels = false; 764 bool appendLabels = false;
765 KOAgendaButton *dayLabel; 765 KOAgendaButton *dayLabel;
766 dayLabel = mDayLabelsList.first(); 766 dayLabel = mDayLabelsList.first();
767 if ( !dayLabel ) { 767 if ( !dayLabel ) {
768 appendLabels = true; 768 appendLabels = true;
769 dayLabel = getNewDaylabel(); 769 dayLabel = getNewDaylabel();
770 } 770 }
771 dayLabel->setFixedWidth( mTimeLabels->width()+mAgenda->frameWidth() ); 771 dayLabel->setFixedWidth( mTimeLabels->width()+mAgenda->frameWidth() );
772 dayLabel->setFont( dlf ); 772 dayLabel->setFont( dlf );
773 dayLabel->setNum( -1 ); 773 dayLabel->setNum( -1 );
774 //dayLabel->setAlignment(QLabel::AlignHCenter); 774 //dayLabel->setAlignment(QLabel::AlignHCenter);
775 775
776 dayLabel->setText( KOGlobals::self()->calendarSystem()->monthName( mSelectedDates.first(), true ) ); 776 dayLabel->setText( KOGlobals::self()->calendarSystem()->monthName( mSelectedDates.first(), true ) );
777 dayLabel->show(); 777 dayLabel->show();
778 DateList::ConstIterator dit; 778 DateList::ConstIterator dit;
779 bool oneday = (mSelectedDates.first() == mSelectedDates.last() ); 779 bool oneday = (mSelectedDates.first() == mSelectedDates.last() );
780 int counter = -1; 780 int counter = -1;
781 for( dit = mSelectedDates.begin(); dit != mSelectedDates.end(); ++dit ) { 781 for( dit = mSelectedDates.begin(); dit != mSelectedDates.end(); ++dit ) {
782 ++counter; 782 ++counter;
783 QDate date = *dit; 783 QDate date = *dit;
784 // QBoxLayout *dayLayout = new QVBoxLayout(mLayoutDayLabels); 784 // QBoxLayout *dayLayout = new QVBoxLayout(mLayoutDayLabels);
785 if ( ! appendLabels ) { 785 if ( ! appendLabels ) {
786 dayLabel = mDayLabelsList.next(); 786 dayLabel = mDayLabelsList.next();
787 if ( !dayLabel ) 787 if ( !dayLabel )
788 appendLabels = true; 788 appendLabels = true;
789 } 789 }
790 if ( appendLabels ) { 790 if ( appendLabels ) {
791 dayLabel = getNewDaylabel(); 791 dayLabel = getNewDaylabel();
792 } 792 }
793 dayLabel->setMinimumWidth( 1 ); 793 dayLabel->setMinimumWidth( 1 );
794 dayLabel->setMaximumWidth( 10240 ); 794 dayLabel->setMaximumWidth( 10240 );
795 dayLabel->setFont( dlf ); 795 dayLabel->setFont( dlf );
796 dayLabel->show(); 796 dayLabel->show();
797 dayLabel->setAutoRepeat( false ); 797 dayLabel->setAutoRepeat( false );
798 dayLabel->setNum( counter ); 798 dayLabel->setNum( counter );
799 QString str; 799 QString str;
800 int dW = KOGlobals::self()->calendarSystem()->dayOfWeek(date); 800 int dW = KOGlobals::self()->calendarSystem()->dayOfWeek(date);
801 QString dayName = KOGlobals::self()->calendarSystem()->weekDayName( dW, true ); 801 QString dayName = KOGlobals::self()->calendarSystem()->weekDayName( dW, true );
802 switch ( maxLen ) { 802 switch ( maxLen ) {
803 case 2: 803 case 2:
804 str = QString::number( date.day() ); 804 str = QString::number( date.day() );
805 break; 805 break;
806 806
807 case 3: 807 case 3:
808 str = dayName.left( 1 ) +QString::number( date.day()); 808 str = dayName.left( 1 ) +QString::number( date.day());
809 809
810 break; 810 break;
811 case 4: 811 case 4:
812 str = dayName.left( 1 ) + " " +QString::number( date.day()); 812 str = dayName.left( 1 ) + " " +QString::number( date.day());
813 813
814 break; 814 break;
815 case 5: 815 case 5:
816 str = dayName.left( 2 ) + " " +QString::number( date.day()); 816 str = dayName.left( 2 ) + " " +QString::number( date.day());
817 817
818 break; 818 break;
819 case 6: 819 case 6:
820 str = dayName.left( 3 ) + " " +QString::number( date.day()); 820 str = dayName.left( 3 ) + " " +QString::number( date.day());
821 break; 821 break;
822 822
823 default: 823 default:
824 break; 824 break;
825 } 825 }
826 if ( oneday ) { 826 if ( oneday ) {
827 QString addString; 827 QString addString;
828 if ( mSelectedDates.first() == QDateTime::currentDateTime().date() ) 828 if ( mSelectedDates.first() == QDateTime::currentDateTime().date() )
829 addString = i18n("Today"); 829 addString = i18n("Today");
830 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(1) ) 830 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(1) )
831 addString = i18n("Tomorrow"); 831 addString = i18n("Tomorrow");
832 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(-1) ) 832 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(-1) )
833 addString = i18n("Yesterday"); 833 addString = i18n("Yesterday");
834 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(-2) ) 834 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(-2) )
835 addString = i18n("Day before yesterday"); 835 addString = i18n("Day before yesterday");
836 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(2) ) 836 else if ( mSelectedDates.first() == QDateTime::currentDateTime().date().addDays(2) )
837 addString = i18n("Day after tomorrow"); 837 addString = i18n("Day after tomorrow");
838 if ( !addString.isEmpty() ) { 838 if ( !addString.isEmpty() ) {
839 if ( QApplication::desktop()->width() < 640 ) 839 if ( QApplication::desktop()->width() < 640 )
840 str = addString+", " + str; 840 str = addString+", " + str;
841 else 841 else
842 str = addString+", "+ KGlobal::locale()->formatDate( date, false); 842 str = addString+", "+ KGlobal::locale()->formatDate( date, false);
843 } else { 843 } else {
844 str = KGlobal::locale()->formatDate( date, KOPrefs::instance()->mShortDateInViewer); 844 str = KGlobal::locale()->formatDate( date, KOPrefs::instance()->mShortDateInViewer);
845 } 845 }
846 } 846 }
847 dayLabel->setText(str); 847 dayLabel->setText(str);
848 //dayLabel->setAlignment(QLabel::AlignHCenter); 848 //dayLabel->setAlignment(QLabel::AlignHCenter);
849 if (date == QDate::currentDate()) { 849 if (date == QDate::currentDate()) {
850 QFont bFont = dlf; 850 QFont bFont = dlf;
851 bFont.setBold( true ); 851 bFont.setBold( true );
852 dayLabel->setFont(bFont); 852 dayLabel->setFont(bFont);
853 } 853 }
854 //dayLayout->addWidget(dayLabel); 854 //dayLayout->addWidget(dayLabel);
855 855
856#ifndef KORG_NOPLUGINS 856#ifndef KORG_NOPLUGINS
857 CalendarDecoration::List cds = KOCore::self()->calendarDecorations(); 857 CalendarDecoration::List cds = KOCore::self()->calendarDecorations();
858 CalendarDecoration *it; 858 CalendarDecoration *it;
859 for(it = cds.first(); it; it = cds.next()) { 859 for(it = cds.first(); it; it = cds.next()) {
860 QString text = it->shortText( date ); 860 QString text = it->shortText( date );
861 if ( !text.isEmpty() ) { 861 if ( !text.isEmpty() ) {
862 QLabel *label = new QLabel(text,mDayLabels); 862 QLabel *label = new QLabel(text,mDayLabels);
863 label->setAlignment(AlignCenter); 863 label->setAlignment(AlignCenter);
864 dayLayout->addWidget(label); 864 dayLayout->addWidget(label);
865 } 865 }
866 } 866 }
867 867
868 for(it = cds.first(); it; it = cds.next()) { 868 for(it = cds.first(); it; it = cds.next()) {
869 QWidget *wid = it->smallWidget(mDayLabels,date); 869 QWidget *wid = it->smallWidget(mDayLabels,date);
870 if ( wid ) { 870 if ( wid ) {
871 // wid->setHeight(20); 871 // wid->setHeight(20);
872 dayLayout->addWidget(wid); 872 dayLayout->addWidget(wid);
873 } 873 }
874 } 874 }
875#endif 875#endif
876 } 876 }
877 if ( ! appendLabels ) { 877 if ( ! appendLabels ) {
878 dayLabel = mDayLabelsList.next(); 878 dayLabel = mDayLabelsList.next();
879 if ( !dayLabel ) 879 if ( !dayLabel )
880 appendLabels = true; 880 appendLabels = true;
881 } 881 }
882 if ( appendLabels ) { 882 if ( appendLabels ) {
883 dayLabel = getNewDaylabel(); 883 dayLabel = getNewDaylabel();
884 } 884 }
885 //dayLabel->hide();//test only 885 //dayLabel->hide();//test only
886 886
887 dayLabel->setText(">"); 887 dayLabel->setText(">");
888 dayLabel->setFont( dlf ); 888 dayLabel->setFont( dlf );
889 dayLabel->setAutoRepeat( true ); 889 dayLabel->setAutoRepeat( true );
890 dayLabel->show(); 890 dayLabel->show();
891 dayLabel->setNum( -2 ); 891 dayLabel->setNum( -2 );
892 dayLabel->setFixedWidth( mAgenda->verticalScrollBar()->width()+ widModulo ); 892 dayLabel->setFixedWidth( mAgenda->verticalScrollBar()->width()+ widModulo );
893 893
894 //mLayoutDayLabels->addSpacing(mAgenda->verticalScrollBar()->width()+ offset+2); 894 //mLayoutDayLabels->addSpacing(mAgenda->verticalScrollBar()->width()+ offset+2);
895 if ( !appendLabels ) { 895 if ( !appendLabels ) {
896 dayLabel = mDayLabelsList.next(); 896 dayLabel = mDayLabelsList.next();
897 while ( dayLabel ) { 897 while ( dayLabel ) {
898 //qDebug("!dayLabel %d",dayLabel ); 898 //qDebug("!dayLabel %d",dayLabel );
899 dayLabel->hide(); 899 dayLabel->hide();
900 dayLabel = mDayLabelsList.next(); 900 dayLabel = mDayLabelsList.next();
901 } 901 }
902 } 902 }
903 903
904 mDayLabelsFrame->setFixedHeight( newHight + 4 ); 904 mDayLabelsFrame->setFixedHeight( newHight + 4 );
905} 905}
906 906
907int KOAgendaView::maxDatesHint() 907int KOAgendaView::maxDatesHint()
908{ 908{
909 // Not sure about the max number of events, so return 0 for now. 909 // Not sure about the max number of events, so return 0 for now.
910 return 0; 910 return 0;
911} 911}
912 912
913int KOAgendaView::currentDateCount() 913int KOAgendaView::currentDateCount()
914{ 914{
915 return mSelectedDates.count(); 915 return mSelectedDates.count();
916} 916}
917 917
918QPtrList<Incidence> KOAgendaView::selectedIncidences() 918QPtrList<Incidence> KOAgendaView::selectedIncidences()
919{ 919{
920 QPtrList<Incidence> selected; 920 QPtrList<Incidence> selected;
921 Incidence *incidence; 921 Incidence *incidence;
922 922
923 incidence = mAgenda->selectedIncidence(); 923 incidence = mAgenda->selectedIncidence();
924 if (incidence) selected.append(incidence); 924 if (incidence) selected.append(incidence);
925 925
926 incidence = mAllDayAgenda->selectedIncidence(); 926 incidence = mAllDayAgenda->selectedIncidence();
927 if (incidence) selected.append(incidence); 927 if (incidence) selected.append(incidence);
928 928
929 return selected; 929 return selected;
930} 930}
931 931
932DateList KOAgendaView::selectedDates() 932DateList KOAgendaView::selectedDates()
933{ 933{
934 DateList selected; 934 DateList selected;
935 QDate qd; 935 QDate qd;
936 936
937 qd = mAgenda->selectedIncidenceDate(); 937 qd = mAgenda->selectedIncidenceDate();
938 if (qd.isValid()) selected.append(qd); 938 if (qd.isValid()) selected.append(qd);
939 939
940 qd = mAllDayAgenda->selectedIncidenceDate(); 940 qd = mAllDayAgenda->selectedIncidenceDate();
941 if (qd.isValid()) selected.append(qd); 941 if (qd.isValid()) selected.append(qd);
942 942
943 return selected; 943 return selected;
944} 944}
945 945
946 946
947void KOAgendaView::updateView() 947void KOAgendaView::updateView()
948{ 948{
949 if ( mBlockUpdating ) 949 if ( mBlockUpdating )
950 return; 950 return;
951 // kdDebug() << "KOAgendaView::updateView()" << endl; 951 // kdDebug() << "KOAgendaView::updateView()" << endl;
952 fillAgenda(); 952 fillAgenda();
953 953
954} 954}
955 955
956 956
957/* 957/*
958 Update configuration settings for the agenda view. This method is not 958 Update configuration settings for the agenda view. This method is not
959 complete. 959 complete.
960*/ 960*/
961void KOAgendaView::updateConfig() 961void KOAgendaView::updateConfig()
962{ 962{
963 if ( mBlockUpdating ) 963 if ( mBlockUpdating )
964 return; 964 return;
965 if ( mAgenda->height() > 96 * KOPrefs::instance()->mHourSize ) { 965 if ( mAgenda->height() > 96 * KOPrefs::instance()->mHourSize ) {
966 int old = KOPrefs::instance()->mHourSize; 966 int old = KOPrefs::instance()->mHourSize;
967 KOPrefs::instance()->mHourSize = mAgenda->height()/96 +1; 967 KOPrefs::instance()->mHourSize = mAgenda->height()/96 +1;
968 //qDebug("KOPrefs::instance()->mHourSize adjusted %d to %d ", old,KOPrefs::instance()->mHourSize ); 968 //qDebug("KOPrefs::instance()->mHourSize adjusted %d to %d ", old,KOPrefs::instance()->mHourSize );
969 } 969 }
970 970
971 971
972 // update config for children 972 // update config for children
973 mTimeLabels->updateConfig(); 973 mTimeLabels->updateConfig();
974 mAgenda->storePosition(); 974 mAgenda->storePosition();
975 mAgenda->updateConfig(); 975 mAgenda->updateConfig();
976 mAllDayAgenda->updateConfig(); 976 mAllDayAgenda->updateConfig();
977 // widget synchronization 977 // widget synchronization
978 //TODO: find a better way, maybe signal/slot 978 //TODO: find a better way, maybe signal/slot
979 mTimeLabels->positionChanged(); 979 mTimeLabels->positionChanged();
980 980
981 // for some reason, this needs to be called explicitly 981 // for some reason, this needs to be called explicitly
982 mTimeLabels->repaint(); 982 mTimeLabels->repaint();
983 983
984 mDummyAllDayLeft->setFixedWidth(mTimeLabels->width()); 984 mDummyAllDayLeft->setFixedWidth(mTimeLabels->width());
985 985
986 // ToolTips displaying summary of events 986 // ToolTips displaying summary of events
987 KOAgendaItem::toolTipGroup()->setEnabled(KOPrefs::instance() 987 KOAgendaItem::toolTipGroup()->setEnabled(KOPrefs::instance()
988 ->mEnableToolTips); 988 ->mEnableToolTips);
989 989
990 //setHolidayMasks(); 990 //setHolidayMasks();
991 991
992 //createDayLabels(); called by via updateView(); 992 //createDayLabels(); called by via updateView();
993 mEventIndicatorTop->setXOffset(mTimeLabels->width() + mAgenda->frameWidth()); 993 mEventIndicatorTop->setXOffset(mTimeLabels->width() + mAgenda->frameWidth());
994 updateView(); 994 updateView();
995 mAgenda->restorePosition(); 995 mAgenda->restorePosition();
996} 996}
997 997
998 998
999void KOAgendaView::updateEventDates(KOAgendaItem *item, int type) 999void KOAgendaView::updateEventDates(KOAgendaItem *item, int type)
1000{ 1000{
1001 1001
1002 1002
1003 int xxx = item->cellX(); 1003 int xxx = item->cellX();
1004 //qDebug("KOAgendaView::updateEventDates %d %d %d %d %d", xxx, mMinY.at(xxx),mMaxY.at(xxx),item->cellYTop(),item->cellYBottom() ); 1004 //qDebug("KOAgendaView::updateEventDates %d %d %d %d %d", xxx, mMinY.at(xxx),mMaxY.at(xxx),item->cellYTop(),item->cellYBottom() );
1005 if ( mMinY.at(xxx) > item->cellYTop() ) 1005 if ( mMinY.at(xxx) > item->cellYTop() )
1006 mMinY.at(xxx) = item->cellYTop(); 1006 mMinY.at(xxx) = item->cellYTop();
1007 if ( mMaxY.at(xxx) < item->cellYBottom() ) 1007 if ( mMaxY.at(xxx) < item->cellYBottom() )
1008 mMaxY.at(xxx) = item->cellYBottom(); 1008 mMaxY.at(xxx) = item->cellYBottom();
1009 1009
1010 QDateTime startDt,endDt; 1010 QDateTime startDt,endDt;
1011 QDate startDate; 1011 QDate startDate;
1012 int lenInSecs; 1012 int lenInSecs;
1013 // if ( type == KOAgenda::RESIZETOP ) 1013 // if ( type == KOAgenda::RESIZETOP )
1014 // qDebug("RESIZETOP "); 1014 // qDebug("RESIZETOP ");
1015 // if ( type == KOAgenda::RESIZEBOTTOM ) 1015 // if ( type == KOAgenda::RESIZEBOTTOM )
1016 // qDebug("RESIZEBOTTOM "); 1016 // qDebug("RESIZEBOTTOM ");
1017 // if ( type == KOAgenda::MOVE ) 1017 // if ( type == KOAgenda::MOVE )
1018 // qDebug("MOVE "); 1018 // qDebug("MOVE ");
1019 if ( item->incidence()->typeID() == eventID ) { 1019 if ( item->incidence()->typeID() == eventID ) {
1020 startDt =item->incidence()->dtStart(); 1020 startDt =item->incidence()->dtStart();
1021 endDt = item->incidence()->dtEnd(); 1021 endDt = item->incidence()->dtEnd();
1022 lenInSecs = startDt.secsTo( endDt ); 1022 lenInSecs = startDt.secsTo( endDt );
1023 } 1023 }
1024 1024
1025 // emit incidenceItemChanged( item->incidence(), KOGlobals::EVENTEDITED ); 1025 // emit incidenceItemChanged( item->incidence(), KOGlobals::EVENTEDITED );
1026 1026
1027 if ( item->incidence()->typeID()== todoID && item->mLastMoveXPos > 0 ) { 1027 if ( item->incidence()->typeID()== todoID && item->mLastMoveXPos > 0 ) {
1028 startDate = mSelectedDates[item->mLastMoveXPos]; 1028 startDate = mSelectedDates[item->mLastMoveXPos];
1029 } else { 1029 } else {
1030 if (item->cellX() < 0) { 1030 if (item->cellX() < 0) {
1031 startDate = (mSelectedDates.first()).addDays(item->cellX()); 1031 startDate = (mSelectedDates.first()).addDays(item->cellX());
1032 } else { 1032 } else {
1033 startDate = mSelectedDates[item->cellX()]; 1033 startDate = mSelectedDates[item->cellX()];
1034 } 1034 }
1035 } 1035 }
1036 startDt.setDate(startDate); 1036 startDt.setDate(startDate);
1037 1037
1038 if (item->incidence()->doesFloat()) { 1038 if (item->incidence()->doesFloat()) {
1039 endDt.setDate(startDate.addDays(item->cellWidth() - 1)); 1039 endDt.setDate(startDate.addDays(item->cellWidth() - 1));
1040 } else { 1040 } else {
1041 if ( type == KOAgenda::RESIZETOP || type == KOAgenda::MOVE ) 1041 if ( type == KOAgenda::RESIZETOP || type == KOAgenda::MOVE )
1042 startDt.setTime(mAgenda->gyToTime(item->cellYTop())); 1042 startDt.setTime(mAgenda->gyToTime(item->cellYTop()));
1043 if ( item->incidence()->typeID() == eventID ) { 1043 if ( item->incidence()->typeID() == eventID ) {
1044 if ( type == KOAgenda::MOVE ) { 1044 if ( type == KOAgenda::MOVE ) {
1045 endDt = startDt.addSecs(lenInSecs); 1045 endDt = startDt.addSecs(lenInSecs);
1046 1046
1047 } else if ( type == KOAgenda::RESIZEBOTTOM ) { 1047 } else if ( type == KOAgenda::RESIZEBOTTOM ) {
1048 if (item->lastMultiItem()) { 1048 if (item->lastMultiItem()) {
1049 endDt.setTime(mAgenda->gyToTime(item->lastMultiItem()->cellYBottom()+1)); 1049 endDt.setTime(mAgenda->gyToTime(item->lastMultiItem()->cellYBottom()+1));
1050 endDt.setDate(startDate. 1050 endDt.setDate(startDate.
1051 addDays(item->lastMultiItem()->cellX() - item->cellX())); 1051 addDays(item->lastMultiItem()->cellX() - item->cellX()));
1052 } else { 1052 } else {
1053 endDt.setTime(mAgenda->gyToTime(item->cellYBottom()+1)); 1053 endDt.setTime(mAgenda->gyToTime(item->cellYBottom()+1));
1054 endDt.setDate(startDate); 1054 endDt.setDate(startDate);
1055 } 1055 }
1056 } 1056 }
1057 } else { 1057 } else {
1058 // todo 1058 // todo
1059 if (item->lastMultiItem()) { 1059 if (item->lastMultiItem()) {
1060 endDt.setTime(mAgenda->gyToTime(item->lastMultiItem()->cellYBottom()+1)); 1060 endDt.setTime(mAgenda->gyToTime(item->lastMultiItem()->cellYBottom()+1));
1061 endDt.setDate(startDate. 1061 endDt.setDate(startDate.
1062 addDays(item->lastMultiItem()->cellX() - item->cellX())); 1062 addDays(item->lastMultiItem()->cellX() - item->cellX()));
1063 } else { 1063 } else {
1064 //qDebug("tem->cellYBottom() %d",item->cellYBottom() ); 1064 //qDebug("tem->cellYBottom() %d",item->cellYBottom() );
1065 if ( item->cellYBottom() > 0 ) 1065 if ( item->cellYBottom() > 0 )
1066 endDt.setTime(mAgenda->gyToTime(item->cellYBottom()+1)); 1066 endDt.setTime(mAgenda->gyToTime(item->cellYBottom()+1));
1067 else 1067 else
1068 endDt.setTime((static_cast<Todo*>(item->incidence()))->dtDue().time()); 1068 endDt.setTime((static_cast<Todo*>(item->incidence()))->dtDue().time());
1069 endDt.setDate(startDate); 1069 endDt.setDate(startDate);
1070 } 1070 }
1071 } 1071 }
1072 } 1072 }
1073 if ( item->incidence()->typeID() == eventID ) { 1073 if ( item->incidence()->typeID() == eventID ) {
1074 item->incidence()->setDtStart(startDt); 1074 item->incidence()->setDtStart(startDt);
1075 (static_cast<Event*>(item->incidence()))->setDtEnd(endDt); 1075 (static_cast<Event*>(item->incidence()))->setDtEnd(endDt);
1076 } else if ( item->incidence()->typeID() == todoID ) { 1076 } else if ( item->incidence()->typeID() == todoID ) {
1077 Todo* to = static_cast<Todo*>(item->incidence()); 1077 Todo* to = static_cast<Todo*>(item->incidence());
1078 1078
1079 to->setDtDue(endDt); 1079 to->setDtDue(endDt);
1080 if ( to->hasStartDate() ) { 1080 if ( to->hasStartDate() ) {
1081 if (to->dtStart() >= to->dtDue() ) 1081 if (to->dtStart() >= to->dtDue() )
1082 to->setDtStart(to->dtDue().addDays( -2 )); 1082 to->setDtStart(to->dtDue().addDays( -2 ));
1083 } 1083 }
1084 1084
1085 } 1085 }
1086 //qDebug("KOAgendaView::updateEventDates stsart %s end %s ", startDt.toString().latin1(), endDt.toString().latin1() ); 1086 //qDebug("KOAgendaView::updateEventDates stsart %s end %s ", startDt.toString().latin1(), endDt.toString().latin1() );
1087 item->incidence()->setRevision(item->incidence()->revision()+1); 1087 item->incidence()->setRevision(item->incidence()->revision()+1);
1088 item->setItemDate(startDt.date()); 1088 item->setItemDate(startDt.date());
1089 //item->updateItem(); 1089 //item->updateItem();
1090 if ( item->incidence()->typeID() == todoID ) { 1090 if ( item->incidence()->typeID() == todoID ) {
1091 emit todoMoved((Todo*)item->incidence(), KOGlobals::EVENTEDITED ); 1091 emit todoMoved((Todo*)item->incidence(), KOGlobals::EVENTEDITED );
1092 1092
1093 } 1093 }
1094 else 1094 else
1095 emit incidenceChanged(item->incidence(), KOGlobals::EVENTEDITED); 1095 emit incidenceChanged(item->incidence(), KOGlobals::EVENTEDITED);
1096 item->updateItem(); 1096 item->updateItem();
1097} 1097}
1098 1098
1099void KOAgendaView::showDates( const QDate &start, const QDate &end ) 1099void KOAgendaView::showDates( const QDate &start, const QDate &end )
1100{ 1100{
1101 // kdDebug() << "KOAgendaView::selectDates" << endl; 1101 // kdDebug() << "KOAgendaView::selectDates" << endl;
1102 1102
1103 mSelectedDates.clear(); 1103 mSelectedDates.clear();
1104 // qDebug("KOAgendaView::showDates "); 1104 // qDebug("KOAgendaView::showDates ");
1105 QDate d = start; 1105 QDate d = start;
1106 while (d <= end) { 1106 while (d <= end) {
1107 mSelectedDates.append(d); 1107 mSelectedDates.append(d);
1108 d = d.addDays( 1 ); 1108 d = d.addDays( 1 );
1109 } 1109 }
1110 1110
1111 // and update the view 1111 // and update the view
1112 fillAgenda(); 1112 fillAgenda();
1113} 1113}
1114 1114
1115 1115
1116void KOAgendaView::showEvents(QPtrList<Event>) 1116void KOAgendaView::showEvents(QPtrList<Event>)
1117{ 1117{
1118 kdDebug() << "KOAgendaView::showEvents() is not yet implemented" << endl; 1118 kdDebug() << "KOAgendaView::showEvents() is not yet implemented" << endl;
1119} 1119}
1120 1120
1121void KOAgendaView::changeEventDisplay(Event *, int) 1121void KOAgendaView::changeEventDisplay(Event *, int)
1122{ 1122{
1123 // qDebug("KOAgendaView::changeEventDisplay "); 1123 // qDebug("KOAgendaView::changeEventDisplay ");
1124 // kdDebug() << "KOAgendaView::changeEventDisplay" << endl; 1124 // kdDebug() << "KOAgendaView::changeEventDisplay" << endl;
1125 // this should be re-written to be MUCH smarter. Right now we 1125 // this should be re-written to be MUCH smarter. Right now we
1126 // are just playing dumb. 1126 // are just playing dumb.
1127 fillAgenda(); 1127 fillAgenda();
1128} 1128}
1129 1129
1130void KOAgendaView::fillAgenda(const QDate &) 1130void KOAgendaView::fillAgenda(const QDate &)
1131{ 1131{
1132 // qDebug("KOAgendaView::fillAgenda "); 1132 // qDebug("KOAgendaView::fillAgenda ");
1133 fillAgenda(); 1133 fillAgenda();
1134} 1134}
1135 1135
1136void KOAgendaView::fillAgenda() 1136void KOAgendaView::fillAgenda()
1137{ 1137{
1138 if ( globalFlagBlockStartup ) 1138 if ( globalFlagBlockStartup )
1139 return; 1139 return;
1140 if ( globalFlagBlockAgenda == 1 ) 1140 if ( globalFlagBlockAgenda == 1 )
1141 return; 1141 return;
1142 static bool onlyOne = false; 1142 static bool onlyOne = false;
1143 if ( onlyOne ) 1143 if ( onlyOne )
1144 return; 1144 return;
1145 onlyOne = true; 1145 onlyOne = true;
1146 //if ( globalFlagBlockAgenda == 2 ) 1146 //if ( globalFlagBlockAgenda == 2 )
1147 //globalFlagBlockAgenda = 0; 1147 //globalFlagBlockAgenda = 0;
1148 // globalFlagBlockPainting = false; 1148 // globalFlagBlockPainting = false;
1149 if ( globalFlagBlockAgenda == 0 ) 1149 if ( globalFlagBlockAgenda == 0 )
1150 globalFlagBlockAgenda = 1; 1150 globalFlagBlockAgenda = 1;
1151 // clearView(); 1151 // clearView();
1152 //qDebug("fillAgenda()++++ "); 1152 //qDebug("fillAgenda()++++ ");
1153 globalFlagBlockAgendaItemPaint = 1; 1153 globalFlagBlockAgendaItemPaint = 1;
1154 1154
1155 mAllDayAgenda->changeColumns(mSelectedDates.count()); 1155 mAllDayAgenda->changeColumns(mSelectedDates.count());
1156 mAgenda->changeColumns(mSelectedDates.count()); 1156 mAgenda->changeColumns(mSelectedDates.count());
1157 qApp->processEvents(); 1157 qApp->processEvents();
1158 mEventIndicatorTop->changeColumns(mSelectedDates.count()); 1158 mEventIndicatorTop->changeColumns(mSelectedDates.count());
1159 mEventIndicatorBottom->changeColumns(mSelectedDates.count()); 1159 mEventIndicatorBottom->changeColumns(mSelectedDates.count());
1160 setHolidayMasks(); 1160 setHolidayMasks();
1161 1161
1162 mMinY.resize(mSelectedDates.count()); 1162 mMinY.resize(mSelectedDates.count());
1163 mMaxY.resize(mSelectedDates.count()); 1163 mMaxY.resize(mSelectedDates.count());
1164 1164
1165 QPtrList<Event> dayEvents; 1165 QPtrList<Event> dayEvents;
1166 1166
1167 // ToDo items shall be displayed for the day they are due, but only showed today if they are already overdue. 1167 // ToDo items shall be displayed for the day they are due, but only showed today if they are already overdue.
1168 // Therefore, gtodoset all of them. 1168 // Therefore, gtodoset all of them.
1169 QPtrList<Todo> todos = calendar()->todos(); 1169 QPtrList<Todo> todos = calendar()->todos();
1170 1170
1171 mAgenda->setDateList(mSelectedDates); 1171 mAgenda->setDateList(mSelectedDates);
1172 1172
1173 QDate today = QDate::currentDate(); 1173 QDate today = QDate::currentDate();
1174 1174
1175 DateList::ConstIterator dit; 1175 DateList::ConstIterator dit;
1176 int curCol = 0; 1176 int curCol = 0;
1177 int maxCol = mSelectedDates.count()-1; 1177 int maxCol = mSelectedDates.count()-1;
1178 for( dit = mSelectedDates.begin(); dit != mSelectedDates.end(); ++dit ) { 1178 for( dit = mSelectedDates.begin(); dit != mSelectedDates.end(); ++dit ) {
1179 QDate currentDate = *dit; 1179 QDate currentDate = *dit;
1180 // kdDebug() << "KOAgendaView::fillAgenda(): " << currentDate.toString() 1180 // kdDebug() << "KOAgendaView::fillAgenda(): " << currentDate.toString()
1181 // << endl; 1181 // << endl;
1182 1182
1183 dayEvents = calendar()->events(currentDate,false); 1183 dayEvents = calendar()->events(currentDate,false);
1184 1184
1185 // Default values, which can never be reached 1185 // Default values, which can never be reached
1186 mMinY[curCol] = mAgenda->timeToY(QTime(23,59)) + 1; 1186 mMinY[curCol] = mAgenda->timeToY(QTime(23,59)) + 1;
1187 mMaxY[curCol] = mAgenda->timeToY(QTime(0,0)) - 1; 1187 mMaxY[curCol] = mAgenda->timeToY(QTime(0,0)) - 1;
1188 1188
1189 unsigned int numEvent; 1189 unsigned int numEvent;
1190 //qDebug("+++++NUMEVENT %d", dayEvents.count()); 1190 //qDebug("+++++NUMEVENT %d", dayEvents.count());
1191 for(numEvent=0;numEvent<dayEvents.count();++numEvent) { 1191 for(numEvent=0;numEvent<dayEvents.count();++numEvent) {
1192 Event *event = dayEvents.at(numEvent); 1192 Event *event = dayEvents.at(numEvent);
1193 if ( !KOPrefs::instance()->mShowSyncEvents && event->uid().left(2) == QString("la") ) 1193 if ( !KOPrefs::instance()->mShowSyncEvents && event->uid().left(2) == QString("la") )
1194 if ( event->uid().left(15) == QString("last-syncEvent-") ) 1194 if ( event->uid().left(15) == QString("last-syncEvent-") )
1195 continue; 1195 continue;
1196 // kdDebug() << " Event: " << event->summary() << endl; 1196 // kdDebug() << " Event: " << event->summary() << endl;
1197 1197
1198 int beginX = currentDate.daysTo(event->dtStart().date()) + curCol; 1198 int beginX = currentDate.daysTo(event->dtStart().date()) + curCol;
1199 int endX = currentDate.daysTo(event->dtEnd().date()) + curCol; 1199 int endX = currentDate.daysTo(event->dtEnd().date()) + curCol;
1200 1200
1201 // kdDebug() << " beginX: " << beginX << " endX: " << endX << endl; 1201 // kdDebug() << " beginX: " << beginX << " endX: " << endX << endl;
1202 1202
1203 if (event->doesFloat()) { 1203 if (event->doesFloat()) {
1204 if (event->recurrence()->doesRecur()) { 1204 if (event->doesRecur()) {
1205 if (event->isMultiDay() ) { 1205 if (event->isMultiDay() ) {
1206 endX = endX - beginX;// endX is now number of days 1206 endX = endX - beginX;// endX is now number of days
1207 if ( event->recursOn( currentDate ) ) { 1207 if ( event->recursOn( currentDate ) ) {
1208 endX += curCol; 1208 endX += curCol;
1209 beginX = curCol; 1209 beginX = curCol;
1210 mAllDayAgenda->insertAllDayItem(event,currentDate,beginX,endX); 1210 mAllDayAgenda->insertAllDayItem(event,currentDate,beginX,endX);
1211 } else { 1211 } else {
1212 //qDebug("days endX %d curCol %d max Col %d %s",endX ,curCol, maxCol, currentDate.toString().latin1()); 1212 //qDebug("days endX %d curCol %d max Col %d %s",endX ,curCol, maxCol, currentDate.toString().latin1());
1213 if ( curCol == maxCol && maxCol+1 < endX ) { 1213 if ( curCol == maxCol && maxCol+1 < endX ) {
1214 int i; 1214 int i;
1215 for ( i = 1; i< endX; ++i ) { 1215 for ( i = 1; i< endX; ++i ) {
1216 if ( event->recursOn( currentDate.addDays( -i ) ) ) 1216 if ( event->recursOn( currentDate.addDays( -i ) ) )
1217 break; 1217 break;
1218 } 1218 }
1219 if ( i > maxCol ) { 1219 if ( i > maxCol ) {
1220 mAllDayAgenda->insertAllDayItem(event,currentDate,0,curCol); 1220 mAllDayAgenda->insertAllDayItem(event,currentDate,0,curCol);
1221 //qDebug("BINGO "); 1221 //qDebug("BINGO ");
1222 } 1222 }
1223 1223
1224 } else { 1224 } else {
1225 QDate dateit = currentDate.addDays( -endX ); 1225 QDate dateit = currentDate.addDays( -endX );
1226 if ( event->recursOn( dateit ) ) { 1226 if ( event->recursOn( dateit ) ) {
1227 //qDebug("found %d %d %d %s", endX,curCol, curCol-endX ,dateit.toString().latin1() ); 1227 //qDebug("found %d %d %d %s", endX,curCol, curCol-endX ,dateit.toString().latin1() );
1228 if ( curCol-endX < 0 ) { 1228 if ( curCol-endX < 0 ) {
1229 mAllDayAgenda->insertAllDayItem(event,currentDate,0,curCol); 1229 mAllDayAgenda->insertAllDayItem(event,currentDate,0,curCol);
1230 } 1230 }
1231 } 1231 }
1232 } 1232 }
1233 } 1233 }
1234 } else { 1234 } else {
1235 mAllDayAgenda->insertAllDayItem(event,currentDate,curCol,curCol); 1235 mAllDayAgenda->insertAllDayItem(event,currentDate,curCol,curCol);
1236 } 1236 }
1237 1237
1238 } else { 1238 } else {
1239 if (beginX <= 0 && curCol == 0) { 1239 if (beginX <= 0 && curCol == 0) {
1240 mAllDayAgenda->insertAllDayItem(event,currentDate,beginX,endX); 1240 mAllDayAgenda->insertAllDayItem(event,currentDate,beginX,endX);
1241 } else if (beginX == curCol) { 1241 } else if (beginX == curCol) {
1242 mAllDayAgenda->insertAllDayItem(event,currentDate,beginX,endX); 1242 mAllDayAgenda->insertAllDayItem(event,currentDate,beginX,endX);
1243 } 1243 }
1244 } 1244 }
1245 } else if (event->isMultiDay()) { 1245 } else if (event->isMultiDay()) {
1246 if ( event->doesRecur () ) { 1246 if ( event->doesRecur () ) {
1247 QDate dateit = currentDate; 1247 QDate dateit = currentDate;
1248 int count = 0; 1248 int count = 0;
1249 int max = event->dtStart().daysTo( event->dtEnd() ) +2; 1249 int max = event->dtStart().daysTo( event->dtEnd() ) +2;
1250 while (! event->recursOn( dateit ) && count <= max ) { 1250 while (! event->recursOn( dateit ) && count <= max ) {
1251 ++count; 1251 ++count;
1252 dateit = dateit.addDays( -1 ); 1252 dateit = dateit.addDays( -1 );
1253 } 1253 }
1254 bool ok; 1254 bool ok;
1255 QDateTime nextOcstart = event->getNextOccurence( QDateTime(dateit) ,&ok ); 1255 QDateTime nextOcstart = event->getNextOccurence( QDateTime(dateit) ,&ok );
1256 if ( ok ) 1256 if ( ok )
1257 { 1257 {
1258 int secs = event->dtStart().secsTo( event->dtEnd() ); 1258 int secs = event->dtStart().secsTo( event->dtEnd() );
1259 QDateTime nextOcend =nextOcstart.addSecs( secs ); ; 1259 QDateTime nextOcend =nextOcstart.addSecs( secs ); ;
1260 beginX = currentDate.daysTo(nextOcstart.date()) + curCol; 1260 beginX = currentDate.daysTo(nextOcstart.date()) + curCol;
1261 endX = currentDate.daysTo(nextOcend.date()) + curCol; 1261 endX = currentDate.daysTo(nextOcend.date()) + curCol;
1262 1262
1263 } 1263 }
1264 } 1264 }
1265 int startY = mAgenda->timeToY(event->dtStart().time()); 1265 int startY = mAgenda->timeToY(event->dtStart().time());
1266 int endY = mAgenda->timeToY(event->dtEnd().time()) - 1; 1266 int endY = mAgenda->timeToY(event->dtEnd().time()) - 1;
1267 //qDebug("insert %d %d %d %d %d ",beginX,endX,startY,endY , curCol ); 1267 //qDebug("insert %d %d %d %d %d ",beginX,endX,startY,endY , curCol );
1268 if ((beginX <= 0 && curCol == 0) || beginX == curCol) { 1268 if ((beginX <= 0 && curCol == 0) || beginX == curCol) {
1269 //qDebug("insert!!! "); 1269 //qDebug("insert!!! ");
1270 mAgenda->insertMultiItem(event,currentDate,beginX,endX,startY,endY); 1270 mAgenda->insertMultiItem(event,currentDate,beginX,endX,startY,endY);
1271 } 1271 }
1272 if (beginX == curCol) { 1272 if (beginX == curCol) {
1273 mMaxY[curCol] = mAgenda->timeToY(QTime(23,59)); 1273 mMaxY[curCol] = mAgenda->timeToY(QTime(23,59));
1274 if (startY < mMinY[curCol]) mMinY[curCol] = startY; 1274 if (startY < mMinY[curCol]) mMinY[curCol] = startY;
1275 } else if (endX == curCol) { 1275 } else if (endX == curCol) {
1276 mMinY[curCol] = mAgenda->timeToY(QTime(0,0)); 1276 mMinY[curCol] = mAgenda->timeToY(QTime(0,0));
1277 if (endY > mMaxY[curCol]) mMaxY[curCol] = endY; 1277 if (endY > mMaxY[curCol]) mMaxY[curCol] = endY;
1278 } else { 1278 } else {
1279 mMinY[curCol] = mAgenda->timeToY(QTime(0,0)); 1279 mMinY[curCol] = mAgenda->timeToY(QTime(0,0));
1280 mMaxY[curCol] = mAgenda->timeToY(QTime(23,59)); 1280 mMaxY[curCol] = mAgenda->timeToY(QTime(23,59));
1281 } 1281 }
1282 } else { 1282 } else {
1283 int startY = mAgenda->timeToY(event->dtStart().time()); 1283 int startY = mAgenda->timeToY(event->dtStart().time());
1284 int endY = mAgenda->timeToY(event->dtEnd().time()) - 1; 1284 int endY = mAgenda->timeToY(event->dtEnd().time()) - 1;
1285 if (endY < startY) endY = startY; 1285 if (endY < startY) endY = startY;
1286 mAgenda->insertItem(event,currentDate,curCol,startY,endY); 1286 mAgenda->insertItem(event,currentDate,curCol,startY,endY);
1287 if (startY < mMinY[curCol]) mMinY[curCol] = startY; 1287 if (startY < mMinY[curCol]) mMinY[curCol] = startY;
1288 if (endY > mMaxY[curCol]) mMaxY[curCol] = endY; 1288 if (endY > mMaxY[curCol]) mMaxY[curCol] = endY;
1289 } 1289 }
1290 } 1290 }
1291 // ---------- [display Todos -------------- 1291 // ---------- [display Todos --------------
1292 unsigned int numTodo; 1292 unsigned int numTodo;
1293 for (numTodo = 0; numTodo < todos.count(); ++numTodo) { 1293 for (numTodo = 0; numTodo < todos.count(); ++numTodo) {
1294 Todo *todo = todos.at(numTodo); 1294 Todo *todo = todos.at(numTodo);
1295 1295
1296 if ( ! todo->hasDueDate() && !todo->hasCompletedDate()) continue; // todo shall not be displayed if it has no date 1296 if ( ! todo->hasDueDate() && !todo->hasCompletedDate()) continue; // todo shall not be displayed if it has no date
1297 if ( todo->hasCompletedDate() && !KOPrefs::instance()->mShowCompletedTodoInAgenda ) continue; 1297 if ( todo->hasCompletedDate() && !KOPrefs::instance()->mShowCompletedTodoInAgenda ) continue;
1298 // ToDo items shall be displayed for the day they are due, but only showed today if they are already overdue. 1298 // ToDo items shall be displayed for the day they are due, but only showed today if they are already overdue.
1299 // Already completed items can be displayed on their original due date 1299 // Already completed items can be displayed on their original due date
1300 //if not KOPrefs::instance()->mShowTodoInAgenda, show overdue in agenda 1300 //if not KOPrefs::instance()->mShowTodoInAgenda, show overdue in agenda
1301 bool overdue = (!todo->isCompleted()) && (todo->dtDue() < today) && KOPrefs::instance()->mShowTodoInAgenda; 1301 bool overdue = (!todo->isCompleted()) && (todo->dtDue() < today) && KOPrefs::instance()->mShowTodoInAgenda;
1302 bool fillIn = false; 1302 bool fillIn = false;
1303 if ( todo->hasCompletedDate() && todo->completed().date() == currentDate ) 1303 if ( todo->hasCompletedDate() && todo->completed().date() == currentDate )
1304 fillIn = true; 1304 fillIn = true;
1305 if ( ! fillIn && !todo->hasCompletedDate() ) 1305 if ( ! fillIn && !todo->hasCompletedDate() )
1306 fillIn = ((todo->dtDue().date() == currentDate) && !overdue) || ((currentDate == today) && overdue); 1306 fillIn = ((todo->dtDue().date() == currentDate) && !overdue) || ((currentDate == today) && overdue);
1307 if ( fillIn ) { 1307 if ( fillIn ) {
1308 if ( (todo->doesFloat() || overdue ) && !todo->hasCompletedDate() ) { // Todo has no due-time set or is already overdue 1308 if ( (todo->doesFloat() || overdue ) && !todo->hasCompletedDate() ) { // Todo has no due-time set or is already overdue
1309 if ( KOPrefs::instance()->mShowTodoInAgenda ) 1309 if ( KOPrefs::instance()->mShowTodoInAgenda )
1310 mAllDayAgenda->insertAllDayItem(todo, currentDate, curCol, curCol); 1310 mAllDayAgenda->insertAllDayItem(todo, currentDate, curCol, curCol);
1311 } 1311 }
1312 else { 1312 else {
1313 QDateTime dt; 1313 QDateTime dt;
1314 if ( todo->hasCompletedDate() ) 1314 if ( todo->hasCompletedDate() )
1315 dt = todo->completed(); 1315 dt = todo->completed();
1316 else 1316 else
1317 dt = todo->dtDue();; 1317 dt = todo->dtDue();;
1318 1318
1319 1319
1320 int endY = mAgenda->timeToY(dt.time()) - 1; 1320 int endY = mAgenda->timeToY(dt.time()) - 1;
1321 int hi = (18/KOPrefs::instance()->mHourSize); 1321 int hi = (18/KOPrefs::instance()->mHourSize);
1322 //qDebug("hei %d ",KOPrefs::instance()->mHourSize); 1322 //qDebug("hei %d ",KOPrefs::instance()->mHourSize);
1323 int startY = endY -hi; 1323 int startY = endY -hi;
1324 1324
1325 mAgenda->insertItem(todo,currentDate,curCol,startY,endY); 1325 mAgenda->insertItem(todo,currentDate,curCol,startY,endY);
1326 1326
1327 if (startY < mMinY[curCol]) mMinY[curCol] = startY; 1327 if (startY < mMinY[curCol]) mMinY[curCol] = startY;
1328 if (endY > mMaxY[curCol]) mMaxY[curCol] = endY; 1328 if (endY > mMaxY[curCol]) mMaxY[curCol] = endY;
1329 } 1329 }
1330 } 1330 }
1331 } 1331 }
1332 // ---------- display Todos] -------------- 1332 // ---------- display Todos] --------------
1333 1333
1334 ++curCol; 1334 ++curCol;
1335 } 1335 }
1336 mAgenda->hideUnused(); 1336 mAgenda->hideUnused();
1337 mAllDayAgenda->hideUnused(); 1337 mAllDayAgenda->hideUnused();
1338 mAgenda->checkScrollBoundaries(); 1338 mAgenda->checkScrollBoundaries();
1339 deleteSelectedDateTime(); 1339 deleteSelectedDateTime();
1340 createDayLabels(); 1340 createDayLabels();
1341 emit incidenceSelected( 0 ); 1341 emit incidenceSelected( 0 );
1342 1342
1343 if ( globalFlagBlockAgenda == 2 ) { 1343 if ( globalFlagBlockAgenda == 2 ) {
1344 if ( KOPrefs::instance()->mSetTimeToDayStartAt ) 1344 if ( KOPrefs::instance()->mSetTimeToDayStartAt )
1345 setStartHour( KOPrefs::instance()->mDayBegins ); 1345 setStartHour( KOPrefs::instance()->mDayBegins );
1346 else if ( KOPrefs::instance()->mCenterOnCurrentTime ) 1346 else if ( KOPrefs::instance()->mCenterOnCurrentTime )
1347 setStartHour( QTime::currentTime ().hour() ); 1347 setStartHour( QTime::currentTime ().hour() );
1348 } 1348 }
1349 qApp->processEvents(); 1349 qApp->processEvents();
1350 globalFlagBlockAgenda = 0; 1350 globalFlagBlockAgenda = 0;
1351 mAllDayAgenda->drawContentsToPainter(); 1351 mAllDayAgenda->drawContentsToPainter();
1352 mAgenda->drawContentsToPainter(); 1352 mAgenda->drawContentsToPainter();
1353 repaintAgenda(); 1353 repaintAgenda();
1354 startIdleTimeout(); 1354 startIdleTimeout();
1355 onlyOne = false; 1355 onlyOne = false;
1356} 1356}
1357void KOAgendaView::repaintAgenda() 1357void KOAgendaView::repaintAgenda()
1358{ 1358{
1359 mAgenda->viewport()->repaint( false ); 1359 mAgenda->viewport()->repaint( false );
1360 mAllDayAgenda->viewport()->repaint( false ); 1360 mAllDayAgenda->viewport()->repaint( false );
1361 mAgenda->finishUpdate(); 1361 mAgenda->finishUpdate();
1362 mAllDayAgenda->finishUpdate(); 1362 mAllDayAgenda->finishUpdate();
1363} 1363}
1364 1364
1365 1365
1366void KOAgendaView::clearView() 1366void KOAgendaView::clearView()
1367{ 1367{
1368 mAllDayAgenda->clear(); 1368 mAllDayAgenda->clear();
1369 mAgenda->clear(); 1369 mAgenda->clear();
1370} 1370}
1371void KOAgendaView::clearList() 1371void KOAgendaView::clearList()
1372{ 1372{
1373 clearView(); 1373 clearView();
1374 mAllDayAgenda->hideUnused(); 1374 mAllDayAgenda->hideUnused();
1375 mAgenda->hideUnused(); 1375 mAgenda->hideUnused();
1376} 1376}
1377 1377
1378void KOAgendaView::printPreview(CalPrinter *calPrinter, const QDate &fd, 1378void KOAgendaView::printPreview(CalPrinter *calPrinter, const QDate &fd,
1379 const QDate &td) 1379 const QDate &td)
1380{ 1380{
1381#ifndef KORG_NOPRINTER 1381#ifndef KORG_NOPRINTER
1382 if (fd == td) 1382 if (fd == td)
1383 calPrinter->preview(CalPrinter::Day, fd, td); 1383 calPrinter->preview(CalPrinter::Day, fd, td);
1384 else 1384 else
1385 calPrinter->preview(CalPrinter::Week, fd, td); 1385 calPrinter->preview(CalPrinter::Week, fd, td);
1386#endif 1386#endif
1387} 1387}
1388 1388
1389// void KOAgendaView::updateMovedTodo() 1389// void KOAgendaView::updateMovedTodo()
1390// { 1390// {
1391// // updateConfig(); 1391// // updateConfig();
1392// // emit updateTodoViews(); 1392// // emit updateTodoViews();
1393// } 1393// }
1394 1394
1395void KOAgendaView::slotShowDateView( int mode , int d ) 1395void KOAgendaView::slotShowDateView( int mode , int d )
1396{ 1396{
1397 if ( d >= mSelectedDates.count() ) { 1397 if ( d >= mSelectedDates.count() ) {
1398 qDebug("KOAgendaView::slotShowDateView datecounterror %d %d ", d, mSelectedDates.count() ); 1398 qDebug("KOAgendaView::slotShowDateView datecounterror %d %d ", d, mSelectedDates.count() );
1399 1399
1400 } else { 1400 } else {
1401 QDate day = mSelectedDates[d]; 1401 QDate day = mSelectedDates[d];
1402 emit showDateView(mode , day ); 1402 emit showDateView(mode , day );
1403 } 1403 }
1404 1404
1405} 1405}
1406void KOAgendaView::newEvent(int gx, int gy) 1406void KOAgendaView::newEvent(int gx, int gy)
1407{ 1407{
1408 if (!mSelectedDates.count()) return; 1408 if (!mSelectedDates.count()) return;
1409 1409
1410 QDate day = mSelectedDates[gx]; 1410 QDate day = mSelectedDates[gx];
1411 1411
1412 QTime time = mAgenda->gyToTime(gy); 1412 QTime time = mAgenda->gyToTime(gy);
1413 QDateTime dt(day,time); 1413 QDateTime dt(day,time);
1414 // if ( dt < QDateTime::currentDateTime () ) 1414 // if ( dt < QDateTime::currentDateTime () )
1415 // dt = QDateTime::currentDateTime ().addSecs( 3600 ); 1415 // dt = QDateTime::currentDateTime ().addSecs( 3600 );
1416 emit newEventSignal(dt); 1416 emit newEventSignal(dt);
1417} 1417}
1418 1418
1419void KOAgendaView::newEvent(int gxStart, int gyStart, int gxEnd, int gyEnd) 1419void KOAgendaView::newEvent(int gxStart, int gyStart, int gxEnd, int gyEnd)
1420{ 1420{
1421 if (!mSelectedDates.count()) return; 1421 if (!mSelectedDates.count()) return;
1422 1422
1423 QDate dayStart = mSelectedDates[gxStart]; 1423 QDate dayStart = mSelectedDates[gxStart];
1424 QDate dayEnd = mSelectedDates[gxEnd]; 1424 QDate dayEnd = mSelectedDates[gxEnd];
1425 1425
1426 QTime timeStart = mAgenda->gyToTime(gyStart); 1426 QTime timeStart = mAgenda->gyToTime(gyStart);
1427 QTime timeEnd = mAgenda->gyToTime( gyEnd + 1 ); 1427 QTime timeEnd = mAgenda->gyToTime( gyEnd + 1 );
1428 1428
1429 QDateTime dtStart(dayStart,timeStart); 1429 QDateTime dtStart(dayStart,timeStart);
1430 QDateTime dtEnd(dayEnd,timeEnd); 1430 QDateTime dtEnd(dayEnd,timeEnd);
1431 1431
1432 emit newEventSignal(dtStart,dtEnd); 1432 emit newEventSignal(dtStart,dtEnd);
1433} 1433}
1434 1434
1435void KOAgendaView::newEventAllDay(int gx, int ) 1435void KOAgendaView::newEventAllDay(int gx, int )
1436{ 1436{
1437 if (!mSelectedDates.count()) return; 1437 if (!mSelectedDates.count()) return;
1438 1438
1439 QDate day = mSelectedDates[gx]; 1439 QDate day = mSelectedDates[gx];
1440 1440
1441 emit newEventSignal(day); 1441 emit newEventSignal(day);
1442} 1442}
1443void KOAgendaView::newTodoAllDay(int gx, int ) 1443void KOAgendaView::newTodoAllDay(int gx, int )
1444{ 1444{
1445 if (!mSelectedDates.count()) return; 1445 if (!mSelectedDates.count()) return;
1446 1446
1447 QDateTime day (mSelectedDates[gx] ); 1447 QDateTime day (mSelectedDates[gx] );
1448 emit newTodoSignal(day, true); 1448 emit newTodoSignal(day, true);
1449} 1449}
1450void KOAgendaView::newTodo(int gx, int gy ) 1450void KOAgendaView::newTodo(int gx, int gy )
1451{ 1451{
1452 if (!mSelectedDates.count()) return; 1452 if (!mSelectedDates.count()) return;
1453 QDate dayStart = mSelectedDates[gx]; 1453 QDate dayStart = mSelectedDates[gx];
1454 QTime timeStart = mAgenda->gyToTime(gy); 1454 QTime timeStart = mAgenda->gyToTime(gy);
1455 QDateTime dt (dayStart,timeStart); 1455 QDateTime dt (dayStart,timeStart);
1456 emit newTodoSignal( dt, false ); 1456 emit newTodoSignal( dt, false );
1457} 1457}
1458 1458
1459void KOAgendaView::updateEventIndicatorTop(int newY) 1459void KOAgendaView::updateEventIndicatorTop(int newY)
1460{ 1460{
1461 uint i; 1461 uint i;
1462 for(i=0;i<mMinY.size();++i) { 1462 for(i=0;i<mMinY.size();++i) {
1463 if (newY >= mMinY.at(i)) mEventIndicatorTop->enableColumn(i,true); 1463 if (newY >= mMinY.at(i)) mEventIndicatorTop->enableColumn(i,true);
1464 else mEventIndicatorTop->enableColumn(i,false); 1464 else mEventIndicatorTop->enableColumn(i,false);
1465 } 1465 }
1466 1466
1467 mEventIndicatorTop->update(); 1467 mEventIndicatorTop->update();
1468} 1468}
1469 1469
1470void KOAgendaView::updateEventIndicatorBottom(int newY) 1470void KOAgendaView::updateEventIndicatorBottom(int newY)
1471{ 1471{
1472 uint i; 1472 uint i;
1473 for(i=0;i<mMaxY.size();++i) { 1473 for(i=0;i<mMaxY.size();++i) {
1474 if (newY <= mMaxY.at(i)) mEventIndicatorBottom->enableColumn(i,true); 1474 if (newY <= mMaxY.at(i)) mEventIndicatorBottom->enableColumn(i,true);
1475 else mEventIndicatorBottom->enableColumn(i,false); 1475 else mEventIndicatorBottom->enableColumn(i,false);
1476 } 1476 }
1477 1477
1478 mEventIndicatorBottom->update(); 1478 mEventIndicatorBottom->update();
1479} 1479}
1480 1480
1481void KOAgendaView::startDrag(Event *event) 1481void KOAgendaView::startDrag(Event *event)
1482{ 1482{
1483#ifndef KORG_NODND 1483#ifndef KORG_NODND
1484 DndFactory factory( calendar() ); 1484 DndFactory factory( calendar() );
1485 ICalDrag *vd = factory.createDrag(event,this); 1485 ICalDrag *vd = factory.createDrag(event,this);
1486 if (vd->drag()) { 1486 if (vd->drag()) {
1487 kdDebug() << "KOAgendaView::startDrag(): Delete drag source" << endl; 1487 kdDebug() << "KOAgendaView::startDrag(): Delete drag source" << endl;
1488 } 1488 }
1489#endif 1489#endif
1490} 1490}
1491 1491
1492void KOAgendaView::readSettings() 1492void KOAgendaView::readSettings()
1493{ 1493{
1494 readSettings(KOGlobals::config()); 1494 readSettings(KOGlobals::config());
1495} 1495}
1496 1496
1497void KOAgendaView::readSettings(KConfig *config) 1497void KOAgendaView::readSettings(KConfig *config)
1498{ 1498{
1499 // kdDebug() << "KOAgendaView::readSettings()" << endl; 1499 // kdDebug() << "KOAgendaView::readSettings()" << endl;
1500 1500
1501 config->setGroup("Views"); 1501 config->setGroup("Views");
1502 1502
1503 //#ifndef KORG_NOSPLITTER 1503 //#ifndef KORG_NOSPLITTER
1504 QValueList<int> sizes = config->readIntListEntry("Separator AgendaView"); 1504 QValueList<int> sizes = config->readIntListEntry("Separator AgendaView");
1505 if (sizes.count() == 2) { 1505 if (sizes.count() == 2) {
1506 if ( sizes[0] < 20 ) { 1506 if ( sizes[0] < 20 ) {
1507 sizes[1] = sizes[1] +20 - sizes[0]; 1507 sizes[1] = sizes[1] +20 - sizes[0];
1508 sizes[0] = 20; 1508 sizes[0] = 20;
1509 } 1509 }
1510 mSplitterAgenda->setSizes(sizes); 1510 mSplitterAgenda->setSizes(sizes);
1511 // qDebug("read %d %d ",sizes[0],sizes[1] ); 1511 // qDebug("read %d %d ",sizes[0],sizes[1] );
1512 } 1512 }
1513 //#endif 1513 //#endif
1514 1514
1515 // updateConfig(); 1515 // updateConfig();
1516} 1516}
1517 1517
1518void KOAgendaView::writeSettings(KConfig *config) 1518void KOAgendaView::writeSettings(KConfig *config)
1519{ 1519{
1520 // kdDebug() << "KOAgendaView::writeSettings()" << endl; 1520 // kdDebug() << "KOAgendaView::writeSettings()" << endl;
1521 1521
1522 config->setGroup("Views"); 1522 config->setGroup("Views");
1523 1523
1524 //#ifndef KORG_NOSPLITTER 1524 //#ifndef KORG_NOSPLITTER
1525 QValueList<int> list = mSplitterAgenda->sizes(); 1525 QValueList<int> list = mSplitterAgenda->sizes();
1526 config->writeEntry("Separator AgendaView",list); 1526 config->writeEntry("Separator AgendaView",list);
1527 //qDebug("write %d %d ", list[0],list[1] ); 1527 //qDebug("write %d %d ", list[0],list[1] );
1528 //#endif 1528 //#endif
1529} 1529}
1530 1530
1531void KOAgendaView::setHolidayMasks() 1531void KOAgendaView::setHolidayMasks()
1532{ 1532{
1533 mHolidayMask.resize(mSelectedDates.count()); 1533 mHolidayMask.resize(mSelectedDates.count());
1534 1534
1535 uint i; 1535 uint i;
1536 for(i=0;i<mSelectedDates.count();++i) { 1536 for(i=0;i<mSelectedDates.count();++i) {
1537 QDate date = mSelectedDates[i]; 1537 QDate date = mSelectedDates[i];
1538 bool showSaturday = KOPrefs::instance()->mExcludeSaturdays && (date.dayOfWeek() == 6); 1538 bool showSaturday = KOPrefs::instance()->mExcludeSaturdays && (date.dayOfWeek() == 6);
1539 bool showSunday = KOPrefs::instance()->mExcludeHolidays && (date.dayOfWeek() == 7); 1539 bool showSunday = KOPrefs::instance()->mExcludeHolidays && (date.dayOfWeek() == 7);
1540 bool showHoliday = false; 1540 bool showHoliday = false;
1541 if ( KOPrefs::instance()->mExcludeHolidays ) { 1541 if ( KOPrefs::instance()->mExcludeHolidays ) {
1542 QPtrList<Event> events = calendar()->events( date, true ); 1542 QPtrList<Event> events = calendar()->events( date, true );
1543 Event *event; 1543 Event *event;
1544 for( event = events.first(); event; event = events.next() ) { 1544 for( event = events.first(); event; event = events.next() ) {
1545 if ( event->isHoliday()) { 1545 if ( event->isHoliday()) {
1546 showHoliday = true; 1546 showHoliday = true;
1547 break; 1547 break;
1548 } 1548 }
1549 } 1549 }
1550 1550
1551 } 1551 }
1552 1552
1553#ifndef KORG_NOPLUGINS 1553#ifndef KORG_NOPLUGINS
1554 bool showHoliday = KOPrefs::instance()->mExcludeHolidays && 1554 bool showHoliday = KOPrefs::instance()->mExcludeHolidays &&
1555 !KOCore::self()->holiday(date).isEmpty(); 1555 !KOCore::self()->holiday(date).isEmpty();
1556#endif 1556#endif
1557 bool showDay = showSaturday || showSunday || showHoliday; 1557 bool showDay = showSaturday || showSunday || showHoliday;
1558 1558
1559 if (showDay) { 1559 if (showDay) {
1560 mHolidayMask.at(i) = true; 1560 mHolidayMask.at(i) = true;
1561 } else { 1561 } else {
1562 mHolidayMask.at(i) = false; 1562 mHolidayMask.at(i) = false;
1563 } 1563 }
1564 } 1564 }
1565 1565
1566 mAgenda->setHolidayMask(&mHolidayMask); 1566 mAgenda->setHolidayMask(&mHolidayMask);
1567 mAllDayAgenda->setHolidayMask(&mHolidayMask); 1567 mAllDayAgenda->setHolidayMask(&mHolidayMask);
1568} 1568}
1569 1569
1570void KOAgendaView::setContentsPos(int y) 1570void KOAgendaView::setContentsPos(int y)
1571{ 1571{
1572 mAgenda->setContentsPos(0,y); 1572 mAgenda->setContentsPos(0,y);
1573} 1573}
1574 1574
1575void KOAgendaView::clearSelection() 1575void KOAgendaView::clearSelection()
1576{ 1576{
1577 mAgenda->deselectItem(); 1577 mAgenda->deselectItem();
1578 mAllDayAgenda->deselectItem(); 1578 mAllDayAgenda->deselectItem();
1579} 1579}
1580 1580
1581void KOAgendaView::newTimeSpanSelectedAllDay(int gxStart, int gyStart, 1581void KOAgendaView::newTimeSpanSelectedAllDay(int gxStart, int gyStart,
1582 int gxEnd, int gyEnd) 1582 int gxEnd, int gyEnd)
1583{ 1583{
1584 mTimeSpanInAllDay = true; 1584 mTimeSpanInAllDay = true;
1585 newTimeSpanSelected(gxStart,gyStart,gxEnd,gyEnd); 1585 newTimeSpanSelected(gxStart,gyStart,gxEnd,gyEnd);
1586} 1586}
1587 1587
1588 1588
1589 1589
1590 1590
1591void KOAgendaView::newTimeSpanSelected(int gxStart, int gyStart, 1591void KOAgendaView::newTimeSpanSelected(int gxStart, int gyStart,
1592 int gxEnd, int gyEnd) 1592 int gxEnd, int gyEnd)
1593{ 1593{
1594 if (!mSelectedDates.count()) return; 1594 if (!mSelectedDates.count()) return;
1595 1595
1596 QDate dayStart = mSelectedDates[gxStart]; 1596 QDate dayStart = mSelectedDates[gxStart];
1597 QDate dayEnd = mSelectedDates[gxEnd]; 1597 QDate dayEnd = mSelectedDates[gxEnd];
1598 1598
1599 QTime timeStart = mAgenda->gyToTime(gyStart); 1599 QTime timeStart = mAgenda->gyToTime(gyStart);
1600 QTime timeEnd = mAgenda->gyToTime( gyEnd + 1 ); 1600 QTime timeEnd = mAgenda->gyToTime( gyEnd + 1 );
1601 1601
1602 QDateTime dtStart(dayStart,timeStart); 1602 QDateTime dtStart(dayStart,timeStart);
1603 QDateTime dtEnd(dayEnd,timeEnd); 1603 QDateTime dtEnd(dayEnd,timeEnd);
1604 1604
1605 mTimeSpanBegin = dtStart; 1605 mTimeSpanBegin = dtStart;
1606 mTimeSpanEnd = dtEnd; 1606 mTimeSpanEnd = dtEnd;
1607 1607
1608} 1608}
1609 1609
1610void KOAgendaView::deleteSelectedDateTime() 1610void KOAgendaView::deleteSelectedDateTime()
1611{ 1611{
1612 mTimeSpanBegin.setDate(QDate()); 1612 mTimeSpanBegin.setDate(QDate());
1613 mTimeSpanEnd.setDate(QDate()); 1613 mTimeSpanEnd.setDate(QDate());
1614 mTimeSpanInAllDay = false; 1614 mTimeSpanInAllDay = false;
1615} 1615}
1616 1616
1617void KOAgendaView::keyPressEvent ( QKeyEvent * e ) 1617void KOAgendaView::keyPressEvent ( QKeyEvent * e )
1618{ 1618{
1619 e->ignore(); 1619 e->ignore();
1620} 1620}
1621 1621
1622void KOAgendaView::scrollOneHourUp() 1622void KOAgendaView::scrollOneHourUp()
1623{ 1623{
1624 1624
1625 mAgenda->scrollBy ( 0, -mAgenda->contentsHeight () / 24 ); 1625 mAgenda->scrollBy ( 0, -mAgenda->contentsHeight () / 24 );
1626} 1626}
1627void KOAgendaView::scrollOneHourDown() 1627void KOAgendaView::scrollOneHourDown()
1628{ 1628{
1629 mAgenda->scrollBy ( 0, mAgenda->contentsHeight () / 24 ); 1629 mAgenda->scrollBy ( 0, mAgenda->contentsHeight () / 24 );
1630} 1630}
1631 1631
1632void KOAgendaView::setStartHour( int h ) 1632void KOAgendaView::setStartHour( int h )
1633{ 1633{
1634 mAgenda->setStartHour( h ); 1634 mAgenda->setStartHour( h );
1635 1635
1636} 1636}
1637void KOAgendaView::setInitStartHour() 1637void KOAgendaView::setInitStartHour()
1638{ 1638{
1639 1639
1640 if ( KOPrefs::instance()->mCenterOnCurrentTime ) 1640 if ( KOPrefs::instance()->mCenterOnCurrentTime )
1641 setStartHour( QTime::currentTime ().hour() ); 1641 setStartHour( QTime::currentTime ().hour() );
1642 else 1642 else
1643 setStartHour( KOPrefs::instance()->mDayBegins ); 1643 setStartHour( KOPrefs::instance()->mDayBegins );
1644 1644
1645} 1645}
1646 1646
1647 1647
1648void KOAgendaView::updateTodo( Todo * t, int ) 1648void KOAgendaView::updateTodo( Todo * t, int )
1649{ 1649{
1650 if ( !isVisible() ) 1650 if ( !isVisible() )
1651 return; 1651 return;
1652 bool remove = false; 1652 bool remove = false;
1653 bool removeAD = false; 1653 bool removeAD = false;
1654 QDate da; 1654 QDate da;
1655 if ( t->hasCompletedDate() ) 1655 if ( t->hasCompletedDate() )
1656 da = t->completed().date(); 1656 da = t->completed().date();
1657 else 1657 else
1658 da = t->dtDue().date(); 1658 da = t->dtDue().date();
1659 if ( ! t->hasDueDate() && !t->hasCompletedDate() ) { 1659 if ( ! t->hasDueDate() && !t->hasCompletedDate() ) {
1660 remove = true; 1660 remove = true;
1661 removeAD = true; 1661 removeAD = true;
1662 } 1662 }
1663 else { 1663 else {
1664 bool overdue = (!t->isCompleted()) && (t->dtDue() < QDate::currentDate()) && KOPrefs::instance()->mShowTodoInAgenda ; 1664 bool overdue = (!t->isCompleted()) && (t->dtDue() < QDate::currentDate()) && KOPrefs::instance()->mShowTodoInAgenda ;
1665 if ( overdue && 1665 if ( overdue &&
1666 QDate::currentDate() >= mSelectedDates.first() && 1666 QDate::currentDate() >= mSelectedDates.first() &&
1667 QDate::currentDate() <= mSelectedDates.last()) { 1667 QDate::currentDate() <= mSelectedDates.last()) {
1668 removeAD = false; 1668 removeAD = false;
1669 remove = true; 1669 remove = true;
1670 } 1670 }
1671 else { 1671 else {
1672 1672
1673 if ( da < mSelectedDates.first() || 1673 if ( da < mSelectedDates.first() ||
1674 da > mSelectedDates.last() ) { 1674 da > mSelectedDates.last() ) {
1675 remove = true; 1675 remove = true;
1676 removeAD = true; 1676 removeAD = true;
1677 } else { 1677 } else {
1678 remove = t->doesFloat() && !t->hasCompletedDate(); 1678 remove = t->doesFloat() && !t->hasCompletedDate();
1679 removeAD = !remove; 1679 removeAD = !remove;
1680 } 1680 }
1681 } 1681 }
1682 } 1682 }
1683 int days = mSelectedDates.first().daysTo( da ); 1683 int days = mSelectedDates.first().daysTo( da );
1684 //qDebug("daysto %d %d %d", days, remove,removeAD ); 1684 //qDebug("daysto %d %d %d", days, remove,removeAD );
1685 mAgenda->updateTodo( t , days, remove); 1685 mAgenda->updateTodo( t , days, remove);
1686 if ( KOPrefs::instance()->mShowTodoInAgenda ) 1686 if ( KOPrefs::instance()->mShowTodoInAgenda )
1687 mAllDayAgenda->updateTodo( t , days, removeAD); 1687 mAllDayAgenda->updateTodo( t , days, removeAD);
1688 //qDebug("KOAgendaView::updateTodo( Todo *, int ) "); 1688 //qDebug("KOAgendaView::updateTodo( Todo *, int ) ");
1689 1689
1690} 1690}
diff --git a/korganizer/kodaymatrix.cpp b/korganizer/kodaymatrix.cpp
index ec1154a..057df0d 100644
--- a/korganizer/kodaymatrix.cpp
+++ b/korganizer/kodaymatrix.cpp
@@ -1,1217 +1,1217 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Eitzenberger Thomas <thomas.eitzenberger@siemens.at> 3 Copyright (c) 2001 Eitzenberger Thomas <thomas.eitzenberger@siemens.at>
4 Parts of the source code have been copied from kdpdatebutton.cpp 4 Parts of the source code have been copied from kdpdatebutton.cpp
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software 17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 19
20 As a special exception, permission is given to link this program 20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source ode for Qt in the source distribution. 22 without including the source ode for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qevent.h> 25#include <qevent.h>
26#include <qpainter.h> 26#include <qpainter.h>
27#include <qptrlist.h> 27#include <qptrlist.h>
28#include <qtimer.h> 28#include <qtimer.h>
29#include <qwhatsthis.h> 29#include <qwhatsthis.h>
30 30
31#include <kglobal.h> 31#include <kglobal.h>
32#include <kdebug.h> 32#include <kdebug.h>
33#include <klocale.h> 33#include <klocale.h>
34 34
35#include <libkcal/vcaldrag.h> 35#include <libkcal/vcaldrag.h>
36#include <libkcal/icaldrag.h> 36#include <libkcal/icaldrag.h>
37#include <libkcal/dndfactory.h> 37#include <libkcal/dndfactory.h>
38#include <libkcal/calendarresources.h> 38#include <libkcal/calendarresources.h>
39#include <libkcal/resourcecalendar.h> 39#include <libkcal/resourcecalendar.h>
40#include <kresources/resourceselectdialog.h> 40#include <kresources/resourceselectdialog.h>
41 41
42#include <kcalendarsystem.h> 42#include <kcalendarsystem.h>
43 43
44#ifndef KORG_NOPLUGINS 44#ifndef KORG_NOPLUGINS
45#include "kocore.h" 45#include "kocore.h"
46#endif 46#endif
47#include "koprefs.h" 47#include "koprefs.h"
48#include "koglobals.h" 48#include "koglobals.h"
49 49
50#include "kodaymatrix.h" 50#include "kodaymatrix.h"
51 51
52// ============================================================================ 52// ============================================================================
53// D Y N A M I C T I P 53// D Y N A M I C T I P
54// ============================================================================ 54// ============================================================================
55 55
56DynamicTip::DynamicTip( QWidget * parent ) 56DynamicTip::DynamicTip( QWidget * parent )
57 : QToolTip( parent ) 57 : QToolTip( parent )
58{ 58{
59 matrix = (KODayMatrix*)parent; 59 matrix = (KODayMatrix*)parent;
60} 60}
61 61
62class KODaymatrixWhatsThis :public QWhatsThis 62class KODaymatrixWhatsThis :public QWhatsThis
63{ 63{
64public: 64public:
65 KODaymatrixWhatsThis( KODayMatrix* view ) : QWhatsThis( view ),_view (view) { ;}; 65 KODaymatrixWhatsThis( KODayMatrix* view ) : QWhatsThis( view ),_view (view) { ;};
66 ~KODaymatrixWhatsThis() { ; }; 66 ~KODaymatrixWhatsThis() { ; };
67 67
68protected: 68protected:
69 virtual QString text( const QPoint& p ) 69 virtual QString text( const QPoint& p )
70 { 70 {
71 return _view->getWhatsThisText( p ) ; 71 return _view->getWhatsThisText( p ) ;
72 } 72 }
73private: 73private:
74 KODayMatrix * _view; 74 KODayMatrix * _view;
75}; 75};
76 76
77void DynamicTip::maybeTip( const QPoint &pos ) 77void DynamicTip::maybeTip( const QPoint &pos )
78{ 78{
79 //calculate which cell of the matrix the mouse is in 79 //calculate which cell of the matrix the mouse is in
80 QRect sz = matrix->frameRect(); 80 QRect sz = matrix->frameRect();
81 int dheight = sz.height()*7 / 42; 81 int dheight = sz.height()*7 / 42;
82 int dwidth = sz.width() / 7; 82 int dwidth = sz.width() / 7;
83 int row = pos.y()/dheight; 83 int row = pos.y()/dheight;
84 int col = pos.x()/dwidth; 84 int col = pos.x()/dwidth;
85 85
86 QRect rct(col*dwidth, row*dheight, dwidth, dheight); 86 QRect rct(col*dwidth, row*dheight, dwidth, dheight);
87 87
88// kdDebug() << "DynamicTip::maybeTip matrix cell index [" << 88// kdDebug() << "DynamicTip::maybeTip matrix cell index [" <<
89// col << "][" << row << "] => " <<(col+row*7) << endl; 89// col << "][" << row << "] => " <<(col+row*7) << endl;
90 90
91 //show holiday names only 91 //show holiday names only
92 QString str = matrix->getHolidayLabel(col+row*7); 92 QString str = matrix->getHolidayLabel(col+row*7);
93 if (str.isEmpty()) return; 93 if (str.isEmpty()) return;
94 tip(rct, str); 94 tip(rct, str);
95} 95}
96 96
97 97
98// ============================================================================ 98// ============================================================================
99// K O D A Y M A T R I X 99// K O D A Y M A T R I X
100// ============================================================================ 100// ============================================================================
101 101
102const int KODayMatrix::NOSELECTION = -1000; 102const int KODayMatrix::NOSELECTION = -1000;
103const int KODayMatrix::NUMDAYS = 42; 103const int KODayMatrix::NUMDAYS = 42;
104 104
105KODayMatrix::KODayMatrix( QWidget *parent, const char *name ) 105KODayMatrix::KODayMatrix( QWidget *parent, const char *name )
106 : QFrame( parent, name , Qt::WRepaintNoErase ), mCalendar( 0 ) 106 : QFrame( parent, name , Qt::WRepaintNoErase ), mCalendar( 0 )
107 107
108 108
109{ 109{
110 mLastView = -1; 110 mLastView = -1;
111 oldW = 0; 111 oldW = 0;
112 oldH = 0; 112 oldH = 0;
113 myPix.resize( 150, 120 ); 113 myPix.resize( 150, 120 );
114 mRedrawNeeded = true; 114 mRedrawNeeded = true;
115 mKODaymatrixWhatsThis = new KODaymatrixWhatsThis(this); 115 mKODaymatrixWhatsThis = new KODaymatrixWhatsThis(this);
116 mPendingUpdateBeforeRepaint = false; 116 mPendingUpdateBeforeRepaint = false;
117 mouseDown = false; 117 mouseDown = false;
118 // initialize dynamic arrays 118 // initialize dynamic arrays
119 bDays.resize ( NUMDAYS ); 119 bDays.resize ( NUMDAYS );
120 pDays.resize ( NUMDAYS ); 120 pDays.resize ( NUMDAYS );
121 hDays.resize ( NUMDAYS ); 121 hDays.resize ( NUMDAYS );
122 eDays.resize ( NUMDAYS ); 122 eDays.resize ( NUMDAYS );
123 days = new QDate[NUMDAYS]; 123 days = new QDate[NUMDAYS];
124 daylbls = new QString[NUMDAYS]; 124 daylbls = new QString[NUMDAYS];
125 //events = new int[NUMDAYS]; 125 //events = new int[NUMDAYS];
126 mToolTip = new DynamicTip(this); 126 mToolTip = new DynamicTip(this);
127 127
128 // set default values used for drawing the matrix 128 // set default values used for drawing the matrix
129 mDefaultBackColor = palette().active().base(); 129 mDefaultBackColor = palette().active().base();
130 mDefaultTextColor = palette().active().foreground(); 130 mDefaultTextColor = palette().active().foreground();
131 mDefaultTextColorShaded = getShadedColor(mDefaultTextColor); 131 mDefaultTextColorShaded = getShadedColor(mDefaultTextColor);
132 mHolidayColorShaded = getShadedColor(KOPrefs::instance()->mHolidayColor); 132 mHolidayColorShaded = getShadedColor(KOPrefs::instance()->mHolidayColor);
133 mSelectedDaysColor = QColor("white"); 133 mSelectedDaysColor = QColor("white");
134 mTodayMarginWidth = 2; 134 mTodayMarginWidth = 2;
135 mSelEnd = mSelStart = NOSELECTION; 135 mSelEnd = mSelStart = NOSELECTION;
136 136
137 setAcceptDrops(true); 137 setAcceptDrops(true);
138 //setFont( QFont("Arial", 10) ); 138 //setFont( QFont("Arial", 10) );
139 139
140 mUpdateTimer = new QTimer( this ); 140 mUpdateTimer = new QTimer( this );
141 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() )); 141 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() ));
142 mRepaintTimer = new QTimer( this ); 142 mRepaintTimer = new QTimer( this );
143 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() )); 143 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() ));
144 mDayChanged = false; 144 mDayChanged = false;
145 updateView(); 145 updateView();
146} 146}
147QString KODayMatrix::getWhatsThisText( QPoint p ) 147QString KODayMatrix::getWhatsThisText( QPoint p )
148{ 148{
149 149
150 int tmp = getDayIndexFrom(p.x(), p.y()); 150 int tmp = getDayIndexFrom(p.x(), p.y());
151 if ( tmp < 0 || tmp > NUMDAYS-1 || !mCalendar ) 151 if ( tmp < 0 || tmp > NUMDAYS-1 || !mCalendar )
152 return QString(); 152 return QString();
153 QDate mDate = days[tmp]; 153 QDate mDate = days[tmp];
154 QPtrList<Event> eventlist = mCalendar->events(mDate); 154 QPtrList<Event> eventlist = mCalendar->events(mDate);
155 Event *event; 155 Event *event;
156 QStringList mToolTip; 156 QStringList mToolTip;
157 for(event=eventlist.first();event != 0;event=eventlist.next()) { 157 for(event=eventlist.first();event != 0;event=eventlist.next()) {
158 QString mToolTipText; 158 QString mToolTipText;
159 QString text; 159 QString text;
160 int multiday = 0;// 1 = start, 2 = midddle, 3 = end day 160 int multiday = 0;// 1 = start, 2 = midddle, 3 = end day
161 if (event->isMultiDay()) { 161 if (event->isMultiDay()) {
162 QString prefix = "<->";multiday = 2; 162 QString prefix = "<->";multiday = 2;
163 QString time; 163 QString time;
164 if ( event->doesRecur() ) { 164 if ( event->doesRecur() ) {
165 if ( event->recursOn( mDate) ) { 165 if ( event->recursOn( mDate) ) {
166 prefix ="->" ;multiday = 1; 166 prefix ="->" ;multiday = 1;
167 } 167 }
168 else { 168 else {
169 int days = event->dtStart().date().daysTo ( event->dtEnd().date() ); 169 int days = event->dtStart().date().daysTo ( event->dtEnd().date() );
170 if ( event->recursOn( mDate.addDays( -days)) ) { 170 if ( event->recursOn( mDate.addDays( -days)) ) {
171 prefix ="<-" ;multiday = 3; 171 prefix ="<-" ;multiday = 3;
172 } 172 }
173 } 173 }
174 } else { 174 } else {
175 if (mDate == event->dtStart().date()) { 175 if (mDate == event->dtStart().date()) {
176 prefix ="->" ;multiday = 1; 176 prefix ="->" ;multiday = 1;
177 } else if (mDate == event->dtEnd().date()) { 177 } else if (mDate == event->dtEnd().date()) {
178 prefix ="<-" ;multiday = 3; 178 prefix ="<-" ;multiday = 3;
179 } 179 }
180 } 180 }
181 if ( !event->doesFloat() ) { 181 if ( !event->doesFloat() ) {
182 if ( mDate == event->dtStart().date () ) 182 if ( mDate == event->dtStart().date () )
183 time = KGlobal::locale()->formatTime(event->dtStart().time())+" "; 183 time = KGlobal::locale()->formatTime(event->dtStart().time())+" ";
184 else if ( mDate == event->dtEnd().date () ) 184 else if ( mDate == event->dtEnd().date () )
185 time = KGlobal::locale()->formatTime(event->dtEnd().time())+" "; 185 time = KGlobal::locale()->formatTime(event->dtEnd().time())+" ";
186 186
187 } 187 }
188 text = time + event->summary(); 188 text = time + event->summary();
189 mToolTipText += prefix + text; 189 mToolTipText += prefix + text;
190 } else { 190 } else {
191 if (event->doesFloat()) { 191 if (event->doesFloat()) {
192 text = event->summary(); 192 text = event->summary();
193 mToolTipText += text; 193 mToolTipText += text;
194 } 194 }
195 else { 195 else {
196 text = KGlobal::locale()->formatTime(event->dtStart().time()); 196 text = KGlobal::locale()->formatTime(event->dtStart().time());
197 text += " " + event->summary(); 197 text += " " + event->summary();
198 mToolTipText += KGlobal::locale()->formatTime(event->dtStart().time()) +"-"+KGlobal::locale()->formatTime(event->dtEnd().time())+" " + event->summary(); 198 mToolTipText += KGlobal::locale()->formatTime(event->dtStart().time()) +"-"+KGlobal::locale()->formatTime(event->dtEnd().time())+" " + event->summary();
199 } 199 }
200 } 200 }
201 if ( !event->location().isEmpty() ) 201 if ( !event->location().isEmpty() )
202 mToolTipText += " (" + event->location() + ")"; 202 mToolTipText += " (" + event->location() + ")";
203 //qDebug("TTT: %s ", mToolTipText.latin1()); 203 //qDebug("TTT: %s ", mToolTipText.latin1());
204 mToolTip.append( deTag( mToolTipText ) ); 204 mToolTip.append( deTag( mToolTipText ) );
205 } 205 }
206 mToolTip.sort(); 206 mToolTip.sort();
207 if ( KOPrefs::instance()->mCurrentDisplayedView == VIEW_T_VIEW ) { 207 if ( KOPrefs::instance()->mCurrentDisplayedView == VIEW_T_VIEW ) {
208 QPtrList<Todo> todolist = mCalendar->todos(mDate); 208 QPtrList<Todo> todolist = mCalendar->todos(mDate);
209 Todo *todo; 209 Todo *todo;
210 for(todo=todolist.first();todo != 0;todo=todolist.next()) { 210 for(todo=todolist.first();todo != 0;todo=todolist.next()) {
211 QString mToolTipText; 211 QString mToolTipText;
212 if ( !todo->doesFloat() ) 212 if ( !todo->doesFloat() )
213 mToolTipText += KGlobal::locale()->formatTime(todo->dtDue().time())+" "; 213 mToolTipText += KGlobal::locale()->formatTime(todo->dtDue().time())+" ";
214 mToolTipText += todo->summary(); 214 mToolTipText += todo->summary();
215 if ( !todo->location().isEmpty() ) 215 if ( !todo->location().isEmpty() )
216 mToolTipText += " (" + todo->location() + ")"; 216 mToolTipText += " (" + todo->location() + ")";
217 mToolTipText = deTag( mToolTipText); 217 mToolTipText = deTag( mToolTipText);
218 mToolTipText = "<b>" + i18n("Todo: ") + "</b>"+ mToolTipText; 218 mToolTipText = "<b>" + i18n("Todo: ") + "</b>"+ mToolTipText;
219 mToolTip.append( mToolTipText ); 219 mToolTip.append( mToolTipText );
220 } 220 }
221 } 221 }
222 if (KOPrefs::instance()->mCurrentDisplayedView == VIEW_J_VIEW ) { 222 if (KOPrefs::instance()->mCurrentDisplayedView == VIEW_J_VIEW ) {
223 QPtrList<Journal> j_list = mCalendar->journals4Date( mDate ); 223 QPtrList<Journal> j_list = mCalendar->journals4Date( mDate );
224 Journal *j = j_list.first(); 224 Journal *j = j_list.first();
225 while ( j ) { 225 while ( j ) {
226 QString mToolTipText; 226 QString mToolTipText;
227 if ( !j->summary().isEmpty() ) { 227 if ( !j->summary().isEmpty() ) {
228 mToolTipText = j->summary().left(30); 228 mToolTipText = j->summary().left(30);
229 if ( j->summary().length() > 30 ) 229 if ( j->summary().length() > 30 )
230 mToolTipText += " ..."; 230 mToolTipText += " ...";
231 } else { 231 } else {
232 mToolTipText = j->description().left(25); 232 mToolTipText = j->description().left(25);
233 if ( j->description().length() > 25 ) 233 if ( j->description().length() > 25 )
234 mToolTipText += " ..."; 234 mToolTipText += " ...";
235 mToolTipText = deTag( mToolTipText); 235 mToolTipText = deTag( mToolTipText);
236 } 236 }
237 mToolTipText = "<b>" + i18n("Journal: ") + "</b>"+ mToolTipText; 237 mToolTipText = "<b>" + i18n("Journal: ") + "</b>"+ mToolTipText;
238 mToolTip.append( mToolTipText ); 238 mToolTip.append( mToolTipText );
239 j = j_list.next(); 239 j = j_list.next();
240 } 240 }
241 } 241 }
242 return "<b>"+KGlobal::locale()->formatDate(days[tmp]) + "</b><br>" + mToolTip.join("<br>"); 242 return "<b>"+KGlobal::locale()->formatDate(days[tmp]) + "</b><br>" + mToolTip.join("<br>");
243} 243}
244 244
245 245
246QString KODayMatrix::deTag( QString mToolTipText ) 246QString KODayMatrix::deTag( QString mToolTipText )
247{ 247{
248 248
249#if QT_VERSION >= 0x030000 249#if QT_VERSION >= 0x030000
250 mToolTipText.replace( '<' , "&lt;" ); 250 mToolTipText.replace( '<' , "&lt;" );
251 mToolTipText.replace( '>' , "&gt;" ); 251 mToolTipText.replace( '>' , "&gt;" );
252#else 252#else
253 if ( mToolTipText.find ('<') >= 0 ) { 253 if ( mToolTipText.find ('<') >= 0 ) {
254 mToolTipText.replace( QRegExp("<") , "&lt;" ); 254 mToolTipText.replace( QRegExp("<") , "&lt;" );
255 } 255 }
256 if ( mToolTipText.find ('>') >= 0 ) { 256 if ( mToolTipText.find ('>') >= 0 ) {
257 mToolTipText.replace( QRegExp(">") , "&gt;" ); 257 mToolTipText.replace( QRegExp(">") , "&gt;" );
258 } 258 }
259#endif 259#endif
260 return mToolTipText; 260 return mToolTipText;
261} 261}
262void KODayMatrix::setCalendar( Calendar *cal ) 262void KODayMatrix::setCalendar( Calendar *cal )
263{ 263{
264 mCalendar = cal; 264 mCalendar = cal;
265 265
266 setAcceptDrops( mCalendar ); 266 setAcceptDrops( mCalendar );
267 267
268 updateEvents(); 268 updateEvents();
269} 269}
270 270
271QColor KODayMatrix::getShadedColor(QColor color) 271QColor KODayMatrix::getShadedColor(QColor color)
272{ 272{
273 QColor shaded; 273 QColor shaded;
274 int h=0; 274 int h=0;
275 int s=0; 275 int s=0;
276 int v=0; 276 int v=0;
277 color.hsv(&h,&s,&v); 277 color.hsv(&h,&s,&v);
278 s = s/4; 278 s = s/4;
279 v = 192+v/4; 279 v = 192+v/4;
280 shaded.setHsv(h,s,v); 280 shaded.setHsv(h,s,v);
281 281
282 return shaded; 282 return shaded;
283} 283}
284 284
285KODayMatrix::~KODayMatrix() 285KODayMatrix::~KODayMatrix()
286{ 286{
287#if QT_VERSION >= 0x030000 287#if QT_VERSION >= 0x030000
288 288
289#else 289#else
290 delete mKODaymatrixWhatsThis; 290 delete mKODaymatrixWhatsThis;
291#endif 291#endif
292 292
293 // delete mKODaymatrixWhatsThis; 293 // delete mKODaymatrixWhatsThis;
294 delete [] days; 294 delete [] days;
295 delete [] daylbls; 295 delete [] daylbls;
296 //delete [] events; 296 //delete [] events;
297 delete mToolTip; 297 delete mToolTip;
298} 298}
299 299
300/* 300/*
301void KODayMatrix::setStartDate(QDate start) 301void KODayMatrix::setStartDate(QDate start)
302{ 302{
303 updateView(start); 303 updateView(start);
304} 304}
305*/ 305*/
306 306
307void KODayMatrix::addSelectedDaysTo(DateList& selDays) 307void KODayMatrix::addSelectedDaysTo(DateList& selDays)
308{ 308{
309 309
310 if (mSelStart == NOSELECTION) { 310 if (mSelStart == NOSELECTION) {
311 return; 311 return;
312 } 312 }
313 313
314 //cope with selection being out of matrix limits at top (< 0) 314 //cope with selection being out of matrix limits at top (< 0)
315 int i0 = mSelStart; 315 int i0 = mSelStart;
316 if (i0 < 0) { 316 if (i0 < 0) {
317 for (int i = i0; i < 0; i++) { 317 for (int i = i0; i < 0; i++) {
318 selDays.append(days[0].addDays(i)); 318 selDays.append(days[0].addDays(i));
319 } 319 }
320 i0 = 0; 320 i0 = 0;
321 } 321 }
322 322
323 //cope with selection being out of matrix limits at bottom (> NUMDAYS-1) 323 //cope with selection being out of matrix limits at bottom (> NUMDAYS-1)
324 if (mSelEnd > NUMDAYS-1) { 324 if (mSelEnd > NUMDAYS-1) {
325 for (int i = i0; i <= NUMDAYS-1; i++) { 325 for (int i = i0; i <= NUMDAYS-1; i++) {
326 selDays.append(days[i]); 326 selDays.append(days[i]);
327 } 327 }
328 for (int i = NUMDAYS; i < mSelEnd; i++) { 328 for (int i = NUMDAYS; i < mSelEnd; i++) {
329 selDays.append(days[0].addDays(i)); 329 selDays.append(days[0].addDays(i));
330 } 330 }
331 331
332 // apply normal routine to selection being entirely within matrix limits 332 // apply normal routine to selection being entirely within matrix limits
333 } else { 333 } else {
334 for (int i = i0; i <= mSelEnd; i++) { 334 for (int i = i0; i <= mSelEnd; i++) {
335 selDays.append(days[i]); 335 selDays.append(days[i]);
336 } 336 }
337 } 337 }
338} 338}
339 339
340bool KODayMatrix::setSelectedDaysFrom(const QDate& start, const QDate& end) 340bool KODayMatrix::setSelectedDaysFrom(const QDate& start, const QDate& end)
341{ 341{
342 mRedrawNeeded = true; 342 mRedrawNeeded = true;
343 bool noSel = (mSelEnd == NOSELECTION && mSelStart == NOSELECTION ); 343 bool noSel = (mSelEnd == NOSELECTION && mSelStart == NOSELECTION );
344 mSelStart = startdate.daysTo(start); 344 mSelStart = startdate.daysTo(start);
345 if ( mSelStart < 0 ) 345 if ( mSelStart < 0 )
346 mSelStart = 0; 346 mSelStart = 0;
347 mSelEnd = startdate.daysTo(end); 347 mSelEnd = startdate.daysTo(end);
348 if ( mSelEnd > NUMDAYS-1 ) 348 if ( mSelEnd > NUMDAYS-1 )
349 mSelEnd = NUMDAYS-1; 349 mSelEnd = NUMDAYS-1;
350 if ( mSelEnd < 0 || mSelStart > NUMDAYS-1 ) { 350 if ( mSelEnd < 0 || mSelStart > NUMDAYS-1 ) {
351 clearSelection(); 351 clearSelection();
352 if ( noSel ) 352 if ( noSel )
353 return false; 353 return false;
354 } 354 }
355 355
356 return true; 356 return true;
357} 357}
358void KODayMatrix::clearSelection() 358void KODayMatrix::clearSelection()
359{ 359{
360 mSelEnd = mSelStart = NOSELECTION; 360 mSelEnd = mSelStart = NOSELECTION;
361} 361}
362 362
363 363
364void KODayMatrix::recalculateToday() 364void KODayMatrix::recalculateToday()
365{ 365{
366 today = -1; 366 today = -1;
367 for (int i=0; i<NUMDAYS; i++) { 367 for (int i=0; i<NUMDAYS; i++) {
368 //events[i] = 0; 368 //events[i] = 0;
369 days[i] = startdate.addDays(i); 369 days[i] = startdate.addDays(i);
370 daylbls[i] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] )); 370 daylbls[i] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] ));
371 371
372 // if today is in the currently displayed month, hilight today 372 // if today is in the currently displayed month, hilight today
373 if (days[i].year() == QDate::currentDate().year() && 373 if (days[i].year() == QDate::currentDate().year() &&
374 days[i].month() == QDate::currentDate().month() && 374 days[i].month() == QDate::currentDate().month() &&
375 days[i].day() == QDate::currentDate().day()) { 375 days[i].day() == QDate::currentDate().day()) {
376 today = i; 376 today = i;
377 } 377 }
378 } 378 }
379 // qDebug(QString("Today is visible at %1.").arg(today)); 379 // qDebug(QString("Today is visible at %1.").arg(today));
380} 380}
381 381
382void KODayMatrix::updateView() 382void KODayMatrix::updateView()
383{ 383{
384 updateView(startdate); 384 updateView(startdate);
385} 385}
386void KODayMatrix::repaintViewTimed() 386void KODayMatrix::repaintViewTimed()
387{ 387{
388 mRedrawNeeded = true; 388 mRedrawNeeded = true;
389 // bDays.fill( false); 389 // bDays.fill( false);
390 //pDays.fill( false); 390 //pDays.fill( false);
391 //hDays.fill( false); 391 //hDays.fill( false);
392 //eDays.fill( false); 392 //eDays.fill( false);
393 mRepaintTimer->stop(); 393 mRepaintTimer->stop();
394 int startDay = days[0].dayOfWeek(); // 1...7 7 = sunday 394 int startDay = days[0].dayOfWeek(); // 1...7 7 = sunday
395 int i; 395 int i;
396 for(i = 0; i < NUMDAYS; i++) { 396 for(i = 0; i < NUMDAYS; i++) {
397 if ( ( (i+startDay) % 7 == 0 ) ) { 397 if ( ( (i+startDay) % 7 == 0 ) ) {
398 pDays.setBit(i); 398 pDays.setBit(i);
399 } 399 }
400 } 400 }
401 repaint(false); 401 repaint(false);
402} 402}
403void KODayMatrix::computeEvent(Event *event, int i ) 403void KODayMatrix::computeEvent(Event *event, int i )
404{ 404{
405 QString holiStr = mHolidays[i]; 405 QString holiStr = mHolidays[i];
406 if ( event->isHoliday()) { 406 if ( event->isHoliday()) {
407 pDays.setBit(i); 407 pDays.setBit(i);
408 hDays.setBit(i); 408 hDays.setBit(i);
409 if ( !holiStr.isEmpty() ) 409 if ( !holiStr.isEmpty() )
410 holiStr += "\n"; 410 holiStr += "\n";
411 holiStr += event->summary(); 411 holiStr += event->summary();
412 if ( !event->location().isEmpty() ) 412 if ( !event->location().isEmpty() )
413 holiStr += " (" + event->location() + ")"; 413 holiStr += " (" + event->location() + ")";
414 mHolidays[i] =holiStr ; 414 mHolidays[i] =holiStr ;
415 eDays.setBit(i); 415 eDays.setBit(i);
416 } 416 }
417 if ( KOPrefs::instance()->mCurrentDisplayedView != VIEW_T_VIEW && KOPrefs::instance()->mCurrentDisplayedView != VIEW_J_VIEW ) { 417 if ( KOPrefs::instance()->mCurrentDisplayedView != VIEW_T_VIEW && KOPrefs::instance()->mCurrentDisplayedView != VIEW_J_VIEW ) {
418 if ( event->isBirthday()) { 418 if ( event->isBirthday()) {
419 pDays.setBit(i); 419 pDays.setBit(i);
420 if ( !holiStr.isEmpty() ) 420 if ( !holiStr.isEmpty() )
421 holiStr += "\n"; 421 holiStr += "\n";
422 holiStr += i18n("Birthday") + ": "+event->summary(); 422 holiStr += i18n("Birthday") + ": "+event->summary();
423 if ( !event->location().isEmpty() ) 423 if ( !event->location().isEmpty() )
424 holiStr += " (" + event->location() + ")"; 424 holiStr += " (" + event->location() + ")";
425 bDays.setBit(i); 425 bDays.setBit(i);
426 mHolidays[i] =holiStr ; 426 mHolidays[i] =holiStr ;
427 } 427 }
428 } 428 }
429 if ( KOPrefs::instance()->mCurrentDisplayedView != VIEW_J_VIEW ) 429 if ( KOPrefs::instance()->mCurrentDisplayedView != VIEW_J_VIEW )
430 eDays.setBit(i); 430 eDays.setBit(i);
431} 431}
432void KODayMatrix::updateViewTimed() 432void KODayMatrix::updateViewTimed()
433{ 433{
434 mUpdateTimer->stop(); 434 mUpdateTimer->stop();
435 if ( !mCalendar ) { 435 if ( !mCalendar ) {
436 qDebug("NOT CAL "); 436 qDebug("NOT CAL ");
437 return; 437 return;
438 } 438 }
439#if 1 439#if 1
440 440
441 441
442 int i; 442 int i;
443 int timeSpan = NUMDAYS-1; 443 int timeSpan = NUMDAYS-1;
444 QPtrList<Event> events = mCalendar->events(); 444 QPtrList<Event> events = mCalendar->events();
445 Event *event; 445 Event *event;
446 QDateTime dt; 446 QDateTime dt;
447 bool ok; 447 bool ok;
448 bDays.fill( false); 448 bDays.fill( false);
449 pDays.fill( false); 449 pDays.fill( false);
450 hDays.fill( false); 450 hDays.fill( false);
451 eDays.fill( false); 451 eDays.fill( false);
452 mHolidays.clear(); 452 mHolidays.clear();
453 QDate mStartDate = days[0]; 453 QDate mStartDate = days[0];
454 QDate endDate = mStartDate.addDays( timeSpan ); 454 QDate endDate = mStartDate.addDays( timeSpan );
455 for( event = events.first(); event; event = events.next() ) { // for event 455 for( event = events.first(); event; event = events.next() ) { // for event
456 ushort recurType = event->recurrence()->doesRecur(); 456 ushort recurType = event->doesRecur();
457 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) || 457 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) ||
458 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) { 458 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) {
459 continue; 459 continue;
460 } 460 }
461 if ( event->doesRecur() ) { 461 if ( event->doesRecur() ) {
462 bool last; 462 bool last;
463 QDateTime incidenceStart = event->recurrence()->getPreviousDateTime( QDateTime( mStartDate ) , &last ); 463 QDateTime incidenceStart = event->recurrence()->getPreviousDateTime( QDateTime( mStartDate ) , &last );
464 QDateTime incidenceEnd; 464 QDateTime incidenceEnd;
465 int eventlen = event->dtStart().date().daysTo ( event->dtEnd().date() ); 465 int eventlen = event->dtStart().date().daysTo ( event->dtEnd().date() );
466 bool invalid = false; 466 bool invalid = false;
467 while( true ) { 467 while( true ) {
468 if ( incidenceStart.isValid() ) { 468 if ( incidenceStart.isValid() ) {
469 incidenceEnd = incidenceStart.addDays( eventlen ); 469 incidenceEnd = incidenceStart.addDays( eventlen );
470 int st = incidenceStart.date().daysTo( endDate ); 470 int st = incidenceStart.date().daysTo( endDate );
471 if ( st >= 0 ) { // start before timeend 471 if ( st >= 0 ) { // start before timeend
472 int end = mStartDate.daysTo( incidenceEnd.date() ); 472 int end = mStartDate.daysTo( incidenceEnd.date() );
473 if ( end >= 0 ) { // end after timestart --- got one! 473 if ( end >= 0 ) { // end after timestart --- got one!
474 //normalize 474 //normalize
475 st = timeSpan - st; 475 st = timeSpan - st;
476 if ( st < 0 ) st = 0; 476 if ( st < 0 ) st = 0;
477 if ( end > timeSpan ) end = timeSpan; 477 if ( end > timeSpan ) end = timeSpan;
478 int iii; 478 int iii;
479 //qDebug("found %s %d %d ",event->summary().latin1(), st, end ); 479 //qDebug("found %s %d %d ",event->summary().latin1(), st, end );
480 for ( iii = st;iii<= end;++iii) { 480 for ( iii = st;iii<= end;++iii) {
481 computeEvent( event, iii ); 481 computeEvent( event, iii );
482 } 482 }
483 } 483 }
484 } 484 }
485 } else { 485 } else {
486 if ( invalid ) 486 if ( invalid )
487 break; 487 break;
488 invalid = true; 488 invalid = true;
489 //qDebug("invalid %s", event->summary().latin1()); 489 //qDebug("invalid %s", event->summary().latin1());
490 incidenceStart = QDateTime( mStartDate ).addSecs( -2 );; 490 incidenceStart = QDateTime( mStartDate ).addSecs( -2 );;
491 } 491 }
492 if ( last ) 492 if ( last )
493 break; 493 break;
494 bool ok; 494 bool ok;
495 incidenceStart = event->getNextOccurence( incidenceStart.addSecs( 1 ) ,&ok ); 495 incidenceStart = event->getNextOccurence( incidenceStart.addSecs( 1 ) ,&ok );
496 if ( ! ok ) 496 if ( ! ok )
497 break; 497 break;
498 if ( incidenceStart.date() > endDate ) 498 if ( incidenceStart.date() > endDate )
499 break; 499 break;
500 } 500 }
501 } else { // no recur 501 } else { // no recur
502 int st = event->dtStart().date().daysTo( endDate ); 502 int st = event->dtStart().date().daysTo( endDate );
503 if ( st >= 0 ) { // start before timeend 503 if ( st >= 0 ) { // start before timeend
504 int end = mStartDate.daysTo( event->dtEnd().date() ); 504 int end = mStartDate.daysTo( event->dtEnd().date() );
505 if ( end >= 0 ) { // end after timestart --- got one! 505 if ( end >= 0 ) { // end after timestart --- got one!
506 //normalize 506 //normalize
507 st = timeSpan - st; 507 st = timeSpan - st;
508 if ( st < 0 ) st = 0; 508 if ( st < 0 ) st = 0;
509 if ( end > timeSpan ) end = timeSpan; 509 if ( end > timeSpan ) end = timeSpan;
510 int iii; 510 int iii;
511 for ( iii = st;iii<= end;++iii) 511 for ( iii = st;iii<= end;++iii)
512 computeEvent( event, iii ); 512 computeEvent( event, iii );
513 } 513 }
514 } 514 }
515 } 515 }
516 } 516 }
517 int startDay = days[0].dayOfWeek(); // 1...7 7 = sunday 517 int startDay = days[0].dayOfWeek(); // 1...7 7 = sunday
518 for(i = 0; i < NUMDAYS; i++) { 518 for(i = 0; i < NUMDAYS; i++) {
519 if ( ( (i+startDay) % 7 == 0 ) ) { 519 if ( ( (i+startDay) % 7 == 0 ) ) {
520 pDays.setBit(i); 520 pDays.setBit(i);
521 } 521 }
522 } 522 }
523 if ( KOPrefs::instance()->mCurrentDisplayedView == VIEW_T_VIEW ) { 523 if ( KOPrefs::instance()->mCurrentDisplayedView == VIEW_T_VIEW ) {
524 bDays.fill( false); 524 bDays.fill( false);
525 // insert due todos 525 // insert due todos
526 QPtrList<Todo> todos = mCalendar->todos( ); 526 QPtrList<Todo> todos = mCalendar->todos( );
527 Todo *todo; 527 Todo *todo;
528 for(todo = todos.first(); todo; todo = todos.next()) { 528 for(todo = todos.first(); todo; todo = todos.next()) {
529 //insertTodo( todo ); 529 //insertTodo( todo );
530 if ( todo->hasDueDate() ) { 530 if ( todo->hasDueDate() ) {
531 int day = mStartDate.daysTo( todo->dtDue().date() ); 531 int day = mStartDate.daysTo( todo->dtDue().date() );
532 if ( day >= 0 && day < timeSpan + 1) { 532 if ( day >= 0 && day < timeSpan + 1) {
533 int i = day; 533 int i = day;
534 QString holiStr = mHolidays[i]; 534 QString holiStr = mHolidays[i];
535 pDays.setBit(i); 535 pDays.setBit(i);
536 if ( !holiStr.isEmpty() ) 536 if ( !holiStr.isEmpty() )
537 holiStr += "\n"; 537 holiStr += "\n";
538 holiStr += i18n("Todo") + ": "+todo->summary(); 538 holiStr += i18n("Todo") + ": "+todo->summary();
539 if ( !todo->location().isEmpty() ) 539 if ( !todo->location().isEmpty() )
540 holiStr += " (" + todo->location() + ")"; 540 holiStr += " (" + todo->location() + ")";
541 bDays.setBit(i); 541 bDays.setBit(i);
542 mHolidays[i] =holiStr ; 542 mHolidays[i] =holiStr ;
543 eDays.setBit(i); 543 eDays.setBit(i);
544 } 544 }
545 } 545 }
546 } 546 }
547 } 547 }
548 if ( KOPrefs::instance()->mCurrentDisplayedView == VIEW_J_VIEW ) { 548 if ( KOPrefs::instance()->mCurrentDisplayedView == VIEW_J_VIEW ) {
549 bDays.fill( false); 549 bDays.fill( false);
550 // insert due todos 550 // insert due todos
551 QPtrList<Journal> todos = mCalendar->journals( ); 551 QPtrList<Journal> todos = mCalendar->journals( );
552 Journal *todo; 552 Journal *todo;
553 for(todo = todos.first(); todo; todo = todos.next()) { 553 for(todo = todos.first(); todo; todo = todos.next()) {
554 int day = mStartDate.daysTo( todo->dtStart().date() ); 554 int day = mStartDate.daysTo( todo->dtStart().date() );
555 if ( day >= 0 && day < timeSpan + 1) { 555 if ( day >= 0 && day < timeSpan + 1) {
556 int i = day; 556 int i = day;
557 QString holiStr = mHolidays[i]; 557 QString holiStr = mHolidays[i];
558 pDays.setBit(i); 558 pDays.setBit(i);
559 if ( !holiStr.isEmpty() ) 559 if ( !holiStr.isEmpty() )
560 holiStr += "\n"; 560 holiStr += "\n";
561 holiStr += i18n("Journal: ")+todo->summary().left(25); 561 holiStr += i18n("Journal: ")+todo->summary().left(25);
562 if ( todo->summary().length() > 25 ) 562 if ( todo->summary().length() > 25 )
563 holiStr +="..."; 563 holiStr +="...";
564 bDays.setBit(i); 564 bDays.setBit(i);
565 mHolidays[i] =holiStr ; 565 mHolidays[i] =holiStr ;
566 eDays.setBit(i); 566 eDays.setBit(i);
567 567
568 } 568 }
569 } 569 }
570 } 570 }
571#else 571#else
572 //qDebug("KODayMatrix::updateViewTimed "); 572 //qDebug("KODayMatrix::updateViewTimed ");
573 for(int i = 0; i < NUMDAYS; i++) { 573 for(int i = 0; i < NUMDAYS; i++) {
574 // if events are set for the day then remember to draw it bold 574 // if events are set for the day then remember to draw it bold
575 QPtrList<Event> eventlist = mCalendar->events(days[i]); 575 QPtrList<Event> eventlist = mCalendar->events(days[i]);
576 Event *event; 576 Event *event;
577 int numEvents = eventlist.count(); 577 int numEvents = eventlist.count();
578 QString holiStr = ""; 578 QString holiStr = "";
579 bDays.clearBit(i); 579 bDays.clearBit(i);
580 hDays.clearBit(i); 580 hDays.clearBit(i);
581 eDays.clearBit(i); 581 eDays.clearBit(i);
582 for(event=eventlist.first();event != 0;event=eventlist.next()) { 582 for(event=eventlist.first();event != 0;event=eventlist.next()) {
583 ushort recurType = event->recurrence()->doesRecur(); 583 ushort recurType = event->recurrence()->doesRecur();
584 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) || 584 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) ||
585 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) { 585 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) {
586 numEvents--; 586 numEvents--;
587 } 587 }
588 if ( event->isHoliday()) { 588 if ( event->isHoliday()) {
589 hDays.setBit(i); 589 hDays.setBit(i);
590 if ( !holiStr.isEmpty() ) 590 if ( !holiStr.isEmpty() )
591 holiStr += "\n"; 591 holiStr += "\n";
592 holiStr += event->summary(); 592 holiStr += event->summary();
593 if ( !event->location().isEmpty() ) 593 if ( !event->location().isEmpty() )
594 holiStr += " (" + event->location() + ")"; 594 holiStr += " (" + event->location() + ")";
595 } 595 }
596 if ( event->isBirthday()) { 596 if ( event->isBirthday()) {
597 if ( !holiStr.isEmpty() ) 597 if ( !holiStr.isEmpty() )
598 holiStr += "\n"; 598 holiStr += "\n";
599 holiStr += i18n("Birthday") + ": "+event->summary(); 599 holiStr += i18n("Birthday") + ": "+event->summary();
600 if ( !event->location().isEmpty() ) 600 if ( !event->location().isEmpty() )
601 holiStr += " (" + event->location() + ")"; 601 holiStr += " (" + event->location() + ")";
602 bDays.setBit(i); 602 bDays.setBit(i);
603 } 603 }
604 } 604 }
605 if ( numEvents ) 605 if ( numEvents )
606 eDays.setBit(i); 606 eDays.setBit(i);
607 //if it is a holy day then draw it red. Sundays are consider holidays, too 607 //if it is a holy day then draw it red. Sundays are consider holidays, too
608 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) || 608 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) ||
609 !holiStr.isEmpty()) { 609 !holiStr.isEmpty()) {
610 mHolidays[i] = holiStr; 610 mHolidays[i] = holiStr;
611 } else { 611 } else {
612 mHolidays[i] = QString::null; 612 mHolidays[i] = QString::null;
613 } 613 }
614 } 614 }
615#endif 615#endif
616 mRedrawNeeded = true; 616 mRedrawNeeded = true;
617 if ( ! mPendingUpdateBeforeRepaint ) 617 if ( ! mPendingUpdateBeforeRepaint )
618 repaint(false); 618 repaint(false);
619} 619}
620void KODayMatrix::updateView(QDate actdate) 620void KODayMatrix::updateView(QDate actdate)
621{ 621{
622 if ( mLastView != KOPrefs::instance()->mCurrentDisplayedView ) 622 if ( mLastView != KOPrefs::instance()->mCurrentDisplayedView )
623 mRedrawNeeded = true; 623 mRedrawNeeded = true;
624 mLastView = KOPrefs::instance()->mCurrentDisplayedView; 624 mLastView = KOPrefs::instance()->mCurrentDisplayedView;
625 if ( ! actdate.isValid() ) { 625 if ( ! actdate.isValid() ) {
626 //qDebug("date not valid "); 626 //qDebug("date not valid ");
627 return; 627 return;
628 } 628 }
629 mDayChanged = false; 629 mDayChanged = false;
630 //flag to indicate if the starting day of the matrix has changed by this call 630 //flag to indicate if the starting day of the matrix has changed by this call
631 //mDayChanged = false; 631 //mDayChanged = false;
632 // if a new startdate is to be set then apply Cornelius's calculation 632 // if a new startdate is to be set then apply Cornelius's calculation
633 // of the first day to be shown 633 // of the first day to be shown
634 if (actdate != startdate) { 634 if (actdate != startdate) {
635 // reset index of selection according to shift of starting date from startdate to actdate 635 // reset index of selection according to shift of starting date from startdate to actdate
636 if (mSelStart != NOSELECTION) { 636 if (mSelStart != NOSELECTION) {
637 int tmp = actdate.daysTo(startdate); 637 int tmp = actdate.daysTo(startdate);
638 //kdDebug() << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl; 638 //kdDebug() << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl;
639 // shift selection if new one would be visible at least partly ! 639 // shift selection if new one would be visible at least partly !
640 640
641 if (mSelStart+tmp < NUMDAYS && mSelEnd+tmp >= 0) { 641 if (mSelStart+tmp < NUMDAYS && mSelEnd+tmp >= 0) {
642 // nested if is required for next X display pushed from a different month - correction required 642 // nested if is required for next X display pushed from a different month - correction required
643 // otherwise, for month forward and backward, it must be avoided 643 // otherwise, for month forward and backward, it must be avoided
644 if( mSelStart > NUMDAYS || mSelStart < 0 ) 644 if( mSelStart > NUMDAYS || mSelStart < 0 )
645 mSelStart = mSelStart + tmp; 645 mSelStart = mSelStart + tmp;
646 if( mSelEnd > NUMDAYS || mSelEnd < 0 ) 646 if( mSelEnd > NUMDAYS || mSelEnd < 0 )
647 mSelEnd = mSelEnd + tmp; 647 mSelEnd = mSelEnd + tmp;
648 } 648 }
649 } 649 }
650 startdate = actdate; 650 startdate = actdate;
651 mDayChanged = true; 651 mDayChanged = true;
652 recalculateToday(); 652 recalculateToday();
653 mRedrawNeeded = true; 653 mRedrawNeeded = true;
654 } 654 }
655 //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() ); 655 //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() );
656 if ( !isVisible() ) { 656 if ( !isVisible() ) {
657 mPendingUpdateBeforeRepaint = true; 657 mPendingUpdateBeforeRepaint = true;
658 } else { 658 } else {
659#ifdef DESKTOP_VERSION 659#ifdef DESKTOP_VERSION
660 //mRepaintTimer->start( 100 ); 660 //mRepaintTimer->start( 100 );
661 //updateViewTimed(); 661 //updateViewTimed();
662 mUpdateTimer->start( 50 ); 662 mUpdateTimer->start( 50 );
663#else 663#else
664 mRepaintTimer->start( 350 ); 664 mRepaintTimer->start( 350 );
665 mUpdateTimer->start( 800 ); 665 mUpdateTimer->start( 800 );
666#endif 666#endif
667 } 667 }
668} 668}
669void KODayMatrix::updateEvents() 669void KODayMatrix::updateEvents()
670{ 670{
671 if ( !mCalendar ) return; 671 if ( !mCalendar ) return;
672 672
673 for( int i = 0; i < NUMDAYS; i++ ) { 673 for( int i = 0; i < NUMDAYS; i++ ) {
674 // if events are set for the day then remember to draw it bold 674 // if events are set for the day then remember to draw it bold
675 QPtrList<Event> eventlist = mCalendar->events( days[ i ] ); 675 QPtrList<Event> eventlist = mCalendar->events( days[ i ] );
676 int numEvents = eventlist.count(); 676 int numEvents = eventlist.count();
677 Event *event; 677 Event *event;
678 for( event = eventlist.first(); event != 0;event=eventlist.next()) { 678 for( event = eventlist.first(); event != 0;event=eventlist.next()) {
679 ushort recurType = event->doesRecur(); 679 ushort recurType = event->doesRecur();
680 680
681 if ( ( recurType == Recurrence::rDaily && 681 if ( ( recurType == Recurrence::rDaily &&
682 !KOPrefs::instance()->mDailyRecur ) || 682 !KOPrefs::instance()->mDailyRecur ) ||
683 ( recurType == Recurrence::rWeekly && 683 ( recurType == Recurrence::rWeekly &&
684 !KOPrefs::instance()->mWeeklyRecur ) ) { 684 !KOPrefs::instance()->mWeeklyRecur ) ) {
685 numEvents--; 685 numEvents--;
686 } 686 }
687 } 687 }
688 if ( numEvents ) 688 if ( numEvents )
689 eDays.setBit(i); 689 eDays.setBit(i);
690 else 690 else
691 eDays.clearBit(i); 691 eDays.clearBit(i);
692 } 692 }
693} 693}
694 694
695const QDate& KODayMatrix::getDate(int offset) 695const QDate& KODayMatrix::getDate(int offset)
696{ 696{
697 if (offset < 0 || offset > NUMDAYS-1) { 697 if (offset < 0 || offset > NUMDAYS-1) {
698 qDebug("Wrong offset2 %d", offset); 698 qDebug("Wrong offset2 %d", offset);
699 return days[0]; 699 return days[0];
700 } 700 }
701 return days[offset]; 701 return days[offset];
702} 702}
703 703
704QString KODayMatrix::getHolidayLabel(int offset) 704QString KODayMatrix::getHolidayLabel(int offset)
705{ 705{
706 if (offset < 0 || offset > NUMDAYS-1) { 706 if (offset < 0 || offset > NUMDAYS-1) {
707 qDebug("Wrong offset1 %d", offset); 707 qDebug("Wrong offset1 %d", offset);
708 return QString(); 708 return QString();
709 } 709 }
710 return mHolidays[offset]; 710 return mHolidays[offset];
711} 711}
712 712
713int KODayMatrix::getDayIndexFrom(int x, int y) 713int KODayMatrix::getDayIndexFrom(int x, int y)
714{ 714{
715 int colModulo = (width()-2) % 7; 715 int colModulo = (width()-2) % 7;
716 int rowModulo = (height()-2) % 6; 716 int rowModulo = (height()-2) % 6;
717#if 0 717#if 0
718 return 7*(y/daysize.height()) + (KOGlobals::self()->reverseLayout() ? 718 return 7*(y/daysize.height()) + (KOGlobals::self()->reverseLayout() ?
719 6 - x/daysize.width() : x/daysize.width()); 719 6 - x/daysize.width() : x/daysize.width());
720#endif 720#endif
721 int xVal = (x-colModulo/2-2)/daysize.width(); 721 int xVal = (x-colModulo/2-2)/daysize.width();
722 int yVal = (y-rowModulo/2-2)/daysize.height(); 722 int yVal = (y-rowModulo/2-2)/daysize.height();
723 723
724 724
725 return 7*(yVal) + xVal; 725 return 7*(yVal) + xVal;
726 726
727} 727}
728 728
729// ---------------------------------------------------------------------------- 729// ----------------------------------------------------------------------------
730// M O U S E E V E N T H A N D L I N G 730// M O U S E E V E N T H A N D L I N G
731// ---------------------------------------------------------------------------- 731// ----------------------------------------------------------------------------
732 732
733void KODayMatrix::mousePressEvent (QMouseEvent* e) 733void KODayMatrix::mousePressEvent (QMouseEvent* e)
734{ 734{
735 735
736 if ( e->button() == LeftButton ) 736 if ( e->button() == LeftButton )
737 mouseDown = true; 737 mouseDown = true;
738 mSelStart = getDayIndexFrom(e->x(), e->y()); 738 mSelStart = getDayIndexFrom(e->x(), e->y());
739 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1; 739 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1;
740 mSelInit = mSelStart; 740 mSelInit = mSelStart;
741 mSelEnd = mSelStart; 741 mSelEnd = mSelStart;
742 mRedrawNeeded = true; 742 mRedrawNeeded = true;
743 repaint(false); 743 repaint(false);
744} 744}
745 745
746void KODayMatrix::mouseReleaseEvent (QMouseEvent* e) 746void KODayMatrix::mouseReleaseEvent (QMouseEvent* e)
747{ 747{
748 mRedrawNeeded = true; 748 mRedrawNeeded = true;
749 if ( e->button() == LeftButton ) 749 if ( e->button() == LeftButton )
750 if ( ! mouseDown ) { 750 if ( ! mouseDown ) {
751 return; 751 return;
752 } 752 }
753 else 753 else
754 mouseDown = false; 754 mouseDown = false;
755 int tmp = getDayIndexFrom(e->x(), e->y()); 755 int tmp = getDayIndexFrom(e->x(), e->y());
756 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 756 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
757 757
758 if (mSelInit > tmp) { 758 if (mSelInit > tmp) {
759 mSelEnd = mSelInit; 759 mSelEnd = mSelInit;
760 if (tmp != mSelStart) { 760 if (tmp != mSelStart) {
761 mSelStart = tmp; 761 mSelStart = tmp;
762 repaint(false); 762 repaint(false);
763 } 763 }
764 } else { 764 } else {
765 mSelStart = mSelInit; 765 mSelStart = mSelInit;
766 766
767 //repaint only if selection has changed 767 //repaint only if selection has changed
768 if (tmp != mSelEnd) { 768 if (tmp != mSelEnd) {
769 mSelEnd = tmp; 769 mSelEnd = tmp;
770 repaint(false); 770 repaint(false);
771 } 771 }
772 } 772 }
773 773
774 DateList daylist; 774 DateList daylist;
775 if ( mSelStart < 0 ) 775 if ( mSelStart < 0 )
776 mSelStart = 0; 776 mSelStart = 0;
777 for (int i = mSelStart; i <= mSelEnd; i++) { 777 for (int i = mSelStart; i <= mSelEnd; i++) {
778 daylist.append(days[i]); 778 daylist.append(days[i]);
779 } 779 }
780 emit selected((const DateList)daylist); 780 emit selected((const DateList)daylist);
781 781
782} 782}
783 783
784void KODayMatrix::mouseMoveEvent (QMouseEvent* e) 784void KODayMatrix::mouseMoveEvent (QMouseEvent* e)
785{ 785{
786 if ( ! mouseDown ) { 786 if ( ! mouseDown ) {
787 return; 787 return;
788 } 788 }
789 mRedrawNeeded = true; 789 mRedrawNeeded = true;
790 int tmp = getDayIndexFrom(e->x(), e->y()); 790 int tmp = getDayIndexFrom(e->x(), e->y());
791 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 791 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
792 792
793 if (mSelInit > tmp) { 793 if (mSelInit > tmp) {
794 mSelEnd = mSelInit; 794 mSelEnd = mSelInit;
795 if (tmp != mSelStart) { 795 if (tmp != mSelStart) {
796 mSelStart = tmp; 796 mSelStart = tmp;
797 repaint(false); 797 repaint(false);
798 } 798 }
799 } else { 799 } else {
800 mSelStart = mSelInit; 800 mSelStart = mSelInit;
801 801
802 //repaint only if selection has changed 802 //repaint only if selection has changed
803 if (tmp != mSelEnd) { 803 if (tmp != mSelEnd) {
804 mSelEnd = tmp; 804 mSelEnd = tmp;
805 repaint(false); 805 repaint(false);
806 } 806 }
807 } 807 }
808} 808}
809 809
810// ---------------------------------------------------------------------------- 810// ----------------------------------------------------------------------------
811// D R A G ' N D R O P H A N D L I N G 811// D R A G ' N D R O P H A N D L I N G
812// ---------------------------------------------------------------------------- 812// ----------------------------------------------------------------------------
813 813
814void KODayMatrix::dragEnterEvent(QDragEnterEvent *e) 814void KODayMatrix::dragEnterEvent(QDragEnterEvent *e)
815{ 815{
816#ifndef KORG_NODND 816#ifndef KORG_NODND
817 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 817 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
818 e->ignore(); 818 e->ignore();
819 return; 819 return;
820 } 820 }
821 821
822 // some visual feedback 822 // some visual feedback
823// oldPalette = palette(); 823// oldPalette = palette();
824// setPalette(my_HilitePalette); 824// setPalette(my_HilitePalette);
825// update(); 825// update();
826#endif 826#endif
827} 827}
828 828
829void KODayMatrix::dragMoveEvent(QDragMoveEvent *e) 829void KODayMatrix::dragMoveEvent(QDragMoveEvent *e)
830{ 830{
831#ifndef KORG_NODND 831#ifndef KORG_NODND
832 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 832 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
833 e->ignore(); 833 e->ignore();
834 return; 834 return;
835 } 835 }
836 836
837 e->accept(); 837 e->accept();
838#endif 838#endif
839} 839}
840 840
841void KODayMatrix::dragLeaveEvent(QDragLeaveEvent */*dl*/) 841void KODayMatrix::dragLeaveEvent(QDragLeaveEvent */*dl*/)
842{ 842{
843#ifndef KORG_NODND 843#ifndef KORG_NODND
844// setPalette(oldPalette); 844// setPalette(oldPalette);
845// update(); 845// update();
846#endif 846#endif
847} 847}
848 848
849void KODayMatrix::dropEvent(QDropEvent *e) 849void KODayMatrix::dropEvent(QDropEvent *e)
850{ 850{
851#ifndef KORG_NODND 851#ifndef KORG_NODND
852// kdDebug() << "KODayMatrix::dropEvent(e) begin" << endl; 852// kdDebug() << "KODayMatrix::dropEvent(e) begin" << endl;
853 853
854 if (!mCalendar || !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 854 if (!mCalendar || !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
855 e->ignore(); 855 e->ignore();
856 return; 856 return;
857 } 857 }
858 858
859 DndFactory factory( mCalendar ); 859 DndFactory factory( mCalendar );
860 Event *event = factory.createDrop(e); 860 Event *event = factory.createDrop(e);
861 861
862 if (event) { 862 if (event) {
863 e->acceptAction(); 863 e->acceptAction();
864 864
865 Event *existingEvent = mCalendar->event(event->uid()); 865 Event *existingEvent = mCalendar->event(event->uid());
866 866
867 if(existingEvent) { 867 if(existingEvent) {
868 // uniquify event 868 // uniquify event
869 event->recreate(); 869 event->recreate();
870/* 870/*
871 KMessageBox::sorry(this, 871 KMessageBox::sorry(this,
872 i18n("Event already exists in this calendar."), 872 i18n("Event already exists in this calendar."),
873 i18n("Drop Event")); 873 i18n("Drop Event"));
874 delete event; 874 delete event;
875 return; 875 return;
876*/ 876*/
877 } 877 }
878// kdDebug() << "Drop new Event" << endl; 878// kdDebug() << "Drop new Event" << endl;
879 // Adjust date 879 // Adjust date
880 QDateTime start = event->dtStart(); 880 QDateTime start = event->dtStart();
881 QDateTime end = event->dtEnd(); 881 QDateTime end = event->dtEnd();
882 int duration = start.daysTo(end); 882 int duration = start.daysTo(end);
883 int idx = getDayIndexFrom(e->pos().x(), e->pos().y()); 883 int idx = getDayIndexFrom(e->pos().x(), e->pos().y());
884 884
885 start.setDate(days[idx]); 885 start.setDate(days[idx]);
886 end.setDate(days[idx].addDays(duration)); 886 end.setDate(days[idx].addDays(duration));
887 887
888 event->setDtStart(start); 888 event->setDtStart(start);
889 event->setDtEnd(end); 889 event->setDtEnd(end);
890 mCalendar->addEvent(event); 890 mCalendar->addEvent(event);
891 891
892 emit eventDropped(event); 892 emit eventDropped(event);
893 } else { 893 } else {
894// kdDebug() << "KODayMatrix::dropEvent(): Event from drop not decodable" << endl; 894// kdDebug() << "KODayMatrix::dropEvent(): Event from drop not decodable" << endl;
895 e->ignore(); 895 e->ignore();
896 } 896 }
897#endif 897#endif
898} 898}
899 899
900// ---------------------------------------------------------------------------- 900// ----------------------------------------------------------------------------
901// P A I N T E V E N T H A N D L I N G 901// P A I N T E V E N T H A N D L I N G
902// ---------------------------------------------------------------------------- 902// ----------------------------------------------------------------------------
903 903
904void KODayMatrix::paintEvent(QPaintEvent * pevent) 904void KODayMatrix::paintEvent(QPaintEvent * pevent)
905{ 905{
906 906
907 if ( width() <= 0 || height() <= 0 ) 907 if ( width() <= 0 || height() <= 0 )
908 return; 908 return;
909 if ( mPendingUpdateBeforeRepaint ) { 909 if ( mPendingUpdateBeforeRepaint ) {
910 updateViewTimed(); 910 updateViewTimed();
911 mPendingUpdateBeforeRepaint = false; 911 mPendingUpdateBeforeRepaint = false;
912 } 912 }
913#if 0 913#if 0
914 if ( myPix.width() != width() || myPix.height()!=height() ) { 914 if ( myPix.width() != width() || myPix.height()!=height() ) {
915 myPix.resize(size() ); 915 myPix.resize(size() );
916 mRedrawNeeded = true; 916 mRedrawNeeded = true;
917 } 917 }
918#endif 918#endif
919 if ( oldW != width() || oldH !=height() ) 919 if ( oldW != width() || oldH !=height() )
920 mRedrawNeeded = true; 920 mRedrawNeeded = true;
921 921
922 oldH = height() ; 922 oldH = height() ;
923 oldW = width(); 923 oldW = width();
924 if ( myPix.width() < width() || myPix.height() < height() ) { 924 if ( myPix.width() < width() || myPix.height() < height() ) {
925 myPix.resize(size() ); 925 myPix.resize(size() );
926 mRedrawNeeded = true; 926 mRedrawNeeded = true;
927 927
928 } 928 }
929 929
930 if ( mRedrawNeeded ) { 930 if ( mRedrawNeeded ) {
931 //qDebug("REDRAW "); 931 //qDebug("REDRAW ");
932 QPainter p(&myPix); 932 QPainter p(&myPix);
933 p.setFont(font()); 933 p.setFont(font());
934 934
935 935
936 int dheight = daysize.height(); 936 int dheight = daysize.height();
937 int dwidth = daysize.width(); 937 int dwidth = daysize.width();
938 int row,col; 938 int row,col;
939 int selw, selh; 939 int selw, selh;
940 int xyOff = frameWidth(); 940 int xyOff = frameWidth();
941 int colModulo = (width()-2) % 7; 941 int colModulo = (width()-2) % 7;
942 int rowModulo = (height()-2) % 6; 942 int rowModulo = (height()-2) % 6;
943 //qDebug("col %d row %d ",colModulo,rowModulo ); 943 //qDebug("col %d row %d ",colModulo,rowModulo );
944 944
945 bool isRTL = KOGlobals::self()->reverseLayout(); 945 bool isRTL = KOGlobals::self()->reverseLayout();
946 946
947 // draw background and topleft frame 947 // draw background and topleft frame
948 p.fillRect(0,0,width(),height(), mDefaultBackColor); 948 p.fillRect(0,0,width(),height(), mDefaultBackColor);
949 //p.setPen(mDefaultTextColor); 949 //p.setPen(mDefaultTextColor);
950 //p.drawRect(0, 0, width(), height()); 950 //p.drawRect(0, 0, width(), height());
951 int mSelStartT = mSelStart; 951 int mSelStartT = mSelStart;
952 int mSelEndT = mSelEnd; 952 int mSelEndT = mSelEnd;
953 if ( mSelEndT >= NUMDAYS ) 953 if ( mSelEndT >= NUMDAYS )
954 mSelEndT = NUMDAYS-1; 954 mSelEndT = NUMDAYS-1;
955 // draw selected days with highlighted background color 955 // draw selected days with highlighted background color
956 if (mSelStart != NOSELECTION) { 956 if (mSelStart != NOSELECTION) {
957 bool skip = false; 957 bool skip = false;
958 if ( ! mouseDown ) { 958 if ( ! mouseDown ) {
959 int mo = days[20].month(); 959 int mo = days[20].month();
960 //qDebug("-- %d %d ", mSelStartT, mSelEndT); 960 //qDebug("-- %d %d ", mSelStartT, mSelEndT);
961 //qDebug("%d %d %d - d %d", mo, days[mSelStartT].month() , days[mSelEndT].month(), days[mSelEndT].day() ); 961 //qDebug("%d %d %d - d %d", mo, days[mSelStartT].month() , days[mSelEndT].month(), days[mSelEndT].day() );
962 int startMo = days[mSelStartT].month(); 962 int startMo = days[mSelStartT].month();
963 int endMo = days[mSelEndT].month(); 963 int endMo = days[mSelEndT].month();
964 if ( startMo == 12 && mo == 1 && endMo <= 2 ) 964 if ( startMo == 12 && mo == 1 && endMo <= 2 )
965 startMo = 1; 965 startMo = 1;
966 if ( endMo == 1 && mo == 12 ) 966 if ( endMo == 1 && mo == 12 )
967 endMo = 12; 967 endMo = 12;
968 if ( mo == 12 && startMo == 1 ) 968 if ( mo == 12 && startMo == 1 )
969 startMo = 13; 969 startMo = 13;
970 if ( (startMo > mo || endMo < mo) ) { 970 if ( (startMo > mo || endMo < mo) ) {
971 skip = true; 971 skip = true;
972 } else { 972 } else {
973 if ( days[mSelStartT].month() != mo ) { 973 if ( days[mSelStartT].month() != mo ) {
974 int add = days[mSelStartT].daysInMonth ()-days[mSelStartT].day(); 974 int add = days[mSelStartT].daysInMonth ()-days[mSelStartT].day();
975 mSelStartT += add +1; 975 mSelStartT += add +1;
976 } 976 }
977 if ( days[mSelEndT].month() != mo ) { 977 if ( days[mSelEndT].month() != mo ) {
978 int sub = days[mSelEndT].day(); 978 int sub = days[mSelEndT].day();
979 mSelEndT -= sub ; 979 mSelEndT -= sub ;
980 } 980 }
981 } 981 }
982 } 982 }
983 //qDebug("SKIP %d ", skip); 983 //qDebug("SKIP %d ", skip);
984 if ( ! skip ) { 984 if ( ! skip ) {
985 row = mSelStartT/7; 985 row = mSelStartT/7;
986 col = mSelStartT -row*7; 986 col = mSelStartT -row*7;
987 QColor selcol = KOPrefs::instance()->mHighlightColor; 987 QColor selcol = KOPrefs::instance()->mHighlightColor;
988 int addCol = 0; 988 int addCol = 0;
989 int addRow = 0; 989 int addRow = 0;
990 int addRow2 = 0; 990 int addRow2 = 0;
991 int addCol2 = 0; 991 int addCol2 = 0;
992 if (row == mSelEndT/7) { 992 if (row == mSelEndT/7) {
993 if ( rowModulo ) { 993 if ( rowModulo ) {
994 if ( row >= 6 - rowModulo ) 994 if ( row >= 6 - rowModulo )
995 addRow = row - 5 + rowModulo; 995 addRow = row - 5 + rowModulo;
996 } 996 }
997 if ( colModulo ) { 997 if ( colModulo ) {
998 int colt1 = mSelEndT%7; 998 int colt1 = mSelEndT%7;
999 //qDebug("colt1 %d ", colt1 ); 999 //qDebug("colt1 %d ", colt1 );
1000 if ( colt1 >= 7 - colModulo ) 1000 if ( colt1 >= 7 - colModulo )
1001 addCol = colt1 - 7 + colModulo+1; 1001 addCol = colt1 - 7 + colModulo+1;
1002 int colt = mSelStartT%7; 1002 int colt = mSelStartT%7;
1003 if ( colt >= 7 - colModulo ) 1003 if ( colt >= 7 - colModulo )
1004 addCol2 = colt - 7 + colModulo; 1004 addCol2 = colt - 7 + colModulo;
1005 addCol -= addCol2; 1005 addCol -= addCol2;
1006 //qDebug("COL %d %d %d %d ",col , colt1 ,addCol ,addCol2 ); 1006 //qDebug("COL %d %d %d %d ",col , colt1 ,addCol ,addCol2 );
1007 } 1007 }
1008 // Single row selection 1008 // Single row selection
1009 //if ( row == 0) 1009 //if ( row == 0)
1010 // addRow = 1; 1010 // addRow = 1;
1011 p.fillRect(isRTL ? (7 - (mSelEndT-mSelStartT+1) - col)*dwidth : col*dwidth+1+addCol2, 1011 p.fillRect(isRTL ? (7 - (mSelEndT-mSelStartT+1) - col)*dwidth : col*dwidth+1+addCol2,
1012 row*dheight+addRow, (mSelEndT-mSelStartT+1)*dwidth+addCol, dheight+1, selcol); 1012 row*dheight+addRow, (mSelEndT-mSelStartT+1)*dwidth+addCol, dheight+1, selcol);
1013 } else { 1013 } else {
1014 // draw first row to the right 1014 // draw first row to the right
1015 if ( colModulo ) { 1015 if ( colModulo ) {
1016 if ( col >= 7 - colModulo ) 1016 if ( col >= 7 - colModulo )
1017 addCol2 = col - 7 + colModulo; 1017 addCol2 = col - 7 + colModulo;
1018 } 1018 }
1019 if ( rowModulo ) { 1019 if ( rowModulo ) {
1020 if ( row >= 6 - rowModulo ) 1020 if ( row >= 6 - rowModulo )
1021 addRow = row - 5 + rowModulo; 1021 addRow = row - 5 + rowModulo;
1022 } 1022 }
1023 //if ( row == 0) 1023 //if ( row == 0)
1024 // addRow = 1; 1024 // addRow = 1;
1025 int drawWid = width()-(col*dwidth+1+addCol2)-1; 1025 int drawWid = width()-(col*dwidth+1+addCol2)-1;
1026 p.fillRect(isRTL ? 0 : col*dwidth+1+addCol2, row*dheight+addRow, drawWid, 1026 p.fillRect(isRTL ? 0 : col*dwidth+1+addCol2, row*dheight+addRow, drawWid,
1027 dheight+1, selcol); 1027 dheight+1, selcol);
1028 // draw full block till last line 1028 // draw full block till last line
1029 selh = mSelEndT/7-row; 1029 selh = mSelEndT/7-row;
1030 addRow = 0; 1030 addRow = 0;
1031 if ( rowModulo ) { 1031 if ( rowModulo ) {
1032 if ( mSelEndT/7 >= 6 - rowModulo ) 1032 if ( mSelEndT/7 >= 6 - rowModulo )
1033 addRow = mSelEndT/7 - 5 + rowModulo; 1033 addRow = mSelEndT/7 - 5 + rowModulo;
1034 } 1034 }
1035 //qDebug("%d %d %d ",selh, row, addRow ); 1035 //qDebug("%d %d %d ",selh, row, addRow );
1036 int addrow2 = addRow-selh+1; 1036 int addrow2 = addRow-selh+1;
1037 if ( addrow2 < 0 ) 1037 if ( addrow2 < 0 )
1038 addrow2 = 0; 1038 addrow2 = 0;
1039 if (selh > 1) { 1039 if (selh > 1) {
1040 p.fillRect(1, (row+1)*dheight+addrow2, 7*dwidth+colModulo, (selh-1)*dheight+addRow,selcol); 1040 p.fillRect(1, (row+1)*dheight+addrow2, 7*dwidth+colModulo, (selh-1)*dheight+addRow,selcol);
1041 } 1041 }
1042 // draw last block from left to mSelEndT 1042 // draw last block from left to mSelEndT
1043 selw = mSelEndT-7*(mSelEndT/7)+1; 1043 selw = mSelEndT-7*(mSelEndT/7)+1;
1044 //qDebug("esl %d ",selw ); 1044 //qDebug("esl %d ",selw );
1045 int add = 0; 1045 int add = 0;
1046 if ( colModulo ) { 1046 if ( colModulo ) {
1047 add = 7 - colModulo; 1047 add = 7 - colModulo;
1048 if ( selw > add ) 1048 if ( selw > add )
1049 add = selw - add; 1049 add = selw - add;
1050 else 1050 else
1051 add = 0; 1051 add = 0;
1052 } 1052 }
1053 //qDebug("add %d ", add); 1053 //qDebug("add %d ", add);
1054 p.fillRect(isRTL ? (7-selw)*dwidth : 1, (row+selh)*dheight+addRow, 1054 p.fillRect(isRTL ? (7-selw)*dwidth : 1, (row+selh)*dheight+addRow,
1055 selw*dwidth+add, dheight+1, selcol); 1055 selw*dwidth+add, dheight+1, selcol);
1056 } 1056 }
1057 } 1057 }
1058 } 1058 }
1059 1059
1060 // iterate over all days in the matrix and draw the day label in appropriate colors 1060 // iterate over all days in the matrix and draw the day label in appropriate colors
1061 QColor actcol = mDefaultTextColorShaded; 1061 QColor actcol = mDefaultTextColorShaded;
1062 p.setPen(actcol); 1062 p.setPen(actcol);
1063 QPen tmppen; 1063 QPen tmppen;
1064 for(int i = 0; i < NUMDAYS; i++) { 1064 for(int i = 0; i < NUMDAYS; i++) {
1065 row = i/7; 1065 row = i/7;
1066 col = isRTL ? 6-(i-row*7) : i-row*7; 1066 col = isRTL ? 6-(i-row*7) : i-row*7;
1067 1067
1068 // if it is the first day of a month switch color from normal to shaded and vice versa 1068 // if it is the first day of a month switch color from normal to shaded and vice versa
1069 if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) { 1069 if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) {
1070 if (actcol == mDefaultTextColorShaded) { 1070 if (actcol == mDefaultTextColorShaded) {
1071 actcol = mDefaultTextColor; 1071 actcol = mDefaultTextColor;
1072 } else { 1072 } else {
1073 actcol = mDefaultTextColorShaded; 1073 actcol = mDefaultTextColorShaded;
1074 } 1074 }
1075 p.setPen(actcol); 1075 p.setPen(actcol);
1076 } 1076 }
1077 if (actcol == mDefaultTextColorShaded) { 1077 if (actcol == mDefaultTextColorShaded) {
1078 if ( ! mouseDown ) { 1078 if ( ! mouseDown ) {
1079 continue; 1079 continue;
1080 } 1080 }
1081 } 1081 }
1082 //Reset pen color after selected days block 1082 //Reset pen color after selected days block
1083 if (i == mSelEndT+1) { 1083 if (i == mSelEndT+1) {
1084 p.setPen(actcol); 1084 p.setPen(actcol);
1085 } 1085 }
1086 1086
1087 // if today then draw rectangle around day 1087 // if today then draw rectangle around day
1088 if (today == i) { 1088 if (today == i) {
1089 tmppen = p.pen(); 1089 tmppen = p.pen();
1090 QPen mTodayPen(p.pen()); 1090 QPen mTodayPen(p.pen());
1091 if ( daysize.width() < 20 ) 1091 if ( daysize.width() < 20 )
1092 mTodayPen.setWidth(1); 1092 mTodayPen.setWidth(1);
1093 else 1093 else
1094 mTodayPen.setWidth(mTodayMarginWidth); 1094 mTodayPen.setWidth(mTodayMarginWidth);
1095 //draw red rectangle for holidays 1095 //draw red rectangle for holidays
1096 if (pDays.testBit(i)) { 1096 if (pDays.testBit(i)) {
1097 if (actcol == mDefaultTextColor) { 1097 if (actcol == mDefaultTextColor) {
1098 mTodayPen.setColor(KOPrefs::instance()->mHolidayColor); 1098 mTodayPen.setColor(KOPrefs::instance()->mHolidayColor);
1099 } else { 1099 } else {
1100 mTodayPen.setColor(mHolidayColorShaded); 1100 mTodayPen.setColor(mHolidayColorShaded);
1101 } 1101 }
1102 } 1102 }
1103 //draw gray rectangle for today if in selection 1103 //draw gray rectangle for today if in selection
1104 if (i >= mSelStartT && i <= mSelEndT) { 1104 if (i >= mSelStartT && i <= mSelEndT) {
1105 QColor grey("grey"); 1105 QColor grey("grey");
1106 mTodayPen.setColor(grey); 1106 mTodayPen.setColor(grey);
1107 } 1107 }
1108 p.setPen(mTodayPen); 1108 p.setPen(mTodayPen);
1109 1109
1110 1110
1111 int addCol = 0; 1111 int addCol = 0;
1112 int addRow = 0; 1112 int addRow = 0;
1113 if (rowModulo) { 1113 if (rowModulo) {
1114 if ( row >= 6 - rowModulo ) 1114 if ( row >= 6 - rowModulo )
1115 addRow = row - 5 + rowModulo; 1115 addRow = row - 5 + rowModulo;
1116 } 1116 }
1117 if ( colModulo ) { 1117 if ( colModulo ) {
1118 if ( col >= 7 - colModulo ) 1118 if ( col >= 7 - colModulo )
1119 addCol = col - 6 + colModulo-1; 1119 addCol = col - 6 + colModulo-1;
1120 } 1120 }
1121 1121
1122 addCol += 1; 1122 addCol += 1;
1123 if ( row == 0 ) 1123 if ( row == 0 )
1124 addRow = 1; 1124 addRow = 1;
1125 p.drawRect(col*dwidth+addCol, row*dheight+addRow, dwidth+1, dheight+1); 1125 p.drawRect(col*dwidth+addCol, row*dheight+addRow, dwidth+1, dheight+1);
1126 p.setPen(tmppen); 1126 p.setPen(tmppen);
1127 } 1127 }
1128 1128
1129 // if any events are on that day then draw it using a bold font 1129 // if any events are on that day then draw it using a bold font
1130 if ( eDays.testBit(i) ) { 1130 if ( eDays.testBit(i) ) {
1131 QFont myFont = font(); 1131 QFont myFont = font();
1132 myFont.setBold(true); 1132 myFont.setBold(true);
1133 p.setFont(myFont); 1133 p.setFont(myFont);
1134 } 1134 }
1135 1135
1136 // if it is a holiday then use the default holiday color 1136 // if it is a holiday then use the default holiday color
1137 if ( pDays.testBit(i)) { 1137 if ( pDays.testBit(i)) {
1138 if ( bDays.testBit(i) ) { 1138 if ( bDays.testBit(i) ) {
1139 if ( hDays.testBit(i) ) 1139 if ( hDays.testBit(i) )
1140 p.setPen(QColor(0,200,0)); 1140 p.setPen(QColor(0,200,0));
1141 else 1141 else
1142 p.setPen(QColor(Qt::blue)); 1142 p.setPen(QColor(Qt::blue));
1143 } else { 1143 } else {
1144 if (actcol == mDefaultTextColor ) { 1144 if (actcol == mDefaultTextColor ) {
1145 p.setPen(KOPrefs::instance()->mHolidayColor); 1145 p.setPen(KOPrefs::instance()->mHolidayColor);
1146 } else { 1146 } else {
1147 p.setPen(mHolidayColorShaded); 1147 p.setPen(mHolidayColorShaded);
1148 } 1148 }
1149 } 1149 }
1150 } 1150 }
1151 1151
1152 // draw selected days with special color 1152 // draw selected days with special color
1153 // DO NOT specially highlight holidays in selection ! 1153 // DO NOT specially highlight holidays in selection !
1154 if (i >= mSelStartT && i <= mSelEndT) { 1154 if (i >= mSelStartT && i <= mSelEndT) {
1155 ;//p.setPen(mSelectedDaysColor); 1155 ;//p.setPen(mSelectedDaysColor);
1156 } 1156 }
1157 1157
1158 int addCol = 0; 1158 int addCol = 0;
1159 int addRow = 0; 1159 int addRow = 0;
1160 if ( colModulo ) { 1160 if ( colModulo ) {
1161 if ( col >= 7 - colModulo ) 1161 if ( col >= 7 - colModulo )
1162 addCol = col - 7 + colModulo; 1162 addCol = col - 7 + colModulo;
1163 } 1163 }
1164 if ( rowModulo ) { 1164 if ( rowModulo ) {
1165 if ( row >= 6 - rowModulo ) 1165 if ( row >= 6 - rowModulo )
1166 addRow = row - 5 + rowModulo; 1166 addRow = row - 5 + rowModulo;
1167 } 1167 }
1168 //qDebug("add %d %d -- %d %d ", col, addCol, row, addRow); 1168 //qDebug("add %d %d -- %d %d ", col, addCol, row, addRow);
1169 ++addCol;//++addCol; 1169 ++addCol;//++addCol;
1170 if ( row == 0) 1170 if ( row == 0)
1171 addRow = 1; 1171 addRow = 1;
1172 p.drawText(col*dwidth+addCol, row*dheight+addRow, dwidth, dheight, 1172 p.drawText(col*dwidth+addCol, row*dheight+addRow, dwidth, dheight,
1173 Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]); 1173 Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]);
1174 1174
1175 // reset color to actual color 1175 // reset color to actual color
1176 if (pDays.testBit(i)) { 1176 if (pDays.testBit(i)) {
1177 p.setPen(actcol); 1177 p.setPen(actcol);
1178 } 1178 }
1179 // reset bold font to plain font 1179 // reset bold font to plain font
1180 if ( eDays.testBit(i)) { 1180 if ( eDays.testBit(i)) {
1181 QFont myFont = font(); 1181 QFont myFont = font();
1182 myFont.setBold(false); 1182 myFont.setBold(false);
1183 p.setFont(myFont); 1183 p.setFont(myFont);
1184 } 1184 }
1185 } 1185 }
1186 p.setPen(mDefaultTextColor); 1186 p.setPen(mDefaultTextColor);
1187 p.drawRect(0, 0, width(), height()); 1187 p.drawRect(0, 0, width(), height());
1188 } else { 1188 } else {
1189 //qDebug("NO redraw "); 1189 //qDebug("NO redraw ");
1190 } 1190 }
1191 1191
1192 bitBlt (this, pevent->rect().topLeft(), &myPix , pevent->rect() ,CopyROP); 1192 bitBlt (this, pevent->rect().topLeft(), &myPix , pevent->rect() ,CopyROP);
1193 mRedrawNeeded = false; 1193 mRedrawNeeded = false;
1194} 1194}
1195 1195
1196// ---------------------------------------------------------------------------- 1196// ----------------------------------------------------------------------------
1197// R E SI Z E E V E N T H A N D L I N G 1197// R E SI Z E E V E N T H A N D L I N G
1198// ---------------------------------------------------------------------------- 1198// ----------------------------------------------------------------------------
1199 1199
1200void KODayMatrix::resizeEvent(QResizeEvent * e) 1200void KODayMatrix::resizeEvent(QResizeEvent * e)
1201{ 1201{
1202 QRect sz = frameRect(); 1202 QRect sz = frameRect();
1203 daysize.setHeight(sz.height()*7 / NUMDAYS); 1203 daysize.setHeight(sz.height()*7 / NUMDAYS);
1204 daysize.setWidth(sz.width() / 7); 1204 daysize.setWidth(sz.width() / 7);
1205 QFrame::resizeEvent( e ); 1205 QFrame::resizeEvent( e );
1206} 1206}
1207 1207
1208QSize KODayMatrix::sizeHint() const 1208QSize KODayMatrix::sizeHint() const
1209{ 1209{
1210 1210
1211 QFontMetrics fm ( font() ); 1211 QFontMetrics fm ( font() );
1212 int wid = fm.width( "30") *7+3; 1212 int wid = fm.width( "30") *7+3;
1213 int hei = fm.height() * 6+3; 1213 int hei = fm.height() * 6+3;
1214 //qDebug("KODayMatrix::sizeHint()********************* %d %d", wid , hei); 1214 //qDebug("KODayMatrix::sizeHint()********************* %d %d", wid , hei);
1215 return QSize ( wid, hei ); 1215 return QSize ( wid, hei );
1216 1216
1217} 1217}
diff --git a/korganizer/koeditorrecurrence.cpp b/korganizer/koeditorrecurrence.cpp
index de4e4f7..89504db 100644
--- a/korganizer/koeditorrecurrence.cpp
+++ b/korganizer/koeditorrecurrence.cpp
@@ -132,989 +132,995 @@ RecurWeekly::RecurWeekly( QWidget *parent, const char *name ) :
132 132
133 topLayout->addStretch( ); 133 topLayout->addStretch( );
134} 134}
135 135
136void RecurWeekly::setDays( const QBitArray &days ) 136void RecurWeekly::setDays( const QBitArray &days )
137{ 137{
138 for ( int i = 0; i < 7; ++i ) { 138 for ( int i = 0; i < 7; ++i ) {
139 mDayBoxes[ i ]->setChecked( days.testBit( i ) ); 139 mDayBoxes[ i ]->setChecked( days.testBit( i ) );
140 } 140 }
141} 141}
142 142
143QBitArray RecurWeekly::days() 143QBitArray RecurWeekly::days()
144{ 144{
145 QBitArray days( 7 ); 145 QBitArray days( 7 );
146 146
147 for ( int i = 0; i < 7; ++i ) { 147 for ( int i = 0; i < 7; ++i ) {
148 days.setBit( i, mDayBoxes[ i ]->isChecked() ); 148 days.setBit( i, mDayBoxes[ i ]->isChecked() );
149 } 149 }
150 150
151 return days; 151 return days;
152} 152}
153 153
154/////////////////////////// RecurMonthly /////////////////////////////// 154/////////////////////////// RecurMonthly ///////////////////////////////
155 155
156RecurMonthly::RecurMonthly( QWidget *parent, const char *name ) : 156RecurMonthly::RecurMonthly( QWidget *parent, const char *name ) :
157 RecurBase( parent, name ) 157 RecurBase( parent, name )
158{ 158{
159 QBoxLayout *topLayout = new QVBoxLayout( this ); 159 QBoxLayout *topLayout = new QVBoxLayout( this );
160 topLayout->setSpacing( KDialog::spacingHint() ); 160 topLayout->setSpacing( KDialog::spacingHint() );
161 topLayout->setMargin( KDialog::marginHintSmall() ); 161 topLayout->setMargin( KDialog::marginHintSmall() );
162 162
163 163
164 QBoxLayout *freqLayout = new QHBoxLayout( topLayout ); 164 QBoxLayout *freqLayout = new QHBoxLayout( topLayout );
165 165
166 QLabel *preLabel = new QLabel( i18n("every"), this ); 166 QLabel *preLabel = new QLabel( i18n("every"), this );
167 freqLayout->addWidget( preLabel ); 167 freqLayout->addWidget( preLabel );
168 168
169 freqLayout->addWidget( frequencyEdit() ); 169 freqLayout->addWidget( frequencyEdit() );
170 170
171 QLabel *postLabel = new QLabel( i18n("month(s)"), this ); 171 QLabel *postLabel = new QLabel( i18n("month(s)"), this );
172 freqLayout->addWidget( postLabel ); 172 freqLayout->addWidget( postLabel );
173 173
174 174
175 QButtonGroup *buttonGroup = new QButtonGroup( this ); 175 QButtonGroup *buttonGroup = new QButtonGroup( this );
176 buttonGroup->setFrameStyle( QFrame::NoFrame ); 176 buttonGroup->setFrameStyle( QFrame::NoFrame );
177 topLayout->addWidget( buttonGroup, 1, AlignVCenter ); 177 topLayout->addWidget( buttonGroup, 1, AlignVCenter );
178 178
179 QGridLayout *buttonLayout = new QGridLayout( buttonGroup, 3, 2 ); 179 QGridLayout *buttonLayout = new QGridLayout( buttonGroup, 3, 2 );
180 buttonLayout->setSpacing( KDialog::spacingHint() ); 180 buttonLayout->setSpacing( KDialog::spacingHint() );
181 buttonLayout->setMargin( KDialog::marginHintSmall() ); 181 buttonLayout->setMargin( KDialog::marginHintSmall() );
182 182
183 183
184 QString recurOnText; 184 QString recurOnText;
185 if ( QApplication::desktop()->width() > 320 ) { 185 if ( QApplication::desktop()->width() > 320 ) {
186 recurOnText = i18n("Recur on the"); 186 recurOnText = i18n("Recur on the");
187 } 187 }
188 188
189 mByDayRadio = new QRadioButton( recurOnText, buttonGroup ); 189 mByDayRadio = new QRadioButton( recurOnText, buttonGroup );
190 buttonLayout->addWidget( mByDayRadio, 0, 0 ); 190 buttonLayout->addWidget( mByDayRadio, 0, 0 );
191 191
192 mByDayCombo = new QComboBox( buttonGroup ); 192 mByDayCombo = new QComboBox( buttonGroup );
193 mByDayCombo->setSizeLimit( 7 ); 193 mByDayCombo->setSizeLimit( 7 );
194 mByDayCombo->insertItem( i18n("1st") ); 194 mByDayCombo->insertItem( i18n("1st") );
195 mByDayCombo->insertItem( i18n("2nd") ); 195 mByDayCombo->insertItem( i18n("2nd") );
196 mByDayCombo->insertItem( i18n("3rd") ); 196 mByDayCombo->insertItem( i18n("3rd") );
197 mByDayCombo->insertItem( i18n("4th") ); 197 mByDayCombo->insertItem( i18n("4th") );
198 mByDayCombo->insertItem( i18n("5th") ); 198 mByDayCombo->insertItem( i18n("5th") );
199 mByDayCombo->insertItem( i18n("6th") ); 199 mByDayCombo->insertItem( i18n("6th") );
200 mByDayCombo->insertItem( i18n("7th") ); 200 mByDayCombo->insertItem( i18n("7th") );
201 mByDayCombo->insertItem( i18n("8th") ); 201 mByDayCombo->insertItem( i18n("8th") );
202 mByDayCombo->insertItem( i18n("9th") ); 202 mByDayCombo->insertItem( i18n("9th") );
203 mByDayCombo->insertItem( i18n("10th") ); 203 mByDayCombo->insertItem( i18n("10th") );
204 mByDayCombo->insertItem( i18n("11th") ); 204 mByDayCombo->insertItem( i18n("11th") );
205 mByDayCombo->insertItem( i18n("12th") ); 205 mByDayCombo->insertItem( i18n("12th") );
206 mByDayCombo->insertItem( i18n("13th") ); 206 mByDayCombo->insertItem( i18n("13th") );
207 mByDayCombo->insertItem( i18n("14th") ); 207 mByDayCombo->insertItem( i18n("14th") );
208 mByDayCombo->insertItem( i18n("15th") ); 208 mByDayCombo->insertItem( i18n("15th") );
209 mByDayCombo->insertItem( i18n("16th") ); 209 mByDayCombo->insertItem( i18n("16th") );
210 mByDayCombo->insertItem( i18n("17th") ); 210 mByDayCombo->insertItem( i18n("17th") );
211 mByDayCombo->insertItem( i18n("18th") ); 211 mByDayCombo->insertItem( i18n("18th") );
212 mByDayCombo->insertItem( i18n("19th") ); 212 mByDayCombo->insertItem( i18n("19th") );
213 mByDayCombo->insertItem( i18n("20th") ); 213 mByDayCombo->insertItem( i18n("20th") );
214 mByDayCombo->insertItem( i18n("21st") ); 214 mByDayCombo->insertItem( i18n("21st") );
215 mByDayCombo->insertItem( i18n("22nd") ); 215 mByDayCombo->insertItem( i18n("22nd") );
216 mByDayCombo->insertItem( i18n("23rd") ); 216 mByDayCombo->insertItem( i18n("23rd") );
217 mByDayCombo->insertItem( i18n("24th") ); 217 mByDayCombo->insertItem( i18n("24th") );
218 mByDayCombo->insertItem( i18n("25th") ); 218 mByDayCombo->insertItem( i18n("25th") );
219 mByDayCombo->insertItem( i18n("26th") ); 219 mByDayCombo->insertItem( i18n("26th") );
220 mByDayCombo->insertItem( i18n("27th") ); 220 mByDayCombo->insertItem( i18n("27th") );
221 mByDayCombo->insertItem( i18n("28th") ); 221 mByDayCombo->insertItem( i18n("28th") );
222 mByDayCombo->insertItem( i18n("29th") ); 222 mByDayCombo->insertItem( i18n("29th") );
223 mByDayCombo->insertItem( i18n("30th") ); 223 mByDayCombo->insertItem( i18n("30th") );
224 mByDayCombo->insertItem( i18n("31st") ); 224 mByDayCombo->insertItem( i18n("31st") );
225 buttonLayout->addWidget( mByDayCombo, 0, 1 ); 225 buttonLayout->addWidget( mByDayCombo, 0, 1 );
226 226
227 QLabel *byDayLabel = new QLabel( i18n("day"), buttonGroup ); 227 QLabel *byDayLabel = new QLabel( i18n("day"), buttonGroup );
228 buttonLayout->addWidget( byDayLabel, 0, 2 ); 228 buttonLayout->addWidget( byDayLabel, 0, 2 );
229 229
230 230
231 mByPosRadio = new QRadioButton( recurOnText, buttonGroup); 231 mByPosRadio = new QRadioButton( recurOnText, buttonGroup);
232 buttonLayout->addWidget( mByPosRadio, 1, 0 ); 232 buttonLayout->addWidget( mByPosRadio, 1, 0 );
233 233
234 mByPosCountCombo = new QComboBox( buttonGroup ); 234 mByPosCountCombo = new QComboBox( buttonGroup );
235 mByPosCountCombo->insertItem( i18n("1st") ); 235 mByPosCountCombo->insertItem( i18n("1st") );
236 mByPosCountCombo->insertItem( i18n("2nd") ); 236 mByPosCountCombo->insertItem( i18n("2nd") );
237 mByPosCountCombo->insertItem( i18n("3rd") ); 237 mByPosCountCombo->insertItem( i18n("3rd") );
238 mByPosCountCombo->insertItem( i18n("4th") ); 238 mByPosCountCombo->insertItem( i18n("4th") );
239 mByPosCountCombo->insertItem( i18n("5th") ); 239 mByPosCountCombo->insertItem( i18n("5th") );
240 buttonLayout->addWidget( mByPosCountCombo, 1, 1 ); 240 buttonLayout->addWidget( mByPosCountCombo, 1, 1 );
241 241
242 mByPosWeekdayCombo = new QComboBox( buttonGroup ); 242 mByPosWeekdayCombo = new QComboBox( buttonGroup );
243 mByPosWeekdayCombo->insertItem( i18n("Monday") ); 243 mByPosWeekdayCombo->insertItem( i18n("Monday") );
244 mByPosWeekdayCombo->insertItem( i18n("Tuesday") ); 244 mByPosWeekdayCombo->insertItem( i18n("Tuesday") );
245 mByPosWeekdayCombo->insertItem( i18n("Wednesday") ); 245 mByPosWeekdayCombo->insertItem( i18n("Wednesday") );
246 mByPosWeekdayCombo->insertItem( i18n("Thursday") ); 246 mByPosWeekdayCombo->insertItem( i18n("Thursday") );
247 mByPosWeekdayCombo->insertItem( i18n("Friday") ); 247 mByPosWeekdayCombo->insertItem( i18n("Friday") );
248 mByPosWeekdayCombo->insertItem( i18n("Saturday") ); 248 mByPosWeekdayCombo->insertItem( i18n("Saturday") );
249 mByPosWeekdayCombo->insertItem( i18n("Sunday") ); 249 mByPosWeekdayCombo->insertItem( i18n("Sunday") );
250 buttonLayout->addWidget( mByPosWeekdayCombo, 1, 2 ); 250 buttonLayout->addWidget( mByPosWeekdayCombo, 1, 2 );
251} 251}
252 252
253void RecurMonthly::setByDay( int day ) 253void RecurMonthly::setByDay( int day )
254{ 254{
255 mByDayRadio->setChecked( true ); 255 mByDayRadio->setChecked( true );
256 mByDayCombo->setCurrentItem( day ); 256 mByDayCombo->setCurrentItem( day );
257} 257}
258 258
259void RecurMonthly::setByPos( int count, int weekday ) 259void RecurMonthly::setByPos( int count, int weekday )
260{ 260{
261 mByPosRadio->setChecked( true ); 261 mByPosRadio->setChecked( true );
262 mByPosCountCombo->setCurrentItem( count ); 262 mByPosCountCombo->setCurrentItem( count );
263 mByPosWeekdayCombo->setCurrentItem( weekday ); 263 mByPosWeekdayCombo->setCurrentItem( weekday );
264} 264}
265 265
266bool RecurMonthly::byDay() 266bool RecurMonthly::byDay()
267{ 267{
268 return mByDayRadio->isChecked(); 268 return mByDayRadio->isChecked();
269} 269}
270 270
271bool RecurMonthly::byPos() 271bool RecurMonthly::byPos()
272{ 272{
273 return mByPosRadio->isChecked(); 273 return mByPosRadio->isChecked();
274} 274}
275 275
276int RecurMonthly::day() 276int RecurMonthly::day()
277{ 277{
278 return mByDayCombo->currentItem() + 1; 278 return mByDayCombo->currentItem() + 1;
279} 279}
280 280
281int RecurMonthly::count() 281int RecurMonthly::count()
282{ 282{
283 return mByPosCountCombo->currentItem() + 1; 283 return mByPosCountCombo->currentItem() + 1;
284} 284}
285 285
286int RecurMonthly::weekday() 286int RecurMonthly::weekday()
287{ 287{
288 return mByPosWeekdayCombo->currentItem(); 288 return mByPosWeekdayCombo->currentItem();
289} 289}
290 290
291/////////////////////////// RecurYearly /////////////////////////////// 291/////////////////////////// RecurYearly ///////////////////////////////
292 292
293RecurYearly::RecurYearly( QWidget *parent, const char *name ) : 293RecurYearly::RecurYearly( QWidget *parent, const char *name ) :
294 RecurBase( parent, name ) 294 RecurBase( parent, name )
295{ 295{
296 QBoxLayout *topLayout = new QVBoxLayout( this ); 296 QBoxLayout *topLayout = new QVBoxLayout( this );
297 topLayout->setSpacing( KDialog::spacingHint() ); 297 topLayout->setSpacing( KDialog::spacingHint() );
298 topLayout->setMargin( KDialog::marginHintSmall() ); 298 topLayout->setMargin( KDialog::marginHintSmall() );
299 299
300 300
301 QBoxLayout *freqLayout = new QHBoxLayout( topLayout ); 301 QBoxLayout *freqLayout = new QHBoxLayout( topLayout );
302 302
303 QLabel *preLabel = new QLabel( i18n("every"), this ); 303 QLabel *preLabel = new QLabel( i18n("every"), this );
304 freqLayout->addWidget( preLabel ); 304 freqLayout->addWidget( preLabel );
305 305
306 freqLayout->addWidget( frequencyEdit() ); 306 freqLayout->addWidget( frequencyEdit() );
307 307
308 QLabel *postLabel = new QLabel( i18n("year(s)"), this ); 308 QLabel *postLabel = new QLabel( i18n("year(s)"), this );
309 freqLayout->addWidget( postLabel ); 309 freqLayout->addWidget( postLabel );
310 310
311 311
312 QButtonGroup *buttonGroup = new QButtonGroup( this ); 312 QButtonGroup *buttonGroup = new QButtonGroup( this );
313 buttonGroup->setFrameStyle( QFrame::NoFrame ); 313 buttonGroup->setFrameStyle( QFrame::NoFrame );
314 topLayout->addWidget( buttonGroup, 1, AlignVCenter ); 314 topLayout->addWidget( buttonGroup, 1, AlignVCenter );
315 315
316 QGridLayout *buttonLayout = new QGridLayout( buttonGroup, 2, 3 ); 316 QGridLayout *buttonLayout = new QGridLayout( buttonGroup, 2, 3 );
317 317
318 mByMonthRadio = new QRadioButton( i18n("On day "), buttonGroup); 318 mByMonthRadio = new QRadioButton( i18n("On day "), buttonGroup);
319 buttonLayout->addWidget( mByMonthRadio, 0, 0 , Qt::AlignRight); 319 buttonLayout->addWidget( mByMonthRadio, 0, 0 , Qt::AlignRight);
320 mByDayLabel = new QLabel( i18n("%1 of ").arg(1), buttonGroup ); 320 mByDayLabel = new QLabel( i18n("%1 of ").arg(1), buttonGroup );
321 321
322 buttonLayout->addWidget( mByDayLabel, 0, 1 ); 322 buttonLayout->addWidget( mByDayLabel, 0, 1 );
323 mByMonthCombo = new QComboBox( buttonGroup ); 323 mByMonthCombo = new QComboBox( buttonGroup );
324 mByMonthCombo->insertItem( i18n("January") ); 324 mByMonthCombo->insertItem( i18n("January") );
325 mByMonthCombo->insertItem( i18n("February") ); 325 mByMonthCombo->insertItem( i18n("February") );
326 mByMonthCombo->insertItem( i18n("March") ); 326 mByMonthCombo->insertItem( i18n("March") );
327 mByMonthCombo->insertItem( i18n("April") ); 327 mByMonthCombo->insertItem( i18n("April") );
328 mByMonthCombo->insertItem( i18n("May") ); 328 mByMonthCombo->insertItem( i18n("May") );
329 mByMonthCombo->insertItem( i18n("June") ); 329 mByMonthCombo->insertItem( i18n("June") );
330 mByMonthCombo->insertItem( i18n("July") ); 330 mByMonthCombo->insertItem( i18n("July") );
331 mByMonthCombo->insertItem( i18n("August") ); 331 mByMonthCombo->insertItem( i18n("August") );
332 mByMonthCombo->insertItem( i18n("September") ); 332 mByMonthCombo->insertItem( i18n("September") );
333 mByMonthCombo->insertItem( i18n("October") ); 333 mByMonthCombo->insertItem( i18n("October") );
334 mByMonthCombo->insertItem( i18n("November") ); 334 mByMonthCombo->insertItem( i18n("November") );
335 mByMonthCombo->insertItem( i18n("December") ); 335 mByMonthCombo->insertItem( i18n("December") );
336 buttonLayout->addWidget( mByMonthCombo, 0, 2,Qt::AlignLeft ); 336 buttonLayout->addWidget( mByMonthCombo, 0, 2,Qt::AlignLeft );
337 if ( QApplication::desktop()->width() <= 640 ) { 337 if ( QApplication::desktop()->width() <= 640 ) {
338 mByMonthCombo->setSizeLimit( 6 ); 338 mByMonthCombo->setSizeLimit( 6 );
339 } 339 }
340 340
341 mByDayRadio = new QRadioButton( i18n("On day "), buttonGroup); 341 mByDayRadio = new QRadioButton( i18n("On day "), buttonGroup);
342 buttonLayout->addWidget( mByDayRadio, 1, 0 , Qt::AlignRight); 342 buttonLayout->addWidget( mByDayRadio, 1, 0 , Qt::AlignRight);
343 mDayOfLabel = new QLabel( i18n("%1 of the year").arg(1), buttonGroup ); 343 mDayOfLabel = new QLabel( i18n("%1 of the year").arg(1), buttonGroup );
344 buttonLayout->addMultiCellWidget( mDayOfLabel, 1, 1, 1,3 ); 344 buttonLayout->addMultiCellWidget( mDayOfLabel, 1, 1, 1,3 );
345 345
346} 346}
347 347
348void RecurYearly::setByDay( int doy ) 348void RecurYearly::setByDay( int doy )
349{ 349{
350 mByDayRadio->setChecked( true ); 350 mByDayRadio->setChecked( true );
351 mDayOfLabel->setText(i18n("%1 of the year").arg( doy ) ); 351 mDayOfLabel->setText(i18n("%1 of the year").arg( doy ) );
352} 352}
353 353
354void RecurYearly::setByMonth( int month, int day ) 354void RecurYearly::setByMonth( int month, int day )
355{ 355{
356 mByMonthRadio->setChecked( true ); 356 mByMonthRadio->setChecked( true );
357 mByMonthCombo->setCurrentItem( month - 1 ); 357 mByMonthCombo->setCurrentItem( month - 1 );
358 mByDayLabel->setText(i18n("%1 of ").arg( day ) ); 358 mByDayLabel->setText(i18n("%1 of ").arg( day ) );
359 mDay = day; 359 mDay = day;
360} 360}
361 361
362bool RecurYearly::byMonth() 362bool RecurYearly::byMonth()
363{ 363{
364 return mByMonthRadio->isChecked(); 364 return mByMonthRadio->isChecked();
365} 365}
366 366
367bool RecurYearly::byDay() 367bool RecurYearly::byDay()
368{ 368{
369 return mByDayRadio->isChecked(); 369 return mByDayRadio->isChecked();
370} 370}
371 371
372int RecurYearly::month() 372int RecurYearly::month()
373{ 373{
374 return mByMonthCombo->currentItem() + 1; 374 return mByMonthCombo->currentItem() + 1;
375} 375}
376int RecurYearly::day() 376int RecurYearly::day()
377{ 377{
378 return mDay;//mByDayCombo->currentItem() + 1; 378 return mDay;//mByDayCombo->currentItem() + 1;
379} 379}
380 380
381//////////////////////////// ExceptionsWidget ////////////////////////// 381//////////////////////////// ExceptionsWidget //////////////////////////
382 382
383ExceptionsWidget::ExceptionsWidget( QWidget *parent, const char *name ) : 383ExceptionsWidget::ExceptionsWidget( QWidget *parent, const char *name ) :
384 QWidget( parent, name ) 384 QWidget( parent, name )
385{ 385{
386 QBoxLayout *topLayout = new QVBoxLayout( this ); 386 QBoxLayout *topLayout = new QVBoxLayout( this );
387 387
388 QGroupBox *groupBox = new QGroupBox( 1, Horizontal, i18n("Exceptions"), 388 QGroupBox *groupBox = new QGroupBox( 1, Horizontal, i18n("Exceptions"),
389 this ); 389 this );
390 topLayout->addWidget( groupBox ); 390 topLayout->addWidget( groupBox );
391 391
392 QWidget *box = new QWidget( groupBox ); 392 QWidget *box = new QWidget( groupBox );
393 393
394 QGridLayout *boxLayout = new QGridLayout( box ); 394 QGridLayout *boxLayout = new QGridLayout( box );
395 395
396 mExceptionDateEdit = new KDateEdit( box ); 396 mExceptionDateEdit = new KDateEdit( box );
397 boxLayout->addWidget( mExceptionDateEdit, 0, 0 ); 397 boxLayout->addWidget( mExceptionDateEdit, 0, 0 );
398 398
399 QPushButton *addExceptionButton = new QPushButton( i18n("Add"), box ); 399 QPushButton *addExceptionButton = new QPushButton( i18n("Add"), box );
400 boxLayout->addWidget( addExceptionButton, 1, 0 ); 400 boxLayout->addWidget( addExceptionButton, 1, 0 );
401 QPushButton *changeExceptionButton = new QPushButton( i18n("Change"), box ); 401 QPushButton *changeExceptionButton = new QPushButton( i18n("Change"), box );
402 boxLayout->addWidget( changeExceptionButton, 2, 0 ); 402 boxLayout->addWidget( changeExceptionButton, 2, 0 );
403 QPushButton *deleteExceptionButton = new QPushButton( i18n("Delete"), box ); 403 QPushButton *deleteExceptionButton = new QPushButton( i18n("Delete"), box );
404 boxLayout->addWidget( deleteExceptionButton, 3, 0 ); 404 boxLayout->addWidget( deleteExceptionButton, 3, 0 );
405 405
406 mExceptionList = new QListBox( box ); 406 mExceptionList = new QListBox( box );
407 boxLayout->addMultiCellWidget( mExceptionList, 0, 3, 1, 1 ); 407 boxLayout->addMultiCellWidget( mExceptionList, 0, 3, 1, 1 );
408 408
409 boxLayout->setRowStretch( 4, 1 ); 409 boxLayout->setRowStretch( 4, 1 );
410 boxLayout->setColStretch( 1, 3 ); 410 boxLayout->setColStretch( 1, 3 );
411 411
412 connect( addExceptionButton, SIGNAL( clicked() ), 412 connect( addExceptionButton, SIGNAL( clicked() ),
413 SLOT( addException() ) ); 413 SLOT( addException() ) );
414 connect( changeExceptionButton, SIGNAL( clicked() ), 414 connect( changeExceptionButton, SIGNAL( clicked() ),
415 SLOT( changeException() ) ); 415 SLOT( changeException() ) );
416 connect( deleteExceptionButton, SIGNAL( clicked() ), 416 connect( deleteExceptionButton, SIGNAL( clicked() ),
417 SLOT( deleteException() ) ); 417 SLOT( deleteException() ) );
418 if ( QApplication::desktop()->width() < 480 ) { 418 if ( QApplication::desktop()->width() < 480 ) {
419 setMinimumWidth( 220 ); 419 setMinimumWidth( 220 );
420 } else { 420 } else {
421 setMinimumWidth( 440 ); 421 setMinimumWidth( 440 );
422 mExceptionDateEdit->setMinimumWidth( 200 ); 422 mExceptionDateEdit->setMinimumWidth( 200 );
423 } 423 }
424} 424}
425 425
426void ExceptionsWidget::setDefaults( const QDateTime &from ) 426void ExceptionsWidget::setDefaults( const QDateTime &from )
427{ 427{
428 mExceptionDateEdit->setDate( from.date() ); 428 mExceptionDateEdit->setDate( from.date() );
429} 429}
430 430
431void ExceptionsWidget::addException() 431void ExceptionsWidget::addException()
432{ 432{
433 QDate date = mExceptionDateEdit->date(); 433 QDate date = mExceptionDateEdit->date();
434 QString dateStr = KGlobal::locale()->formatDate( date ); 434 QString dateStr = KGlobal::locale()->formatDate( date );
435 if( !mExceptionList->findItem( dateStr ) ) { 435 if( !mExceptionList->findItem( dateStr ) ) {
436 mExceptionDates.append( date ); 436 mExceptionDates.append( date );
437 mExceptionList->insertItem( dateStr ); 437 mExceptionList->insertItem( dateStr );
438 } 438 }
439} 439}
440 440
441void ExceptionsWidget::changeException() 441void ExceptionsWidget::changeException()
442{ 442{
443 int pos = mExceptionList->currentItem(); 443 int pos = mExceptionList->currentItem();
444 if ( pos < 0 ) return; 444 if ( pos < 0 ) return;
445 445
446 QDate date = mExceptionDateEdit->date(); 446 QDate date = mExceptionDateEdit->date();
447 mExceptionDates[ pos ] = date; 447 mExceptionDates[ pos ] = date;
448 mExceptionList->changeItem( KGlobal::locale()->formatDate( date ), pos ); 448 mExceptionList->changeItem( KGlobal::locale()->formatDate( date ), pos );
449} 449}
450 450
451void ExceptionsWidget::deleteException() 451void ExceptionsWidget::deleteException()
452{ 452{
453 int pos = mExceptionList->currentItem(); 453 int pos = mExceptionList->currentItem();
454 if ( pos < 0 ) return; 454 if ( pos < 0 ) return;
455 455
456 mExceptionDates.remove( mExceptionDates.at( pos ) ); 456 mExceptionDates.remove( mExceptionDates.at( pos ) );
457 mExceptionList->removeItem( pos ); 457 mExceptionList->removeItem( pos );
458} 458}
459 459
460void ExceptionsWidget::setDates( const DateList &dates ) 460void ExceptionsWidget::setDates( const DateList &dates )
461{ 461{
462 mExceptionList->clear(); 462 mExceptionList->clear();
463 mExceptionDates.clear(); 463 mExceptionDates.clear();
464 DateList::ConstIterator dit; 464 DateList::ConstIterator dit;
465 for ( dit = dates.begin(); dit != dates.end(); ++dit ) { 465 for ( dit = dates.begin(); dit != dates.end(); ++dit ) {
466 mExceptionList->insertItem( KGlobal::locale()->formatDate(* dit ) ); 466 mExceptionList->insertItem( KGlobal::locale()->formatDate(* dit ) );
467 mExceptionDates.append( *dit ); 467 mExceptionDates.append( *dit );
468 } 468 }
469} 469}
470 470
471DateList ExceptionsWidget::dates() 471DateList ExceptionsWidget::dates()
472{ 472{
473 return mExceptionDates; 473 return mExceptionDates;
474} 474}
475 475
476///////////////////////// ExceptionsDialog /////////////////////////// 476///////////////////////// ExceptionsDialog ///////////////////////////
477 477
478ExceptionsDialog::ExceptionsDialog( QWidget *parent, const char *name ) : 478ExceptionsDialog::ExceptionsDialog( QWidget *parent, const char *name ) :
479 KDialogBase( parent, name, true, i18n("Edit exceptions"), Ok|Cancel ) 479 KDialogBase( parent, name, true, i18n("Edit exceptions"), Ok|Cancel )
480{ 480{
481 mExceptions = new ExceptionsWidget( this ); 481 mExceptions = new ExceptionsWidget( this );
482 setMainWidget( mExceptions ); 482 setMainWidget( mExceptions );
483 resize(220,10); 483 resize(220,10);
484} 484}
485 485
486void ExceptionsDialog::setDefaults( const QDateTime &from ) 486void ExceptionsDialog::setDefaults( const QDateTime &from )
487{ 487{
488 mExceptions->setDefaults( from ); 488 mExceptions->setDefaults( from );
489} 489}
490 490
491void ExceptionsDialog::setDates( const DateList &dates ) 491void ExceptionsDialog::setDates( const DateList &dates )
492{ 492{
493 mExceptions->setDates( dates ); 493 mExceptions->setDates( dates );
494} 494}
495 495
496DateList ExceptionsDialog::dates() 496DateList ExceptionsDialog::dates()
497{ 497{
498 return mExceptions->dates(); 498 return mExceptions->dates();
499} 499}
500 500
501///////////////////////// RecurrenceRangeWidget /////////////////////////// 501///////////////////////// RecurrenceRangeWidget ///////////////////////////
502 502
503RecurrenceRangeWidget::RecurrenceRangeWidget( QWidget *parent, 503RecurrenceRangeWidget::RecurrenceRangeWidget( QWidget *parent,
504 const char *name ) 504 const char *name )
505 : QWidget( parent, name ) 505 : QWidget( parent, name )
506{ 506{
507 QBoxLayout *topLayout = new QVBoxLayout( this ); 507 QBoxLayout *topLayout = new QVBoxLayout( this );
508 508
509 mRangeGroupBox = new QGroupBox( 1, Horizontal, i18n("Recurrence Range"), 509 mRangeGroupBox = new QGroupBox( 1, Horizontal, i18n("Recurrence Range"),
510 this ); 510 this );
511 topLayout->addWidget( mRangeGroupBox ); 511 topLayout->addWidget( mRangeGroupBox );
512 512
513 QWidget *rangeBox = new QWidget( mRangeGroupBox ); 513 QWidget *rangeBox = new QWidget( mRangeGroupBox );
514 QVBoxLayout *rangeLayout = new QVBoxLayout( rangeBox ); 514 QVBoxLayout *rangeLayout = new QVBoxLayout( rangeBox );
515 rangeLayout->setSpacing( KDialog::spacingHint() ); 515 rangeLayout->setSpacing( KDialog::spacingHint() );
516 rangeLayout->setMargin( KDialog::marginHintSmall() ); 516 rangeLayout->setMargin( KDialog::marginHintSmall() );
517 517
518 mStartDateLabel = new QLabel( i18n("Begin on:"), rangeBox ); 518 mStartDateLabel = new QLabel( i18n("Begin on:"), rangeBox );
519 rangeLayout->addWidget( mStartDateLabel ); 519 rangeLayout->addWidget( mStartDateLabel );
520 520
521 QButtonGroup *rangeButtonGroup = new QButtonGroup; 521 QButtonGroup *rangeButtonGroup = new QButtonGroup;
522 522
523 mNoEndDateButton = new QRadioButton( i18n("No ending date"), rangeBox ); 523 mNoEndDateButton = new QRadioButton( i18n("No ending date"), rangeBox );
524 rangeButtonGroup->insert( mNoEndDateButton ); 524 rangeButtonGroup->insert( mNoEndDateButton );
525 rangeLayout->addWidget( mNoEndDateButton ); 525 rangeLayout->addWidget( mNoEndDateButton );
526 526
527 QBoxLayout *durationLayout = new QHBoxLayout( rangeLayout ); 527 QBoxLayout *durationLayout = new QHBoxLayout( rangeLayout );
528 durationLayout->setSpacing( KDialog::spacingHint() ); 528 durationLayout->setSpacing( KDialog::spacingHint() );
529 529
530 mEndDurationButton = new QRadioButton( i18n("End after"), rangeBox ); 530 mEndDurationButton = new QRadioButton( i18n("End after"), rangeBox );
531 rangeButtonGroup->insert( mEndDurationButton ); 531 rangeButtonGroup->insert( mEndDurationButton );
532 durationLayout->addWidget( mEndDurationButton ); 532 durationLayout->addWidget( mEndDurationButton );
533 533
534 mEndDurationEdit = new QSpinBox( 1, 9999, 1, rangeBox ); 534 mEndDurationEdit = new QSpinBox( 1, 9999, 1, rangeBox );
535 durationLayout->addWidget( mEndDurationEdit ); 535 durationLayout->addWidget( mEndDurationEdit );
536 536
537 QLabel *endDurationLabel = new QLabel( i18n("occurrence(s)"), rangeBox ); 537 QLabel *endDurationLabel = new QLabel( i18n("occurrence(s)"), rangeBox );
538 durationLayout ->addWidget( endDurationLabel ); 538 durationLayout ->addWidget( endDurationLabel );
539 539
540 QBoxLayout *endDateLayout = new QHBoxLayout( rangeLayout ); 540 QBoxLayout *endDateLayout = new QHBoxLayout( rangeLayout );
541 endDateLayout->setSpacing( KDialog::spacingHint() ); 541 endDateLayout->setSpacing( KDialog::spacingHint() );
542 542
543 mEndDateButton = new QRadioButton( i18n("End by:"), rangeBox ); 543 mEndDateButton = new QRadioButton( i18n("End by:"), rangeBox );
544 rangeButtonGroup->insert( mEndDateButton ); 544 rangeButtonGroup->insert( mEndDateButton );
545 endDateLayout->addWidget( mEndDateButton ); 545 endDateLayout->addWidget( mEndDateButton );
546 546
547 mEndDateEdit = new KDateEdit( rangeBox ); 547 mEndDateEdit = new KDateEdit( rangeBox );
548 endDateLayout->addWidget( mEndDateEdit ); 548 endDateLayout->addWidget( mEndDateEdit );
549 549
550 //endDateLayout->addStretch( 1 ); 550 //endDateLayout->addStretch( 1 );
551 551
552 connect( mNoEndDateButton, SIGNAL( toggled( bool ) ), 552 connect( mNoEndDateButton, SIGNAL( toggled( bool ) ),
553 SLOT( showCurrentRange() ) ); 553 SLOT( showCurrentRange() ) );
554 connect( mEndDurationButton, SIGNAL( toggled( bool ) ), 554 connect( mEndDurationButton, SIGNAL( toggled( bool ) ),
555 SLOT( showCurrentRange() ) ); 555 SLOT( showCurrentRange() ) );
556 connect( mEndDateButton, SIGNAL( toggled( bool ) ), 556 connect( mEndDateButton, SIGNAL( toggled( bool ) ),
557 SLOT( showCurrentRange() ) ); 557 SLOT( showCurrentRange() ) );
558} 558}
559 559
560void RecurrenceRangeWidget::setDefaults( const QDateTime &from ) 560void RecurrenceRangeWidget::setDefaults( const QDateTime &from )
561{ 561{
562 mNoEndDateButton->setChecked( true ); 562 mNoEndDateButton->setChecked( true );
563 563
564 setDateTimes( from ); 564 setDateTimes( from );
565 mEndDateEdit->setDate( from.date() ); 565 mEndDateEdit->setDate( from.date() );
566} 566}
567 567
568void RecurrenceRangeWidget::setDuration( int duration ) 568void RecurrenceRangeWidget::setDuration( int duration )
569{ 569{
570 if ( duration == -1 ) { 570 if ( duration == -1 ) {
571 mNoEndDateButton->setChecked( true ); 571 mNoEndDateButton->setChecked( true );
572 } else if ( duration == 0 ) { 572 } else if ( duration == 0 ) {
573 mEndDateButton->setChecked( true ); 573 mEndDateButton->setChecked( true );
574 } else { 574 } else {
575 mEndDurationButton->setChecked( true ); 575 mEndDurationButton->setChecked( true );
576 mEndDurationEdit->setValue( duration ); 576 mEndDurationEdit->setValue( duration );
577 } 577 }
578} 578}
579 579
580int RecurrenceRangeWidget::duration() 580int RecurrenceRangeWidget::duration()
581{ 581{
582 if ( mNoEndDateButton->isChecked() ) { 582 if ( mNoEndDateButton->isChecked() ) {
583 return -1; 583 return -1;
584 } else if ( mEndDurationButton->isChecked() ) { 584 } else if ( mEndDurationButton->isChecked() ) {
585 return mEndDurationEdit->value(); 585 return mEndDurationEdit->value();
586 } else { 586 } else {
587 return 0; 587 return 0;
588 } 588 }
589} 589}
590 590
591void RecurrenceRangeWidget::setEndDate( const QDate &date ) 591void RecurrenceRangeWidget::setEndDate( const QDate &date )
592{ 592{
593 mEndDateEdit->setDate( date ); 593 mEndDateEdit->setDate( date );
594} 594}
595 595
596QDate RecurrenceRangeWidget::endDate() 596QDate RecurrenceRangeWidget::endDate()
597{ 597{
598 return mEndDateEdit->date(); 598 return mEndDateEdit->date();
599} 599}
600 600
601void RecurrenceRangeWidget::showCurrentRange() 601void RecurrenceRangeWidget::showCurrentRange()
602{ 602{
603 mEndDurationEdit->setEnabled( mEndDurationButton->isChecked() ); 603 mEndDurationEdit->setEnabled( mEndDurationButton->isChecked() );
604 mEndDateEdit->setEnabled( mEndDateButton->isChecked() ); 604 mEndDateEdit->setEnabled( mEndDateButton->isChecked() );
605} 605}
606 606
607void RecurrenceRangeWidget::setDateTimes( const QDateTime &start, 607void RecurrenceRangeWidget::setDateTimes( const QDateTime &start,
608 const QDateTime & ) 608 const QDateTime & )
609{ 609{
610 mStartDateLabel->setText( i18n("Start date: %1") 610 mStartDateLabel->setText( i18n("Start date: %1")
611 .arg( KGlobal::locale()->formatDate( start.date() ) ) ); 611 .arg( KGlobal::locale()->formatDate( start.date() ) ) );
612 612
613 if(!mEndDateButton->isChecked()) 613 if(!mEndDateButton->isChecked())
614 mEndDateEdit->setDate( start.date() ); 614 mEndDateEdit->setDate( start.date() );
615} 615}
616 616
617///////////////////////// RecurrenceRangeDialog /////////////////////////// 617///////////////////////// RecurrenceRangeDialog ///////////////////////////
618 618
619RecurrenceRangeDialog::RecurrenceRangeDialog( QWidget *parent, 619RecurrenceRangeDialog::RecurrenceRangeDialog( QWidget *parent,
620 const char *name ) : 620 const char *name ) :
621 KDialogBase( parent, name, true, i18n("Edit Recurrence Range"), Ok|Cancel ) 621 KDialogBase( parent, name, true, i18n("Edit Recurrence Range"), Ok|Cancel )
622{ 622{
623 mRecurrenceRangeWidget = new RecurrenceRangeWidget( this ); 623 mRecurrenceRangeWidget = new RecurrenceRangeWidget( this );
624 setMainWidget( mRecurrenceRangeWidget ); 624 setMainWidget( mRecurrenceRangeWidget );
625} 625}
626 626
627void RecurrenceRangeDialog::setDefaults( const QDateTime &from ) 627void RecurrenceRangeDialog::setDefaults( const QDateTime &from )
628{ 628{
629 mRecurrenceRangeWidget->setDefaults( from ); 629 mRecurrenceRangeWidget->setDefaults( from );
630} 630}
631 631
632void RecurrenceRangeDialog::setDuration( int duration ) 632void RecurrenceRangeDialog::setDuration( int duration )
633{ 633{
634 mRecurrenceRangeWidget->setDuration( duration ); 634 mRecurrenceRangeWidget->setDuration( duration );
635} 635}
636 636
637int RecurrenceRangeDialog::duration() 637int RecurrenceRangeDialog::duration()
638{ 638{
639 return mRecurrenceRangeWidget->duration(); 639 return mRecurrenceRangeWidget->duration();
640} 640}
641 641
642void RecurrenceRangeDialog::setEndDate( const QDate &date ) 642void RecurrenceRangeDialog::setEndDate( const QDate &date )
643{ 643{
644 mRecurrenceRangeWidget->setEndDate( date ); 644 mRecurrenceRangeWidget->setEndDate( date );
645} 645}
646 646
647QDate RecurrenceRangeDialog::endDate() 647QDate RecurrenceRangeDialog::endDate()
648{ 648{
649 return mRecurrenceRangeWidget->endDate(); 649 return mRecurrenceRangeWidget->endDate();
650} 650}
651 651
652void RecurrenceRangeDialog::setDateTimes( const QDateTime &start, 652void RecurrenceRangeDialog::setDateTimes( const QDateTime &start,
653 const QDateTime &end ) 653 const QDateTime &end )
654{ 654{
655 mRecurrenceRangeWidget->setDateTimes( start, end ); 655 mRecurrenceRangeWidget->setDateTimes( start, end );
656} 656}
657 657
658//////////////////////////// RecurrenceChooser //////////////////////// 658//////////////////////////// RecurrenceChooser ////////////////////////
659 659
660RecurrenceChooser::RecurrenceChooser( QWidget *parent, const char *name ) : 660RecurrenceChooser::RecurrenceChooser( QWidget *parent, const char *name ) :
661 QWidget( parent, name ) 661 QWidget( parent, name )
662{ 662{
663 QBoxLayout *topLayout = new QVBoxLayout( this ); 663 QBoxLayout *topLayout = new QVBoxLayout( this );
664 664
665 mTypeCombo = new QComboBox( this ); 665 mTypeCombo = new QComboBox( this );
666 mTypeCombo->insertItem( i18n("Daily") ); 666 mTypeCombo->insertItem( i18n("Daily") );
667 mTypeCombo->insertItem( i18n("Weekly") ); 667 mTypeCombo->insertItem( i18n("Weekly") );
668 mTypeCombo->insertItem( i18n("Monthly") ); 668 mTypeCombo->insertItem( i18n("Monthly") );
669 mTypeCombo->insertItem( i18n("Yearly") ); 669 mTypeCombo->insertItem( i18n("Yearly") );
670 670
671 topLayout->addWidget( mTypeCombo ); 671 topLayout->addWidget( mTypeCombo );
672 672
673 connect( mTypeCombo, SIGNAL( activated( int ) ), SLOT( emitChoice() ) ); 673 connect( mTypeCombo, SIGNAL( activated( int ) ), SLOT( emitChoice() ) );
674 674
675} 675}
676 676
677int RecurrenceChooser::type() 677int RecurrenceChooser::type()
678{ 678{
679 if ( mTypeCombo ) { 679 if ( mTypeCombo ) {
680 return mTypeCombo->currentItem(); 680 return mTypeCombo->currentItem();
681 } else { 681 } else {
682 if ( mDailyButton->isChecked() ) return Daily; 682 if ( mDailyButton->isChecked() ) return Daily;
683 else if ( mWeeklyButton->isChecked() ) return Weekly; 683 else if ( mWeeklyButton->isChecked() ) return Weekly;
684 else if ( mMonthlyButton->isChecked() ) return Monthly; 684 else if ( mMonthlyButton->isChecked() ) return Monthly;
685 else return Yearly; 685 else return Yearly;
686 } 686 }
687} 687}
688 688
689void RecurrenceChooser::setType( int type ) 689void RecurrenceChooser::setType( int type )
690{ 690{
691 if ( mTypeCombo ) { 691 if ( mTypeCombo ) {
692 mTypeCombo->setCurrentItem( type ); 692 mTypeCombo->setCurrentItem( type );
693 } else { 693 } else {
694 switch ( type ) { 694 switch ( type ) {
695 case Daily: 695 case Daily:
696 mDailyButton->setChecked( true ); 696 mDailyButton->setChecked( true );
697 break; 697 break;
698 case Weekly: 698 case Weekly:
699 mWeeklyButton->setChecked( true ); 699 mWeeklyButton->setChecked( true );
700 break; 700 break;
701 case Monthly: 701 case Monthly:
702 mMonthlyButton->setChecked( true ); 702 mMonthlyButton->setChecked( true );
703 break; 703 break;
704 case Yearly: 704 case Yearly:
705 default: 705 default:
706 mYearlyButton->setChecked( true ); 706 mYearlyButton->setChecked( true );
707 break; 707 break;
708 } 708 }
709 } 709 }
710} 710}
711 711
712void RecurrenceChooser::emitChoice() 712void RecurrenceChooser::emitChoice()
713{ 713{
714 emit chosen ( type() ); 714 emit chosen ( type() );
715} 715}
716 716
717/////////////////////////////// Main Widget ///////////////////////////// 717/////////////////////////////// Main Widget /////////////////////////////
718 718
719KOEditorRecurrence::KOEditorRecurrence( QWidget* parent, const char *name ) : 719KOEditorRecurrence::KOEditorRecurrence( QWidget* parent, const char *name ) :
720 QWidget( parent, name ) 720 QWidget( parent, name )
721{ 721{
722 QGridLayout *topLayout = new QGridLayout( this, 2,2 ); 722 QGridLayout *topLayout = new QGridLayout( this, 2,2 );
723 topLayout->setSpacing( KDialog::spacingHint() ); 723 topLayout->setSpacing( KDialog::spacingHint() );
724 topLayout->setMargin( KDialog::marginHintSmall() ); 724 topLayout->setMargin( KDialog::marginHintSmall() );
725 725
726 mEnabledCheck = new QCheckBox( i18n("Enable Recurrence"), this ); 726 mEnabledCheck = new QCheckBox( i18n("Enable Recurrence"), this );
727 connect( mEnabledCheck, SIGNAL( toggled( bool ) ), 727 connect( mEnabledCheck, SIGNAL( toggled( bool ) ),
728 SLOT( setEnabled( bool ) ) ); 728 SLOT( setEnabled( bool ) ) );
729 topLayout->addMultiCellWidget( mEnabledCheck, 0, 0, 0, 1 ); 729 topLayout->addMultiCellWidget( mEnabledCheck, 0, 0, 0, 1 );
730 730
731 731
732 mTimeGroupBox = new QGroupBox( 1, Horizontal, i18n("Time"), 732 mTimeGroupBox = new QGroupBox( 1, Horizontal, i18n("Time"),
733 this ); 733 this );
734 topLayout->addMultiCellWidget( mTimeGroupBox, 1, 1 , 0 , 1 ); 734 topLayout->addMultiCellWidget( mTimeGroupBox, 1, 1 , 0 , 1 );
735 735
736 if ( QApplication::desktop()->width() <= 640 ) { 736 if ( QApplication::desktop()->width() <= 640 ) {
737 mTimeGroupBox->hide(); 737 mTimeGroupBox->hide();
738 } 738 }
739 739
740// QFrame *timeFrame = new QFrame( mTimeGroupBox ); 740// QFrame *timeFrame = new QFrame( mTimeGroupBox );
741// QBoxLayout *layoutTimeFrame = new QHBoxLayout( timeFrame ); 741// QBoxLayout *layoutTimeFrame = new QHBoxLayout( timeFrame );
742// layoutTimeFrame->setSpacing( KDialog::spacingHint() ); 742// layoutTimeFrame->setSpacing( KDialog::spacingHint() );
743 743
744 mDateTimeLabel = new QLabel( mTimeGroupBox ); 744 mDateTimeLabel = new QLabel( mTimeGroupBox );
745// mDateTimeLabel = new QLabel( timeFrame ); 745// mDateTimeLabel = new QLabel( timeFrame );
746// layoutTimeFrame->addWidget( mDateTimeLabel ); 746// layoutTimeFrame->addWidget( mDateTimeLabel );
747 //mTimeGroupBox->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ) ); 747 //mTimeGroupBox->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ) );
748 //mDateTimeLabel->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum) ); 748 //mDateTimeLabel->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum) );
749 mRuleBox = new QGroupBox( 1, Horizontal, i18n("Recurrence Rule"), this ); 749 mRuleBox = new QGroupBox( 1, Horizontal, i18n("Recurrence Rule"), this );
750 topLayout->addMultiCellWidget( mRuleBox, 2, 2, 0, 1 ); 750 topLayout->addMultiCellWidget( mRuleBox, 2, 2, 0, 1 );
751 mRecurrenceChooser = new RecurrenceChooser( mRuleBox ); 751 mRecurrenceChooser = new RecurrenceChooser( mRuleBox );
752 connect( mRecurrenceChooser, SIGNAL( chosen( int ) ), 752 connect( mRecurrenceChooser, SIGNAL( chosen( int ) ),
753 SLOT( showCurrentRule( int ) ) ); 753 SLOT( showCurrentRule( int ) ) );
754 754
755 755
756 mRuleStack = new QWidgetStack( mRuleBox ); 756 mRuleStack = new QWidgetStack( mRuleBox );
757 757
758 mDaily = new RecurDaily( mRuleStack ); 758 mDaily = new RecurDaily( mRuleStack );
759 mRuleStack->addWidget( mDaily, 0 ); 759 mRuleStack->addWidget( mDaily, 0 );
760 760
761 mWeekly = new RecurWeekly( mRuleStack ); 761 mWeekly = new RecurWeekly( mRuleStack );
762 mRuleStack->addWidget( mWeekly, 0 ); 762 mRuleStack->addWidget( mWeekly, 0 );
763 763
764 mMonthly = new RecurMonthly( mRuleStack ); 764 mMonthly = new RecurMonthly( mRuleStack );
765 mRuleStack->addWidget( mMonthly, 0 ); 765 mRuleStack->addWidget( mMonthly, 0 );
766 766
767 mYearly = new RecurYearly( mRuleStack ); 767 mYearly = new RecurYearly( mRuleStack );
768 mRuleStack->addWidget( mYearly, 0 ); 768 mRuleStack->addWidget( mYearly, 0 );
769 769
770 showCurrentRule( mRecurrenceChooser->type() ); 770 showCurrentRule( mRecurrenceChooser->type() );
771 mRecurrenceRangeWidget = 0; 771 mRecurrenceRangeWidget = 0;
772 mRecurrenceRangeDialog = new RecurrenceRangeDialog( this ); 772 mRecurrenceRangeDialog = new RecurrenceRangeDialog( this );
773 mRecurrenceRange = mRecurrenceRangeDialog; 773 mRecurrenceRange = mRecurrenceRangeDialog;
774 mRecurrenceRangeButton = new QPushButton( i18n("Recurrence Range..."), 774 mRecurrenceRangeButton = new QPushButton( i18n("Recurrence Range..."),
775 this ); 775 this );
776 776
777 connect( mRecurrenceRangeButton, SIGNAL( clicked() ), 777 connect( mRecurrenceRangeButton, SIGNAL( clicked() ),
778 SLOT( showRecurrenceRangeDialog() ) ); 778 SLOT( showRecurrenceRangeDialog() ) );
779 779
780 mExceptionsWidget = 0; 780 mExceptionsWidget = 0;
781 mExceptionsDialog = new ExceptionsDialog( this ); 781 mExceptionsDialog = new ExceptionsDialog( this );
782 mExceptions = mExceptionsDialog; 782 mExceptions = mExceptionsDialog;
783 mExceptionsButton = new QPushButton( i18n("Exceptions..."), this ); 783 mExceptionsButton = new QPushButton( i18n("Exceptions..."), this );
784 if ( QApplication::desktop()->width() < 320 ) { 784 if ( QApplication::desktop()->width() < 320 ) {
785 topLayout->addMultiCellWidget( mRecurrenceRangeButton, 3, 3, 0, 1 ); 785 topLayout->addMultiCellWidget( mRecurrenceRangeButton, 3, 3, 0, 1 );
786 topLayout->addMultiCellWidget( mExceptionsButton, 4, 4, 0, 1 ); 786 topLayout->addMultiCellWidget( mExceptionsButton, 4, 4, 0, 1 );
787 } else { 787 } else {
788 topLayout->addWidget( mRecurrenceRangeButton, 3, 0 ); 788 topLayout->addWidget( mRecurrenceRangeButton, 3, 0 );
789 topLayout->addWidget( mExceptionsButton, 3, 1 ); 789 topLayout->addWidget( mExceptionsButton, 3, 1 );
790 } 790 }
791 connect( mExceptionsButton, SIGNAL( clicked() ), 791 connect( mExceptionsButton, SIGNAL( clicked() ),
792 SLOT( showExceptionsDialog() ) ); 792 SLOT( showExceptionsDialog() ) );
793} 793}
794 794
795KOEditorRecurrence::~KOEditorRecurrence() 795KOEditorRecurrence::~KOEditorRecurrence()
796{ 796{
797} 797}
798 798
799void KOEditorRecurrence::setEnabled( bool enabled ) 799void KOEditorRecurrence::setEnabled( bool enabled )
800{ 800{
801// kdDebug() << "KOEditorRecurrence::setEnabled(): " << (enabled ? "on" : "off") << endl; 801// kdDebug() << "KOEditorRecurrence::setEnabled(): " << (enabled ? "on" : "off") << endl;
802 802
803 mTimeGroupBox->setEnabled( enabled ); 803 mTimeGroupBox->setEnabled( enabled );
804 if ( mRecurrenceRangeWidget ) mRecurrenceRangeWidget->setEnabled( enabled ); 804 if ( mRecurrenceRangeWidget ) mRecurrenceRangeWidget->setEnabled( enabled );
805 if ( mRecurrenceRangeButton ) mRecurrenceRangeButton->setEnabled( enabled ); 805 if ( mRecurrenceRangeButton ) mRecurrenceRangeButton->setEnabled( enabled );
806 if ( mExceptionsWidget ) mExceptionsWidget->setEnabled( enabled ); 806 if ( mExceptionsWidget ) mExceptionsWidget->setEnabled( enabled );
807 if ( mExceptionsButton ) mExceptionsButton->setEnabled( enabled ); 807 if ( mExceptionsButton ) mExceptionsButton->setEnabled( enabled );
808 mRuleBox->setEnabled( enabled ); 808 mRuleBox->setEnabled( enabled );
809} 809}
810 810
811void KOEditorRecurrence::showCurrentRule( int current ) 811void KOEditorRecurrence::showCurrentRule( int current )
812{ 812{
813 switch ( current ) { 813 switch ( current ) {
814 case Daily: 814 case Daily:
815 mRuleStack->raiseWidget( mDaily ); 815 mRuleStack->raiseWidget( mDaily );
816 break; 816 break;
817 case Weekly: 817 case Weekly:
818 mRuleStack->raiseWidget( mWeekly ); 818 mRuleStack->raiseWidget( mWeekly );
819 break; 819 break;
820 case Monthly: 820 case Monthly:
821 mRuleStack->raiseWidget( mMonthly ); 821 mRuleStack->raiseWidget( mMonthly );
822 break; 822 break;
823 default: 823 default:
824 case Yearly: 824 case Yearly:
825 mRuleStack->raiseWidget( mYearly ); 825 mRuleStack->raiseWidget( mYearly );
826 break; 826 break;
827 } 827 }
828} 828}
829 829
830void KOEditorRecurrence::setDateTimes( QDateTime start, QDateTime end ) 830void KOEditorRecurrence::setDateTimes( QDateTime start, QDateTime end )
831{ 831{
832// kdDebug() << "KOEditorRecurrence::setDateTimes" << endl; 832// kdDebug() << "KOEditorRecurrence::setDateTimes" << endl;
833 833
834 mRecurrenceRange->setDateTimes( start, end ); 834 mRecurrenceRange->setDateTimes( start, end );
835 mExceptions->setDefaults( end ); 835 mExceptions->setDefaults( end );
836 836
837} 837}
838void KOEditorRecurrence::setDefaultsDates( QDateTime from, QDateTime to ) 838void KOEditorRecurrence::setDefaultsDates( QDateTime from, QDateTime to )
839{ 839{
840 setDateTimes( from, to ); 840 setDateTimes( from, to );
841 QBitArray days( 7 ); 841 QBitArray days( 7 );
842 days.fill( 0 ); 842 days.fill( 0 );
843 days.setBit( from.date().dayOfWeek()- 1); 843 days.setBit( from.date().dayOfWeek()- 1);
844 mWeekly->setDays( days ); 844 mWeekly->setDays( days );
845 bool byPos = mMonthly->byPos(); 845 bool byPos = mMonthly->byPos();
846 if ( byPos ) 846 if ( byPos )
847 mMonthly->setByDay( from.date().day()-1 ); 847 mMonthly->setByDay( from.date().day()-1 );
848 mMonthly->setByPos((from.date().day()/7), from.date().dayOfWeek()-1 ); 848 mMonthly->setByPos((from.date().day()/7), from.date().dayOfWeek()-1 );
849 if ( ! byPos) 849 if ( ! byPos)
850 mMonthly->setByDay( from.date().day()-1 ); 850 mMonthly->setByDay( from.date().day()-1 );
851 851
852 bool byDay = mYearly->byDay(); 852 bool byDay = mYearly->byDay();
853 if ( ! byDay ) 853 if ( ! byDay )
854 mYearly->setByDay( from.date().dayOfYear() ); 854 mYearly->setByDay( from.date().dayOfYear() );
855 mYearly->setByMonth( from.date().month(), from.date().day() ); 855 mYearly->setByMonth( from.date().month(), from.date().day() );
856 if ( byDay ) 856 if ( byDay )
857 mYearly->setByDay( from.date().dayOfYear() ); 857 mYearly->setByDay( from.date().dayOfYear() );
858} 858}
859void KOEditorRecurrence::setDefaults( QDateTime from, QDateTime to ) 859void KOEditorRecurrence::setDefaults( QDateTime from, QDateTime to )
860{ 860{
861 861
862 // qDebug("KOEditorRecurrence::setDefaults %s %s ",from.toString().latin1(),to.toString().latin1() ); 862 // qDebug("KOEditorRecurrence::setDefaults %s %s ",from.toString().latin1(),to.toString().latin1() );
863 //setDateTimes( from, to ); 863 //setDateTimes( from, to );
864 864
865 bool enabled = false; 865 bool enabled = false;
866 mEnabledCheck->setChecked( enabled ); 866 mEnabledCheck->setChecked( enabled );
867 setEnabled( enabled ); 867 setEnabled( enabled );
868 868
869 mExceptions->setDefaults( to ); 869 mExceptions->setDefaults( to );
870 mRecurrenceRange->setDefaults( to ); 870 mRecurrenceRange->setDefaults( to );
871 871
872 mRecurrenceChooser->setType( RecurrenceChooser::Weekly ); 872 mRecurrenceChooser->setType( RecurrenceChooser::Weekly );
873 showCurrentRule( mRecurrenceChooser->type() ); 873 showCurrentRule( mRecurrenceChooser->type() );
874 874
875 mDaily->setFrequency( 1 ); 875 mDaily->setFrequency( 1 );
876 mWeekly->setFrequency( 1 ); 876 mWeekly->setFrequency( 1 );
877 mMonthly->setFrequency( 1 ); 877 mMonthly->setFrequency( 1 );
878 mYearly->setFrequency( 1 ); 878 mYearly->setFrequency( 1 );
879 setDefaultsDates( from, to ); 879 setDefaultsDates( from, to );
880} 880}
881 881
882void KOEditorRecurrence::readEvent(Incidence *event) 882void KOEditorRecurrence::readEvent(Incidence *event)
883{ 883{
884 884
885 QDateTime dtEnd; 885 QDateTime dtEnd;
886 if ( event->typeID() == eventID ) 886 if ( event->typeID() == eventID )
887 dtEnd = ((Event*)event)->dtEnd(); 887 dtEnd = ((Event*)event)->dtEnd();
888 else 888 else
889 dtEnd = ((Todo*)event)->dtDue(); 889 dtEnd = ((Todo*)event)->dtDue();
890 890
891 setDefaults( event->dtStart(), dtEnd ); 891 setDefaults( event->dtStart(), dtEnd );
892 QBitArray rDays( 7 ); 892 QBitArray rDays( 7 );
893 QPtrList<Recurrence::rMonthPos> rmp; 893 QPtrList<Recurrence::rMonthPos> rmp;
894 QPtrList<int> rmd; 894 QPtrList<int> rmd;
895 int day = 0; 895 int day = 0;
896 int count = 0; 896 int count = 0;
897 int month = 0; 897 int month = 0;
898 setDateTimes( event->dtStart(), dtEnd ); 898 setDateTimes( event->dtStart(), dtEnd );
899 899
900 Recurrence *r = event->recurrence(); 900
901 int f = r->frequency();
902 901
903 int recurs = r->doesRecur(); 902 int recurs = event->doesRecur();
904 903
905 mEnabledCheck->setChecked( recurs ); 904 mEnabledCheck->setChecked( recurs );
906 setEnabled( recurs ); 905 setEnabled( recurs );
907 906
908 int recurrenceType = RecurrenceChooser::Weekly; 907 int recurrenceType = RecurrenceChooser::Weekly;
909 908 if ( recurs ) {
910 switch ( recurs ) { 909 Recurrence *r = event->recurrence();
911 case Recurrence::rNone: 910 int f = r->frequency();
912 setDefaults( event->dtStart(), dtEnd ); 911 switch ( recurs ) {
913 break; 912 case Recurrence::rNone:
914 case Recurrence::rDaily: 913 setDefaults( event->dtStart(), dtEnd );
915 recurrenceType = RecurrenceChooser::Daily; 914 break;
916 mDaily->setFrequency( f ); 915 case Recurrence::rDaily:
917 break; 916 recurrenceType = RecurrenceChooser::Daily;
918 case Recurrence::rWeekly: 917 mDaily->setFrequency( f );
919 recurrenceType = RecurrenceChooser::Weekly; 918 break;
920 mWeekly->setFrequency( f ); 919 case Recurrence::rWeekly:
921 mWeekly->setDays( r->days() ); 920 recurrenceType = RecurrenceChooser::Weekly;
922 break; 921 mWeekly->setFrequency( f );
923 case Recurrence::rMonthlyPos: 922 mWeekly->setDays( r->days() );
924 // we only handle one possibility in the list right now, 923 break;
925 // so I have hardcoded calls with first(). If we make the GUI 924 case Recurrence::rMonthlyPos:
926 // more extended, this can be changed. 925 // we only handle one possibility in the list right now,
927 recurrenceType = RecurrenceChooser::Monthly; 926 // so I have hardcoded calls with first(). If we make the GUI
928 927 // more extended, this can be changed.
929 rmp = r->monthPositions(); 928 recurrenceType = RecurrenceChooser::Monthly;
930 if ( rmp.first()->negative ) 929
931 count = 5 - rmp.first()->rPos - 1; 930 rmp = r->monthPositions();
932 else 931 if ( rmp.first()->negative )
933 count = rmp.first()->rPos - 1; 932 count = 5 - rmp.first()->rPos - 1;
934 day = 0; 933 else
935 while ( !rmp.first()->rDays.testBit( day ) ) ++day; 934 count = rmp.first()->rPos - 1;
936 mMonthly->setByPos( count, day ); 935 day = 0;
937 936 while ( !rmp.first()->rDays.testBit( day ) ) ++day;
938 mMonthly->setFrequency( f ); 937 mMonthly->setByPos( count, day );
939 938
940 break; 939 mMonthly->setFrequency( f );
941 case Recurrence::rMonthlyDay: 940
942 recurrenceType = RecurrenceChooser::Monthly; 941 break;
943 942 case Recurrence::rMonthlyDay:
944 rmd = r->monthDays(); 943 recurrenceType = RecurrenceChooser::Monthly;
945 day = *rmd.first() - 1; 944
946 mMonthly->setByDay( day ); 945 rmd = r->monthDays();
947 946 day = *rmd.first() - 1;
948 mMonthly->setFrequency( f ); 947 mMonthly->setByDay( day );
949 948
950 break; 949 mMonthly->setFrequency( f );
951 case Recurrence::rYearlyMonth: 950
952 { 951 break;
953 recurrenceType = RecurrenceChooser::Yearly; 952 case Recurrence::rYearlyMonth:
954 //qDebug("Recurrence::rYearlyMonth: "); 953 {
955 day = event->dtStart().date().day(); 954 recurrenceType = RecurrenceChooser::Yearly;
956 rmd = r->yearNums(); 955 //qDebug("Recurrence::rYearlyMonth: ");
957 if ( rmd.count() > 0 ) 956 day = event->dtStart().date().day();
958 month = *rmd.first(); 957 rmd = r->yearNums();
959 else 958 if ( rmd.count() > 0 )
960 month = event->dtStart().date().month() ; 959 month = *rmd.first();
961 mYearly->setByMonth( month, day ); 960 else
961 month = event->dtStart().date().month() ;
962 mYearly->setByMonth( month, day );
962#if 0 963#if 0
963 //qDebug("2day = %d ",day ); 964 //qDebug("2day = %d ",day );
964 QPtrList<Recurrence::rMonthPos> monthlist = r->yearMonthPositions(); 965 QPtrList<Recurrence::rMonthPos> monthlist = r->yearMonthPositions();
965 int month; 966 int month;
966 if ( !monthlist.isEmpty() ) { 967 if ( !monthlist.isEmpty() ) {
967 month = monthlist.first()->rPos ; 968 month = monthlist.first()->rPos ;
968 } else { 969 } else {
969 month = event->dtStart().date().month() ; 970 month = event->dtStart().date().month() ;
970 } 971 }
971 mYearly->setByMonth( day, month ); 972 mYearly->setByMonth( day, month );
972#endif 973#endif
973 mYearly->setFrequency( f ); 974 mYearly->setFrequency( f );
974 } 975 }
975 976
976 break; 977 break;
977 case Recurrence::rYearlyDay: 978 case Recurrence::rYearlyDay:
978 //qDebug("Recurrence::rYearlyDay: "); 979 //qDebug("Recurrence::rYearlyDay: ");
979 recurrenceType = RecurrenceChooser::Yearly; 980 recurrenceType = RecurrenceChooser::Yearly;
980 mYearly->setByDay( event->dtStart().date().dayOfYear() ); 981 mYearly->setByDay( event->dtStart().date().dayOfYear() );
981 mYearly->setFrequency( f ); 982 mYearly->setFrequency( f );
982 break; 983 break;
983 default: 984 default:
984 setDefaults( event->dtStart(), dtEnd ); 985 setDefaults( event->dtStart(), dtEnd );
985 break; 986 break;
987 }
986 } 988 }
987
988 mRecurrenceChooser->setType( recurrenceType ); 989 mRecurrenceChooser->setType( recurrenceType );
989 showCurrentRule( recurrenceType ); 990 showCurrentRule( recurrenceType );
990 991
991 mRecurrenceRange->setDateTimes( event->dtStart() ); 992 mRecurrenceRange->setDateTimes( event->dtStart() );
992 993
993 if ( r->doesRecur() ) { 994 if ( event->doesRecur() ) {
995 Recurrence *r = event->recurrence();
994 mRecurrenceRange->setDuration( r->duration() ); 996 mRecurrenceRange->setDuration( r->duration() );
995 if ( r->duration() == 0 ) 997 if ( r->duration() == 0 )
996 { 998 {
997 if ( r->endDate() < event->dtStart().date() ) 999 if ( r->endDate() < event->dtStart().date() )
998 mRecurrenceRange->setEndDate( event->dtStart().date() ); 1000 mRecurrenceRange->setEndDate( event->dtStart().date() );
999 else 1001 else
1000 mRecurrenceRange->setEndDate( r->endDate() ); 1002 mRecurrenceRange->setEndDate( r->endDate() );
1001 } else 1003 } else
1002 mRecurrenceRange->setEndDate( event->dtStart().date() ); 1004 mRecurrenceRange->setEndDate( event->dtStart().date() );
1003 } 1005 }
1004 1006
1005 mExceptions->setDates( event->exDates() ); 1007 mExceptions->setDates( event->exDates() );
1006} 1008}
1007 1009
1008void KOEditorRecurrence::writeEvent( Incidence *event ) 1010void KOEditorRecurrence::writeEvent( Incidence *event )
1009{ 1011{
1010 Recurrence *r = event->recurrence(); 1012
1011 1013
1012 // clear out any old settings; 1014 if ( !mEnabledCheck->isChecked() ) {
1013 r->unsetRecurs(); 1015 if ( event->doesRecur() )
1016 event->recurrence()->unsetRecurs();
1017 } else {
1018 Recurrence *r = event->recurrence();
1014 1019
1015 if ( mEnabledCheck->isChecked() ) { 1020 // clear out any old settings;
1021 r->unsetRecurs();
1016 int duration = mRecurrenceRange->duration(); 1022 int duration = mRecurrenceRange->duration();
1017 QDate endDate; 1023 QDate endDate;
1018 if ( duration == 0 ) endDate = mRecurrenceRange->endDate(); 1024 if ( duration == 0 ) endDate = mRecurrenceRange->endDate();
1019 1025
1020 int recurrenceType = mRecurrenceChooser->type(); 1026 int recurrenceType = mRecurrenceChooser->type();
1021 1027
1022 if ( recurrenceType == RecurrenceChooser::Daily ) { 1028 if ( recurrenceType == RecurrenceChooser::Daily ) {
1023 int freq = mDaily->frequency(); 1029 int freq = mDaily->frequency();
1024 if ( duration != 0 ) r->setDaily( freq, duration ); 1030 if ( duration != 0 ) r->setDaily( freq, duration );
1025 else r->setDaily( freq, endDate ); 1031 else r->setDaily( freq, endDate );
1026 } else if ( recurrenceType == RecurrenceChooser::Weekly ) { 1032 } else if ( recurrenceType == RecurrenceChooser::Weekly ) {
1027 int freq = mWeekly->frequency(); 1033 int freq = mWeekly->frequency();
1028 QBitArray days = mWeekly->days(); 1034 QBitArray days = mWeekly->days();
1029 int j; 1035 int j;
1030 bool found = false; 1036 bool found = false;
1031 for (j = 0; j < 7 ; ++j ) { 1037 for (j = 0; j < 7 ; ++j ) {
1032 found |=days.at(j); 1038 found |=days.at(j);
1033 } 1039 }
1034 if ( !found ) { 1040 if ( !found ) {
1035 days.setBit( event->dtStart().date().dayOfWeek()-1); 1041 days.setBit( event->dtStart().date().dayOfWeek()-1);
1036 //qDebug("bit set %d ", event->dtStart().date().dayOfWeek()-1); 1042 //qDebug("bit set %d ", event->dtStart().date().dayOfWeek()-1);
1037 } 1043 }
1038 if ( duration != 0 ) r->setWeekly( freq, days, duration ); 1044 if ( duration != 0 ) r->setWeekly( freq, days, duration );
1039 else r->setWeekly( freq, days, endDate ); 1045 else r->setWeekly( freq, days, endDate );
1040 } else if ( recurrenceType == RecurrenceChooser::Monthly ) { 1046 } else if ( recurrenceType == RecurrenceChooser::Monthly ) {
1041 int freq = mMonthly->frequency(); 1047 int freq = mMonthly->frequency();
1042 if ( mMonthly->byPos() ) { 1048 if ( mMonthly->byPos() ) {
1043 int pos = mMonthly->count(); 1049 int pos = mMonthly->count();
1044 1050
1045 QBitArray days( 7 ); 1051 QBitArray days( 7 );
1046 days.fill( false ); 1052 days.fill( false );
1047 1053
1048 days.setBit( mMonthly->weekday() ); 1054 days.setBit( mMonthly->weekday() );
1049 if ( duration != 0 ) 1055 if ( duration != 0 )
1050 r->setMonthly( Recurrence::rMonthlyPos, freq, duration ); 1056 r->setMonthly( Recurrence::rMonthlyPos, freq, duration );
1051 else 1057 else
1052 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); 1058 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
1053 r->addMonthlyPos( pos, days ); 1059 r->addMonthlyPos( pos, days );
1054 } else { 1060 } else {
1055 // it's by day 1061 // it's by day
1056 int day = mMonthly->day(); 1062 int day = mMonthly->day();
1057 1063
1058 if ( duration != 0 ) { 1064 if ( duration != 0 ) {
1059 r->setMonthly( Recurrence::rMonthlyDay, freq, duration ); 1065 r->setMonthly( Recurrence::rMonthlyDay, freq, duration );
1060 } else { 1066 } else {
1061 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); 1067 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
1062 } 1068 }
1063 r->addMonthlyDay( day ); 1069 r->addMonthlyDay( day );
1064 } 1070 }
1065 } else if ( recurrenceType == RecurrenceChooser::Yearly ) { 1071 } else if ( recurrenceType == RecurrenceChooser::Yearly ) {
1066 //qDebug("RecurrenceChooser::Yearly "); 1072 //qDebug("RecurrenceChooser::Yearly ");
1067 int freq = mYearly->frequency(); 1073 int freq = mYearly->frequency();
1068 if ( mYearly->byDay() ) { 1074 if ( mYearly->byDay() ) {
1069 if ( duration != 0 ) { 1075 if ( duration != 0 ) {
1070 r->setYearly( Recurrence::rYearlyDay, freq, duration ); 1076 r->setYearly( Recurrence::rYearlyDay, freq, duration );
1071 } else { 1077 } else {
1072 r->setYearly( Recurrence::rYearlyDay, freq, endDate ); 1078 r->setYearly( Recurrence::rYearlyDay, freq, endDate );
1073 } 1079 }
1074 r->addYearlyNum( event->dtStart().date().dayOfYear() ); 1080 r->addYearlyNum( event->dtStart().date().dayOfYear() );
1075 } else { 1081 } else {
1076 if ( duration != 0 ) { 1082 if ( duration != 0 ) {
1077 r->setYearly( Recurrence::rYearlyMonth, freq, duration ); 1083 r->setYearly( Recurrence::rYearlyMonth, freq, duration );
1078 } else { 1084 } else {
1079 r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); 1085 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
1080 } 1086 }
1081 r->addYearlyNum( mYearly->month() ); 1087 r->addYearlyNum( mYearly->month() );
1082 } 1088 }
1083 1089
1084 } 1090 }
1085 1091
1086 event->setExDates( mExceptions->dates() ); 1092 event->setExDates( mExceptions->dates() );
1087 } 1093 }
1088} 1094}
1089 1095
1090void KOEditorRecurrence::setDateTimeStr( const QString &str ) 1096void KOEditorRecurrence::setDateTimeStr( const QString &str )
1091{ 1097{
1092 mDateTimeLabel->setText( str ); 1098 mDateTimeLabel->setText( str );
1093} 1099}
1094 1100
1095bool KOEditorRecurrence::validateInput() 1101bool KOEditorRecurrence::validateInput()
1096{ 1102{
1097 // Check input here 1103 // Check input here
1098 1104
1099 return true; 1105 return true;
1100} 1106}
1101 1107
1102void KOEditorRecurrence::showExceptionsDialog() 1108void KOEditorRecurrence::showExceptionsDialog()
1103{ 1109{
1104 DateList dates = mExceptions->dates(); 1110 DateList dates = mExceptions->dates();
1105 int result = mExceptionsDialog->exec(); 1111 int result = mExceptionsDialog->exec();
1106 if ( result == QDialog::Rejected ) mExceptions->setDates( dates ); 1112 if ( result == QDialog::Rejected ) mExceptions->setDates( dates );
1107} 1113}
1108 1114
1109void KOEditorRecurrence::showRecurrenceRangeDialog() 1115void KOEditorRecurrence::showRecurrenceRangeDialog()
1110{ 1116{
1111 int duration = mRecurrenceRange->duration(); 1117 int duration = mRecurrenceRange->duration();
1112 QDate endDate = mRecurrenceRange->endDate(); 1118 QDate endDate = mRecurrenceRange->endDate();
1113 1119
1114 int result = mRecurrenceRangeDialog->exec(); 1120 int result = mRecurrenceRangeDialog->exec();
1115 if ( result == QDialog::Rejected ) { 1121 if ( result == QDialog::Rejected ) {
1116 mRecurrenceRange->setDuration( duration ); 1122 mRecurrenceRange->setDuration( duration );
1117 mRecurrenceRange->setEndDate( endDate ); 1123 mRecurrenceRange->setEndDate( endDate );
1118 } 1124 }
1119 1125
1120} 1126}
diff --git a/korganizer/koeventviewer.cpp b/korganizer/koeventviewer.cpp
index a690ab1..db695f5 100644
--- a/korganizer/koeventviewer.cpp
+++ b/korganizer/koeventviewer.cpp
@@ -1,831 +1,831 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18*/ 18*/
19 19
20#include <qcstring.h> 20#include <qcstring.h>
21#include <qwhatsthis.h> 21#include <qwhatsthis.h>
22#include <qdialog.h> 22#include <qdialog.h>
23#include <qapplication.h> 23#include <qapplication.h>
24#include <qlabel.h> 24#include <qlabel.h>
25#include <qlayout.h> 25#include <qlayout.h>
26 26
27#include <klocale.h> 27#include <klocale.h>
28#include <kapplication.h> 28#include <kapplication.h>
29#include <libkcal/event.h> 29#include <libkcal/event.h>
30#include <libkcal/todo.h> 30#include <libkcal/todo.h>
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kiconloader.h> 32#include <kiconloader.h>
33#include <krun.h> 33#include <krun.h>
34#include <kglobal.h> 34#include <kglobal.h>
35#include <kprocess.h> 35#include <kprocess.h>
36#include "koprefs.h" 36#include "koprefs.h"
37 37
38#include <kabc/stdaddressbook.h> 38#include <kabc/stdaddressbook.h>
39 39
40#ifndef KORG_NODCOP 40#ifndef KORG_NODCOP
41#include <dcopclient.h> 41#include <dcopclient.h>
42#include "korganizer.h" 42#include "korganizer.h"
43#include "koprefs.h" 43#include "koprefs.h"
44#include "actionmanager.h" 44#include "actionmanager.h"
45#endif 45#endif
46 46
47#include "koeventviewer.h" 47#include "koeventviewer.h"
48//#ifndef KORG_NOKABC 48//#ifndef KORG_NOKABC
49//#include <kabc/stdaddressbook.h> 49//#include <kabc/stdaddressbook.h>
50//#define size count 50//#define size count
51//#endif 51//#endif
52 52
53#ifdef DESKTOP_VERSION 53#ifdef DESKTOP_VERSION
54#include <kabc/addresseedialog.h> 54#include <kabc/addresseedialog.h>
55#include <kabc/addresseeview.h> 55#include <kabc/addresseeview.h>
56#include <qprinter.h> 56#include <qprinter.h>
57#include <qpainter.h> 57#include <qpainter.h>
58#include <qpaintdevicemetrics.h> 58#include <qpaintdevicemetrics.h>
59#else //DESKTOP_VERSION 59#else //DESKTOP_VERSION
60#include <externalapphandler.h> 60#include <externalapphandler.h>
61#include <qtopia/qcopenvelope_qws.h> 61#include <qtopia/qcopenvelope_qws.h>
62#endif //DESKTOP_VERSION 62#endif //DESKTOP_VERSION
63 63
64KOEventViewer::KOEventViewer(QWidget *parent,const char *name) 64KOEventViewer::KOEventViewer(QWidget *parent,const char *name)
65 : QTextBrowser(parent,name) 65 : QTextBrowser(parent,name)
66{ 66{
67 mSyncMode = false; 67 mSyncMode = false;
68 mColorMode = 0; 68 mColorMode = 0;
69} 69}
70 70
71KOEventViewer::~KOEventViewer() 71KOEventViewer::~KOEventViewer()
72{ 72{
73} 73}
74 74
75void KOEventViewer::printMe() 75void KOEventViewer::printMe()
76{ 76{
77#ifdef DESKTOP_VERSION 77#ifdef DESKTOP_VERSION
78 78
79 KOPrintPrefs pp ( this ); 79 KOPrintPrefs pp ( this );
80 if (!pp.exec() ) 80 if (!pp.exec() )
81 return; 81 return;
82 int scaleval = pp.printMode() ; 82 int scaleval = pp.printMode() ;
83 83
84 QPrinter printer; 84 QPrinter printer;
85 if (!printer.setup() ) 85 if (!printer.setup() )
86 return; 86 return;
87 QPainter p; 87 QPainter p;
88 p.begin ( &printer ); 88 p.begin ( &printer );
89 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer ); 89 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer );
90 float dx, dy; 90 float dx, dy;
91 int wid = (m.width() * 9)/10; 91 int wid = (m.width() * 9)/10;
92 dx = (float) wid/(float)contentsWidth (); 92 dx = (float) wid/(float)contentsWidth ();
93 dy = (float)(m.height()) / (float)contentsHeight (); 93 dy = (float)(m.height()) / (float)contentsHeight ();
94 float scale; 94 float scale;
95 // scale to fit the width or height of the paper 95 // scale to fit the width or height of the paper
96 if ( dx < dy ) 96 if ( dx < dy )
97 scale = dx; 97 scale = dx;
98 else 98 else
99 scale = dy; 99 scale = dy;
100 100
101 p.translate( m.width()/10,0 ); 101 p.translate( m.width()/10,0 );
102 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) { 102 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) {
103 p.scale( scale, scale ); 103 p.scale( scale, scale );
104 } 104 }
105 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () ); 105 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () );
106 p.end(); 106 p.end();
107#endif 107#endif
108 108
109} 109}
110void KOEventViewer::setSource(const QString& n) 110void KOEventViewer::setSource(const QString& n)
111{ 111{
112 112
113 if ( n.left(8) == "todo_uid" ) { 113 if ( n.left(8) == "todo_uid" ) {
114 int midstr = 9; 114 int midstr = 9;
115#ifdef DESKTOP_VERSION 115#ifdef DESKTOP_VERSION
116 midstr = 11; 116 midstr = 11;
117#endif 117#endif
118 //qDebug("-%s- ", n.mid(midstr).latin1()); 118 //qDebug("-%s- ", n.mid(midstr).latin1());
119 emit showIncidence( n.mid(midstr) ); 119 emit showIncidence( n.mid(midstr) );
120 return; 120 return;
121 } 121 }
122 122
123 if ( n.left(3) == "uid" ) 123 if ( n.left(3) == "uid" )
124#ifdef DESKTOP_VERSION 124#ifdef DESKTOP_VERSION
125 { 125 {
126 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 126 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
127 KABC::AddressBook::Iterator it; 127 KABC::AddressBook::Iterator it;
128 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 128 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
129 // LR I do not understand, why the uid string is different on zaurus and desktop 129 // LR I do not understand, why the uid string is different on zaurus and desktop
130 QString uid = "uid://"+(*it).uid(); 130 QString uid = "uid://"+(*it).uid();
131 131
132 //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1()); 132 //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1());
133 if (n == uid ) { 133 if (n == uid ) {
134 //qDebug("found %s ",(*it).mobileHomePhone().latin1() ); 134 //qDebug("found %s ",(*it).mobileHomePhone().latin1() );
135 QDialog dia( this,"dia123", true ); 135 QDialog dia( this,"dia123", true );
136 dia.setCaption( i18n("Details of attendee") ); 136 dia.setCaption( i18n("Details of attendee") );
137 QVBoxLayout lay ( &dia ); 137 QVBoxLayout lay ( &dia );
138 KABC::AddresseeView av ( &dia ); 138 KABC::AddresseeView av ( &dia );
139 av.setAddressee( (*it) ); 139 av.setAddressee( (*it) );
140 lay.addWidget( &av ); 140 lay.addWidget( &av );
141 if ( QApplication::desktop()->width() < 480 ) 141 if ( QApplication::desktop()->width() < 480 )
142 dia.resize( 220, 240); 142 dia.resize( 220, 240);
143 else { 143 else {
144 dia.resize( 400,400); 144 dia.resize( 400,400);
145 } 145 }
146 dia.exec(); 146 dia.exec();
147 break; 147 break;
148 } 148 }
149 } 149 }
150 return; 150 return;
151 } 151 }
152#else 152#else
153 { 153 {
154 if ( "uid:organizer" == n ) { 154 if ( "uid:organizer" == n ) {
155 ExternalAppHandler::instance()->requestDetailsFromKAPI("", mCurrentIncidence->organizer(),""); 155 ExternalAppHandler::instance()->requestDetailsFromKAPI("", mCurrentIncidence->organizer(),"");
156 return; 156 return;
157 } 157 }
158 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 158 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
159 if (attendees.count()) { 159 if (attendees.count()) {
160 Attendee *a; 160 Attendee *a;
161 for(a=attendees.first();a;a=attendees.next()) { 161 for(a=attendees.first();a;a=attendees.next()) {
162 if ( "uid:"+a->uid() == n ) { 162 if ( "uid:"+a->uid() == n ) {
163 bool res = ExternalAppHandler::instance()->requestDetailsFromKAPI(a->name(), a->email(), a->uid()); 163 bool res = ExternalAppHandler::instance()->requestDetailsFromKAPI(a->name(), a->email(), a->uid());
164 return; 164 return;
165 } 165 }
166 } 166 }
167 } 167 }
168 return; 168 return;
169 } 169 }
170 //requestNameEmailUidListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/); 170 //requestNameEmailUidListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/);
171 // the result should now arrive through method insertAttendees 171 // the result should now arrive through method insertAttendees
172 //QString uid = "uid:"+(*it).uid(); 172 //QString uid = "uid:"+(*it).uid();
173#endif 173#endif
174 if ( n.left(6) == "mailto" ) { 174 if ( n.left(6) == "mailto" ) {
175 // qDebug("KOEventViewer::setSource %s ", n.mid(7).latin1()); 175 // qDebug("KOEventViewer::setSource %s ", n.mid(7).latin1());
176#ifndef DESKTOP_VERSION 176#ifndef DESKTOP_VERSION
177 if ( n.mid(7,3) == "ALL" ) { 177 if ( n.mid(7,3) == "ALL" ) {
178 mailToAttendees( true ); 178 mailToAttendees( true );
179 } else if ( n.mid(7,4) == "RSVP" ) { 179 } else if ( n.mid(7,4) == "RSVP" ) {
180 mailToAttendees( false ); 180 mailToAttendees( false );
181 } else { 181 } else {
182 QCopEnvelope e("QPE/Application/ompi", "newMail(QString)" ); 182 QCopEnvelope e("QPE/Application/ompi", "newMail(QString)" );
183 e << n.mid(7); 183 e << n.mid(7);
184 } 184 }
185#endif 185#endif
186 186
187 } 187 }
188 188
189 189
190#ifndef KORG_NODCOP 190#ifndef KORG_NODCOP
191 kdDebug() << "KOEventViewer::setSource(): " << n << endl; 191 kdDebug() << "KOEventViewer::setSource(): " << n << endl;
192 QString tmpStr; 192 QString tmpStr;
193 if (n.startsWith("mailto:")) { 193 if (n.startsWith("mailto:")) {
194 KApplication::kApplication()->invokeMailer(n.mid(7),QString::null); 194 KApplication::kApplication()->invokeMailer(n.mid(7),QString::null);
195 //emit showIncidence(n); 195 //emit showIncidence(n);
196 return; 196 return;
197 } else if (n.startsWith("uid:")) { 197 } else if (n.startsWith("uid:")) {
198 DCOPClient *client = KApplication::kApplication()->dcopClient(); 198 DCOPClient *client = KApplication::kApplication()->dcopClient();
199 const QByteArray noParamData; 199 const QByteArray noParamData;
200 const QByteArray paramData; 200 const QByteArray paramData;
201 QByteArray replyData; 201 QByteArray replyData;
202 QCString replyTypeStr; 202 QCString replyTypeStr;
203#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData)) 203#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData))
204 bool foundAbbrowser = PING_ABBROWSER; 204 bool foundAbbrowser = PING_ABBROWSER;
205 205
206 if (foundAbbrowser) { 206 if (foundAbbrowser) {
207 //KAddressbook is already running, so just DCOP to it to bring up the contact editor 207 //KAddressbook is already running, so just DCOP to it to bring up the contact editor
208 //client->send("kaddressbook","KAddressBookIface", 208 //client->send("kaddressbook","KAddressBookIface",
209 QDataStream arg(paramData, IO_WriteOnly); 209 QDataStream arg(paramData, IO_WriteOnly);
210 arg << n.mid(6); 210 arg << n.mid(6);
211 client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData); 211 client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData);
212 return; 212 return;
213 } else { 213 } else {
214 /* 214 /*
215 KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater. 215 KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater.
216 We start it without its main interface 216 We start it without its main interface
217 */ 217 */
218 KIconLoader* iconLoader = new KIconLoader(); 218 KIconLoader* iconLoader = new KIconLoader();
219 QString iconPath = iconLoader->iconPath("go",KIcon::Small); 219 QString iconPath = iconLoader->iconPath("go",KIcon::Small);
220 ActionManager::setStartedKAddressBook(true); 220 ActionManager::setStartedKAddressBook(true);
221 tmpStr = "kaddressbook --editor-only --uid "; 221 tmpStr = "kaddressbook --editor-only --uid ";
222 tmpStr += KProcess::quote(n.mid(6)); 222 tmpStr += KProcess::quote(n.mid(6));
223 KRun::runCommand(tmpStr,"KAddressBook",iconPath); 223 KRun::runCommand(tmpStr,"KAddressBook",iconPath);
224 return; 224 return;
225 } 225 }
226 } else { 226 } else {
227 //QTextBrowser::setSource(n); 227 //QTextBrowser::setSource(n);
228 } 228 }
229#endif 229#endif
230} 230}
231void KOEventViewer::mailToAttendees( bool all ) 231void KOEventViewer::mailToAttendees( bool all )
232{ 232{
233 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 233 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
234 if (attendees.count() == 0) return; 234 if (attendees.count() == 0) return;
235 QStringList nameList; 235 QStringList nameList;
236 QStringList emailList; 236 QStringList emailList;
237 QStringList uidList; 237 QStringList uidList;
238 Attendee* a; 238 Attendee* a;
239 for(a=attendees.first();a;a=attendees.next()) { 239 for(a=attendees.first();a;a=attendees.next()) {
240 if ( !all && !a->RSVP() ) continue; 240 if ( !all && !a->RSVP() ) continue;
241 if (!a->email().isEmpty()) { 241 if (!a->email().isEmpty()) {
242 nameList.append (a->name() ); 242 nameList.append (a->name() );
243 emailList.append (a->email() ); 243 emailList.append (a->email() );
244 uidList.append (a->uid() ); 244 uidList.append (a->uid() );
245 } 245 }
246 } 246 }
247 QString uid = "ComposeMailUIpick2"+mMailSubject; 247 QString uid = "ComposeMailUIpick2"+mMailSubject;
248#ifndef DESKTOP_VERSION 248#ifndef DESKTOP_VERSION
249 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); 249 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList);
250#endif 250#endif
251 251
252} 252}
253void KOEventViewer::addTag(const QString & tag,const QString & text) 253void KOEventViewer::addTag(const QString & tag,const QString & text)
254{ 254{
255 int number=text.contains("\n"); 255 int number=text.contains("\n");
256 QString str = "<" + tag + ">"; 256 QString str = "<" + tag + ">";
257 QString tmpText=text; 257 QString tmpText=text;
258 QString tmpStr=str; 258 QString tmpStr=str;
259 if(number !=-1) 259 if(number !=-1)
260 { 260 {
261 if (number > 0) { 261 if (number > 0) {
262 int pos=0; 262 int pos=0;
263 QString tmp; 263 QString tmp;
264 for(int i=0;i<=number;i++) { 264 for(int i=0;i<=number;i++) {
265 pos=tmpText.find("\n"); 265 pos=tmpText.find("\n");
266 tmp=tmpText.left(pos); 266 tmp=tmpText.left(pos);
267 tmpText=tmpText.right(tmpText.length()-pos-1); 267 tmpText=tmpText.right(tmpText.length()-pos-1);
268 tmpStr+=tmp+"<br>"; 268 tmpStr+=tmp+"<br>";
269 } 269 }
270 } 270 }
271 else tmpStr += tmpText; 271 else tmpStr += tmpText;
272 tmpStr+="</" + tag + ">"; 272 tmpStr+="</" + tag + ">";
273 mText.append(tmpStr); 273 mText.append(tmpStr);
274 } 274 }
275 else 275 else
276 { 276 {
277 str += text + "</" + tag + ">"; 277 str += text + "</" + tag + ">";
278 mText.append(str); 278 mText.append(str);
279 } 279 }
280} 280}
281 281
282void KOEventViewer::setColorMode( int m ) 282void KOEventViewer::setColorMode( int m )
283{ 283{
284 mColorMode = m; 284 mColorMode = m;
285} 285}
286void KOEventViewer::appendEvent(Event *event, int mode ) 286void KOEventViewer::appendEvent(Event *event, int mode )
287{ 287{
288 mMailSubject = ""; 288 mMailSubject = "";
289 mCurrentIncidence = event; 289 mCurrentIncidence = event;
290 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 290 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
291 bool wideScreen = ( QApplication::desktop()->width() >= 640 ); 291 bool wideScreen = ( QApplication::desktop()->width() >= 640 );
292 topLevelWidget()->setCaption(i18n("Event Viewer")); 292 topLevelWidget()->setCaption(i18n("Event Viewer"));
293 if ( mode == 0 ) { 293 if ( mode == 0 ) {
294 addTag("h2",deTag(event->summary())); 294 addTag("h2",deTag(event->summary()));
295 formatReadOnly(event); 295 formatReadOnly(event);
296 } 296 }
297 else { 297 else {
298 if ( mColorMode == 1 ) { 298 if ( mColorMode == 1 ) {
299 mText +="<font color=\"#00A000\">"; 299 mText +="<font color=\"#00A000\">";
300 } 300 }
301 if ( mColorMode == 2 ) { 301 if ( mColorMode == 2 ) {
302 mText +="<font color=\"#C00000\">"; 302 mText +="<font color=\"#C00000\">";
303 } 303 }
304 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 304 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
305 if ( mode == 1 ) { 305 if ( mode == 1 ) {
306 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 306 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
307 } else { 307 } else {
308 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 308 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
309 } 309 }
310 formatReadOnly(event); 310 formatReadOnly(event);
311 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 311 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
312 if ( mColorMode ) 312 if ( mColorMode )
313 mText += "</font>"; 313 mText += "</font>";
314 } 314 }
315 mMailSubject += i18n( "Meeting " )+ event->summary(); 315 mMailSubject += i18n( "Meeting " )+ event->summary();
316 if (event->cancelled ()) { 316 if (event->cancelled ()) {
317 mText +="<font color=\"#B00000\">"; 317 mText +="<font color=\"#B00000\">";
318 addTag("i",i18n("This event has been cancelled!")); 318 addTag("i",i18n("This event has been cancelled!"));
319 mText.append("<br>"); 319 mText.append("<br>");
320 mText += "</font>"; 320 mText += "</font>";
321 mMailSubject += i18n("(cancelled)"); 321 mMailSubject += i18n("(cancelled)");
322 } 322 }
323 323
324 if (event->doesFloat()) { 324 if (event->doesFloat()) {
325 if (event->isMultiDay()) { 325 if (event->isMultiDay()) {
326 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 326 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
327 .arg(event->dtStartDateStr(shortDate)) 327 .arg(event->dtStartDateStr(shortDate))
328 .arg(event->dtEndDateStr(shortDate))); 328 .arg(event->dtEndDateStr(shortDate)));
329 } else { 329 } else {
330 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 330 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
331 } 331 }
332 } else { 332 } else {
333 if (event->isMultiDay()) { 333 if (event->isMultiDay()) {
334 mText.append(i18n("<p><b>From:</b> %1</p> ") 334 mText.append(i18n("<p><b>From:</b> %1</p> ")
335 .arg(event->dtStartStr( shortDate))); 335 .arg(event->dtStartStr( shortDate)));
336 mText.append(i18n("<p><b>To:</b> %1</p>") 336 mText.append(i18n("<p><b>To:</b> %1</p>")
337 .arg(event->dtEndStr(shortDate))); 337 .arg(event->dtEndStr(shortDate)));
338 } else { 338 } else {
339 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 339 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
340 .arg(event->dtStartTimeStr()) 340 .arg(event->dtStartTimeStr())
341 .arg(event->dtEndTimeStr())); 341 .arg(event->dtEndTimeStr()));
342 mText.append(i18n("<p><b>On:</b> %1</p> ") 342 mText.append(i18n("<p><b>On:</b> %1</p> ")
343 .arg(event->dtStartDateStr( shortDate ))); 343 .arg(event->dtStartDateStr( shortDate )));
344 } 344 }
345 } 345 }
346 if (!event->location().isEmpty()) { 346 if (!event->location().isEmpty()) {
347 addTag("p","<b>"+i18n("Location: ")+"</b>"+ deTag(event->location() ) ); 347 addTag("p","<b>"+i18n("Location: ")+"</b>"+ deTag(event->location() ) );
348 mMailSubject += i18n(" at ") + event->location(); 348 mMailSubject += i18n(" at ") + event->location();
349 } 349 }
350 if (event->recurrence()->doesRecur()) { 350 if (event->doesRecur()) {
351 351
352 QString recurText = event->recurrence()->recurrenceText(); 352 QString recurText = event->recurrenceText();
353 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 353 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
354 bool ok; 354 bool ok;
355 QDate start = QDate::currentDate(); 355 QDate start = QDate::currentDate();
356 QDateTime next; 356 QDateTime next;
357 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok ); 357 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
358 if ( ok ) { 358 if ( ok ) {
359 if ( wideScreen ){ 359 if ( wideScreen ){
360 addTag("p",i18n("<b>Next recurrence is on:</b>") +" " + KGlobal::locale()->formatDate( next.date(), shortDate ) ); 360 addTag("p",i18n("<b>Next recurrence is on:</b>") +" " + KGlobal::locale()->formatDate( next.date(), shortDate ) );
361 } else { 361 } else {
362 addTag("p",i18n("<b>Next recurrence is on:</b>") ); 362 addTag("p",i18n("<b>Next recurrence is on:</b>") );
363 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate )); 363 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
364 } 364 }
365 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true ); 365 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true );
366 366
367 } else { 367 } else {
368 bool last; 368 bool last;
369 QDate nextd; 369 QDate nextd;
370 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last ); 370 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
371 if ( last ) { 371 if ( last ) {
372 if ( wideScreen ){ 372 if ( wideScreen ){
373 addTag("p",i18n("<b>Last recurrence was on:</b>") +" " + KGlobal::locale()->formatDate( nextd, shortDate )); 373 addTag("p",i18n("<b>Last recurrence was on:</b>") +" " + KGlobal::locale()->formatDate( nextd, shortDate ));
374 } else{ 374 } else{
375 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 375 addTag("p",i18n("<b>Last recurrence was on:</b>") );
376 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate )); 376 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
377 } 377 }
378 } 378 }
379 } 379 }
380 } else { 380 } else {
381 mMailSubject += i18n(" - " )+event->dtStartStr( true ); 381 mMailSubject += i18n(" - " )+event->dtStartStr( true );
382 382
383 } 383 }
384 384
385 385
386 if (event->isAlarmEnabled()) { 386 if (event->isAlarmEnabled()) {
387 Alarm *alarm =event->alarms().first() ; 387 Alarm *alarm =event->alarms().first() ;
388 QDateTime t = alarm->time(); 388 QDateTime t = alarm->time();
389 QString s =i18n("( %1 before )").arg( alarm->offsetText() ); 389 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
390 if(wideScreen ){ 390 if(wideScreen ){
391 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"+ KGlobal::locale()->formatDateTime( t, shortDate )); 391 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"+ KGlobal::locale()->formatDateTime( t, shortDate ));
392 }else{ 392 }else{
393 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 393 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
394 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 394 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
395 } 395 }
396 //addTag("p",s); 396 //addTag("p",s);
397 } 397 }
398 398
399 addTag("p","<b>"+i18n("Access: ") + "</b>" + event->secrecyStr()); 399 addTag("p","<b>"+i18n("Access: ") + "</b>" + event->secrecyStr());
400 400
401 formatCategories(event); 401 formatCategories(event);
402 402
403 formatAttendees(event); 403 formatAttendees(event);
404 404
405 if ( KOPrefs::instance()->mEVshowCreated ) { 405 if ( KOPrefs::instance()->mEVshowCreated ) {
406 if(wideScreen ){ 406 if(wideScreen ){
407 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate )); 407 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate ));
408 }else{ 408 }else{
409 addTag("p",i18n("<b>Created: ") +" </b>"); 409 addTag("p",i18n("<b>Created: ") +" </b>");
410 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 410 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
411 } 411 }
412 412
413 413
414 } 414 }
415 if ( KOPrefs::instance()->mEVshowChanged ) { 415 if ( KOPrefs::instance()->mEVshowChanged ) {
416 if(wideScreen ){ 416 if(wideScreen ){
417 addTag("p",i18n("<b>Last modified: ") +" </b>" + KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) ); 417 addTag("p",i18n("<b>Last modified: ") +" </b>" + KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) );
418 }else{ 418 }else{
419 addTag("p",i18n("<b>Last modified: ") +" </b>"); 419 addTag("p",i18n("<b>Last modified: ") +" </b>");
420 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 420 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
421 } 421 }
422 422
423 } 423 }
424 if ( KOPrefs::instance()->mEVshowDetails ) { 424 if ( KOPrefs::instance()->mEVshowDetails ) {
425 if (!event->description().isEmpty()) { 425 if (!event->description().isEmpty()) {
426 addTag("p",i18n("<b>Details: </b>")); 426 addTag("p",i18n("<b>Details: </b>"));
427 addTag("p",deTag(event->description())); 427 addTag("p",deTag(event->description()));
428 } 428 }
429 } 429 }
430 setText(mText); 430 setText(mText);
431 //QWhatsThis::add(this,mText); 431 //QWhatsThis::add(this,mText);
432 432
433} 433}
434 434
435void KOEventViewer::appendTodo(Todo *event, int mode ) 435void KOEventViewer::appendTodo(Todo *event, int mode )
436{ 436{
437 mMailSubject = ""; 437 mMailSubject = "";
438 mCurrentIncidence = event; 438 mCurrentIncidence = event;
439 topLevelWidget()->setCaption(i18n("Todo Viewer")); 439 topLevelWidget()->setCaption(i18n("Todo Viewer"));
440 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 440 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
441 bool wideScreen = ( QApplication::desktop()->width() >= 640 ); 441 bool wideScreen = ( QApplication::desktop()->width() >= 640 );
442 if (mode == 0 ) { 442 if (mode == 0 ) {
443 addTag("h2",deTag(event->summary())); 443 addTag("h2",deTag(event->summary()));
444 formatReadOnly(event); 444 formatReadOnly(event);
445 } 445 }
446 else { 446 else {
447 if ( mColorMode == 1 ) { 447 if ( mColorMode == 1 ) {
448 mText +="<font color=\"#00A000\">"; 448 mText +="<font color=\"#00A000\">";
449 } 449 }
450 if ( mColorMode == 2 ) { 450 if ( mColorMode == 2 ) {
451 mText +="<font color=\"#B00000\">"; 451 mText +="<font color=\"#B00000\">";
452 } 452 }
453 if ( mode == 1 ) { 453 if ( mode == 1 ) {
454 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 454 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
455 } else { 455 } else {
456 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 456 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
457 } 457 }
458 formatReadOnly(event); 458 formatReadOnly(event);
459 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 459 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
460 if ( mColorMode ) 460 if ( mColorMode )
461 mText += "</font>"; 461 mText += "</font>";
462 } 462 }
463 mMailSubject += i18n( "Todo " )+ event->summary(); 463 mMailSubject += i18n( "Todo " )+ event->summary();
464 464
465 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 465 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
466 mText +="<font color=\"#B00000\">"; 466 mText +="<font color=\"#B00000\">";
467 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) ); 467 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) );
468 mText += "</font>"; 468 mText += "</font>";
469 } else { 469 } else {
470 mText.append(i18n("<p><i>%1 % completed</i></p>") 470 mText.append(i18n("<p><i>%1 % completed</i></p>")
471 .arg(event->percentComplete())); 471 .arg(event->percentComplete()));
472 } 472 }
473 473
474 if (event->cancelled ()) { 474 if (event->cancelled ()) {
475 mText +="<font color=\"#B00000\">"; 475 mText +="<font color=\"#B00000\">";
476 addTag("i",i18n("This todo has been cancelled!")); 476 addTag("i",i18n("This todo has been cancelled!"));
477 mText.append("<br>"); 477 mText.append("<br>");
478 mText += "</font>"; 478 mText += "</font>";
479 mMailSubject += i18n("(cancelled)"); 479 mMailSubject += i18n("(cancelled)");
480 } 480 }
481 481
482 482
483 483
484 if (event->recurrence()->doesRecur()) { 484 if (event->doesRecur()) {
485 485
486 QString recurText = event->recurrence()->recurrenceText(); 486 QString recurText = event->recurrence()->recurrenceText();
487 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>"); 487 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>");
488 488
489 } 489 }
490 if (event->hasStartDate()) { 490 if (event->hasStartDate()) {
491 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer))); 491 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer)));
492 } 492 }
493 if (event->hasDueDate()) { 493 if (event->hasDueDate()) {
494 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer))); 494 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer)));
495 mMailSubject += i18n(" - " )+event->dtDueStr( true ); 495 mMailSubject += i18n(" - " )+event->dtDueStr( true );
496 } 496 }
497 if (!event->location().isEmpty()) { 497 if (!event->location().isEmpty()) {
498 addTag("p","<b>"+i18n("Location: ")+"</b>"+ deTag(event->location() ) ); 498 addTag("p","<b>"+i18n("Location: ")+"</b>"+ deTag(event->location() ) );
499 mMailSubject += i18n(" at ") + event->location(); 499 mMailSubject += i18n(" at ") + event->location();
500 } 500 }
501 mText.append(i18n("<p><b>Priority:</b> %2</p>") 501 mText.append(i18n("<p><b>Priority:</b> %2</p>")
502 .arg(QString::number(event->priority()))); 502 .arg(QString::number(event->priority())));
503 503
504 if (event->isAlarmEnabled()) { 504 if (event->isAlarmEnabled()) {
505 Alarm *alarm =event->alarms().first() ; 505 Alarm *alarm =event->alarms().first() ;
506 QDateTime t = alarm->time(); 506 QDateTime t = alarm->time();
507 QString s =i18n("( %1 before )").arg( alarm->offsetText() ); 507 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
508 if ( wideScreen ) { 508 if ( wideScreen ) {
509 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"+ KGlobal::locale()->formatDateTime( t, shortDate )); 509 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"+ KGlobal::locale()->formatDateTime( t, shortDate ));
510 } else { 510 } else {
511 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 511 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
512 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 512 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
513 } 513 }
514 } 514 }
515 515
516 addTag("p","<b>"+i18n("Access: ") + "</b>" + event->secrecyStr()); 516 addTag("p","<b>"+i18n("Access: ") + "</b>" + event->secrecyStr());
517 517
518 formatCategories(event); 518 formatCategories(event);
519 519
520 formatAttendees(event); 520 formatAttendees(event);
521 521
522 if ( KOPrefs::instance()->mEVshowCreated ) { 522 if ( KOPrefs::instance()->mEVshowCreated ) {
523 if(wideScreen ){ 523 if(wideScreen ){
524 524
525 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate )); 525 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate ));
526 526
527 } else { 527 } else {
528 addTag("p",i18n("<b>Created: ") +" </b>"); 528 addTag("p",i18n("<b>Created: ") +" </b>");
529 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 529 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
530 } 530 }
531 } 531 }
532 if ( KOPrefs::instance()->mEVshowChanged ) { 532 if ( KOPrefs::instance()->mEVshowChanged ) {
533 if(wideScreen ){ 533 if(wideScreen ){
534 addTag("p",i18n("<b>Last modified: ") +" </b>" +KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) ); 534 addTag("p",i18n("<b>Last modified: ") +" </b>" +KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ) );
535 535
536 } else { 536 } else {
537 addTag("p",i18n("<b>Last modified: ") +" </b>"); 537 addTag("p",i18n("<b>Last modified: ") +" </b>");
538 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 538 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
539 } 539 }
540 } 540 }
541 if ( event->relatedTo() ) { 541 if ( event->relatedTo() ) {
542 addTag("b",i18n("Parent todo:<br>")); 542 addTag("b",i18n("Parent todo:<br>"));
543 543
544 QString t_name = "[" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] ";// +event->relatedTo()->summary()); 544 QString t_name = "[" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] ";// +event->relatedTo()->summary());
545 545
546 mText += t_name; 546 mText += t_name;
547 mText += "<a href=\"todo_uid:" + event->relatedTo()->uid() + "\">"; 547 mText += "<a href=\"todo_uid:" + event->relatedTo()->uid() + "\">";
548 mText += deTag(event->relatedTo()->summary()); 548 mText += deTag(event->relatedTo()->summary());
549 mText += "</a><br>"; 549 mText += "</a><br>";
550 550
551 // mText.append(deTag("[" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] " +event->relatedTo()->summary()) +"<br>"); 551 // mText.append(deTag("[" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] " +event->relatedTo()->summary()) +"<br>");
552 } 552 }
553 QPtrList<Incidence> Relations = event->relations(); 553 QPtrList<Incidence> Relations = event->relations();
554 Incidence *to; 554 Incidence *to;
555 if ( Relations.first() ) 555 if ( Relations.first() )
556 addTag("b",i18n("Sub todos:<br>")); 556 addTag("b",i18n("Sub todos:<br>"));
557 for (to=Relations.first();to;to=Relations.next()) { 557 for (to=Relations.first();to;to=Relations.next()) {
558 QString t_name = "[" +QString::number(((Todo*)to)->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%] ";// +to->relatedTo()->summary()); 558 QString t_name = "[" +QString::number(((Todo*)to)->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%] ";// +to->relatedTo()->summary());
559 mText += t_name; 559 mText += t_name;
560 mText += "<a href=\"todo_uid:" + to->uid() + "\">"; 560 mText += "<a href=\"todo_uid:" + to->uid() + "\">";
561 mText += deTag(to->summary()); 561 mText += deTag(to->summary());
562 mText += "</a><br>"; 562 mText += "</a><br>";
563 563
564 } 564 }
565 565
566 if ( KOPrefs::instance()->mEVshowDetails ) { 566 if ( KOPrefs::instance()->mEVshowDetails ) {
567 if (!event->description().isEmpty()) { 567 if (!event->description().isEmpty()) {
568 addTag("p",i18n("<b>Details: </b>")); 568 addTag("p",i18n("<b>Details: </b>"));
569 addTag("p",deTag(event->description())); 569 addTag("p",deTag(event->description()));
570 } 570 }
571 } 571 }
572 setText(mText); 572 setText(mText);
573} 573}
574 574
575void KOEventViewer::formatCategories(Incidence *event) 575void KOEventViewer::formatCategories(Incidence *event)
576{ 576{
577 if (!event->categoriesStr().isEmpty()) { 577 if (!event->categoriesStr().isEmpty()) {
578 if (event->categories().count() == 1) { 578 if (event->categories().count() == 1) {
579 addTag("p","<b>"+i18n("Category") + ":</b> " + event->categoriesStrWithSpace()); 579 addTag("p","<b>"+i18n("Category") + ":</b> " + event->categoriesStrWithSpace());
580 } else { 580 } else {
581 addTag("p","<b>"+i18n("Categories")+":</b> " + event->categoriesStrWithSpace() ) ; 581 addTag("p","<b>"+i18n("Categories")+":</b> " + event->categoriesStrWithSpace() ) ;
582 } 582 }
583 } 583 }
584} 584}
585void KOEventViewer::formatAttendees(Incidence *event) 585void KOEventViewer::formatAttendees(Incidence *event)
586{ 586{
587 QPtrList<Attendee> attendees = event->attendees(); 587 QPtrList<Attendee> attendees = event->attendees();
588 if (attendees.count()) { 588 if (attendees.count()) {
589 589
590 590
591 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); 591 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small);
592 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small); 592 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small);
593 addTag("h3",i18n("Organizer")); 593 addTag("h3",i18n("Organizer"));
594 mText.append("<ul><li>"); 594 mText.append("<ul><li>");
595#ifndef KORG_NOKABC 595#ifndef KORG_NOKABC
596 596
597#ifdef DESKTOP_VERSION 597#ifdef DESKTOP_VERSION
598 KABC::AddressBook *add_book = KABC::StdAddressBook::self(); 598 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
599 KABC::Addressee::List addressList; 599 KABC::Addressee::List addressList;
600 addressList = add_book->findByEmail(event->organizer()); 600 addressList = add_book->findByEmail(event->organizer());
601 KABC::Addressee o = addressList.first(); 601 KABC::Addressee o = addressList.first();
602 if (!o.isEmpty() && addressList.size()<2) { 602 if (!o.isEmpty() && addressList.size()<2) {
603 mText += "<a href=\"uid:" + o.uid() + "\">"; 603 mText += "<a href=\"uid:" + o.uid() + "\">";
604 mText += o.formattedName(); 604 mText += o.formattedName();
605 mText += "</a>\n"; 605 mText += "</a>\n";
606 } else { 606 } else {
607 mText.append(event->organizer()); 607 mText.append(event->organizer());
608 } 608 }
609#else //DESKTOP_VERSION 609#else //DESKTOP_VERSION
610 mText += "<a href=\"uid:organizer\">"; 610 mText += "<a href=\"uid:organizer\">";
611 mText += event->organizer(); 611 mText += event->organizer();
612 mText += "</a>\n"; 612 mText += "</a>\n";
613#endif //DESKTOP_VERSION 613#endif //DESKTOP_VERSION
614 614
615 615
616#else 616#else
617 mText.append(event->organizer()); 617 mText.append(event->organizer());
618#endif 618#endif
619 619
620 if (iconPath) { 620 if (iconPath) {
621 mText += " <a href=\"mailto:" + event->organizer() + "\">"; 621 mText += " <a href=\"mailto:" + event->organizer() + "\">";
622 mText += "<IMG src=\"" + iconPath + "\">"; 622 mText += "<IMG src=\"" + iconPath + "\">";
623 mText += "</a>\n"; 623 mText += "</a>\n";
624 } 624 }
625 mText.append("</li></ul>"); 625 mText.append("</li></ul>");
626 626
627 addTag("h3",i18n("Attendees")); 627 addTag("h3",i18n("Attendees"));
628 Attendee *a; 628 Attendee *a;
629 mText.append("<ul>"); 629 mText.append("<ul>");
630 int a_count = 0; 630 int a_count = 0;
631 int a_count_nr = 0; 631 int a_count_nr = 0;
632 632
633 for(a=attendees.first();a;a=attendees.next()) { 633 for(a=attendees.first();a;a=attendees.next()) {
634#ifndef KORG_NOKABC 634#ifndef KORG_NOKABC
635#ifdef DESKTOP_VERSION 635#ifdef DESKTOP_VERSION
636 if (a->name().isEmpty()) { 636 if (a->name().isEmpty()) {
637 addressList = add_book->findByEmail(a->email()); 637 addressList = add_book->findByEmail(a->email());
638 KABC::Addressee o = addressList.first(); 638 KABC::Addressee o = addressList.first();
639 if (!o.isEmpty() && addressList.size()<2) { 639 if (!o.isEmpty() && addressList.size()<2) {
640 mText += "<a href=\"uid:" + o.uid() + "\">"; 640 mText += "<a href=\"uid:" + o.uid() + "\">";
641 mText += o.formattedName(); 641 mText += o.formattedName();
642 mText += "</a>\n"; 642 mText += "</a>\n";
643 } else { 643 } else {
644 mText += "<li>"; 644 mText += "<li>";
645 mText.append(a->email()); 645 mText.append(a->email());
646 mText += "\n"; 646 mText += "\n";
647 } 647 }
648 } else { 648 } else {
649 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 649 mText += "<li><a href=\"uid:" + a->uid() + "\">";
650 if (!a->name().isEmpty()) mText += a->name(); 650 if (!a->name().isEmpty()) mText += a->name();
651 else mText += a->email(); 651 else mText += a->email();
652 mText += "</a>\n"; 652 mText += "</a>\n";
653 } 653 }
654#else //DESKTOP_VERSION 654#else //DESKTOP_VERSION
655 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 655 mText += "<li><a href=\"uid:" + a->uid() + "\">";
656 if (!a->name().isEmpty()) mText += a->name(); 656 if (!a->name().isEmpty()) mText += a->name();
657 else mText += a->email(); 657 else mText += a->email();
658 mText += "</a>\n"; 658 mText += "</a>\n";
659#endif //DESKTOP_VERSION 659#endif //DESKTOP_VERSION
660#else 660#else
661 //qDebug("nokabc "); 661 //qDebug("nokabc ");
662 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 662 mText += "<li><a href=\"uid:" + a->uid() + "\">";
663 if (!a->name().isEmpty()) mText += a->name(); 663 if (!a->name().isEmpty()) mText += a->name();
664 else mText += a->email(); 664 else mText += a->email();
665 mText += "</a>\n"; 665 mText += "</a>\n";
666#endif 666#endif
667 667
668 668
669 if (!a->email().isEmpty()) { 669 if (!a->email().isEmpty()) {
670 if (iconPath) { 670 if (iconPath) {
671 mText += "<a href=\"mailto:" + a->name() +" <" + a->email() + ">:" + mMailSubject + "\">"; 671 mText += "<a href=\"mailto:" + a->name() +" <" + a->email() + ">:" + mMailSubject + "\">";
672 if ( a->RSVP() ) { 672 if ( a->RSVP() ) {
673 ++a_count_nr; 673 ++a_count_nr;
674 mText += "<IMG src=\"" + iconPath + "\">"; 674 mText += "<IMG src=\"" + iconPath + "\">";
675 } 675 }
676 else { 676 else {
677 ++a_count; 677 ++a_count;
678 mText += "<IMG src=\"" + NOiconPath + "\">"; 678 mText += "<IMG src=\"" + NOiconPath + "\">";
679 } 679 }
680 mText += "</a>\n"; 680 mText += "</a>\n";
681 } 681 }
682 } 682 }
683 if (a->status() != Attendee::NeedsAction ) 683 if (a->status() != Attendee::NeedsAction )
684 mText +="[" + a->statusStr() + "] "; 684 mText +="[" + a->statusStr() + "] ";
685 if (a->role() == Attendee::Chair ) 685 if (a->role() == Attendee::Chair )
686 mText +="(" + a->roleStr().left(1) + ".)"; 686 mText +="(" + a->roleStr().left(1) + ".)";
687 } 687 }
688 mText.append("</li></ul>"); 688 mText.append("</li></ul>");
689 if ( (a_count+a_count_nr) > 1 ) { 689 if ( (a_count+a_count_nr) > 1 ) {
690 mText += "<a href=\"mailto:ALL\">"; 690 mText += "<a href=\"mailto:ALL\">";
691 mText += i18n( "Mail to all" ); 691 mText += i18n( "Mail to all" );
692 mText += "</a> ( "; 692 mText += "</a> ( ";
693 mText += "<IMG src=\"" + iconPath + "\">"; 693 mText += "<IMG src=\"" + iconPath + "\">";
694 mText += i18n( " and " ); 694 mText += i18n( " and " );
695 mText += "<IMG src=\"" + NOiconPath + "\"> )"; 695 mText += "<IMG src=\"" + NOiconPath + "\"> )";
696 mText += "<br>\n"; 696 mText += "<br>\n";
697 697
698 698
699 } 699 }
700 if ( a_count_nr > 1 ) { 700 if ( a_count_nr > 1 ) {
701 mText += "<a href=\"mailto:RSVP\">"; 701 mText += "<a href=\"mailto:RSVP\">";
702 mText += i18n( "Mail to selected" ); 702 mText += i18n( "Mail to selected" );
703 mText += "</a> ( "; 703 mText += "</a> ( ";
704 mText += i18n( "<IMG src=\"%1\"> only )").arg ( iconPath ); 704 mText += i18n( "<IMG src=\"%1\"> only )").arg ( iconPath );
705 mText += "<br>\n"; 705 mText += "<br>\n";
706 } 706 }
707 } 707 }
708 708
709} 709}
710void KOEventViewer::appendJournal(Journal *jour, int mode ) 710void KOEventViewer::appendJournal(Journal *jour, int mode )
711{ 711{
712 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 712 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
713 QString text_d = i18n("Journal from: "); 713 QString text_d = i18n("Journal from: ");
714 if ( !jour->summary().isEmpty() ) 714 if ( !jour->summary().isEmpty() )
715 text_d = jour->summary(); 715 text_d = jour->summary();
716 if (mode == 0 ) { 716 if (mode == 0 ) {
717 addTag("h2", text_d ); 717 addTag("h2", text_d );
718 } 718 }
719 else { 719 else {
720 if ( mode == 1 ) { 720 if ( mode == 1 ) {
721 addTag("h3",i18n( "Local: " ) + text_d ); 721 addTag("h3",i18n( "Local: " ) + text_d );
722 } else { 722 } else {
723 addTag("h3",i18n( "Remote: " ) + text_d ); 723 addTag("h3",i18n( "Remote: " ) + text_d );
724 } 724 }
725 } 725 }
726 topLevelWidget()->setCaption(i18n("Journal viewer")); 726 topLevelWidget()->setCaption(i18n("Journal viewer"));
727 mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer))); 727 mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer)));
728 formatReadOnly(jour); 728 formatReadOnly(jour);
729 addTag("p","<b>"+i18n( "Last modified: " ) + "</b>"+KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) ); 729 addTag("p","<b>"+i18n( "Last modified: " ) + "</b>"+KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) );
730 730
731 if (!jour->description().isEmpty()) { 731 if (!jour->description().isEmpty()) {
732 addTag("p",deTag(jour->description())); 732 addTag("p",deTag(jour->description()));
733 } 733 }
734 setText(mText); 734 setText(mText);
735} 735}
736 736
737void KOEventViewer::formatReadOnly(Incidence *event) 737void KOEventViewer::formatReadOnly(Incidence *event)
738{ 738{
739 int id = event->calID(); 739 int id = event->calID();
740 if ( id > 1 ) { 740 if ( id > 1 ) {
741 addTag("p", "<em>("+i18n("Calendar:")+" " + KOPrefs::instance()->getCalendar( id )->mName + ")</em>"); 741 addTag("p", "<em>("+i18n("Calendar:")+" " + KOPrefs::instance()->getCalendar( id )->mName + ")</em>");
742 } 742 }
743 if (event->isReadOnly()) { 743 if (event->isReadOnly()) {
744 addTag("p","<em>(" + i18n("read-only") + ")</em>"); 744 addTag("p","<em>(" + i18n("read-only") + ")</em>");
745 } 745 }
746} 746}
747void KOEventViewer::setSyncMode( bool b ) 747void KOEventViewer::setSyncMode( bool b )
748{ 748{
749 mSyncMode = b; 749 mSyncMode = b;
750} 750}
751 751
752void KOEventViewer::setTodo(Todo *event, bool clearV ) 752void KOEventViewer::setTodo(Todo *event, bool clearV )
753{ 753{
754 if ( clearV ) 754 if ( clearV )
755 clearEvents(); 755 clearEvents();
756 if ( mSyncMode ) { 756 if ( mSyncMode ) {
757 if ( clearV ) 757 if ( clearV )
758 appendTodo(event,1 ); 758 appendTodo(event,1 );
759 else 759 else
760 appendTodo(event,2); 760 appendTodo(event,2);
761 } else 761 } else
762 appendTodo(event); 762 appendTodo(event);
763} 763}
764void KOEventViewer::setJournal(Journal *event, bool clearV ) 764void KOEventViewer::setJournal(Journal *event, bool clearV )
765{ 765{
766 if ( clearV ) 766 if ( clearV )
767 clearEvents(); 767 clearEvents();
768 if ( mSyncMode ) { 768 if ( mSyncMode ) {
769 if ( clearV ) 769 if ( clearV )
770 appendJournal(event, 1); 770 appendJournal(event, 1);
771 else 771 else
772 appendJournal(event, 2); 772 appendJournal(event, 2);
773 } else 773 } else
774 appendJournal(event); 774 appendJournal(event);
775} 775}
776 776
777void KOEventViewer::setEvent(Event *event) 777void KOEventViewer::setEvent(Event *event)
778{ 778{
779 clearEvents(); 779 clearEvents();
780 if ( mSyncMode ) 780 if ( mSyncMode )
781 appendEvent(event, 1); 781 appendEvent(event, 1);
782 else 782 else
783 appendEvent(event); 783 appendEvent(event);
784} 784}
785 785
786void KOEventViewer::addEvent(Event *event) 786void KOEventViewer::addEvent(Event *event)
787{ 787{
788 if ( mSyncMode ) 788 if ( mSyncMode )
789 appendEvent(event, 2); 789 appendEvent(event, 2);
790 else 790 else
791 appendEvent(event); 791 appendEvent(event);
792} 792}
793 793
794void KOEventViewer::clearEvents(bool now) 794void KOEventViewer::clearEvents(bool now)
795{ 795{
796 mText = ""; 796 mText = "";
797 if (now) setText(mText); 797 if (now) setText(mText);
798} 798}
799 799
800void KOEventViewer::addText(QString text) 800void KOEventViewer::addText(QString text)
801{ 801{
802 mText.append(text); 802 mText.append(text);
803 setText(mText); 803 setText(mText);
804} 804}
805QString KOEventViewer::deTag(QString text) 805QString KOEventViewer::deTag(QString text)
806{ 806{
807#if QT_VERSION >= 0x030000 807#if QT_VERSION >= 0x030000
808 text.replace( '<' , "&lt;" ); 808 text.replace( '<' , "&lt;" );
809 text.replace( '>' , "&gt;" ); 809 text.replace( '>' , "&gt;" );
810#else 810#else
811 if ( text.find ('<') >= 0 ) { 811 if ( text.find ('<') >= 0 ) {
812 text.replace( QRegExp("<") , "&lt;" ); 812 text.replace( QRegExp("<") , "&lt;" );
813 } 813 }
814 if ( text.find ('>') >= 0 ) { 814 if ( text.find ('>') >= 0 ) {
815 text.replace( QRegExp(">") , "&gt;" ); 815 text.replace( QRegExp(">") , "&gt;" );
816 } 816 }
817#endif 817#endif
818 return text; 818 return text;
819} 819}
820void KOEventViewer::keyPressEvent ( QKeyEvent * e ) 820void KOEventViewer::keyPressEvent ( QKeyEvent * e )
821{ 821{
822 switch ( e->key() ) { 822 switch ( e->key() ) {
823 case Qt::Key_Return: 823 case Qt::Key_Return:
824 case Qt::Key_Enter : 824 case Qt::Key_Enter :
825 e->ignore(); 825 e->ignore();
826 break; 826 break;
827 default: 827 default:
828 QTextBrowser::keyPressEvent ( e ); 828 QTextBrowser::keyPressEvent ( e );
829 break; 829 break;
830 } 830 }
831} 831}
diff --git a/korganizer/kolistview.cpp b/korganizer/kolistview.cpp
index d25f671..e7a5e0e 100644
--- a/korganizer/kolistview.cpp
+++ b/korganizer/kolistview.cpp
@@ -1,955 +1,955 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 1999 Preston Brown 3 Copyright (c) 1999 Preston Brown
4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software 17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 19
20 As a special exception, permission is given to link this program 20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source code for Qt in the source distribution. 22 without including the source code for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qlistview.h> 25#include <qlistview.h>
26#include <qlayout.h> 26#include <qlayout.h>
27#include <qlabel.h> 27#include <qlabel.h>
28#include <qpopupmenu.h> 28#include <qpopupmenu.h>
29#include <qprogressbar.h> 29#include <qprogressbar.h>
30#include <qfileinfo.h> 30#include <qfileinfo.h>
31#include <qmessagebox.h> 31#include <qmessagebox.h>
32#include <qdialog.h> 32#include <qdialog.h>
33#include <qtextstream.h> 33#include <qtextstream.h>
34#include <qdir.h> 34#include <qdir.h>
35#include <qwhatsthis.h> 35#include <qwhatsthis.h>
36#include <qregexp.h> 36#include <qregexp.h>
37#include <qpainter.h> 37#include <qpainter.h>
38#include <qpaintdevicemetrics.h> 38#include <qpaintdevicemetrics.h>
39 39
40#include <klocale.h> 40#include <klocale.h>
41#include <kdebug.h> 41#include <kdebug.h>
42#include <kiconloader.h> 42#include <kiconloader.h>
43#include <kglobal.h> 43#include <kglobal.h>
44 44
45#include <libkdepim/kpimglobalprefs.h> 45#include <libkdepim/kpimglobalprefs.h>
46#include <libkcal/calendar.h> 46#include <libkcal/calendar.h>
47#include <libkcal/calendarlocal.h> 47#include <libkcal/calendarlocal.h>
48#include <libkcal/icalformat.h> 48#include <libkcal/icalformat.h>
49#include <libkcal/vcalformat.h> 49#include <libkcal/vcalformat.h>
50#include <libkcal/recurrence.h> 50#include <libkcal/recurrence.h>
51#include <libkcal/filestorage.h> 51#include <libkcal/filestorage.h>
52#include <libkdepim/categoryselectdialog.h> 52#include <libkdepim/categoryselectdialog.h>
53#include <libkcal/kincidenceformatter.h> 53#include <libkcal/kincidenceformatter.h>
54#ifndef DESKTOP_VERSION 54#ifndef DESKTOP_VERSION
55#include <qpe/qpeapplication.h> 55#include <qpe/qpeapplication.h>
56#else 56#else
57#include <qapplication.h> 57#include <qapplication.h>
58#endif 58#endif
59 59
60#ifndef KORG_NOPRINTER 60#ifndef KORG_NOPRINTER
61#include "calprinter.h" 61#include "calprinter.h"
62#endif 62#endif
63#include "koglobals.h" 63#include "koglobals.h"
64#include "koprefs.h" 64#include "koprefs.h"
65#include "kfiledialog.h" 65#include "kfiledialog.h"
66 66
67#include "kolistview.h" 67#include "kolistview.h"
68#include "koeventviewer.h" 68#include "koeventviewer.h"
69 69
70extern QPixmap* sgListViewCompletedPix[6]; 70extern QPixmap* sgListViewCompletedPix[6];
71extern QPixmap* sgListViewJournalPix; 71extern QPixmap* sgListViewJournalPix;
72 72
73class KOListViewWhatsThis :public QWhatsThis 73class KOListViewWhatsThis :public QWhatsThis
74{ 74{
75public: 75public:
76 KOListViewWhatsThis( QWidget *wid, KOListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; 76 KOListViewWhatsThis( QWidget *wid, KOListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { };
77 77
78protected: 78protected:
79 virtual QString text( const QPoint& p) 79 virtual QString text( const QPoint& p)
80 { 80 {
81 return _view->getWhatsThisText(p) ; 81 return _view->getWhatsThisText(p) ;
82 } 82 }
83private: 83private:
84 QWidget* _wid; 84 QWidget* _wid;
85 KOListView * _view; 85 KOListView * _view;
86}; 86};
87 87
88 88
89ListItemVisitor::ListItemVisitor(KOListViewItem *item, QDate date ) 89ListItemVisitor::ListItemVisitor(KOListViewItem *item, QDate date )
90{ 90{
91 mItem = item; 91 mItem = item;
92 mDate = date; 92 mDate = date;
93} 93}
94 94
95ListItemVisitor::~ListItemVisitor() 95ListItemVisitor::~ListItemVisitor()
96{ 96{
97} 97}
98 98
99bool ListItemVisitor::visit(Event *e) 99bool ListItemVisitor::visit(Event *e)
100{ 100{
101 bool ok = false; 101 bool ok = false;
102 QString start, end; 102 QString start, end;
103 QDate ds, de; 103 QDate ds, de;
104 if ( e->doesRecur() ) { 104 if ( e->doesRecur() ) {
105 ds = e->getNextOccurence( QDateTime( mDate, QTime(0,0,0)), &ok ).date(); 105 ds = e->getNextOccurence( QDateTime( mDate, QTime(0,0,0)), &ok ).date();
106 if ( ok ) { 106 if ( ok ) {
107 int days = e->dtStart().date().daysTo(e->dtEnd().date() ); 107 int days = e->dtStart().date().daysTo(e->dtEnd().date() );
108 start = KGlobal::locale()->formatDate(ds,true); 108 start = KGlobal::locale()->formatDate(ds,true);
109 de = ds.addDays( days); 109 de = ds.addDays( days);
110 end = KGlobal::locale()->formatDate(de,true); 110 end = KGlobal::locale()->formatDate(de,true);
111 } 111 }
112 112
113 } 113 }
114 if ( ! ok ) { 114 if ( ! ok ) {
115 start =e->dtStartDateStr(); 115 start =e->dtStartDateStr();
116 end = e->dtEndDateStr(); 116 end = e->dtEndDateStr();
117 ds = e->dtStart().date(); 117 ds = e->dtStart().date();
118 de = e->dtEnd().date(); 118 de = e->dtEnd().date();
119 } 119 }
120 mItem->setText(0,e->summary()); 120 mItem->setText(0,e->summary());
121 mItem->setText(1,start); 121 mItem->setText(1,start);
122 if ( e->doesFloat() ) 122 if ( e->doesFloat() )
123 mItem->setText(2,"---"); 123 mItem->setText(2,"---");
124 else 124 else
125 mItem->setText(2,e->dtStartTimeStr()); 125 mItem->setText(2,e->dtStartTimeStr());
126 mItem->setText(3,end); 126 mItem->setText(3,end);
127 if ( e->doesFloat() ) 127 if ( e->doesFloat() )
128 mItem->setText(4,"---"); 128 mItem->setText(4,"---");
129 else 129 else
130 mItem->setText(4,e->dtEndTimeStr()); 130 mItem->setText(4,e->dtEndTimeStr());
131 if ( e->isAlarmEnabled() ) { 131 if ( e->isAlarmEnabled() ) {
132 mItem->setText(5,e->alarms().first()->offsetText() ); 132 mItem->setText(5,e->alarms().first()->offsetText() );
133 } else { 133 } else {
134 mItem->setText(5, i18n("No")); 134 mItem->setText(5, i18n("No"));
135 } 135 }
136 mItem->setText(6, e->recurrence()->recurrenceText()); 136 mItem->setText(6, e->recurrenceText());
137 if( ! e->doesRecur() ) 137 if( ! e->doesRecur() )
138 mItem->setSortKey( 6, "-" ); 138 mItem->setSortKey( 6, "-" );
139 mItem->setText(7,"---"); 139 mItem->setText(7,"---");
140 mItem->setText(8,"---"); 140 mItem->setText(8,"---");
141 mItem->setText(9, e->cancelled() ? i18n("Yes") : i18n("No")); 141 mItem->setText(9, e->cancelled() ? i18n("Yes") : i18n("No"));
142 mItem->setText(10,e->categoriesStr()); 142 mItem->setText(10,e->categoriesStr());
143 mItem->setText(11, KOPrefs::instance()->calName( e->calID() )); 143 mItem->setText(11, KOPrefs::instance()->calName( e->calID() ));
144 mItem->setText(12, KGlobal::locale()->formatDateTime( e->lastModified(), true, true )); 144 mItem->setText(12, KGlobal::locale()->formatDateTime( e->lastModified(), true, true ));
145 145
146 QString key; 146 QString key;
147 QDate d = e->lastModified().date(); 147 QDate d = e->lastModified().date();
148 QTime t = e->lastModified().time(); 148 QTime t = e->lastModified().time();
149 key.sprintf("%04d%02d%02d%02d%02d%02d",d.year(),d.month(),d.day(),t.hour(),t.minute(),t.second() ); 149 key.sprintf("%04d%02d%02d%02d%02d%02d",d.year(),d.month(),d.day(),t.hour(),t.minute(),t.second() );
150 mItem->setSortKey(12,key); 150 mItem->setSortKey(12,key);
151 t = e->doesFloat() ? QTime(0,0) : e->dtStart().time(); 151 t = e->doesFloat() ? QTime(0,0) : e->dtStart().time();
152 key.sprintf("%04d%02d%02d%02d%02d",ds.year(),ds.month(),ds.day(),t.hour(),t.minute()); 152 key.sprintf("%04d%02d%02d%02d%02d",ds.year(),ds.month(),ds.day(),t.hour(),t.minute());
153 mItem->setSortKey(1,key); 153 mItem->setSortKey(1,key);
154 154
155 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time(); 155 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time();
156 key.sprintf("%04d%02d%02d%02d%02d",de.year(),de.month(),de.day(),t.hour(),t.minute()); 156 key.sprintf("%04d%02d%02d%02d%02d",de.year(),de.month(),de.day(),t.hour(),t.minute());
157 mItem->setSortKey(3,key); 157 mItem->setSortKey(3,key);
158 return true; 158 return true;
159} 159}
160 160
161bool ListItemVisitor::visit(Todo *t) 161bool ListItemVisitor::visit(Todo *t)
162{ 162{
163 mItem->setText(0,t->summary()); 163 mItem->setText(0,t->summary());
164 if ( t->isCompleted() ) { 164 if ( t->isCompleted() ) {
165 mItem->setSortKey(0,"99"+ t->summary().left(10)); 165 mItem->setSortKey(0,"99"+ t->summary().left(10));
166 } else 166 } else
167 mItem->setSortKey(0,QString::number( t->percentComplete()+1 )+ t->summary().left(10)); 167 mItem->setSortKey(0,QString::number( t->percentComplete()+1 )+ t->summary().left(10));
168 mItem->setPixmap( 0, *(sgListViewCompletedPix[t->percentComplete()/20])); 168 mItem->setPixmap( 0, *(sgListViewCompletedPix[t->percentComplete()/20]));
169 if (t->hasStartDate()) { 169 if (t->hasStartDate()) {
170 mItem->setText(1,t->dtStartDateStr()); 170 mItem->setText(1,t->dtStartDateStr());
171 if (t->doesFloat()) { 171 if (t->doesFloat()) {
172 mItem->setText(2,"---"); 172 mItem->setText(2,"---");
173 } else { 173 } else {
174 mItem->setText(2,t->dtStartTimeStr()); 174 mItem->setText(2,t->dtStartTimeStr());
175 } 175 }
176 } else { 176 } else {
177 mItem->setText(1,"---"); 177 mItem->setText(1,"---");
178 mItem->setText(2,"---"); 178 mItem->setText(2,"---");
179 } 179 }
180 mItem->setText(3,"---"); 180 mItem->setText(3,"---");
181 mItem->setText(4,"---"); 181 mItem->setText(4,"---");
182 if ( t->isAlarmEnabled() ) { 182 if ( t->isAlarmEnabled() ) {
183 mItem->setText(5,t->alarms().first()->offsetText() ); 183 mItem->setText(5,t->alarms().first()->offsetText() );
184 } else { 184 } else {
185 mItem->setText(5, i18n("No")); 185 mItem->setText(5, i18n("No"));
186 } 186 }
187 mItem->setText(6, t->recurrence()->recurrenceText()); 187 mItem->setText(6, t->recurrenceText());
188 if( ! t->doesRecur() ) 188 if( ! t->doesRecur() )
189 mItem->setSortKey( 6, "-" ); 189 mItem->setSortKey( 6, "-" );
190 if (t->hasDueDate()) { 190 if (t->hasDueDate()) {
191 mItem->setText(7,t->dtDueDateStr()); 191 mItem->setText(7,t->dtDueDateStr());
192 if (t->doesFloat()) { 192 if (t->doesFloat()) {
193 mItem->setText(8,"---"); 193 mItem->setText(8,"---");
194 } else { 194 } else {
195 mItem->setText(8,t->dtDueTimeStr()); 195 mItem->setText(8,t->dtDueTimeStr());
196 } 196 }
197 } else { 197 } else {
198 mItem->setText(7,"---"); 198 mItem->setText(7,"---");
199 mItem->setText(8,"---"); 199 mItem->setText(8,"---");
200 } 200 }
201 mItem->setText(9, t->cancelled() ? i18n("Yes") : i18n("No")); 201 mItem->setText(9, t->cancelled() ? i18n("Yes") : i18n("No"));
202 mItem->setText(10,t->categoriesStr()); 202 mItem->setText(10,t->categoriesStr());
203 mItem->setText(11, KOPrefs::instance()->calName( t->calID() )); 203 mItem->setText(11, KOPrefs::instance()->calName( t->calID() ));
204 mItem->setText(12, KGlobal::locale()->formatDateTime( t->lastModified(), true, true )); 204 mItem->setText(12, KGlobal::locale()->formatDateTime( t->lastModified(), true, true ));
205 QString key; 205 QString key;
206 QDate d = t->lastModified().date(); 206 QDate d = t->lastModified().date();
207 QTime tm = t->lastModified().time(); 207 QTime tm = t->lastModified().time();
208 key.sprintf("%04d%02d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute(),tm.second() ); 208 key.sprintf("%04d%02d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute(),tm.second() );
209 mItem->setSortKey(12,key); 209 mItem->setSortKey(12,key);
210 if (t->hasDueDate()) { 210 if (t->hasDueDate()) {
211 d = t->dtDue().date(); 211 d = t->dtDue().date();
212 tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time(); 212 tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time();
213 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute()); 213 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
214 mItem->setSortKey(7,key); 214 mItem->setSortKey(7,key);
215 } 215 }
216 if ( t->hasStartDate() ) { 216 if ( t->hasStartDate() ) {
217 d = t->dtStart().date(); 217 d = t->dtStart().date();
218 tm = t->doesFloat() ? QTime(0,0) : t->dtStart().time(); 218 tm = t->doesFloat() ? QTime(0,0) : t->dtStart().time();
219 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute()); 219 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
220 mItem->setSortKey(1,key); 220 mItem->setSortKey(1,key);
221 } 221 }
222 return true; 222 return true;
223} 223}
224 224
225bool ListItemVisitor::visit(Journal * j) 225bool ListItemVisitor::visit(Journal * j)
226{ 226{
227 227
228 QString des; 228 QString des;
229 mItem->setPixmap( 0, *sgListViewJournalPix); 229 mItem->setPixmap( 0, *sgListViewJournalPix);
230 if ( !j->summary().isEmpty() ) { 230 if ( !j->summary().isEmpty() ) {
231 des = j->summary(); 231 des = j->summary();
232 } else { 232 } else {
233 des = j->description().left(30); 233 des = j->description().left(30);
234 des = des.simplifyWhiteSpace (); 234 des = des.simplifyWhiteSpace ();
235 des.replace (QRegExp ("\\n"),"" ); 235 des.replace (QRegExp ("\\n"),"" );
236 des.replace (QRegExp ("\\r"),"" ); 236 des.replace (QRegExp ("\\r"),"" );
237 } 237 }
238 mItem->setText(0,des.left(25)); 238 mItem->setText(0,des.left(25));
239 mItem->setSortKey(0,"0"+ des.left(25)); 239 mItem->setSortKey(0,"0"+ des.left(25));
240 mItem->setText(1,j->dtStartDateStr()); 240 mItem->setText(1,j->dtStartDateStr());
241 mItem->setText(2,"---"); 241 mItem->setText(2,"---");
242 mItem->setText(3,"---"); 242 mItem->setText(3,"---");
243 mItem->setText(4,"---"); 243 mItem->setText(4,"---");
244 mItem->setText(5,"---"); 244 mItem->setText(5,"---");
245 mItem->setText(6,"---"); 245 mItem->setText(6,"---");
246 mItem->setText(7,j->dtStartDateStr()); 246 mItem->setText(7,j->dtStartDateStr());
247 mItem->setText(8,"---"); 247 mItem->setText(8,"---");
248 mItem->setText(9,"---"); 248 mItem->setText(9,"---");
249 mItem->setText(10,j->categoriesStr()); 249 mItem->setText(10,j->categoriesStr());
250 mItem->setText(11, KOPrefs::instance()->calName( j->calID() )); 250 mItem->setText(11, KOPrefs::instance()->calName( j->calID() ));
251 mItem->setText(12, KGlobal::locale()->formatDateTime( j->lastModified(), true, true )); 251 mItem->setText(12, KGlobal::locale()->formatDateTime( j->lastModified(), true, true ));
252 252
253 QString key; 253 QString key;
254 QDate d = j->lastModified().date(); 254 QDate d = j->lastModified().date();
255 QTime tm = j->lastModified().time(); 255 QTime tm = j->lastModified().time();
256 key.sprintf("%04d%02d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute(),tm.second() ); 256 key.sprintf("%04d%02d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute(),tm.second() );
257 mItem->setSortKey(12,key); 257 mItem->setSortKey(12,key);
258 d = j->dtStart().date(); 258 d = j->dtStart().date();
259 key.sprintf("%04d%02d%02d",d.year(),d.month(),d.day()); 259 key.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
260 mItem->setSortKey(1,key); 260 mItem->setSortKey(1,key);
261 mItem->setSortKey(7,key); 261 mItem->setSortKey(7,key);
262 262
263 return true; 263 return true;
264} 264}
265 265
266KOListView::KOListView(Calendar *calendar, QWidget *parent, 266KOListView::KOListView(Calendar *calendar, QWidget *parent,
267 const char *name) 267 const char *name)
268 : KOEventView(calendar, parent, name) 268 : KOEventView(calendar, parent, name)
269{ 269{
270 270
271 mActiveItem = 0; 271 mActiveItem = 0;
272 mForceShowCompletedTodos = false; 272 mForceShowCompletedTodos = false;
273 mListView = new KOListViewListView(this); 273 mListView = new KOListViewListView(this);
274 mListView->addColumn(i18n("Summary")); 274 mListView->addColumn(i18n("Summary"));
275 mListView->addColumn(i18n("Start Date")); 275 mListView->addColumn(i18n("Start Date"));
276 mListView->addColumn(i18n("Start Time")); 276 mListView->addColumn(i18n("Start Time"));
277 mListView->addColumn(i18n("End Date")); 277 mListView->addColumn(i18n("End Date"));
278 mListView->addColumn(i18n("End Time")); 278 mListView->addColumn(i18n("End Time"));
279 mListView->addColumn(i18n("Alarm")); // alarm set? 279 mListView->addColumn(i18n("Alarm")); // alarm set?
280 mListView->addColumn(i18n("Recurs")); // recurs? 280 mListView->addColumn(i18n("Recurs")); // recurs?
281 mListView->addColumn(i18n("Due Date")); 281 mListView->addColumn(i18n("Due Date"));
282 mListView->addColumn(i18n("Due Time")); 282 mListView->addColumn(i18n("Due Time"));
283 mListView->addColumn(i18n("Cancelled")); 283 mListView->addColumn(i18n("Cancelled"));
284 mListView->addColumn(i18n("Categories")); 284 mListView->addColumn(i18n("Categories"));
285 mListView->addColumn(i18n("Calendar")); 285 mListView->addColumn(i18n("Calendar"));
286 mListView->addColumn(i18n("Last Modified")); 286 mListView->addColumn(i18n("Last Modified"));
287 287
288 mListView->setColumnAlignment(0,AlignLeft); 288 mListView->setColumnAlignment(0,AlignLeft);
289 mListView->setColumnAlignment(1,AlignLeft); 289 mListView->setColumnAlignment(1,AlignLeft);
290 mListView->setColumnAlignment(2,AlignHCenter); 290 mListView->setColumnAlignment(2,AlignHCenter);
291 mListView->setColumnAlignment(3,AlignLeft); 291 mListView->setColumnAlignment(3,AlignLeft);
292 mListView->setColumnAlignment(4,AlignHCenter); 292 mListView->setColumnAlignment(4,AlignHCenter);
293 mListView->setColumnAlignment(5,AlignLeft); 293 mListView->setColumnAlignment(5,AlignLeft);
294 mListView->setColumnAlignment(6,AlignLeft); 294 mListView->setColumnAlignment(6,AlignLeft);
295 mListView->setColumnAlignment(7,AlignLeft); 295 mListView->setColumnAlignment(7,AlignLeft);
296 mListView->setColumnAlignment(8,AlignLeft); 296 mListView->setColumnAlignment(8,AlignLeft);
297 mListView->setColumnAlignment(9,AlignLeft); 297 mListView->setColumnAlignment(9,AlignLeft);
298 mListView->setColumnAlignment(10,AlignLeft); 298 mListView->setColumnAlignment(10,AlignLeft);
299 mListView->setColumnAlignment(11,AlignLeft); 299 mListView->setColumnAlignment(11,AlignLeft);
300 mListView->setColumnAlignment(12,AlignLeft); 300 mListView->setColumnAlignment(12,AlignLeft);
301 mKOListViewWhatsThis = new KOListViewWhatsThis(mListView->viewport(),this); 301 mKOListViewWhatsThis = new KOListViewWhatsThis(mListView->viewport(),this);
302 302
303 int iii = 0; 303 int iii = 0;
304 for ( iii = 0; iii< 13 ; ++iii ) 304 for ( iii = 0; iii< 13 ; ++iii )
305 mListView->setColumnWidthMode( iii, QListView::Manual ); 305 mListView->setColumnWidthMode( iii, QListView::Manual );
306 306
307 QBoxLayout *layoutTop = new QVBoxLayout(this); 307 QBoxLayout *layoutTop = new QVBoxLayout(this);
308 layoutTop->addWidget(mListView); 308 layoutTop->addWidget(mListView);
309 mListView->setFont ( KOPrefs::instance()->mListViewFont ); 309 mListView->setFont ( KOPrefs::instance()->mListViewFont );
310 mPopupMenu = eventPopup(); 310 mPopupMenu = eventPopup();
311 QPopupMenu* selPopup = new QPopupMenu ( this ); 311 QPopupMenu* selPopup = new QPopupMenu ( this );
312 mPopupMenu->insertSeparator(); 312 mPopupMenu->insertSeparator();
313 313
314 selPopup->insertItem(i18n("All"),this, 314 selPopup->insertItem(i18n("All"),this,
315 SLOT(allSelection())); 315 SLOT(allSelection()));
316 selPopup->insertItem(i18n("None"),this, 316 selPopup->insertItem(i18n("None"),this,
317 SLOT(clearSelection())); 317 SLOT(clearSelection()));
318 selPopup->insertItem(i18n("Delete selected..."),this, 318 selPopup->insertItem(i18n("Delete selected..."),this,
319 SLOT(deleteAll())); 319 SLOT(deleteAll()));
320 mPopupMenu->insertItem(i18n("Selection"), selPopup ); 320 mPopupMenu->insertItem(i18n("Selection"), selPopup );
321 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 321 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
322 i18n("Hide all selected"),this, 322 i18n("Hide all selected"),this,
323 SLOT(hideAll()),true); 323 SLOT(hideAll()),true);
324 324
325 selPopup->insertSeparator(); 325 selPopup->insertSeparator();
326 QPopupMenu * exportPO = new QPopupMenu ( this ); 326 QPopupMenu * exportPO = new QPopupMenu ( this );
327 selPopup->insertItem( i18n("Export"), exportPO ); 327 selPopup->insertItem( i18n("Export"), exportPO );
328#ifdef DESKTOP_VERSION 328#ifdef DESKTOP_VERSION
329 mPopupMenu->insertSeparator(); 329 mPopupMenu->insertSeparator();
330 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 330 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
331 i18n("Print complete list..."),this, 331 i18n("Print complete list..."),this,
332 SLOT(printList()),true); 332 SLOT(printList()),true);
333#endif 333#endif
334 mCalPopup = new QPopupMenu ( this ); 334 mCalPopup = new QPopupMenu ( this );
335 selPopup->insertItem( i18n("Set Calendar"), mCalPopup ); 335 selPopup->insertItem( i18n("Set Calendar"), mCalPopup );
336 336
337 selPopup->insertItem(i18n("Set categories")+"...",this, 337 selPopup->insertItem(i18n("Set categories")+"...",this,
338 SLOT(setCat()) ); 338 SLOT(setCat()) );
339 selPopup->insertItem( i18n("Set alarm..."),this, 339 selPopup->insertItem( i18n("Set alarm..."),this,
340 SLOT(setAlarm())); 340 SLOT(setAlarm()));
341#if 0 341#if 0
342 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 342 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
343 i18n("Set categories")+"...",this, 343 i18n("Set categories")+"...",this,
344 SLOT(setCat()),true); 344 SLOT(setCat()),true);
345 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 345 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
346 i18n("Set alarm..."),this, 346 i18n("Set alarm..."),this,
347 SLOT(setAlarm()),true); 347 SLOT(setAlarm()),true);
348#endif 348#endif
349 QObject::connect(mCalPopup,SIGNAL(aboutToShow()),this, 349 QObject::connect(mCalPopup,SIGNAL(aboutToShow()),this,
350 SLOT( populateCalPopup() )); 350 SLOT( populateCalPopup() ));
351 QObject::connect(mCalPopup,SIGNAL(activated( int )),this, 351 QObject::connect(mCalPopup,SIGNAL(activated( int )),this,
352 SLOT( setCalendar( int ) )); 352 SLOT( setCalendar( int ) ));
353 QObject::connect(mPopupMenu,SIGNAL(categoryChanged( Incidence * )),this, 353 QObject::connect(mPopupMenu,SIGNAL(categoryChanged( Incidence * )),this,
354 SLOT( catChanged( Incidence * ) )); 354 SLOT( catChanged( Incidence * ) ));
355 exportPO->insertItem( i18n("As iCal (ics) file..."),this, 355 exportPO->insertItem( i18n("As iCal (ics) file..."),this,
356 SLOT(saveToFile())); 356 SLOT(saveToFile()));
357 exportPO->insertItem( i18n("As vCal (vcs) file..."),this, 357 exportPO->insertItem( i18n("As vCal (vcs) file..."),this,
358 SLOT(saveToFileVCS())); 358 SLOT(saveToFileVCS()));
359 exportPO->insertItem( i18n("Journal/Details..."),this, 359 exportPO->insertItem( i18n("Journal/Details..."),this,
360 SLOT(saveDescriptionToFile())); 360 SLOT(saveDescriptionToFile()));
361 // mPopupMenu->insertSeparator(); 361 // mPopupMenu->insertSeparator();
362 // mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 362 // mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
363 // i18n("Add Categ. to selected..."),this, 363 // i18n("Add Categ. to selected..."),this,
364 // SLOT(addCat()),true); 364 // SLOT(addCat()),true);
365 //mPopupMenu->insertSeparator(); 365 //mPopupMenu->insertSeparator();
366#ifndef DESKTOP_VERSION 366#ifndef DESKTOP_VERSION
367 selPopup->insertSeparator(); 367 selPopup->insertSeparator();
368 selPopup->insertItem( i18n("Beam via IR..."),this, 368 selPopup->insertItem( i18n("Beam via IR..."),this,
369 SLOT(beamSelected())); 369 SLOT(beamSelected()));
370#if 0 370#if 0
371 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 371 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
372 i18n("Beam via IR"),this, 372 i18n("Beam via IR"),this,
373 SLOT(beamSelected()),true); 373 SLOT(beamSelected()),true);
374#endif 374#endif
375#endif 375#endif
376 /* 376 /*
377 mPopupMenu = new QPopupMenu; 377 mPopupMenu = new QPopupMenu;
378 mPopupMenu->insertItem(i18n("Edit Event"), this, 378 mPopupMenu->insertItem(i18n("Edit Event"), this,
379 SLOT (editEvent())); 379 SLOT (editEvent()));
380 mPopupMenu->insertItem(SmallIcon("delete"), i18n("Delete Event"), this, 380 mPopupMenu->insertItem(SmallIcon("delete"), i18n("Delete Event"), this,
381 SLOT (deleteEvent())); 381 SLOT (deleteEvent()));
382 mPopupMenu->insertSeparator(); 382 mPopupMenu->insertSeparator();
383 mPopupMenu->insertItem(i18n("Show Dates"), this, 383 mPopupMenu->insertItem(i18n("Show Dates"), this,
384 SLOT(showDates())); 384 SLOT(showDates()));
385 mPopupMenu->insertItem(i18n("Hide Dates"), this, 385 mPopupMenu->insertItem(i18n("Hide Dates"), this,
386 SLOT(hideDates())); 386 SLOT(hideDates()));
387 */ 387 */
388 QObject::connect(mListView,SIGNAL( newEvent()), 388 QObject::connect(mListView,SIGNAL( newEvent()),
389 this,SIGNAL(signalNewEvent())); 389 this,SIGNAL(signalNewEvent()));
390 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)), 390 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)),
391 this,SLOT(defaultItemAction(QListViewItem *))); 391 this,SLOT(defaultItemAction(QListViewItem *)));
392 QObject::connect(mListView,SIGNAL(rightButtonPressed( QListViewItem *, 392 QObject::connect(mListView,SIGNAL(rightButtonPressed( QListViewItem *,
393 const QPoint &, int )), 393 const QPoint &, int )),
394 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int))); 394 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int)));
395 QObject::connect(mListView,SIGNAL(currentChanged(QListViewItem *)), 395 QObject::connect(mListView,SIGNAL(currentChanged(QListViewItem *)),
396 SLOT(processSelectionChange(QListViewItem *))); 396 SLOT(processSelectionChange(QListViewItem *)));
397 QObject::connect(mListView,SIGNAL(showIncidence(Incidence *)), 397 QObject::connect(mListView,SIGNAL(showIncidence(Incidence *)),
398 SIGNAL(showIncidenceSignal(Incidence *)) ); 398 SIGNAL(showIncidenceSignal(Incidence *)) );
399 399
400 readSettings(KOGlobals::config(),"KOListView Layout"); 400 readSettings(KOGlobals::config(),"KOListView Layout");
401} 401}
402 402
403KOListView::~KOListView() 403KOListView::~KOListView()
404{ 404{
405 delete mPopupMenu; 405 delete mPopupMenu;
406#if QT_VERSION >= 0x030000 406#if QT_VERSION >= 0x030000
407 407
408#else 408#else
409 delete mKOListViewWhatsThis; 409 delete mKOListViewWhatsThis;
410#endif 410#endif
411} 411}
412 412
413void KOListView::catChanged( Incidence* inc) 413void KOListView::catChanged( Incidence* inc)
414{ 414{
415 KOListViewItem* item = getItemForEvent(inc); 415 KOListViewItem* item = getItemForEvent(inc);
416 if (item) { 416 if (item) {
417 ListItemVisitor v(item, mStartDate ); 417 ListItemVisitor v(item, mStartDate );
418 inc->accept(v); 418 inc->accept(v);
419 } 419 }
420} 420}
421QString KOListView::getWhatsThisText(QPoint p) 421QString KOListView::getWhatsThisText(QPoint p)
422{ 422{
423 KOListViewItem* item = ( KOListViewItem* ) mListView->itemAt( p ); 423 KOListViewItem* item = ( KOListViewItem* ) mListView->itemAt( p );
424 if ( item ) 424 if ( item )
425 return KIncidenceFormatter::instance()->getFormattedText( item->data(), 425 return KIncidenceFormatter::instance()->getFormattedText( item->data(),
426 KOPrefs::instance()->mWTshowDetails, 426 KOPrefs::instance()->mWTshowDetails,
427 KOPrefs::instance()->mWTshowCreated, 427 KOPrefs::instance()->mWTshowCreated,
428 KOPrefs::instance()->mWTshowChanged); 428 KOPrefs::instance()->mWTshowChanged);
429 return i18n("That is the list view" ); 429 return i18n("That is the list view" );
430 430
431} 431}
432 432
433void KOListView::setCalendar( int c ) 433void KOListView::setCalendar( int c )
434{ 434{
435 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"), 435 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"),
436 i18n("This adds the selected\nitems to the calendar\n%1\nand removes them from\ntheir current calendar!").arg( KOPrefs::instance()->calName( c ) ), 436 i18n("This adds the selected\nitems to the calendar\n%1\nand removes them from\ntheir current calendar!").arg( KOPrefs::instance()->calName( c ) ),
437 i18n("Continue"), i18n("Cancel"), 0, 437 i18n("Continue"), i18n("Cancel"), 0,
438 0, 1 ); 438 0, 1 );
439 if ( result != 0 ) { 439 if ( result != 0 ) {
440 return; 440 return;
441 } 441 }
442 442
443 QPtrList<Incidence> delSel = getSelectedIncidences() ; 443 QPtrList<Incidence> delSel = getSelectedIncidences() ;
444 int icount = delSel.count(); 444 int icount = delSel.count();
445 if ( icount ) { 445 if ( icount ) {
446 Incidence *incidence = delSel.first(); 446 Incidence *incidence = delSel.first();
447 while ( incidence ) { 447 while ( incidence ) {
448 incidence->setCalID( c ); 448 incidence->setCalID( c );
449 KOListViewItem * item = getItemForEvent( incidence ); 449 KOListViewItem * item = getItemForEvent( incidence );
450 if ( item ) { 450 if ( item ) {
451 ListItemVisitor v(item, mStartDate ); 451 ListItemVisitor v(item, mStartDate );
452 incidence->accept(v); 452 incidence->accept(v);
453 } 453 }
454 incidence = delSel.next(); 454 incidence = delSel.next();
455 } 455 }
456 } 456 }
457 QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars; 457 QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars;
458 KopiCalendarFile * cal = calendars.first(); 458 KopiCalendarFile * cal = calendars.first();
459 while ( cal ) { 459 while ( cal ) {
460 mCalendar->setCalendarEnabled( cal->mCalNumber,cal->isEnabled ); 460 mCalendar->setCalendarEnabled( cal->mCalNumber,cal->isEnabled );
461 mCalendar->setAlarmEnabled( cal->mCalNumber, cal->isAlarmEnabled ); 461 mCalendar->setAlarmEnabled( cal->mCalNumber, cal->isAlarmEnabled );
462 mCalendar->setReadOnly( cal->mCalNumber, cal->isReadOnly ); 462 mCalendar->setReadOnly( cal->mCalNumber, cal->isReadOnly );
463 if ( cal->isStandard ) 463 if ( cal->isStandard )
464 mCalendar->setDefaultCalendar( cal->mCalNumber ); 464 mCalendar->setDefaultCalendar( cal->mCalNumber );
465 cal = calendars.next(); 465 cal = calendars.next();
466 } 466 }
467 mCalendar->setSyncEventsReadOnly(); 467 mCalendar->setSyncEventsReadOnly();
468 mCalendar->reInitAlarmSettings(); 468 mCalendar->reInitAlarmSettings();
469 469
470} 470}
471void KOListView::populateCalPopup() 471void KOListView::populateCalPopup()
472{ 472{
473 mCalPopup->clear(); 473 mCalPopup->clear();
474 KopiCalendarFile * kkf = KOPrefs::instance()->mCalendars.first(); 474 KopiCalendarFile * kkf = KOPrefs::instance()->mCalendars.first();
475 while ( kkf ) { 475 while ( kkf ) {
476 int index = mCalPopup->insertItem( kkf->mName+"...", kkf->mCalNumber); 476 int index = mCalPopup->insertItem( kkf->mName+"...", kkf->mCalNumber);
477 if ( kkf->mErrorOnLoad || kkf->isReadOnly ) 477 if ( kkf->mErrorOnLoad || kkf->isReadOnly )
478 mCalPopup->setItemEnabled( index, false ); 478 mCalPopup->setItemEnabled( index, false );
479 kkf = KOPrefs::instance()->mCalendars.next(); 479 kkf = KOPrefs::instance()->mCalendars.next();
480 } 480 }
481} 481}
482void KOListView::updateList() 482void KOListView::updateList()
483{ 483{
484 // qDebug(" KOListView::updateList() "); 484 // qDebug(" KOListView::updateList() ");
485 485
486} 486}
487 487
488void KOListView::clearList() 488void KOListView::clearList()
489{ 489{
490 clear (); 490 clear ();
491} 491}
492 492
493void KOListView::setCat() 493void KOListView::setCat()
494{ 494{
495 495
496 bool set = true; 496 bool set = true;
497 int result = KMessageBox::warningYesNoCancel(this, 497 int result = KMessageBox::warningYesNoCancel(this,
498 i18n("Do you want to <b>add</b> categories to the selected items or <b>reset</b> the list (i.e. remove current categories)?"), 498 i18n("Do you want to <b>add</b> categories to the selected items or <b>reset</b> the list (i.e. remove current categories)?"),
499 i18n("Set categories"), 499 i18n("Set categories"),
500 i18n("Add"), 500 i18n("Add"),
501 i18n("Reset")); 501 i18n("Reset"));
502 if (result == KMessageBox::Cancel) return; 502 if (result == KMessageBox::Cancel) return;
503 if (result == KMessageBox::Yes) set = false; 503 if (result == KMessageBox::Yes) set = false;
504 setCategories( set ); 504 setCategories( set );
505} 505}
506 506
507void KOListView::setAlarm() 507void KOListView::setAlarm()
508{ 508{
509 KOAlarmPrefs kap( this); 509 KOAlarmPrefs kap( this);
510 if ( !kap.exec() ) 510 if ( !kap.exec() )
511 return; 511 return;
512 QPtrList<Incidence> delSel = getSelectedIncidences( true, true, false, true ); // no journals, only due todos 512 QPtrList<Incidence> delSel = getSelectedIncidences( true, true, false, true ); // no journals, only due todos
513 Incidence* inc = delSel.first(); 513 Incidence* inc = delSel.first();
514 int count = 0; 514 int count = 0;
515 while ( inc ) { 515 while ( inc ) {
516 ++count; 516 ++count;
517 if (kap.mAlarmButton->isChecked()) { 517 if (kap.mAlarmButton->isChecked()) {
518 if (inc->alarms().count() == 0) 518 if (inc->alarms().count() == 0)
519 inc->newAlarm(); 519 inc->newAlarm();
520 Alarm *alarm = inc->alarms().first(); 520 Alarm *alarm = inc->alarms().first();
521 alarm->setEnabled(true); 521 alarm->setEnabled(true);
522 int j = kap.mAlarmTimeEdit->value()* -60; 522 int j = kap.mAlarmTimeEdit->value()* -60;
523 if (kap.mAlarmIncrCombo->currentItem() == 1) 523 if (kap.mAlarmIncrCombo->currentItem() == 1)
524 j = j * 60; 524 j = j * 60;
525 else if (kap.mAlarmIncrCombo->currentItem() == 2) 525 else if (kap.mAlarmIncrCombo->currentItem() == 2)
526 j = j * (60 * 24); 526 j = j * (60 * 24);
527 alarm->setStartOffset( j ); 527 alarm->setStartOffset( j );
528 528
529 if (!kap.mAlarmProgram.isEmpty() && kap.mAlarmProgramButton->isOn()) { 529 if (!kap.mAlarmProgram.isEmpty() && kap.mAlarmProgramButton->isOn()) {
530 alarm->setProcedureAlarm(kap.mAlarmProgram); 530 alarm->setProcedureAlarm(kap.mAlarmProgram);
531 } 531 }
532 else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn()) 532 else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn())
533 alarm->setAudioAlarm(kap.mAlarmSound); 533 alarm->setAudioAlarm(kap.mAlarmSound);
534 else 534 else
535 alarm->setType(Alarm::Invalid); 535 alarm->setType(Alarm::Invalid);
536 } else { 536 } else {
537 QPtrList<Alarm> alarms = inc->alarms(); 537 QPtrList<Alarm> alarms = inc->alarms();
538 Alarm *alarm; 538 Alarm *alarm;
539 for (alarm = alarms.first(); alarm; alarm = alarms.next() ) { 539 for (alarm = alarms.first(); alarm; alarm = alarms.next() ) {
540 alarm->setEnabled(false); 540 alarm->setEnabled(false);
541 alarm->setType(Alarm::Invalid); 541 alarm->setType(Alarm::Invalid);
542 } 542 }
543 } 543 }
544 KOListViewItem* item = getItemForEvent(inc); 544 KOListViewItem* item = getItemForEvent(inc);
545 if (item) { 545 if (item) {
546 ListItemVisitor v(item, mStartDate ); 546 ListItemVisitor v(item, mStartDate );
547 inc->accept(v); 547 inc->accept(v);
548 } 548 }
549 inc = delSel.next(); 549 inc = delSel.next();
550 } 550 }
551 topLevelWidget()->setCaption( i18n("Changed alarm for %1 items").arg( count ) ); 551 topLevelWidget()->setCaption( i18n("Changed alarm for %1 items").arg( count ) );
552 qDebug("KO: Set alarm for %d items", count); 552 qDebug("KO: Set alarm for %d items", count);
553 calendar()->reInitAlarmSettings(); 553 calendar()->reInitAlarmSettings();
554 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) ); 554 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) );
555} 555}
556void KOListView::setCategories( bool removeOld ) 556void KOListView::setCategories( bool removeOld )
557{ 557{
558 558
559 KPIM::CategorySelectDialog* csd = new KPIM::CategorySelectDialog( KOPrefs::instance(), 0 ); 559 KPIM::CategorySelectDialog* csd = new KPIM::CategorySelectDialog( KOPrefs::instance(), 0 );
560 csd->setColorEnabled(); 560 csd->setColorEnabled();
561 if (! csd->exec()) { 561 if (! csd->exec()) {
562 delete csd; 562 delete csd;
563 return; 563 return;
564 } 564 }
565 QStringList catList = csd->selectedCategories(); 565 QStringList catList = csd->selectedCategories();
566 delete csd; 566 delete csd;
567 QPtrList<Incidence> delSel = getSelectedIncidences(); // all inc allowed; 567 QPtrList<Incidence> delSel = getSelectedIncidences(); // all inc allowed;
568 Incidence* inc = delSel.first(); 568 Incidence* inc = delSel.first();
569 while ( inc ) { 569 while ( inc ) {
570 if ( removeOld ) { 570 if ( removeOld ) {
571 inc->setCategories( catList, false ); 571 inc->setCategories( catList, false );
572 } else { 572 } else {
573 inc->addCategories( catList, false ); 573 inc->addCategories( catList, false );
574 } 574 }
575 KOListViewItem* item = getItemForEvent(inc); 575 KOListViewItem* item = getItemForEvent(inc);
576 if (item) { 576 if (item) {
577 ListItemVisitor v(item, mStartDate ); 577 ListItemVisitor v(item, mStartDate );
578 inc->accept(v); 578 inc->accept(v);
579 } 579 }
580 inc = delSel.next(); 580 inc = delSel.next();
581 } 581 }
582 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) ); 582 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) );
583} 583}
584 584
585void KOListView::beamSelected() 585void KOListView::beamSelected()
586{ 586{
587 QPtrList<Incidence> delSel = getSelectedIncidences() ; 587 QPtrList<Incidence> delSel = getSelectedIncidences() ;
588 if ( delSel.count() ) 588 if ( delSel.count() )
589 emit beamIncidenceList( delSel ); 589 emit beamIncidenceList( delSel );
590} 590}
591 591
592void KOListView::saveDescriptionToFile() 592void KOListView::saveDescriptionToFile()
593{ 593{
594 594
595 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"), 595 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"),
596 i18n("This saves the text/details of selected\nJournals and Events/Todos\nto a text file."), 596 i18n("This saves the text/details of selected\nJournals and Events/Todos\nto a text file."),
597 i18n("Continue"), i18n("Cancel"), 0, 597 i18n("Continue"), i18n("Cancel"), 0,
598 0, 1 ); 598 0, 1 );
599 if ( result != 0 ) { 599 if ( result != 0 ) {
600 return; 600 return;
601 } 601 }
602 QPtrList<Incidence> delSel = getSelectedIncidences() ; 602 QPtrList<Incidence> delSel = getSelectedIncidences() ;
603 int icount = delSel.count(); 603 int icount = delSel.count();
604 if ( icount ) { 604 if ( icount ) {
605 QString fn = KOPrefs::instance()->mLastSaveFile; 605 QString fn = KOPrefs::instance()->mLastSaveFile;
606 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this ); 606 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this );
607 607
608 if ( fn == "" ) 608 if ( fn == "" )
609 return; 609 return;
610 QFileInfo info; 610 QFileInfo info;
611 info.setFile( fn ); 611 info.setFile( fn );
612 QString mes; 612 QString mes;
613 bool createbup = true; 613 bool createbup = true;
614 if ( info. exists() ) { 614 if ( info. exists() ) {
615 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) ); 615 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) );
616 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes, 616 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes,
617 i18n("Overwrite!"), i18n("Cancel"), 0, 617 i18n("Overwrite!"), i18n("Cancel"), 0,
618 0, 1 ); 618 0, 1 );
619 if ( result != 0 ) { 619 if ( result != 0 ) {
620 createbup = false; 620 createbup = false;
621 } 621 }
622 } 622 }
623 if ( createbup ) { 623 if ( createbup ) {
624 QString text = i18n("KO/Pi Description/Journal save file.\nSave date: ") + 624 QString text = i18n("KO/Pi Description/Journal save file.\nSave date: ") +
625 KGlobal::locale()->formatDateTime(QDateTime::currentDateTime(), false); 625 KGlobal::locale()->formatDateTime(QDateTime::currentDateTime(), false);
626 Incidence *incidence = delSel.first(); 626 Incidence *incidence = delSel.first();
627 icount = 0; 627 icount = 0;
628 while ( incidence ) { 628 while ( incidence ) {
629 if ( incidence->typeID() == journalID ) { 629 if ( incidence->typeID() == journalID ) {
630 text += "\n************************************\n"; 630 text += "\n************************************\n";
631 if ( !incidence->summary().isEmpty() ) 631 if ( !incidence->summary().isEmpty() )
632 text += i18n("Journal: %1 from ").arg( incidence->summary() ) +incidence->dtStartDateStr( false ); 632 text += i18n("Journal: %1 from ").arg( incidence->summary() ) +incidence->dtStartDateStr( false );
633 else 633 else
634 text += i18n("Journal from: ") +incidence->dtStartDateStr( false ); 634 text += i18n("Journal from: ") +incidence->dtStartDateStr( false );
635 if ( !incidence->location().isEmpty() ) 635 if ( !incidence->location().isEmpty() )
636 text +="\n(" + i18n("Location: ") + incidence->location()+ ")"; 636 text +="\n(" + i18n("Location: ") + incidence->location()+ ")";
637 text +="\n" + i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false); 637 text +="\n" + i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false);
638 text +="\n" + i18n("Description: ") + "\n"+ incidence->description(); 638 text +="\n" + i18n("Description: ") + "\n"+ incidence->description();
639 ++icount; 639 ++icount;
640 640
641 } else { 641 } else {
642 if ( !incidence->description().isEmpty() ) { 642 if ( !incidence->description().isEmpty() ) {
643 text += "\n************************************\n"; 643 text += "\n************************************\n";
644 if ( incidence->typeID() == todoID ) 644 if ( incidence->typeID() == todoID )
645 text += i18n("To-Do: "); 645 text += i18n("To-Do: ");
646 text += incidence->summary(); 646 text += incidence->summary();
647 if ( !incidence->location().isEmpty() ) 647 if ( !incidence->location().isEmpty() )
648 text +="\n(" + i18n("Location: ") + incidence->location()+ ")"; 648 text +="\n(" + i18n("Location: ") + incidence->location()+ ")";
649 if ( incidence->hasStartDate() ) 649 if ( incidence->hasStartDate() )
650 text +="\n"+ i18n("Start Date: ") + incidence->dtStartStr( false ); 650 text +="\n"+ i18n("Start Date: ") + incidence->dtStartStr( false );
651 text +="\n"+ i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false); 651 text +="\n"+ i18n("Last modified: ") +KGlobal::locale()->formatDateTime(incidence->lastModified(), false);
652 text += "\n" + i18n("Description: ") + "\n" + incidence->description(); 652 text += "\n" + i18n("Description: ") + "\n" + incidence->description();
653 ++icount; 653 ++icount;
654 654
655 } 655 }
656 } 656 }
657 incidence = delSel.next(); 657 incidence = delSel.next();
658 } 658 }
659 QFile file( fn ); 659 QFile file( fn );
660 if (!file.open( IO_WriteOnly ) ) { 660 if (!file.open( IO_WriteOnly ) ) {
661 topLevelWidget()->setCaption(i18n("File open error - nothing saved!") ); 661 topLevelWidget()->setCaption(i18n("File open error - nothing saved!") );
662 return; 662 return;
663 } 663 }
664 QTextStream ts( &file ); 664 QTextStream ts( &file );
665 ts << text; 665 ts << text;
666 file.close(); 666 file.close();
667 //qDebug("%s ", text.latin1()); 667 //qDebug("%s ", text.latin1());
668 mes = i18n("KO/Pi:Saved %1 descriptions/journals").arg(icount ); 668 mes = i18n("KO/Pi:Saved %1 descriptions/journals").arg(icount );
669 KOPrefs::instance()->mLastSaveFile = fn; 669 KOPrefs::instance()->mLastSaveFile = fn;
670 topLevelWidget()->setCaption(mes); 670 topLevelWidget()->setCaption(mes);
671 } 671 }
672 } 672 }
673} 673}
674void KOListView::saveToFileVCS() 674void KOListView::saveToFileVCS()
675{ 675{
676 writeToFile( false ); 676 writeToFile( false );
677} 677}
678void KOListView::saveToFile() 678void KOListView::saveToFile()
679{ 679{
680 writeToFile( true ); 680 writeToFile( true );
681} 681}
682QPtrList<Incidence> KOListView::getSelectedIncidences( bool includeEvents, bool includeTodos, bool includeJournals, bool onlyDueTodos ) 682QPtrList<Incidence> KOListView::getSelectedIncidences( bool includeEvents, bool includeTodos, bool includeJournals, bool onlyDueTodos )
683{ 683{
684 QPtrList<Incidence> delSel ; 684 QPtrList<Incidence> delSel ;
685 bool addSubTodos = false; 685 bool addSubTodos = false;
686 bool askSubTodos = true; 686 bool askSubTodos = true;
687 QListViewItem *item = mListView->firstChild (); 687 QListViewItem *item = mListView->firstChild ();
688 while ( item ) { 688 while ( item ) {
689 if ( item->isSelected() ) { 689 if ( item->isSelected() ) {
690 Incidence* inc = ((KOListViewItem *)item)->data(); 690 Incidence* inc = ((KOListViewItem *)item)->data();
691 if ( ( addSubTodos && delSel.findRef( inc ) == -1) || !addSubTodos ) { 691 if ( ( addSubTodos && delSel.findRef( inc ) == -1) || !addSubTodos ) {
692 if ( (inc->typeID() == todoID && includeTodos) || 692 if ( (inc->typeID() == todoID && includeTodos) ||
693 (inc->typeID() == eventID && includeEvents) || 693 (inc->typeID() == eventID && includeEvents) ||
694 (inc->typeID() == journalID && includeJournals) ) { 694 (inc->typeID() == journalID && includeJournals) ) {
695 if ( inc->typeID() == todoID && onlyDueTodos ) { 695 if ( inc->typeID() == todoID && onlyDueTodos ) {
696 if ( ((Todo*)inc)->hasDueDate() ) 696 if ( ((Todo*)inc)->hasDueDate() )
697 delSel.append( inc ); 697 delSel.append( inc );
698 } else 698 } else
699 delSel.append( inc ); 699 delSel.append( inc );
700 700
701 } 701 }
702 } 702 }
703 if ( inc->typeID() == todoID ) { 703 if ( inc->typeID() == todoID ) {
704 Todo * todo = (Todo*) inc; 704 Todo * todo = (Todo*) inc;
705 if ( todo->relations().count() ) { 705 if ( todo->relations().count() ) {
706 if ( askSubTodos ) { 706 if ( askSubTodos ) {
707 int result = KMessageBox::warningYesNoCancel(this, 707 int result = KMessageBox::warningYesNoCancel(this,
708 i18n("One (or more) selected\ntodo has subtodos!\nDo you want to select\nall subtodos of all\nselected todos as well?"), 708 i18n("One (or more) selected\ntodo has subtodos!\nDo you want to select\nall subtodos of all\nselected todos as well?"),
709 i18n("Todo has subtodos"), 709 i18n("Todo has subtodos"),
710 i18n("Yes"), 710 i18n("Yes"),
711 i18n("No")); 711 i18n("No"));
712 if ( result == KMessageBox::Cancel ) { 712 if ( result == KMessageBox::Cancel ) {
713 delSel.clear(); 713 delSel.clear();
714 return delSel; 714 return delSel;
715 } 715 }
716 if (result == KMessageBox::Yes) 716 if (result == KMessageBox::Yes)
717 addSubTodos = true; 717 addSubTodos = true;
718 askSubTodos = false; 718 askSubTodos = false;
719 } 719 }
720 if ( addSubTodos ) { 720 if ( addSubTodos ) {
721 QPtrList<Incidence> tempSel ; 721 QPtrList<Incidence> tempSel ;
722 inc->addRelationsToList( &tempSel ); 722 inc->addRelationsToList( &tempSel );
723 Incidence* tempinc = tempSel.first(); 723 Incidence* tempinc = tempSel.first();
724 while ( tempinc ) { 724 while ( tempinc ) {
725 if ( delSel.findRef( tempinc ) == -1 ) { 725 if ( delSel.findRef( tempinc ) == -1 ) {
726 if ( tempinc->typeID() == todoID && onlyDueTodos ) { 726 if ( tempinc->typeID() == todoID && onlyDueTodos ) {
727 if ( ((Todo*)tempinc)->hasDueDate() ) 727 if ( ((Todo*)tempinc)->hasDueDate() )
728 delSel.append( tempinc ); 728 delSel.append( tempinc );
729 } else 729 } else
730 delSel.append( tempinc ); 730 delSel.append( tempinc );
731 } 731 }
732 tempinc = tempSel.next(); 732 tempinc = tempSel.next();
733 } 733 }
734 } 734 }
735 } 735 }
736 } 736 }
737 } 737 }
738 item = item->nextSibling(); 738 item = item->nextSibling();
739 } 739 }
740 return delSel; 740 return delSel;
741} 741}
742 742
743void KOListView::writeToFile( bool iCal ) 743void KOListView::writeToFile( bool iCal )
744{ 744{
745 QPtrList<Incidence> delSel = getSelectedIncidences(); // all inc allowed; 745 QPtrList<Incidence> delSel = getSelectedIncidences(); // all inc allowed;
746 if ( !iCal ) { 746 if ( !iCal ) {
747 bool journal = false; 747 bool journal = false;
748 Incidence *incidence = delSel.first(); 748 Incidence *incidence = delSel.first();
749 while ( incidence ) { 749 while ( incidence ) {
750 if ( incidence->typeID() == journalID ) { 750 if ( incidence->typeID() == journalID ) {
751 journal = true; 751 journal = true;
752 break; 752 break;
753 } 753 }
754 incidence = delSel.next(); 754 incidence = delSel.next();
755 } 755 }
756 if ( journal ) { 756 if ( journal ) {
757 int result = KMessageBox::warningContinueCancel(this, 757 int result = KMessageBox::warningContinueCancel(this,
758 i18n("The journal entries can not be\nexported to a vCalendar file."), 758 i18n("The journal entries can not be\nexported to a vCalendar file."),
759 i18n("Data Loss Warning"),i18n("Proceed"),i18n("Cancel"), 759 i18n("Data Loss Warning"),i18n("Proceed"),i18n("Cancel"),
760 true); 760 true);
761 if (result != KMessageBox::Continue) return; 761 if (result != KMessageBox::Continue) return;
762 } 762 }
763 } 763 }
764 if ( delSel.count() ) { 764 if ( delSel.count() ) {
765 QString fn = KOPrefs::instance()->mLastSaveFile; 765 QString fn = KOPrefs::instance()->mLastSaveFile;
766 QString extension; 766 QString extension;
767 if ( iCal ) { 767 if ( iCal ) {
768 if ( fn.right( 4 ).lower() == ".vcs" ) { 768 if ( fn.right( 4 ).lower() == ".vcs" ) {
769 fn = fn.left( fn.length() -3) + "ics"; 769 fn = fn.left( fn.length() -3) + "ics";
770 } 770 }
771 } else { 771 } else {
772 if ( fn.right( 4 ).lower() == ".ics" ) { 772 if ( fn.right( 4 ).lower() == ".ics" ) {
773 fn = fn.left( fn.length() -3) + "vcs"; 773 fn = fn.left( fn.length() -3) + "vcs";
774 } 774 }
775 } 775 }
776 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this ); 776 fn = KFileDialog::getSaveFileName( fn, i18n("Save filename"), this );
777 777
778 if ( fn == "" ) 778 if ( fn == "" )
779 return; 779 return;
780 QFileInfo info; 780 QFileInfo info;
781 info.setFile( fn ); 781 info.setFile( fn );
782 QString mes; 782 QString mes;
783 bool createbup = true; 783 bool createbup = true;
784 if ( info. exists() ) { 784 if ( info. exists() ) {
785 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) ); 785 mes = i18n("File already exists!\nOld file from:\n%1\nOverwrite?\n").arg (KGlobal::locale()->formatDateTime(info.lastModified (), true, false ) );
786 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes, 786 int result = QMessageBox::warning( this, i18n("KO/Pi: Warning!"),mes,
787 i18n("Overwrite!"), i18n("Cancel"), 0, 787 i18n("Overwrite!"), i18n("Cancel"), 0,
788 0, 1 ); 788 0, 1 );
789 if ( result != 0 ) { 789 if ( result != 0 ) {
790 createbup = false; 790 createbup = false;
791 } 791 }
792 } 792 }
793 if ( createbup ) { 793 if ( createbup ) {
794 CalendarLocal cal; 794 CalendarLocal cal;
795 cal.setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 795 cal.setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
796 Incidence *incidence = delSel.first(); 796 Incidence *incidence = delSel.first();
797 while ( incidence ) { 797 while ( incidence ) {
798 cal.addIncidence( incidence->clone() ); 798 cal.addIncidence( incidence->clone() );
799 incidence = delSel.next(); 799 incidence = delSel.next();
800 } 800 }
801 if ( iCal ) { 801 if ( iCal ) {
802 ICalFormat format; 802 ICalFormat format;
803 format.save( &cal, fn ); 803 format.save( &cal, fn );
804 } else { 804 } else {
805 805
806 VCalFormat format; 806 VCalFormat format;
807 format.save( &cal, fn ); 807 format.save( &cal, fn );
808 } 808 }
809 mes = i18n("KO/Pi:Saved %1").arg(fn ); 809 mes = i18n("KO/Pi:Saved %1").arg(fn );
810 KOPrefs::instance()->mLastSaveFile = fn; 810 KOPrefs::instance()->mLastSaveFile = fn;
811 topLevelWidget()->setCaption(mes); 811 topLevelWidget()->setCaption(mes);
812 } 812 }
813 } 813 }
814 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) ); 814 QTimer::singleShot( 1, this, SLOT ( resetFocus() ) );
815} 815}
816void KOListView::hideAll() 816void KOListView::hideAll()
817{ 817{
818 QPtrList<QListViewItem> delSel ; 818 QPtrList<QListViewItem> delSel ;
819 QListViewItem *item = mListView->firstChild (); 819 QListViewItem *item = mListView->firstChild ();
820 while ( item ) { 820 while ( item ) {
821 if ( item->isSelected() ) { 821 if ( item->isSelected() ) {
822 delSel.append(item); 822 delSel.append(item);
823 } 823 }
824 item = item->nextSibling(); 824 item = item->nextSibling();
825 } 825 }
826 item = delSel.first() ; 826 item = delSel.first() ;
827 while ( item ) { 827 while ( item ) {
828 QListViewItem * del = item; 828 QListViewItem * del = item;
829 item = delSel.next(); 829 item = delSel.next();
830 delete del; 830 delete del;
831 } 831 }
832} 832}
833void KOListView::printList() 833void KOListView::printList()
834{ 834{
835 mListView->printList(); 835 mListView->printList();
836} 836}
837void KOListView::deleteAll() 837void KOListView::deleteAll()
838{ 838{
839 QPtrList<Incidence> delSel = getSelectedIncidences(); // all inc allowed;; 839 QPtrList<Incidence> delSel = getSelectedIncidences(); // all inc allowed;;
840 if ( delSel.count() ) { 840 if ( delSel.count() ) {
841 int icount = delSel.count(); 841 int icount = delSel.count();
842 Incidence *incidence = delSel.first(); 842 Incidence *incidence = delSel.first();
843 Incidence *toDelete; 843 Incidence *toDelete;
844 KOPrefs *p = KOPrefs::instance(); 844 KOPrefs *p = KOPrefs::instance();
845 bool confirm = p->mConfirm; 845 bool confirm = p->mConfirm;
846 QString mess; 846 QString mess;
847 mess = mess.sprintf( i18n("You have %d item(s) selected.\n"), icount ); 847 mess = mess.sprintf( i18n("You have %d item(s) selected.\n"), icount );
848 if ( KMessageBox::Continue == KMessageBox::warningContinueCancel(this, mess + i18n("All selected items will be\npermanently deleted.\n(Deleting items will take\nsome time on a PDA)\n"), i18n("KO/Pi Confirmation"),i18n("Delete")) ) { 848 if ( KMessageBox::Continue == KMessageBox::warningContinueCancel(this, mess + i18n("All selected items will be\npermanently deleted.\n(Deleting items will take\nsome time on a PDA)\n"), i18n("KO/Pi Confirmation"),i18n("Delete")) ) {
849 p->mConfirm = false; 849 p->mConfirm = false;
850 int delCounter = 0; 850 int delCounter = 0;
851 QDialog dia ( this, "p-dialog", true ); 851 QDialog dia ( this, "p-dialog", true );
852 QLabel lab (i18n("Close dialog to abort deletion!"), &dia ); 852 QLabel lab (i18n("Close dialog to abort deletion!"), &dia );
853 QVBoxLayout lay( &dia ); 853 QVBoxLayout lay( &dia );
854 lay.setMargin(7); 854 lay.setMargin(7);
855 lay.setSpacing(7); 855 lay.setSpacing(7);
856 lay.addWidget( &lab); 856 lay.addWidget( &lab);
857 QProgressBar bar( icount, &dia ); 857 QProgressBar bar( icount, &dia );
858 lay.addWidget( &bar); 858 lay.addWidget( &bar);
859 int w = 220; 859 int w = 220;
860 int h = 50; 860 int h = 50;
861 int dw = QApplication::desktop()->width(); 861 int dw = QApplication::desktop()->width();
862 int dh = QApplication::desktop()->height(); 862 int dh = QApplication::desktop()->height();
863 dia.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 863 dia.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
864 //dia.resize( 240,50 ); 864 //dia.resize( 240,50 );
865 dia.show(); 865 dia.show();
866 KOPrefs::instance()->mGlobalUpdateDisabled = true; 866 KOPrefs::instance()->mGlobalUpdateDisabled = true;
867 while ( incidence ) { 867 while ( incidence ) {
868 bar.setProgress( delCounter ); 868 bar.setProgress( delCounter );
869 mess = mess.sprintf( i18n("Deleting item %d ..."), ++delCounter ); 869 mess = mess.sprintf( i18n("Deleting item %d ..."), ++delCounter );
870 dia.setCaption( mess ); 870 dia.setCaption( mess );
871 qApp->processEvents(); 871 qApp->processEvents();
872 toDelete = (incidence); 872 toDelete = (incidence);
873 incidence = delSel.next(); 873 incidence = delSel.next();
874 emit deleteIncidenceSignal(toDelete ); 874 emit deleteIncidenceSignal(toDelete );
875 if ( dia.result() != 0 ) 875 if ( dia.result() != 0 )
876 break; 876 break;
877 877
878 } 878 }
879 KOPrefs::instance()->mGlobalUpdateDisabled = false; 879 KOPrefs::instance()->mGlobalUpdateDisabled = false;
880 emit deleteIncidenceSignal( 0 ); 880 emit deleteIncidenceSignal( 0 );
881 mess = mess.sprintf( i18n("%d items remaining in list."), count() ); 881 mess = mess.sprintf( i18n("%d items remaining in list."), count() );
882 topLevelWidget ()->setCaption( mess ); 882 topLevelWidget ()->setCaption( mess );
883 p->mConfirm = confirm; 883 p->mConfirm = confirm;
884 } 884 }
885 } 885 }
886 886
887 887
888} 888}
889int KOListView::maxDatesHint() 889int KOListView::maxDatesHint()
890{ 890{
891 return 0; 891 return 0;
892} 892}
893 893
894int KOListView::currentDateCount() 894int KOListView::currentDateCount()
895{ 895{
896 return 0; 896 return 0;
897} 897}
898 898
899QPtrList<Incidence> KOListView::selectedIncidences() 899QPtrList<Incidence> KOListView::selectedIncidences()
900{ 900{
901 QPtrList<Incidence> eventList; 901 QPtrList<Incidence> eventList;
902 QListViewItem *item = mListView->firstChild (); 902 QListViewItem *item = mListView->firstChild ();
903 while ( item ) { 903 while ( item ) {
904 if ( item->isSelected() ) { 904 if ( item->isSelected() ) {
905 eventList.append(((KOListViewItem *)item)->data()); 905 eventList.append(((KOListViewItem *)item)->data());
906 } 906 }
907 907
908 item = item->nextSibling(); 908 item = item->nextSibling();
909 } 909 }
910 910
911 // // QListViewItem *item = mListView->selectedItem(); 911 // // QListViewItem *item = mListView->selectedItem();
912 //if (item) eventList.append(((KOListViewItem *)item)->data()); 912 //if (item) eventList.append(((KOListViewItem *)item)->data());
913 913
914 return eventList; 914 return eventList;
915} 915}
916 916
917DateList KOListView::selectedDates() 917DateList KOListView::selectedDates()
918{ 918{
919 DateList eventList; 919 DateList eventList;
920 return eventList; 920 return eventList;
921} 921}
922 922
923void KOListView::showDates(bool show) 923void KOListView::showDates(bool show)
924{ 924{
925 // Shouldn't we set it to a value greater 0? When showDates is called with 925 // Shouldn't we set it to a value greater 0? When showDates is called with
926 // show == true at first, then the columnwidths are set to zero. 926 // show == true at first, then the columnwidths are set to zero.
927 static int oldColWidth1 = 0; 927 static int oldColWidth1 = 0;
928 static int oldColWidth3 = 0; 928 static int oldColWidth3 = 0;
929 929
930 if (!show) { 930 if (!show) {
931 oldColWidth1 = mListView->columnWidth(1); 931 oldColWidth1 = mListView->columnWidth(1);
932 oldColWidth3 = mListView->columnWidth(3); 932 oldColWidth3 = mListView->columnWidth(3);
933 mListView->setColumnWidth(1, 0); 933 mListView->setColumnWidth(1, 0);
934 mListView->setColumnWidth(3, 0); 934 mListView->setColumnWidth(3, 0);
935 } else { 935 } else {
936 mListView->setColumnWidth(1, oldColWidth1); 936 mListView->setColumnWidth(1, oldColWidth1);
937 mListView->setColumnWidth(3, oldColWidth3); 937 mListView->setColumnWidth(3, oldColWidth3);
938 } 938 }
939 mListView->repaint(); 939 mListView->repaint();
940} 940}
941 941
942void KOListView::printPreview(CalPrinter *calPrinter, const QDate &fd, 942void KOListView::printPreview(CalPrinter *calPrinter, const QDate &fd,
943 const QDate &td) 943 const QDate &td)
944{ 944{
945#ifndef KORG_NOPRINTER 945#ifndef KORG_NOPRINTER
946 calPrinter->preview(CalPrinter::Day, fd, td); 946 calPrinter->preview(CalPrinter::Day, fd, td);
947#endif 947#endif
948} 948}
949 949
950void KOListView::showDates() 950void KOListView::showDates()
951{ 951{
952 showDates(true); 952 showDates(true);
953} 953}
954 954
955void KOListView::hideDates() 955void KOListView::hideDates()
diff --git a/korganizer/komonthview.cpp b/korganizer/komonthview.cpp
index 498d9b0..eea9a4d 100644
--- a/korganizer/komonthview.cpp
+++ b/korganizer/komonthview.cpp
@@ -22,1854 +22,1856 @@
22#include <qfontmetrics.h> 22#include <qfontmetrics.h>
23#include <qkeycode.h> 23#include <qkeycode.h>
24#include <qhbox.h> 24#include <qhbox.h>
25#include <qvbox.h> 25#include <qvbox.h>
26#include <qwidgetstack.h> 26#include <qwidgetstack.h>
27#include <qpushbutton.h> 27#include <qpushbutton.h>
28#include <qtooltip.h> 28#include <qtooltip.h>
29#include <qpainter.h> 29#include <qpainter.h>
30#include <qtimer.h> 30#include <qtimer.h>
31#include <qwhatsthis.h> 31#include <qwhatsthis.h>
32#ifndef DESKTOP_VERSION 32#ifndef DESKTOP_VERSION
33#include <qpe/qpeapplication.h> 33#include <qpe/qpeapplication.h>
34#else 34#else
35#include <qapplication.h> 35#include <qapplication.h>
36#endif 36#endif
37 37
38#include <kdebug.h> 38#include <kdebug.h>
39#include <klocale.h> 39#include <klocale.h>
40#include <kglobal.h> 40#include <kglobal.h>
41#include <kconfig.h> 41#include <kconfig.h>
42#include <kiconloader.h> 42#include <kiconloader.h>
43 43
44#include <kcalendarsystem.h> 44#include <kcalendarsystem.h>
45 45
46#ifndef KORG_NOPRINTER 46#ifndef KORG_NOPRINTER
47#include "calprinter.h" 47#include "calprinter.h"
48#endif 48#endif
49#include "koprefs.h" 49#include "koprefs.h"
50#ifndef KORG_NOPLUGINS 50#ifndef KORG_NOPLUGINS
51#include "kocore.h" 51#include "kocore.h"
52#endif 52#endif
53#include "koglobals.h" 53#include "koglobals.h"
54#include <libkcal/kincidenceformatter.h> 54#include <libkcal/kincidenceformatter.h>
55 55
56#include "komonthview.h" 56#include "komonthview.h"
57 57
58#define PIXMAP_SIZE 5 58#define PIXMAP_SIZE 5
59#ifdef DESKTOP_VERSION 59#ifdef DESKTOP_VERSION
60QToolTipGroup *MonthViewCell::mToolTipGroup = 0; 60QToolTipGroup *MonthViewCell::mToolTipGroup = 0;
61#endif 61#endif
62class KNOWhatsThis :public QWhatsThis 62class KNOWhatsThis :public QWhatsThis
63{ 63{
64public: 64public:
65 KNOWhatsThis( KNoScrollListBox* sbox ) : QWhatsThis( sbox ), _wid( sbox) { }; 65 KNOWhatsThis( KNoScrollListBox* sbox ) : QWhatsThis( sbox ), _wid( sbox) { };
66 //~KNOWhatsThis( ) {qDebug("~KNOWhatsThis( ) "); }; 66 //~KNOWhatsThis( ) {qDebug("~KNOWhatsThis( ) "); };
67 67
68protected: 68protected:
69 virtual QString text( const QPoint& p) 69 virtual QString text( const QPoint& p)
70 { 70 {
71 return _wid->getWhatsThisText(p) ; 71 return _wid->getWhatsThisText(p) ;
72 }; 72 };
73private: 73private:
74 KNoScrollListBox* _wid; 74 KNoScrollListBox* _wid;
75 75
76}; 76};
77 77
78 78
79KNoScrollListBox::KNoScrollListBox(QWidget *parent,const char *name) 79KNoScrollListBox::KNoScrollListBox(QWidget *parent,const char *name)
80 : QListBox(parent, name, WRepaintNoErase) 80 : QListBox(parent, name, WRepaintNoErase)
81{ 81{
82#ifndef DESKTOP_VERSION 82#ifndef DESKTOP_VERSION
83 QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); 83 QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );
84#endif 84#endif
85 mWT = new KNOWhatsThis(this); 85 mWT = new KNOWhatsThis(this);
86 resetOnFocusIn = true; 86 resetOnFocusIn = true;
87 setVScrollBarMode(QScrollView::AlwaysOff); 87 setVScrollBarMode(QScrollView::AlwaysOff);
88 setHScrollBarMode(QScrollView::AlwaysOff); 88 setHScrollBarMode(QScrollView::AlwaysOff);
89} 89}
90KNoScrollListBox::~KNoScrollListBox() 90KNoScrollListBox::~KNoScrollListBox()
91{ 91{
92#if QT_VERSION >= 0x030000 92#if QT_VERSION >= 0x030000
93 93
94#else 94#else
95 delete mWT; 95 delete mWT;
96#endif 96#endif
97} 97}
98 98
99 99
100void KNoScrollListBox::focusInEvent ( QFocusEvent * e ) 100void KNoScrollListBox::focusInEvent ( QFocusEvent * e )
101{ 101{
102 QListBox::focusInEvent ( e ); 102 QListBox::focusInEvent ( e );
103 if ( count() ){ 103 if ( count() ){
104 int ci = currentItem(); 104 int ci = currentItem();
105 if ( ci < 0 ) ci = 0; 105 if ( ci < 0 ) ci = 0;
106 106
107 setCurrentItem( ci ); 107 setCurrentItem( ci );
108 setSelected ( ci, true ); 108 setSelected ( ci, true );
109 emit highlighted( item ( ci ) ); 109 emit highlighted( item ( ci ) );
110 110
111 resetOnFocusIn = true; 111 resetOnFocusIn = true;
112 112
113 if ( KOPrefs::instance()->mEnableMonthScroll || KOPrefs::instance()->mMonthViewWeek ) { 113 if ( KOPrefs::instance()->mEnableMonthScroll || KOPrefs::instance()->mMonthViewWeek ) {
114 QListBoxItem *fi = firstItem (); 114 QListBoxItem *fi = firstItem ();
115 if (fi ) { 115 if (fi ) {
116 int ihei = fi->height( this ); 116 int ihei = fi->height( this );
117 int hei = numRows () * ihei; 117 int hei = numRows () * ihei;
118 if ( hei < height() - horizontalScrollBar()->height () ) { 118 if ( hei < height() - horizontalScrollBar()->height () ) {
119 setVScrollBarMode(QScrollView::AlwaysOff); 119 setVScrollBarMode(QScrollView::AlwaysOff);
120 } 120 }
121 else 121 else
122 setVScrollBarMode(QScrollView::Auto); 122 setVScrollBarMode(QScrollView::Auto);
123 if ( ihei *3 > height() ) { 123 if ( ihei *3 > height() ) {
124 setHScrollBarMode(QScrollView::AlwaysOff); 124 setHScrollBarMode(QScrollView::AlwaysOff);
125 } 125 }
126 else { 126 else {
127 setHScrollBarMode(QScrollView::Auto); 127 setHScrollBarMode(QScrollView::Auto);
128 } 128 }
129 } else { 129 } else {
130 setVScrollBarMode(QScrollView::Auto); 130 setVScrollBarMode(QScrollView::Auto);
131 setHScrollBarMode(QScrollView::Auto); 131 setHScrollBarMode(QScrollView::Auto);
132 } 132 }
133 } 133 }
134 } 134 }
135} 135}
136void KNoScrollListBox::focusOutEvent ( QFocusEvent * e ) 136void KNoScrollListBox::focusOutEvent ( QFocusEvent * e )
137{ 137{
138 int i = currentItem (); 138 int i = currentItem ();
139 if ( i >= 0 ) { 139 if ( i >= 0 ) {
140 setSelected ( i, false ); 140 setSelected ( i, false );
141 } 141 }
142 QListBox::focusOutEvent ( e ); 142 QListBox::focusOutEvent ( e );
143 setVScrollBarMode(QScrollView::AlwaysOff); 143 setVScrollBarMode(QScrollView::AlwaysOff);
144 setHScrollBarMode(QScrollView::AlwaysOff); 144 setHScrollBarMode(QScrollView::AlwaysOff);
145 emit highlightIncidence( 0, (MonthViewCell*)this, 0 ); 145 emit highlightIncidence( 0, (MonthViewCell*)this, 0 );
146} 146}
147 147
148QString KNoScrollListBox::getWhatsThisText(QPoint p) 148QString KNoScrollListBox::getWhatsThisText(QPoint p)
149{ 149{
150 QListBoxItem* item = itemAt ( p ); 150 QListBoxItem* item = itemAt ( p );
151 if ( ! item ) { 151 if ( ! item ) {
152 return i18n("Click in the cell\nto add an event!"); 152 return i18n("Click in the cell\nto add an event!");
153 } 153 }
154 return KIncidenceFormatter::instance()->getFormattedText(((MonthViewItem*) item)->incidence(), 154 return KIncidenceFormatter::instance()->getFormattedText(((MonthViewItem*) item)->incidence(),
155 KOPrefs::instance()->mWTshowDetails, 155 KOPrefs::instance()->mWTshowDetails,
156 KOPrefs::instance()->mWTshowCreated, 156 KOPrefs::instance()->mWTshowCreated,
157 KOPrefs::instance()->mWTshowChanged); 157 KOPrefs::instance()->mWTshowChanged);
158} 158}
159void KNoScrollListBox::keyPressEvent(QKeyEvent *e) 159void KNoScrollListBox::keyPressEvent(QKeyEvent *e)
160{ 160{
161 //qDebug("KNoScrollListBox::keyPressEvent "); 161 //qDebug("KNoScrollListBox::keyPressEvent ");
162 switch(e->key()) { 162 switch(e->key()) {
163 case Key_Right: 163 case Key_Right:
164 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) 164 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton )
165 { 165 {
166 e->ignore(); 166 e->ignore();
167 return; 167 return;
168 } 168 }
169 scrollBy(10,0); 169 scrollBy(10,0);
170 break; 170 break;
171 case Key_Left: 171 case Key_Left:
172 if (e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) 172 if (e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton )
173 { 173 {
174 e->ignore(); 174 e->ignore();
175 return; 175 return;
176 } 176 }
177 scrollBy(-10,0); 177 scrollBy(-10,0);
178 break; 178 break;
179 case Key_Up: 179 case Key_Up:
180 if( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton) { 180 if( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton) {
181 e->ignore(); 181 e->ignore();
182 break; 182 break;
183 } 183 }
184 if ( count() ) { 184 if ( count() ) {
185 if ( currentItem() == 0 ) { 185 if ( currentItem() == 0 ) {
186 emit prevCell(); 186 emit prevCell();
187 } else { 187 } else {
188 setCurrentItem((currentItem()+count()-1)%count()); 188 setCurrentItem((currentItem()+count()-1)%count());
189 if(!itemVisible(currentItem())) { 189 if(!itemVisible(currentItem())) {
190 if((unsigned int) currentItem() == (count()-1)) { 190 if((unsigned int) currentItem() == (count()-1)) {
191 setTopItem(currentItem()-numItemsVisible()+1); 191 setTopItem(currentItem()-numItemsVisible()+1);
192 } else { 192 } else {
193 setTopItem(topItem()-1); 193 setTopItem(topItem()-1);
194 } 194 }
195 } 195 }
196 } 196 }
197 } 197 }
198 break; 198 break;
199 case Key_Down: 199 case Key_Down:
200 if(e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton) { 200 if(e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton) {
201 e->ignore(); 201 e->ignore();
202 break; 202 break;
203 } 203 }
204 if ( count () ) { 204 if ( count () ) {
205 if ( ((uint)currentItem()+1) == count () ) { 205 if ( ((uint)currentItem()+1) == count () ) {
206 emit nextCell(); 206 emit nextCell();
207 } else { 207 } else {
208 setCurrentItem((currentItem()+1)%count()); 208 setCurrentItem((currentItem()+1)%count());
209 if(!itemVisible(currentItem())) { 209 if(!itemVisible(currentItem())) {
210 if(currentItem() == 0) { 210 if(currentItem() == 0) {
211 setTopItem(0); 211 setTopItem(0);
212 } else { 212 } else {
213 setTopItem(topItem()+1); 213 setTopItem(topItem()+1);
214 } 214 }
215 } 215 }
216 } 216 }
217 } 217 }
218 break; 218 break;
219 case Key_I: 219 case Key_I:
220 QTimer::singleShot( 1, this, SLOT ( oneDown() ) ); 220 QTimer::singleShot( 1, this, SLOT ( oneDown() ) );
221 e->ignore(); 221 e->ignore();
222 break; 222 break;
223 case Key_Return: 223 case Key_Return:
224 case Key_Enter: 224 case Key_Enter:
225 { 225 {
226 if ( currentItem() >= 0 ) { 226 if ( currentItem() >= 0 ) {
227 emit doubleClicked( item( currentItem() ) ); 227 emit doubleClicked( item( currentItem() ) );
228 e->accept(); 228 e->accept();
229 } else { 229 } else {
230 e->ignore(); 230 e->ignore();
231 } 231 }
232 } 232 }
233 break; 233 break;
234 case Key_Shift: 234 case Key_Shift:
235 emit shiftDown(); 235 emit shiftDown();
236 break; 236 break;
237 default: 237 default:
238 e->ignore(); 238 e->ignore();
239 break; 239 break;
240 } 240 }
241} 241}
242 242
243void KNoScrollListBox::oneDown() 243void KNoScrollListBox::oneDown()
244{ 244{
245 if ( count () ) { 245 if ( count () ) {
246 if ( ((uint)currentItem()+1) == count () ) { 246 if ( ((uint)currentItem()+1) == count () ) {
247 emit nextCell(); 247 emit nextCell();
248 } else { 248 } else {
249 resetOnFocusIn = false; 249 resetOnFocusIn = false;
250 setCurrentItem((currentItem()+1)%count()); 250 setCurrentItem((currentItem()+1)%count());
251 if(!itemVisible(currentItem())) { 251 if(!itemVisible(currentItem())) {
252 if(currentItem() == 0) { 252 if(currentItem() == 0) {
253 setTopItem(0); 253 setTopItem(0);
254 } else { 254 } else {
255 setTopItem(topItem()+1); 255 setTopItem(topItem()+1);
256 } 256 }
257 } 257 }
258 } 258 }
259 } 259 }
260} 260}
261void KNoScrollListBox::keyReleaseEvent(QKeyEvent *e) 261void KNoScrollListBox::keyReleaseEvent(QKeyEvent *e)
262{ 262{
263 switch(e->key()) { 263 switch(e->key()) {
264 case Key_Shift: 264 case Key_Shift:
265 emit shiftUp(); 265 emit shiftUp();
266 break; 266 break;
267 default: 267 default:
268 break; 268 break;
269 } 269 }
270} 270}
271 271
272void KNoScrollListBox::mousePressEvent(QMouseEvent *e) 272void KNoScrollListBox::mousePressEvent(QMouseEvent *e)
273{ 273{
274 QListBox::mousePressEvent(e); 274 QListBox::mousePressEvent(e);
275 275
276 if(e->button() == RightButton) { 276 if(e->button() == RightButton) {
277 emit rightClick(); 277 emit rightClick();
278 } 278 }
279} 279}
280 280
281MonthViewItem::MonthViewItem( Incidence *incidence, const QString & s) 281MonthViewItem::MonthViewItem( Incidence *incidence, const QString & s)
282 : QListBoxItem() 282 : QListBoxItem()
283{ 283{
284 mblockRepaint = true; 284 mblockRepaint = true;
285 isWeekItem = KOPrefs::instance()->mMonthViewWeek; 285 isWeekItem = KOPrefs::instance()->mMonthViewWeek;
286 recycle( incidence, s ); 286 recycle( incidence, s );
287} 287}
288void MonthViewItem::recycle( Incidence *incidence, const QString & s) 288void MonthViewItem::recycle( Incidence *incidence, const QString & s)
289{ 289{
290 mDisplayHighlighted = false; 290 mDisplayHighlighted = false;
291 setText( s ); 291 setText( s );
292 mMultiday = 0; 292 mMultiday = 0;
293 mIncidence = incidence; 293 mIncidence = incidence;
294 mRecur = false; 294 mRecur = false;
295 mAlarm = false; 295 mAlarm = false;
296 mReply = false; 296 mReply = false;
297 mInfo = false; 297 mInfo = false;
298 mdayPos = 0; 298 mdayPos = 0;
299} 299}
300 300
301bool MonthViewItem::setHighlightedFalse() 301bool MonthViewItem::setHighlightedFalse()
302{ 302{
303 if ( !mDisplayHighlighted ) 303 if ( !mDisplayHighlighted )
304 return false; 304 return false;
305 mDisplayHighlighted = false; 305 mDisplayHighlighted = false;
306 return true; 306 return true;
307} 307}
308 308
309bool MonthViewItem::setHighlighted( Incidence * inc ) 309bool MonthViewItem::setHighlighted( Incidence * inc )
310{ 310{
311 if ( inc == mIncidence ) { 311 if ( inc == mIncidence ) {
312 if ( mDisplayHighlighted ) 312 if ( mDisplayHighlighted )
313 return false; 313 return false;
314 mDisplayHighlighted = true; 314 mDisplayHighlighted = true;
315 return true; 315 return true;
316 } else { 316 } else {
317 if ( !mDisplayHighlighted ) 317 if ( !mDisplayHighlighted )
318 return false; 318 return false;
319 mDisplayHighlighted = false; 319 mDisplayHighlighted = false;
320 return true; 320 return true;
321 } 321 }
322 return false; 322 return false;
323} 323}
324void MonthViewItem::paint(QPainter *p) 324void MonthViewItem::paint(QPainter *p)
325{ 325{
326 if ( mblockRepaint || !mIncidence ) { 326 if ( mblockRepaint || !mIncidence ) {
327 return; 327 return;
328 } 328 }
329#if QT_VERSION >= 0x030000 329#if QT_VERSION >= 0x030000
330 bool sel = isSelected(); 330 bool sel = isSelected();
331#else 331#else
332 bool sel = selected(); 332 bool sel = selected();
333#endif 333#endif
334 int heihei = height( listBox () ); 334 int heihei = height( listBox () );
335 int x = 1; 335 int x = 1;
336 if (KOPrefs::instance()->mMonthViewUsesCategoryColor || mDisplayHighlighted || sel ) 336 if (KOPrefs::instance()->mMonthViewUsesCategoryColor || mDisplayHighlighted || sel )
337 { 337 {
338 338
339 p->setBackgroundColor( palette().color( QPalette::Normal, \ 339 p->setBackgroundColor( palette().color( QPalette::Normal, \
340 sel ||mDisplayHighlighted ? QColorGroup::Highlight : QColorGroup::Background ) ); 340 sel ||mDisplayHighlighted ? QColorGroup::Highlight : QColorGroup::Background ) );
341 p->eraseRect( 0, 0, listBox()->maxItemWidth(), heihei ); 341 p->eraseRect( 0, 0, listBox()->maxItemWidth(), heihei );
342 } 342 }
343 343
344 //int y = 3;//(height() - mRecurPixmap.height()) /2; 344 //int y = 3;//(height() - mRecurPixmap.height()) /2;
345 int size = PIXMAP_SIZE; 345 int size = PIXMAP_SIZE;
346 if ( QApplication::desktop()->width() < 300 ) 346 if ( QApplication::desktop()->width() < 300 )
347 size = 3; 347 size = 3;
348 int y = (heihei - size -1 ) /2; 348 int y = (heihei - size -1 ) /2;
349 349
350 if ( mIncidence->calID() > 1 ) { 350 if ( mIncidence->calID() > 1 ) {
351 p->fillRect ( x, y-2,size,size+4, KOPrefs::instance()->defaultColor( mIncidence->calID() ) ); 351 p->fillRect ( x, y-2,size,size+4, KOPrefs::instance()->defaultColor( mIncidence->calID() ) );
352 p->drawRect ( x, y-2,size,size+4); 352 p->drawRect ( x, y-2,size,size+4);
353 x += size + 1; 353 x += size + 1;
354 } 354 }
355 if ( KOPrefs::instance()->mMonthShowIcons ) { 355 if ( KOPrefs::instance()->mMonthShowIcons ) {
356 if ( mInfo ) { 356 if ( mInfo ) {
357 p->fillRect ( x, y,size,size, Qt::darkGreen ); 357 p->fillRect ( x, y,size,size, Qt::darkGreen );
358 x += size + 1; 358 x += size + 1;
359 } 359 }
360 if ( mRecur ) { 360 if ( mRecur ) {
361 p->fillRect ( x, y,size,size, Qt::blue ); 361 p->fillRect ( x, y,size,size, Qt::blue );
362 x += size + 1; 362 x += size + 1;
363 } 363 }
364 if ( mAlarm ) { 364 if ( mAlarm ) {
365 p->fillRect ( x, y,size,size, Qt::red ); 365 p->fillRect ( x, y,size,size, Qt::red );
366 x += size + 1; 366 x += size + 1;
367 } 367 }
368 if ( mReply ) { 368 if ( mReply ) {
369 p->fillRect ( x, y,size,size, Qt::yellow ); 369 p->fillRect ( x, y,size,size, Qt::yellow );
370 x += size + 1; 370 x += size + 1;
371 } 371 }
372 } 372 }
373 373
374 374
375 375
376 376
377 if ( sel ) p->setPen( Qt::white ); 377 if ( sel ) p->setPen( Qt::white );
378 else p->setPen( palette().color( QPalette::Normal,QColorGroup::Foreground ) ); 378 else p->setPen( palette().color( QPalette::Normal,QColorGroup::Foreground ) );
379 379
380#if 0 380#if 0
381 p->setPen( palette().color( QPalette::Normal, sel ? \ 381 p->setPen( palette().color( QPalette::Normal, sel ? \
382 QColorGroup::HighlightedText : QColorGroup::Foreground ) ); 382 QColorGroup::HighlightedText : QColorGroup::Foreground ) );
383#endif 383#endif
384 QColor textColor = p->pen().color(); 384 QColor textColor = p->pen().color();
385 385
386 386
387 if ( mMultiday ) { 387 if ( mMultiday ) {
388 int yyy = y+(size/2); 388 int yyy = y+(size/2);
389 int sizeM = size+2; 389 int sizeM = size+2;
390 p->setBrush( QBrush( textColor ) ); 390 p->setBrush( QBrush( textColor ) );
391 p->drawLine ( x+1, yyy, x +sizeM +sizeM/2-1, yyy ) ; 391 p->drawLine ( x+1, yyy, x +sizeM +sizeM/2-1, yyy ) ;
392 if ( mMultiday == 2 || mMultiday == 3 ) { 392 if ( mMultiday == 2 || mMultiday == 3 ) {
393 QPointArray pa ( 3 ); 393 QPointArray pa ( 3 );
394 pa.setPoint (0, x, yyy ); 394 pa.setPoint (0, x, yyy );
395 pa.setPoint (1, x+sizeM/2, yyy+sizeM/2 ); 395 pa.setPoint (1, x+sizeM/2, yyy+sizeM/2 );
396 pa.setPoint (2, x+sizeM/2, yyy-sizeM/2 ); 396 pa.setPoint (2, x+sizeM/2, yyy-sizeM/2 );
397 p->drawPolygon( pa ); 397 p->drawPolygon( pa );
398 } 398 }
399 if ( mMultiday == 2 || mMultiday == 1 ) { 399 if ( mMultiday == 2 || mMultiday == 1 ) {
400 QPointArray pa ( 3 ); 400 QPointArray pa ( 3 );
401 pa.setPoint (0, x+sizeM +sizeM/2, yyy ); 401 pa.setPoint (0, x+sizeM +sizeM/2, yyy );
402 pa.setPoint (1, x+sizeM, yyy+sizeM/2 ); 402 pa.setPoint (1, x+sizeM, yyy+sizeM/2 );
403 pa.setPoint (2, x+sizeM, yyy-sizeM/2 ); 403 pa.setPoint (2, x+sizeM, yyy-sizeM/2 );
404 p->drawPolygon( pa ); 404 p->drawPolygon( pa );
405 } 405 }
406 if ( mMultiday == 1 ) { 406 if ( mMultiday == 1 ) {
407 // p->fillRect ( x, yyy-sizeM/2+1, sizeM/2, size, QBrush ( QBrush::SolidPattern ) ); 407 // p->fillRect ( x, yyy-sizeM/2+1, sizeM/2, size, QBrush ( QBrush::SolidPattern ) );
408 p->drawLine ( x+1, yyy-sizeM/2, x+1, yyy+sizeM/2 ); 408 p->drawLine ( x+1, yyy-sizeM/2, x+1, yyy+sizeM/2 );
409 } 409 }
410 if ( mMultiday == 3 ) { 410 if ( mMultiday == 3 ) {
411 // p->fillRect ( x+sizeM, yyy-sizeM/2+1, sizeM/2, size, QBrush ( QBrush::SolidPattern ) ); 411 // p->fillRect ( x+sizeM, yyy-sizeM/2+1, sizeM/2, size, QBrush ( QBrush::SolidPattern ) );
412 p->drawLine ( x+sizeM +sizeM/2-1, yyy-sizeM/2, x+sizeM +sizeM/2-1, yyy+sizeM/2 ); 412 p->drawLine ( x+sizeM +sizeM/2-1, yyy-sizeM/2, x+sizeM +sizeM/2-1, yyy+sizeM/2 );
413 413
414 } 414 }
415 x += sizeM/2 + 1; 415 x += sizeM/2 + 1;
416 x += sizeM + 1; 416 x += sizeM + 1;
417 } 417 }
418 418
419 if ( mIncidence->typeID() == todoID ){ 419 if ( mIncidence->typeID() == todoID ){
420 Todo* td = ( Todo* ) mIncidence; 420 Todo* td = ( Todo* ) mIncidence;
421 if ( td->isCompleted() ) { 421 if ( td->isCompleted() ) {
422 int half = size/2; 422 int half = size/2;
423 p->drawLine ( x, heihei/2, x +half , heihei/2 +half ) ; 423 p->drawLine ( x, heihei/2, x +half , heihei/2 +half ) ;
424 p->drawLine ( x +half , heihei/2 +half , x +half+half +2 , heihei/2 -2 ) ; 424 p->drawLine ( x +half , heihei/2 +half , x +half+half +2 , heihei/2 -2 ) ;
425 x += half+half + 4; 425 x += half+half + 4;
426 426
427 } else { 427 } else {
428 int val = td->percentComplete()/20; 428 int val = td->percentComplete()/20;
429 p->fillRect ( x+1, y-2, val ,size+4,textColor ); 429 p->fillRect ( x+1, y-2, val ,size+4,textColor );
430 p->drawRect ( x, y-2,7,size+4); 430 p->drawRect ( x, y-2,7,size+4);
431 x += size + 3; 431 x += size + 3;
432 } 432 }
433 } 433 }
434 QFontMetrics fm = p->fontMetrics(); 434 QFontMetrics fm = p->fontMetrics();
435 int yPos; 435 int yPos;
436 int pmheight = size; 436 int pmheight = size;
437 if( pmheight < fm.height() ) 437 if( pmheight < fm.height() )
438 yPos = fm.ascent() + fm.leading()/2; 438 yPos = fm.ascent() + fm.leading()/2;
439 else 439 else
440 yPos = pmheight/2 - fm.height()/2 + fm.ascent(); 440 yPos = pmheight/2 - fm.height()/2 + fm.ascent();
441 441
442 if ( KOPrefs::instance()->mMonthShowTimes || isWeekItem) { 442 if ( KOPrefs::instance()->mMonthShowTimes || isWeekItem) {
443 p->drawText( x, yPos, text() ); 443 p->drawText( x, yPos, text() );
444 if ( mIncidence->cancelled() ) { 444 if ( mIncidence->cancelled() ) {
445 int wid = fm.width( text() ); 445 int wid = fm.width( text() );
446 p->drawLine( x, heihei/2 ,x+wid, heihei/2 ); 446 p->drawLine( x, heihei/2 ,x+wid, heihei/2 );
447 } 447 }
448 } else { 448 } else {
449 QString pText = text(); 449 QString pText = text();
450 if( pText.mid(2,1) == ":" ) 450 if( pText.mid(2,1) == ":" )
451 pText = pText.mid( 6 ); 451 pText = pText.mid( 6 );
452 p->drawText( x, yPos, pText ); 452 p->drawText( x, yPos, pText );
453 if ( mIncidence->cancelled() ) { 453 if ( mIncidence->cancelled() ) {
454 int wid = fm.width( pText ); 454 int wid = fm.width( pText );
455 p->drawLine( x, heihei/2 ,x+wid, heihei/2 ); 455 p->drawLine( x, heihei/2 ,x+wid, heihei/2 );
456 } 456 }
457 } 457 }
458} 458}
459 459
460int MonthViewItem::height(const QListBox *lb) const 460int MonthViewItem::height(const QListBox *lb) const
461{ 461{
462 int ret = 10; 462 int ret = 10;
463 if ( lb ) 463 if ( lb )
464 ret = lb->fontMetrics().lineSpacing()+1; 464 ret = lb->fontMetrics().lineSpacing()+1;
465 return ret; 465 return ret;
466} 466}
467 467
468int MonthViewItem::width(const QListBox *lb) const 468int MonthViewItem::width(const QListBox *lb) const
469{ 469{
470 if( KOPrefs::instance()->mEnableMonthScroll || isWeekItem ) { 470 if( KOPrefs::instance()->mEnableMonthScroll || isWeekItem ) {
471 int size = PIXMAP_SIZE; 471 int size = PIXMAP_SIZE;
472 if ( QApplication::desktop()->width() < 300 ) 472 if ( QApplication::desktop()->width() < 300 )
473 size = 3; 473 size = 3;
474 int x = 1; 474 int x = 1;
475 if ( KOPrefs::instance()->mMonthShowIcons ) { 475 if ( KOPrefs::instance()->mMonthShowIcons ) {
476 if ( mInfo ) { 476 if ( mInfo ) {
477 x += size + 1; 477 x += size + 1;
478 } 478 }
479 if( mRecur ) { 479 if( mRecur ) {
480 x += size+1; 480 x += size+1;
481 } 481 }
482 if( mAlarm ) { 482 if( mAlarm ) {
483 x += size+1; 483 x += size+1;
484 } 484 }
485 if( mReply ) { 485 if( mReply ) {
486 x += size+1; 486 x += size+1;
487 } 487 }
488 } 488 }
489 if( mMultiday ) { 489 if( mMultiday ) {
490 x += size+1+2+size/2; 490 x += size+1+2+size/2;
491 } 491 }
492 return( x + lb->fontMetrics().width( text() ) + 1 ); 492 return( x + lb->fontMetrics().width( text() ) + 1 );
493 } 493 }
494 if ( ! lb ) 494 if ( ! lb )
495 return 10; 495 return 10;
496 return lb->width(); 496 return lb->width();
497} 497}
498 498
499 499
500MonthViewCell::MonthViewCell( KOMonthView *parent,QWidget* par ) 500MonthViewCell::MonthViewCell( KOMonthView *parent,QWidget* par )
501 : KNoScrollListBox( par ), 501 : KNoScrollListBox( par ),
502 mMonthView( parent ) 502 mMonthView( parent )
503{ 503{
504 //QVBoxLayout *topLayout = new QVBoxLayout( this ); 504 //QVBoxLayout *topLayout = new QVBoxLayout( this );
505 currentPalette = 0; 505 currentPalette = 0;
506 // mLabel = new QLabel( this );QPushButton 506 // mLabel = new QLabel( this );QPushButton
507 mLabel = new QPushButton( this ); 507 mLabel = new QPushButton( this );
508 //mLabel->setFrameStyle( QFrame::Panel | QFrame::Plain ); 508 //mLabel->setFrameStyle( QFrame::Panel | QFrame::Plain );
509 //mLabel->setLineWidth( 1 ); 509 //mLabel->setLineWidth( 1 );
510 //mLabel->setAlignment( AlignCenter ); 510 //mLabel->setAlignment( AlignCenter );
511 mLabel->setFlat( true ); 511 mLabel->setFlat( true );
512 mLabel->setFocusPolicy(NoFocus); 512 mLabel->setFocusPolicy(NoFocus);
513 //mItemList = new KNoScrollListBox( this ); 513 //mItemList = new KNoScrollListBox( this );
514 setMinimumSize( 10, 10 ); 514 setMinimumSize( 10, 10 );
515 setFrameStyle( QFrame::Panel | QFrame::Plain ); 515 setFrameStyle( QFrame::Panel | QFrame::Plain );
516 setLineWidth( 1 ); 516 setLineWidth( 1 );
517 //topLayout->addWidget( mItemList ); 517 //topLayout->addWidget( mItemList );
518 mLabel->raise(); 518 mLabel->raise();
519 // QColor( 0,0,255 ) QColor( 160,1600,255 ) 519 // QColor( 0,0,255 ) QColor( 160,1600,255 )
520 mStandardPalette = palette(); 520 mStandardPalette = palette();
521 mStandardPalette.setColor(QColorGroup::Base, mStandardPalette.color( QPalette::Normal, QColorGroup::Background ) ); 521 mStandardPalette.setColor(QColorGroup::Base, mStandardPalette.color( QPalette::Normal, QColorGroup::Background ) );
522 522
523 enableScrollBars( false ); 523 enableScrollBars( false );
524 updateConfig(); 524 updateConfig();
525 //connect( mLabel, SIGNAL( clicked( )), SLOT( newEvent() )); 525 //connect( mLabel, SIGNAL( clicked( )), SLOT( newEvent() ));
526 connect( mLabel, SIGNAL( clicked( )), SLOT( showDay() )); 526 connect( mLabel, SIGNAL( clicked( )), SLOT( showDay() ));
527 connect( this , SIGNAL( doubleClicked( QListBoxItem *) ), 527 connect( this , SIGNAL( doubleClicked( QListBoxItem *) ),
528 SLOT( defaultAction( QListBoxItem * ) ) ); 528 SLOT( defaultAction( QListBoxItem * ) ) );
529 connect( this, SIGNAL( rightButtonPressed( QListBoxItem *, 529 connect( this, SIGNAL( rightButtonPressed( QListBoxItem *,
530 const QPoint &) ), 530 const QPoint &) ),
531 SLOT( contextMenu( QListBoxItem * ) ) ); 531 SLOT( contextMenu( QListBoxItem * ) ) );
532 connect( this, SIGNAL( highlighted( QListBoxItem *) ), 532 connect( this, SIGNAL( highlighted( QListBoxItem *) ),
533 SLOT( selection( QListBoxItem * ) ) ); 533 SLOT( selection( QListBoxItem * ) ) );
534 534
535 /* 535 /*
536 connect( this, SIGNAL( clicked( QListBoxItem * ) ), 536 connect( this, SIGNAL( clicked( QListBoxItem * ) ),
537 SLOT( selection( QListBoxItem * ) ) ); 537 SLOT( selection( QListBoxItem * ) ) );
538 */ 538 */
539} 539}
540#ifdef DESKTOP_VERSION 540#ifdef DESKTOP_VERSION
541QToolTipGroup *MonthViewCell::toolTipGroup() 541QToolTipGroup *MonthViewCell::toolTipGroup()
542{ 542{
543 if (!mToolTipGroup) mToolTipGroup = new QToolTipGroup(0); 543 if (!mToolTipGroup) mToolTipGroup = new QToolTipGroup(0);
544 return mToolTipGroup; 544 return mToolTipGroup;
545} 545}
546#endif 546#endif
547 547
548void MonthViewCell::setDate( const QDate &date ) 548void MonthViewCell::setDate( const QDate &date )
549{ 549{
550 // kdDebug() << "MonthViewCell::setDate(): " << date.toString() << endl; 550 // kdDebug() << "MonthViewCell::setDate(): " << date.toString() << endl;
551 mDate = date; 551 mDate = date;
552 552
553 553
554 554
555 //resizeEvent( 0 ); 555 //resizeEvent( 0 );
556} 556}
557 557
558QDate MonthViewCell::date() const 558QDate MonthViewCell::date() const
559{ 559{
560 return mDate; 560 return mDate;
561} 561}
562 562
563void MonthViewCell::setPrimary( bool primary ) 563void MonthViewCell::setPrimary( bool primary )
564{ 564{
565 mPrimary = primary; 565 mPrimary = primary;
566 //setMyPalette(); 566 //setMyPalette();
567} 567}
568void MonthViewCell::setMyPalette() 568void MonthViewCell::setMyPalette()
569{ 569{
570 570
571 if ( mHoliday) { 571 if ( mHoliday) {
572 if ( currentPalette == 1 ) return; 572 if ( currentPalette == 1 ) return;
573 mLabel->setPalette( QPalette ( mHolidayPalette.color( QPalette::Normal,QColorGroup::Base),mHolidayPalette.color(QPalette::Normal,QColorGroup::Base ) )); 573 mLabel->setPalette( QPalette ( mHolidayPalette.color( QPalette::Normal,QColorGroup::Base),mHolidayPalette.color(QPalette::Normal,QColorGroup::Base ) ));
574 setPalette( mHolidayPalette ); 574 setPalette( mHolidayPalette );
575 //mLabel->setPalette( mHolidayPalette ); 575 //mLabel->setPalette( mHolidayPalette );
576 currentPalette = 1; 576 currentPalette = 1;
577 577
578 } else { 578 } else {
579 if ( mPrimary ) { 579 if ( mPrimary ) {
580 if ( currentPalette == 2 ) return; 580 if ( currentPalette == 2 ) return;
581 mLabel->setPalette( QPalette ( mPrimaryPalette.color( QPalette::Normal,QColorGroup::Base),mPrimaryPalette.color(QPalette::Normal,QColorGroup::Base ) )); 581 mLabel->setPalette( QPalette ( mPrimaryPalette.color( QPalette::Normal,QColorGroup::Base),mPrimaryPalette.color(QPalette::Normal,QColorGroup::Base ) ));
582 //mLabel->setPalette( mPrimaryPalette ); 582 //mLabel->setPalette( mPrimaryPalette );
583 setPalette( mPrimaryPalette ); 583 setPalette( mPrimaryPalette );
584 currentPalette = 2; 584 currentPalette = 2;
585 585
586 } else { 586 } else {
587 if ( currentPalette == 3 ) return; 587 if ( currentPalette == 3 ) return;
588 setPalette( mNonPrimaryPalette ); 588 setPalette( mNonPrimaryPalette );
589 mLabel->setPalette( QPalette ( mNonPrimaryPalette.color( QPalette::Normal,QColorGroup::Base),mNonPrimaryPalette.color(QPalette::Normal,QColorGroup::Base ) )); 589 mLabel->setPalette( QPalette ( mNonPrimaryPalette.color( QPalette::Normal,QColorGroup::Base),mNonPrimaryPalette.color(QPalette::Normal,QColorGroup::Base ) ));
590 //mLabel->setPalette( mNonPrimaryPalette );; 590 //mLabel->setPalette( mNonPrimaryPalette );;
591 currentPalette = 3; 591 currentPalette = 3;
592 } 592 }
593 } 593 }
594 //QPalette pal = palette(); 594 //QPalette pal = palette();
595 595
596 //mLabel->setPalette( QPalette ( pal.color( QPalette::Normal,QColorGroup::Base),pal.color(QPalette::Normal,QColorGroup::Base ) )); 596 //mLabel->setPalette( QPalette ( pal.color( QPalette::Normal,QColorGroup::Base),pal.color(QPalette::Normal,QColorGroup::Base ) ));
597} 597}
598QPalette MonthViewCell::getPalette () 598QPalette MonthViewCell::getPalette ()
599{ 599{
600 if ( !KOPrefs::instance()->mMonthViewUsesDayColors ) 600 if ( !KOPrefs::instance()->mMonthViewUsesDayColors )
601 return mStandardPalette; 601 return mStandardPalette;
602 if ( mHoliday) { 602 if ( mHoliday) {
603 return mHolidayPalette ; 603 return mHolidayPalette ;
604 } else { 604 } else {
605 if ( mPrimary ) { 605 if ( mPrimary ) {
606 return mPrimaryPalette ; 606 return mPrimaryPalette ;
607 } 607 }
608 } 608 }
609 return mNonPrimaryPalette; 609 return mNonPrimaryPalette;
610} 610}
611bool MonthViewCell::isPrimary() const 611bool MonthViewCell::isPrimary() const
612{ 612{
613 return mPrimary; 613 return mPrimary;
614} 614}
615 615
616void MonthViewCell::setHoliday( bool holiday ) 616void MonthViewCell::setHoliday( bool holiday )
617{ 617{
618 mHoliday = holiday; 618 mHoliday = holiday;
619 //setMyPalette(); 619 //setMyPalette();
620} 620}
621 621
622void MonthViewCell::setHoliday( const QString &holiday ) 622void MonthViewCell::setHoliday( const QString &holiday )
623{ 623{
624 mHolidayString = holiday; 624 mHolidayString = holiday;
625 625
626 if ( !holiday.isEmpty() ) { 626 if ( !holiday.isEmpty() ) {
627 setHoliday( true ); 627 setHoliday( true );
628 } 628 }
629} 629}
630 630
631void MonthViewCell::startUpdateCell() 631void MonthViewCell::startUpdateCell()
632{ 632{
633 blockSignals( true ); 633 blockSignals( true );
634 mdayCount = 0; 634 mdayCount = 0;
635 setFocusPolicy(NoFocus); 635 setFocusPolicy(NoFocus);
636 if ( !mMonthView->isUpdatePossible() ) 636 if ( !mMonthView->isUpdatePossible() )
637 return; 637 return;
638 MonthViewItem *mitem = (MonthViewItem*) firstItem (); 638 MonthViewItem *mitem = (MonthViewItem*) firstItem ();
639 while ( mitem ) { 639 while ( mitem ) {
640 mitem->setBlockRepaint( true ); 640 mitem->setBlockRepaint( true );
641 mitem = (MonthViewItem *)mitem->next(); 641 mitem = (MonthViewItem *)mitem->next();
642 } 642 }
643 if ( mAvailItemList.count() > 20 ) { 643 if ( mAvailItemList.count() > 20 ) {
644 mAvailItemList.setAutoDelete( true ); 644 mAvailItemList.setAutoDelete( true );
645 mAvailItemList.clear(); 645 mAvailItemList.clear();
646 mAvailItemList.setAutoDelete( false ); 646 mAvailItemList.setAutoDelete( false );
647 clear(); 647 clear();
648 } 648 }
649 649
650 setPrimary( mDate.month()%2 ); 650 setPrimary( mDate.month()%2 );
651 setHoliday( KOGlobals::self()->calendarSystem()->dayOfWeek(mDate) == KOGlobals::self()->calendarSystem()->weekDayOfPray() || ( mDate.dayOfWeek() == 6 ) && KOPrefs::instance()-> mExcludeSaturdays); 651 setHoliday( KOGlobals::self()->calendarSystem()->dayOfWeek(mDate) == KOGlobals::self()->calendarSystem()->weekDayOfPray() || ( mDate.dayOfWeek() == 6 ) && KOPrefs::instance()-> mExcludeSaturdays);
652 if ( mDate == QDate::currentDate() ) { 652 if ( mDate == QDate::currentDate() ) {
653 setLineWidth( 3 ); 653 setLineWidth( 3 );
654 } else { 654 } else {
655 setLineWidth( 1 ); 655 setLineWidth( 1 );
656 } 656 }
657 MonthViewItem* CurrentAvailItem = (MonthViewItem*) firstItem (); 657 MonthViewItem* CurrentAvailItem = (MonthViewItem*) firstItem ();
658 //clear(); 658 //clear();
659 while ( CurrentAvailItem ) { 659 while ( CurrentAvailItem ) {
660 MonthViewItem *item = CurrentAvailItem; 660 MonthViewItem *item = CurrentAvailItem;
661 //item->setHighlightedFalse(); 661 //item->setHighlightedFalse();
662 item->recycle( 0, ""); 662 item->recycle( 0, "");
663 CurrentAvailItem = (MonthViewItem *)item->next(); 663 CurrentAvailItem = (MonthViewItem *)item->next();
664 mAvailItemList.append( item ); 664 mAvailItemList.append( item );
665 takeItem ( item ); 665 takeItem ( item );
666 } 666 }
667 667
668#ifdef DESKTOP_VERSION 668#ifdef DESKTOP_VERSION
669 QToolTip::remove(this); 669 QToolTip::remove(this);
670#endif 670#endif
671 mToolTip.clear(); 671 mToolTip.clear();
672 //qApp->processEvents(); 672 //qApp->processEvents();
673#if 0 673#if 0
674 if ( !mHolidayString.isEmpty() ) { 674 if ( !mHolidayString.isEmpty() ) {
675 MonthViewItem *item = new MonthViewItem( 0, mDate, mHolidayString ); 675 MonthViewItem *item = new MonthViewItem( 0, mDate, mHolidayString );
676 item->setPalette( mHolidayPalette ); 676 item->setPalette( mHolidayPalette );
677 insertItem( item ); 677 insertItem( item );
678 mToolTip.append ( mHolidayString ); 678 mToolTip.append ( mHolidayString );
679 } 679 }
680#endif 680#endif
681} 681}
682 682
683int MonthViewCell::insertEvent(Event *event) 683int MonthViewCell::insertEvent(Event *event)
684{ 684{
685 bool useToolTips = true; 685 bool useToolTips = true;
686#ifndef DESKTOP_VERSION 686#ifndef DESKTOP_VERSION
687 useToolTips = false; 687 useToolTips = false;
688#endif 688#endif
689 QString mToolTipText; 689 QString mToolTipText;
690 setFocusPolicy(WheelFocus); 690 setFocusPolicy(WheelFocus);
691 if ( !(event->doesRecur() == Recurrence::rNone) ) { 691 if ( !(event->doesRecur() == Recurrence::rNone) ) {
692 if ( !KOPrefs::instance()->mMonthDailyRecur && event->doesRecur() == Recurrence::rDaily ) 692 if ( !KOPrefs::instance()->mMonthDailyRecur && event->doesRecur() == Recurrence::rDaily )
693 return mdayCount; 693 return mdayCount;
694 else 694 else
695 if ( !KOPrefs::instance()->mMonthWeeklyRecur && event->doesRecur() == Recurrence::rWeekly ) 695 if ( !KOPrefs::instance()->mMonthWeeklyRecur && event->doesRecur() == Recurrence::rWeekly )
696 return mdayCount; 696 return mdayCount;
697 } 697 }
698 698
699 if ( event->isHoliday()) { 699 if ( event->isHoliday()) {
700 setHoliday( true ); 700 setHoliday( true );
701 if ( mDate.dayOfWeek() == 7 ) 701 if ( mDate.dayOfWeek() == 7 )
702 setLineWidth( 3 ); 702 setLineWidth( 3 );
703 } 703 }
704 QString text; 704 QString text;
705 int multiday = 0;// 1 = start, 2 = midddle, 3 = end day 705 int multiday = 0;// 1 = start, 2 = midddle, 3 = end day
706 if (event->isMultiDay()) { 706 if (event->isMultiDay()) {
707 QString prefix = "<->";multiday = 2; 707 QString prefix = "<->";multiday = 2;
708 QString time; 708 QString time;
709 if ( event->doesRecur() ) { 709 if ( event->doesRecur() ) {
710 if ( event->recursOn( mDate) ) { 710 if ( event->recursOn( mDate) ) {
711 prefix ="->" ;multiday = 1; 711 prefix ="->" ;multiday = 1;
712 } 712 }
713 else { 713 else {
714 int days = event->dtStart().date().daysTo ( event->dtEnd().date() ); 714 int days = event->dtStart().date().daysTo ( event->dtEnd().date() );
715 if ( event->recursOn( mDate.addDays( -days)) ) { 715 if ( event->recursOn( mDate.addDays( -days)) ) {
716 prefix ="<-" ;multiday = 3; 716 prefix ="<-" ;multiday = 3;
717 } 717 }
718 } 718 }
719 719
720 } else { 720 } else {
721 if (mDate == event->dtStart().date()) { 721 if (mDate == event->dtStart().date()) {
722 prefix ="->" ;multiday = 1; 722 prefix ="->" ;multiday = 1;
723 } else if (mDate == event->dtEnd().date()) { 723 } else if (mDate == event->dtEnd().date()) {
724 prefix ="<-" ;multiday = 3; 724 prefix ="<-" ;multiday = 3;
725 } 725 }
726 } 726 }
727 if ( !event->doesFloat() ) { 727 if ( !event->doesFloat() ) {
728 if ( mDate == event->dtStart().date () ) 728 if ( mDate == event->dtStart().date () )
729 time = KGlobal::locale()->formatTime(event->dtStart().time())+" "; 729 time = KGlobal::locale()->formatTime(event->dtStart().time())+" ";
730 else if ( mDate == event->dtEnd().date () ) 730 else if ( mDate == event->dtEnd().date () )
731 time = KGlobal::locale()->formatTime(event->dtEnd().time())+" "; 731 time = KGlobal::locale()->formatTime(event->dtEnd().time())+" ";
732 732
733 } 733 }
734 text = time + event->summary(); 734 text = time + event->summary();
735 if ( useToolTips ) 735 if ( useToolTips )
736 mToolTipText += prefix + text; 736 mToolTipText += prefix + text;
737 } else { 737 } else {
738 if (event->doesFloat()) { 738 if (event->doesFloat()) {
739 text = event->summary(); 739 text = event->summary();
740 if ( useToolTips ) 740 if ( useToolTips )
741 mToolTipText += text; 741 mToolTipText += text;
742 } 742 }
743 else { 743 else {
744 text = KGlobal::locale()->formatTime(event->dtStart().time()); 744 text = KGlobal::locale()->formatTime(event->dtStart().time());
745 text += " " + event->summary(); 745 text += " " + event->summary();
746 if ( useToolTips ) 746 if ( useToolTips )
747 mToolTipText += KGlobal::locale()->formatTime(event->dtStart().time()) +"-"+KGlobal::locale()->formatTime(event->dtEnd().time())+" " + event->summary(); 747 mToolTipText += KGlobal::locale()->formatTime(event->dtStart().time()) +"-"+KGlobal::locale()->formatTime(event->dtEnd().time())+" " + event->summary();
748 } 748 }
749 } 749 }
750 if ( useToolTips && ! event->location().isEmpty() ) { 750 if ( useToolTips && ! event->location().isEmpty() ) {
751 mToolTipText += " (" + event->location() +")"; 751 mToolTipText += " (" + event->location() +")";
752 } 752 }
753 MonthViewItem *item ; 753 MonthViewItem *item ;
754 754
755 if ( mAvailItemList.count() ) { 755 if ( mAvailItemList.count() ) {
756 item = mAvailItemList.first(); 756 item = mAvailItemList.first();
757 mAvailItemList.remove( item ); 757 mAvailItemList.remove( item );
758 item->recycle( event, text ); 758 item->recycle( event, text );
759 } else { 759 } else {
760 item = new MonthViewItem( event, text ); 760 item = new MonthViewItem( event, text );
761 } 761 }
762 762
763 QPalette pal; 763 QPalette pal;
764 if (KOPrefs::instance()->mMonthViewUsesCategoryColor) { 764 if (KOPrefs::instance()->mMonthViewUsesCategoryColor) {
765 QStringList categories = event->categories(); 765 QStringList categories = event->categories();
766 QString cat = categories.first(); 766 QString cat = categories.first();
767 if ( KOPrefs::instance()->mMonthViewUsesForegroundColor ) { 767 if ( KOPrefs::instance()->mMonthViewUsesForegroundColor ) {
768 pal = getPalette(); 768 pal = getPalette();
769 if (cat.isEmpty()) { 769 if (cat.isEmpty()) {
770 //pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->mEventColor); 770 //pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->mEventColor);
771 pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->defaultColor( event->calID() )); 771 pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->defaultColor( event->calID() ));
772 } else { 772 } else {
773 pal.setColor(QColorGroup::Foreground, *(KOPrefs::instance()->categoryColor(cat))); 773 pal.setColor(QColorGroup::Foreground, *(KOPrefs::instance()->categoryColor(cat)));
774 } 774 }
775 775
776 } else { 776 } else {
777 if (cat.isEmpty()) { 777 if (cat.isEmpty()) {
778 //pal = QPalette(KOPrefs::instance()->mEventColor, KOPrefs::instance()->mEventColor); 778 //pal = QPalette(KOPrefs::instance()->mEventColor, KOPrefs::instance()->mEventColor);
779 pal = QPalette( KOPrefs::instance()->defaultColor( event->calID() ), KOPrefs::instance()->defaultColor( event->calID() )); 779 pal = QPalette( KOPrefs::instance()->defaultColor( event->calID() ), KOPrefs::instance()->defaultColor( event->calID() ));
780 } else { 780 } else {
781 pal = QPalette(*(KOPrefs::instance()->categoryColor(cat)), *(KOPrefs::instance()->categoryColor(cat))); 781 pal = QPalette(*(KOPrefs::instance()->categoryColor(cat)), *(KOPrefs::instance()->categoryColor(cat)));
782 } 782 }
783 } 783 }
784 784
785 } else { 785 } else {
786 pal = mStandardPalette ; 786 pal = mStandardPalette ;
787 } 787 }
788 pal.setColor(QColorGroup::Highlight, KOPrefs::instance()->mHighlightColor); 788 pal.setColor(QColorGroup::Highlight, KOPrefs::instance()->mHighlightColor);
789 item->setPalette( pal ); 789 item->setPalette( pal );
790 item->setRecur( event->recurrence()->doesRecur() ); 790 item->setRecur( event->doesRecur() );
791 item->setAlarm( event->isAlarmEnabled() && multiday < 2 && event->alarmEnabled() ); 791 item->setAlarm( event->isAlarmEnabled() && multiday < 2 && event->alarmEnabled() );
792 item->setMoreInfo( event->description().length() > 0 ); 792 item->setMoreInfo( event->description().length() > 0 );
793#ifdef DESKTOP_VERSION 793#ifdef DESKTOP_VERSION
794 Attendee *me = event->attendeeByMails(KOPrefs::instance()->mAdditionalMails, 794 Attendee *me = event->attendeeByMails(KOPrefs::instance()->mAdditionalMails,
795 KOPrefs::instance()->email()); 795 KOPrefs::instance()->email());
796 if ( me != 0 ) { 796 if ( me != 0 ) {
797 if ( me->status() == Attendee::NeedsAction && me->RSVP()) 797 if ( me->status() == Attendee::NeedsAction && me->RSVP())
798 item->setReply(true && multiday < 2); 798 item->setReply(true && multiday < 2);
799 else 799 else
800 item->setReply(false); 800 item->setReply(false);
801 } else 801 } else
802 item->setReply(false); 802 item->setReply(false);
803#endif 803#endif
804 804
805 item->setMultiDay( multiday ); 805 item->setMultiDay( multiday );
806 if ( multiday ) { 806 if ( multiday ) {
807 insertItem( item ,mdayCount); 807 insertItem( item ,mdayCount);
808 ++mdayCount; 808 ++mdayCount;
809 } else { 809 } else {
810 uint i = mdayCount; 810 uint i = mdayCount;
811 uint pos = mdayCount; 811 uint pos = mdayCount;
812 uint itcount = count(); 812 uint itcount = count();
813 if ( itcount > 1000 ) { 813 if ( itcount > 1000 ) {
814 qDebug("KO: Bug in MonthViewCell::insertEvent %u ", itcount); 814 qDebug("KO: Bug in MonthViewCell::insertEvent %u ", itcount);
815 itcount = 0; 815 itcount = 0;
816 } 816 }
817 for ( i = pos; i < itcount;++i ) { 817 for ( i = pos; i < itcount;++i ) {
818 // qDebug("i %d mday %u count %d ",i,itcount,mdayCount ); 818 // qDebug("i %d mday %u count %d ",i,itcount,mdayCount );
819 QListBoxItem* it = this->item ( i ); 819 QListBoxItem* it = this->item ( i );
820 if ( it && text < it->text() ) { 820 if ( it && text < it->text() ) {
821 pos = i; 821 pos = i;
822 break; 822 break;
823 } 823 }
824 ++pos; 824 ++pos;
825 } 825 }
826 insertItem( item ,pos); 826 insertItem( item ,pos);
827 } 827 }
828 if ( useToolTips ) { 828 if ( useToolTips ) {
829 mToolTip.append( mToolTipText ); 829 mToolTip.append( mToolTipText );
830 } 830 }
831 return mdayCount; 831 return mdayCount;
832} 832}
833void MonthViewCell::insertTodo(Todo *todo) 833void MonthViewCell::insertTodo(Todo *todo)
834{ 834{
835 setFocusPolicy(WheelFocus); 835 setFocusPolicy(WheelFocus);
836 QString text; 836 QString text;
837 if (todo->hasDueDate()) { 837 if (todo->hasDueDate()) {
838 if (!todo->doesFloat()) { 838 if (!todo->doesFloat()) {
839 text += KGlobal::locale()->formatTime(todo->dtDue().time()); 839 text += KGlobal::locale()->formatTime(todo->dtDue().time());
840 text += " "; 840 text += " ";
841 } 841 }
842 } 842 }
843 text += todo->summary(); 843 text += todo->summary();
844 MonthViewItem *item ; 844 MonthViewItem *item ;
845 if ( mAvailItemList.count() ) { 845 if ( mAvailItemList.count() ) {
846 item = mAvailItemList.first(); 846 item = mAvailItemList.first();
847 mAvailItemList.remove( item ); 847 mAvailItemList.remove( item );
848 item->recycle( todo, text ); 848 item->recycle( todo, text );
849 } else { 849 } else {
850 item = new MonthViewItem( todo, text ); 850 item = new MonthViewItem( todo, text );
851 } 851 }
852 //MonthViewItem *item = new MonthViewItem( todo, mDate, text ); 852 //MonthViewItem *item = new MonthViewItem( todo, mDate, text );
853 //item->setPalette( mStandardPalette ); 853 //item->setPalette( mStandardPalette );
854 QPalette pal; 854 QPalette pal;
855 if (KOPrefs::instance()->mMonthViewUsesCategoryColor) { 855 if (KOPrefs::instance()->mMonthViewUsesCategoryColor) {
856 QStringList categories = todo->categories(); 856 QStringList categories = todo->categories();
857 QString cat = categories.first(); 857 QString cat = categories.first();
858 if ( KOPrefs::instance()->mMonthViewUsesForegroundColor ) { 858 if ( KOPrefs::instance()->mMonthViewUsesForegroundColor ) {
859 pal = getPalette(); 859 pal = getPalette();
860 if (cat.isEmpty()) { 860 if (cat.isEmpty()) {
861 //pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->mEventColor); 861 //pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->mEventColor);
862 pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->defaultColor( todo->calID() )); 862 pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->defaultColor( todo->calID() ));
863 } else { 863 } else {
864 pal.setColor(QColorGroup::Foreground, *(KOPrefs::instance()->categoryColor(cat))); 864 pal.setColor(QColorGroup::Foreground, *(KOPrefs::instance()->categoryColor(cat)));
865 } 865 }
866 866
867 } else { 867 } else {
868 if (cat.isEmpty()) { 868 if (cat.isEmpty()) {
869 //pal = QPalette(KOPrefs::instance()->mEventColor, KOPrefs::instance()->mEventColor); 869 //pal = QPalette(KOPrefs::instance()->mEventColor, KOPrefs::instance()->mEventColor);
870 pal = QPalette(KOPrefs::instance()->defaultColor( todo->calID() ), KOPrefs::instance()->defaultColor( todo->calID() )); 870 pal = QPalette(KOPrefs::instance()->defaultColor( todo->calID() ), KOPrefs::instance()->defaultColor( todo->calID() ));
871 } else { 871 } else {
872 pal = QPalette(*(KOPrefs::instance()->categoryColor(cat)), *(KOPrefs::instance()->categoryColor(cat))); 872 pal = QPalette(*(KOPrefs::instance()->categoryColor(cat)), *(KOPrefs::instance()->categoryColor(cat)));
873 } 873 }
874 } 874 }
875 875
876 } else { 876 } else {
877 pal = mStandardPalette ; 877 pal = mStandardPalette ;
878 } 878 }
879 pal.setColor(QColorGroup::Highlight, KOPrefs::instance()->mHighlightColor); 879 pal.setColor(QColorGroup::Highlight, KOPrefs::instance()->mHighlightColor);
880 item->setPalette( pal ); 880 item->setPalette( pal );
881 item->setRecur( todo->recurrence()->doesRecur() ); 881 item->setRecur( todo->doesRecur() );
882 item->setAlarm( todo->isAlarmEnabled() && todo->alarmEnabled() ); 882 item->setAlarm( todo->isAlarmEnabled() && todo->alarmEnabled() );
883 item->setMoreInfo( todo->description().length() > 0 ); 883 item->setMoreInfo( todo->description().length() > 0 );
884 insertItem( item , count()); 884 insertItem( item , count());
885#ifdef DESKTOP_VERSION 885#ifdef DESKTOP_VERSION
886 mToolTip.append( text ); 886 mToolTip.append( text );
887#endif 887#endif
888} 888}
889void MonthViewCell::repaintfinishUpdateCell() 889void MonthViewCell::repaintfinishUpdateCell()
890{ 890{
891 MonthViewItem *mitem = (MonthViewItem*) firstItem (); 891 MonthViewItem *mitem = (MonthViewItem*) firstItem ();
892 while ( mitem ) { 892 while ( mitem ) {
893 mitem->setBlockRepaint( false ); 893 mitem->setBlockRepaint( false );
894 updateItem ( mitem ); 894 updateItem ( mitem );
895 mitem = (MonthViewItem *)mitem->next(); 895 mitem = (MonthViewItem *)mitem->next();
896 } 896 }
897 blockSignals( false ); 897 blockSignals( false );
898} 898}
899void MonthViewCell::finishUpdateCell() 899void MonthViewCell::finishUpdateCell()
900{ 900{
901 901
902 902
903 903
904#ifdef DESKTOP_VERSION 904#ifdef DESKTOP_VERSION
905 if (mToolTip.count() > 0 ) { 905 if (mToolTip.count() > 0 ) {
906 mToolTip.sort(); 906 mToolTip.sort();
907 QToolTip::add(this,mToolTip.join("\n"),toolTipGroup(),""); 907 QToolTip::add(this,mToolTip.join("\n"),toolTipGroup(),"");
908 } 908 }
909#endif 909#endif
910 //sort(); 910 //sort();
911 //setMyPalette(); 911 //setMyPalette();
912 setMyPalette(); 912 setMyPalette();
913 913
914 resizeEvent( 0 ); 914 resizeEvent( 0 );
915 915
916} 916}
917void MonthViewCell::updateCell() 917void MonthViewCell::updateCell()
918{ 918{
919 if ( !mMonthView->isUpdatePossible() ) 919 if ( !mMonthView->isUpdatePossible() )
920 return; 920 return;
921 startUpdateCell(); 921 startUpdateCell();
922 //mLabel->setMaximumWidth( width() - mItemList->lineWidth()*2); 922 //mLabel->setMaximumWidth( width() - mItemList->lineWidth()*2);
923 QPtrList<Event> events = mMonthView->calendar()->events( mDate, true ); 923 QPtrList<Event> events = mMonthView->calendar()->events( mDate, true );
924 Event *event; 924 Event *event;
925 for( event = events.first(); event; event = events.next() ) { // for event 925 for( event = events.first(); event; event = events.next() ) { // for event
926 insertEvent(event); 926 insertEvent(event);
927 } 927 }
928 // insert due todos 928 // insert due todos
929 QPtrList<Todo> todos = mMonthView->calendar()->todos( mDate ); 929 QPtrList<Todo> todos = mMonthView->calendar()->todos( mDate );
930 Todo *todo; 930 Todo *todo;
931 for(todo = todos.first(); todo; todo = todos.next()) { 931 for(todo = todos.first(); todo; todo = todos.next()) {
932 insertTodo( todo ); 932 insertTodo( todo );
933 } 933 }
934 finishUpdateCell(); 934 finishUpdateCell();
935 // if ( isVisible()) 935 // if ( isVisible())
936 //qApp->processEvents(); 936 //qApp->processEvents();
937} 937}
938 938
939void MonthViewCell::updateConfig( bool bigFont ) // = false 939void MonthViewCell::updateConfig( bool bigFont ) // = false
940{ 940{
941 941
942 if ( bigFont ) { 942 if ( bigFont ) {
943 QFont fo = KOPrefs::instance()->mMonthViewFont; 943 QFont fo = KOPrefs::instance()->mMonthViewFont;
944 int ps = fo.pointSize() + 2; 944 int ps = fo.pointSize() + 2;
945 if ( ps < 18 ) 945 if ( ps < 18 )
946 ps += 2; 946 ps += 2;
947 fo.setPointSize( ps ); 947 fo.setPointSize( ps );
948 setFont( fo ); 948 setFont( fo );
949 } else 949 } else
950 setFont( KOPrefs::instance()->mMonthViewFont ); 950 setFont( KOPrefs::instance()->mMonthViewFont );
951 951
952 QFontMetrics fm( font() ); 952 QFontMetrics fm( font() );
953 mLabelSize = fm.size( 0, "30" ) + QSize( 4, 2 ); 953 mLabelSize = fm.size( 0, "30" ) + QSize( 4, 2 );
954 mLabelBigSize = fm.size( 0, "Mag 30" ) + QSize( 2, 2 ); 954 mLabelBigSize = fm.size( 0, "Mag 30" ) + QSize( 2, 2 );
955 mHolidayPalette = mStandardPalette; 955 mHolidayPalette = mStandardPalette;
956 mPrimaryPalette = mStandardPalette; 956 mPrimaryPalette = mStandardPalette;
957 mNonPrimaryPalette = mStandardPalette; 957 mNonPrimaryPalette = mStandardPalette;
958 if ( KOPrefs::instance()->mMonthViewUsesDayColors ) { 958 if ( KOPrefs::instance()->mMonthViewUsesDayColors ) {
959 mHolidayPalette.setColor(QColorGroup::Base, KOPrefs::instance()->mMonthViewHolidayColor ); 959 mHolidayPalette.setColor(QColorGroup::Base, KOPrefs::instance()->mMonthViewHolidayColor );
960 mHolidayPalette.setColor(QColorGroup::Background, KOPrefs::instance()->mMonthViewHolidayColor ); 960 mHolidayPalette.setColor(QColorGroup::Background, KOPrefs::instance()->mMonthViewHolidayColor );
961 mHolidayPalette.setColor(QColorGroup::Foreground, KOPrefs::instance()->mMonthViewHolidayColor.dark()); 961 mHolidayPalette.setColor(QColorGroup::Foreground, KOPrefs::instance()->mMonthViewHolidayColor.dark());
962 mPrimaryPalette.setColor(QColorGroup::Foreground,KOPrefs::instance()->mMonthViewOddColor.dark()); 962 mPrimaryPalette.setColor(QColorGroup::Foreground,KOPrefs::instance()->mMonthViewOddColor.dark());
963 mPrimaryPalette.setColor(QColorGroup::Base,KOPrefs::instance()->mMonthViewOddColor); 963 mPrimaryPalette.setColor(QColorGroup::Base,KOPrefs::instance()->mMonthViewOddColor);
964 mPrimaryPalette.setColor(QColorGroup::Background,KOPrefs::instance()->mMonthViewOddColor); 964 mPrimaryPalette.setColor(QColorGroup::Background,KOPrefs::instance()->mMonthViewOddColor);
965 mNonPrimaryPalette.setColor(QColorGroup::Foreground,KOPrefs::instance()->mMonthViewEvenColor.dark()); 965 mNonPrimaryPalette.setColor(QColorGroup::Foreground,KOPrefs::instance()->mMonthViewEvenColor.dark());
966 mNonPrimaryPalette.setColor(QColorGroup::Base,KOPrefs::instance()->mMonthViewEvenColor); 966 mNonPrimaryPalette.setColor(QColorGroup::Base,KOPrefs::instance()->mMonthViewEvenColor);
967 mNonPrimaryPalette.setColor(QColorGroup::Background,KOPrefs::instance()->mMonthViewEvenColor); 967 mNonPrimaryPalette.setColor(QColorGroup::Background,KOPrefs::instance()->mMonthViewEvenColor);
968 } 968 }
969 //updateCell(); 969 //updateCell();
970} 970}
971 971
972void MonthViewCell::enableScrollBars( bool enabled ) 972void MonthViewCell::enableScrollBars( bool enabled )
973{ 973{
974 974
975 return; 975 return;
976 if ( enabled ) { 976 if ( enabled ) {
977 QListBoxItem *fi = firstItem (); 977 QListBoxItem *fi = firstItem ();
978 if (fi ) { 978 if (fi ) {
979 int ihei = fi->height( this ); 979 int ihei = fi->height( this );
980 int hei = numRows () * ihei; 980 int hei = numRows () * ihei;
981 if ( hei < height() - horizontalScrollBar()->height () ) { 981 if ( hei < height() - horizontalScrollBar()->height () ) {
982 setVScrollBarMode(QScrollView::AlwaysOff); 982 setVScrollBarMode(QScrollView::AlwaysOff);
983 } 983 }
984 else 984 else
985 setVScrollBarMode(QScrollView::Auto); 985 setVScrollBarMode(QScrollView::Auto);
986 if ( ihei *3 > height() ) { 986 if ( ihei *3 > height() ) {
987 setHScrollBarMode(QScrollView::AlwaysOff); 987 setHScrollBarMode(QScrollView::AlwaysOff);
988 } 988 }
989 else { 989 else {
990 setHScrollBarMode(QScrollView::Auto); 990 setHScrollBarMode(QScrollView::Auto);
991 } 991 }
992 } else { 992 } else {
993 setVScrollBarMode(QScrollView::Auto); 993 setVScrollBarMode(QScrollView::Auto);
994 setHScrollBarMode(QScrollView::Auto); 994 setHScrollBarMode(QScrollView::Auto);
995 } 995 }
996 } else { 996 } else {
997 setVScrollBarMode(QScrollView::AlwaysOff); 997 setVScrollBarMode(QScrollView::AlwaysOff);
998 setHScrollBarMode(QScrollView::AlwaysOff); 998 setHScrollBarMode(QScrollView::AlwaysOff);
999 } 999 }
1000} 1000}
1001 1001
1002Incidence *MonthViewCell::selectedIncidence() 1002Incidence *MonthViewCell::selectedIncidence()
1003{ 1003{
1004 int index = currentItem(); 1004 int index = currentItem();
1005 if ( index < 0 ) return 0; 1005 if ( index < 0 ) return 0;
1006 1006
1007 MonthViewItem *mitem = 1007 MonthViewItem *mitem =
1008 static_cast<MonthViewItem *>( item( index ) ); 1008 static_cast<MonthViewItem *>( item( index ) );
1009 1009
1010 if ( !mitem ) return 0; 1010 if ( !mitem ) return 0;
1011 1011
1012 return mitem->incidence(); 1012 return mitem->incidence();
1013} 1013}
1014 1014
1015QDate MonthViewCell::selectedIncidenceDate() 1015QDate MonthViewCell::selectedIncidenceDate()
1016{ 1016{
1017 QDate qd; 1017 QDate qd;
1018 int index = currentItem(); 1018 int index = currentItem();
1019 if ( index < 0 ) return qd; 1019 if ( index < 0 ) return qd;
1020 return mDate; 1020 return mDate;
1021} 1021}
1022 1022
1023void MonthViewCell::deselect() 1023void MonthViewCell::deselect()
1024{ 1024{
1025 clearSelection(); 1025 clearSelection();
1026 enableScrollBars( false ); 1026 enableScrollBars( false );
1027 // updateCell(); 1027 // updateCell();
1028} 1028}
1029void MonthViewCell::select() 1029void MonthViewCell::select()
1030{ 1030{
1031 ;// updateCell(); 1031 ;// updateCell();
1032} 1032}
1033 1033
1034void MonthViewCell::resizeEvent ( QResizeEvent * e ) 1034void MonthViewCell::resizeEvent ( QResizeEvent * e )
1035{ 1035{
1036 if ( !mMonthView->isUpdatePossible() ) 1036 if ( !mMonthView->isUpdatePossible() )
1037 return; 1037 return;
1038 //qDebug("++++++++++++++MonthViewCell::resizeEvent %d %d ", width(), height()); 1038 //qDebug("++++++++++++++MonthViewCell::resizeEvent %d %d ", width(), height());
1039 deselect(); 1039 deselect();
1040 mLabel->setMaximumHeight( height() - lineWidth()*2 ); 1040 mLabel->setMaximumHeight( height() - lineWidth()*2 );
1041 1041
1042 QString text; 1042 QString text;
1043 //mLabel->setText( text ); 1043 //mLabel->setText( text );
1044 bool smallDisplay = QApplication::desktop()->width() < 320 && KOPrefs::instance()->mMonthViewSatSunTog; 1044 bool smallDisplay = QApplication::desktop()->width() < 320 && KOPrefs::instance()->mMonthViewSatSunTog;
1045 if ( KOPrefs::instance()->mMonthViewWeek || KOGlobals::self()->calendarSystem()->day( mDate ) == 1 || (mDate.dayOfWeek() == 7 && !smallDisplay ) || KOPrefs::instance()->mMonthShowShort) { 1045 if ( KOPrefs::instance()->mMonthViewWeek || KOGlobals::self()->calendarSystem()->day( mDate ) == 1 || (mDate.dayOfWeek() == 7 && !smallDisplay ) || KOPrefs::instance()->mMonthShowShort) {
1046 text = KOGlobals::self()->calendarSystem()->monthName( mDate, true ) + " " + QString::number( mDate.day() ); 1046 text = KOGlobals::self()->calendarSystem()->monthName( mDate, true ) + " " + QString::number( mDate.day() );
1047 mLabel->resize( mLabelBigSize ); 1047 mLabel->resize( mLabelBigSize );
1048 } else { 1048 } else {
1049 mLabel->resize( mLabelSize ); 1049 mLabel->resize( mLabelSize );
1050 text = QString::number( mDate.day() ); 1050 text = QString::number( mDate.day() );
1051 } 1051 }
1052 mLabel->setText( text ); 1052 mLabel->setText( text );
1053 1053
1054 int size = height() - mLabel->height() - lineWidth()-1; 1054 int size = height() - mLabel->height() - lineWidth()-1;
1055 //qDebug("LW %d ", lineWidth()); 1055 //qDebug("LW %d ", lineWidth());
1056 if ( size > 0 ) 1056 if ( size > 0 )
1057 verticalScrollBar()->setMaximumHeight( size ); 1057 verticalScrollBar()->setMaximumHeight( size );
1058 size = width() - mLabel->width() -lineWidth()-1; 1058 size = width() - mLabel->width() -lineWidth()-1;
1059 if ( size > 0 ) 1059 if ( size > 0 )
1060 horizontalScrollBar()->setMaximumWidth( size ); 1060 horizontalScrollBar()->setMaximumWidth( size );
1061 mLabel->move( width()-lineWidth() - mLabel->width(), height()-lineWidth() - mLabel->height() ); 1061 mLabel->move( width()-lineWidth() - mLabel->width(), height()-lineWidth() - mLabel->height() );
1062 //mLabel->setMaximumWidth( width() - mItemList->lineWidth()*2); 1062 //mLabel->setMaximumWidth( width() - mItemList->lineWidth()*2);
1063 // mItemList->resize ( width(), height () ); 1063 // mItemList->resize ( width(), height () );
1064 if ( e ) 1064 if ( e )
1065 KNoScrollListBox::resizeEvent ( e ); 1065 KNoScrollListBox::resizeEvent ( e );
1066} 1066}
1067 1067
1068void MonthViewCell::defaultAction( QListBoxItem *item ) 1068void MonthViewCell::defaultAction( QListBoxItem *item )
1069{ 1069{
1070 1070
1071 if ( !item ) { 1071 if ( !item ) {
1072 QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) ); 1072 QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) );
1073 emit newEventSignal( dt ); 1073 emit newEventSignal( dt );
1074 return; 1074 return;
1075 } 1075 }
1076 1076
1077 MonthViewItem *eventItem = static_cast<MonthViewItem *>( item ); 1077 MonthViewItem *eventItem = static_cast<MonthViewItem *>( item );
1078 Incidence *incidence = eventItem->incidence(); 1078 Incidence *incidence = eventItem->incidence();
1079 if ( incidence ) mMonthView->defaultAction( incidence ); 1079 if ( incidence ) mMonthView->defaultAction( incidence );
1080} 1080}
1081void MonthViewCell::showDay() 1081void MonthViewCell::showDay()
1082{ 1082{
1083 emit showDaySignal( date() ); 1083 emit showDaySignal( date() );
1084} 1084}
1085void MonthViewCell::newEvent() 1085void MonthViewCell::newEvent()
1086{ 1086{
1087 QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) ); 1087 QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) );
1088 emit newEventSignal( dt ); 1088 emit newEventSignal( dt );
1089} 1089}
1090void MonthViewCell::cellClicked( QListBoxItem *item ) 1090void MonthViewCell::cellClicked( QListBoxItem *item )
1091{ 1091{
1092 mMonthView->setSelectedCell( this ); 1092 mMonthView->setSelectedCell( this );
1093 if ( item == 0 ) { 1093 if ( item == 0 ) {
1094 QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) ); 1094 QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) );
1095 emit newEventSignal( dt ); 1095 emit newEventSignal( dt );
1096 return; 1096 return;
1097 } 1097 }
1098 1098
1099} 1099}
1100 1100
1101void MonthViewCell::contextMenu( QListBoxItem *item ) 1101void MonthViewCell::contextMenu( QListBoxItem *item )
1102{ 1102{
1103 mMonthView->setPopupCell( this ); 1103 mMonthView->setPopupCell( this );
1104 if ( !item ) { 1104 if ( !item ) {
1105 mMonthView->showContextMenu( 0 ); 1105 mMonthView->showContextMenu( 0 );
1106 return; 1106 return;
1107 } 1107 }
1108 //selection( item );
1109 //qApp->processEvents();
1108 MonthViewItem *eventItem = static_cast<MonthViewItem *>( item ); 1110 MonthViewItem *eventItem = static_cast<MonthViewItem *>( item );
1109 Incidence *incidence = eventItem->incidence(); 1111 Incidence *incidence = eventItem->incidence();
1110 if ( incidence ) mMonthView->showContextMenu( incidence ); 1112 if ( incidence ) mMonthView->showContextMenu( incidence );
1111} 1113}
1112 1114
1113void MonthViewCell::selection( QListBoxItem *item ) 1115void MonthViewCell::selection( QListBoxItem *item )
1114{ 1116{
1115 if ( !item ) { 1117 if ( !item ) {
1116 emit highlightIncidence( 0 , this, 0 ); 1118 emit highlightIncidence( 0 , this, 0 );
1117 return; 1119 return;
1118 } 1120 }
1119 MonthViewItem * it = (static_cast<MonthViewItem *>( item )); 1121 MonthViewItem * it = (static_cast<MonthViewItem *>( item ));
1120 emit highlightIncidence( it->incidence(), this, it->multiDay() ); 1122 emit highlightIncidence( it->incidence(), this, it->multiDay() );
1121 mMonthView->setSelectedCell( this ); 1123 mMonthView->setSelectedCell( this );
1122} 1124}
1123 1125
1124void MonthViewCell::deHighLight() 1126void MonthViewCell::deHighLight()
1125{ 1127{
1126 MonthViewItem *mitem = (MonthViewItem*) firstItem (); 1128 MonthViewItem *mitem = (MonthViewItem*) firstItem ();
1127 while ( mitem ) { 1129 while ( mitem ) {
1128 if ( mitem->setHighlightedFalse() ) 1130 if ( mitem->setHighlightedFalse() )
1129 updateItem ( mitem ); 1131 updateItem ( mitem );
1130 mitem = (MonthViewItem *)mitem->next(); 1132 mitem = (MonthViewItem *)mitem->next();
1131 } 1133 }
1132} 1134}
1133// returns true if no inc found 1135// returns true if no inc found
1134bool MonthViewCell::doHighLight( Incidence * inc ) 1136bool MonthViewCell::doHighLight( Incidence * inc )
1135{ 1137{
1136 1138
1137 MonthViewItem *mitem = (MonthViewItem*) firstItem (); 1139 MonthViewItem *mitem = (MonthViewItem*) firstItem ();
1138 while ( mitem ) { 1140 while ( mitem ) {
1139 if ( mitem->incidence() == inc ) { 1141 if ( mitem->incidence() == inc ) {
1140 if ( mitem->setHighlighted( inc ) ) 1142 if ( mitem->setHighlighted( inc ) )
1141 updateItem ( mitem ); 1143 updateItem ( mitem );
1142 return false; 1144 return false;
1143 } 1145 }
1144 mitem = (MonthViewItem *)mitem->next(); 1146 mitem = (MonthViewItem *)mitem->next();
1145 } 1147 }
1146 return true; 1148 return true;
1147} 1149}
1148// ******************************************************************************* 1150// *******************************************************************************
1149// ******************************************************************************* 1151// *******************************************************************************
1150// ******************************************************************************* 1152// *******************************************************************************
1151 1153
1152 1154
1153KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) 1155KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name)
1154 : KOEventView( calendar, parent, name ), 1156 : KOEventView( calendar, parent, name ),
1155 mDaysPerWeek( 7 ), mNumWeeks( 6 ), mNumCells( mDaysPerWeek * mNumWeeks ), 1157 mDaysPerWeek( 7 ), mNumWeeks( 6 ), mNumCells( mDaysPerWeek * mNumWeeks ),
1156 mWidthLongDayLabel( 0 ), mSelectedCell( 0 ) 1158 mWidthLongDayLabel( 0 ), mSelectedCell( 0 )
1157{ 1159{
1158 mFlagKeyPressed = false; 1160 mFlagKeyPressed = false;
1159 mShortDayLabelsM = false; 1161 mShortDayLabelsM = false;
1160 mShortDayLabelsW = false; 1162 mShortDayLabelsW = false;
1161 skipResize = false; 1163 skipResize = false;
1162 clPending = true; 1164 clPending = true;
1163 mPopupCell = 0; 1165 mPopupCell = 0;
1164 mNavigatorBar = new NavigatorBar( QDate::currentDate(), this, "useBigPixmaps" ); 1166 mNavigatorBar = new NavigatorBar( QDate::currentDate(), this, "useBigPixmaps" );
1165 mWidStack = new QWidgetStack( this ); 1167 mWidStack = new QWidgetStack( this );
1166 QVBoxLayout* hb = new QVBoxLayout( this ); 1168 QVBoxLayout* hb = new QVBoxLayout( this );
1167 mMonthView = new QWidget( mWidStack ); 1169 mMonthView = new QWidget( mWidStack );
1168 mWeekView = new QWidget( mWidStack ); 1170 mWeekView = new QWidget( mWidStack );
1169#if QT_VERSION >= 0x030000 1171#if QT_VERSION >= 0x030000
1170 mWidStack->addWidget(mMonthView ); 1172 mWidStack->addWidget(mMonthView );
1171 mWidStack->addWidget(mWeekView ); 1173 mWidStack->addWidget(mWeekView );
1172#else 1174#else
1173 mWidStack->addWidget( mMonthView, 1 ); 1175 mWidStack->addWidget( mMonthView, 1 );
1174 mWidStack->addWidget( mWeekView , 1 ); 1176 mWidStack->addWidget( mWeekView , 1 );
1175#endif 1177#endif
1176 hb->addWidget( mNavigatorBar ); 1178 hb->addWidget( mNavigatorBar );
1177 hb->addWidget( mWidStack ); 1179 hb->addWidget( mWidStack );
1178 mShowWeekView = KOPrefs::instance()->mMonthViewWeek; 1180 mShowWeekView = KOPrefs::instance()->mMonthViewWeek;
1179 updatePossible = false; 1181 updatePossible = false;
1180 //updatePossible = true; 1182 //updatePossible = true;
1181 mCells.setAutoDelete( true ); 1183 mCells.setAutoDelete( true );
1182 mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ; 1184 mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ;
1183 mDayLabels.resize( mDaysPerWeek ); 1185 mDayLabels.resize( mDaysPerWeek );
1184 mDayLabelsW.resize( mDaysPerWeek ); 1186 mDayLabelsW.resize( mDaysPerWeek );
1185 QFont bfont = font(); 1187 QFont bfont = font();
1186 if ( QApplication::desktop()->width() < 650 ) { 1188 if ( QApplication::desktop()->width() < 650 ) {
1187 bfont.setPointSize( bfont.pointSize() - 2 ); 1189 bfont.setPointSize( bfont.pointSize() - 2 );
1188 } 1190 }
1189 bfont.setBold( true ); 1191 bfont.setBold( true );
1190 int i; 1192 int i;
1191 1193
1192 for( i = 0; i < mDaysPerWeek; i++ ) { 1194 for( i = 0; i < mDaysPerWeek; i++ ) {
1193 QLabel *label = new QLabel( mMonthView ); 1195 QLabel *label = new QLabel( mMonthView );
1194 label->setFont(bfont); 1196 label->setFont(bfont);
1195 label->setFrameStyle(QFrame::Panel|QFrame::Raised); 1197 label->setFrameStyle(QFrame::Panel|QFrame::Raised);
1196 label->setLineWidth(1); 1198 label->setLineWidth(1);
1197 label->setAlignment(AlignCenter); 1199 label->setAlignment(AlignCenter);
1198 mDayLabels.insert( i, label ); 1200 mDayLabels.insert( i, label );
1199 label = new QLabel( mWeekView ); 1201 label = new QLabel( mWeekView );
1200 label->setFont(bfont); 1202 label->setFont(bfont);
1201 label->setFrameStyle(QFrame::Panel|QFrame::Raised); 1203 label->setFrameStyle(QFrame::Panel|QFrame::Raised);
1202 label->setLineWidth(1); 1204 label->setLineWidth(1);
1203 label->setAlignment(AlignCenter); 1205 label->setAlignment(AlignCenter);
1204 mDayLabelsW.insert( i, label ); 1206 mDayLabelsW.insert( i, label );
1205 } 1207 }
1206 1208
1207 bfont.setBold( false ); 1209 bfont.setBold( false );
1208 mWeekLabels.resize( mNumWeeks+1 ); 1210 mWeekLabels.resize( mNumWeeks+1 );
1209 mWeekLabelsW.resize( 2 ); 1211 mWeekLabelsW.resize( 2 );
1210 for( i = 0; i < mNumWeeks+1; i++ ) { 1212 for( i = 0; i < mNumWeeks+1; i++ ) {
1211 KOWeekButton *label = new KOWeekButton( mMonthView ); 1213 KOWeekButton *label = new KOWeekButton( mMonthView );
1212 label->setFocusPolicy(NoFocus); 1214 label->setFocusPolicy(NoFocus);
1213 label->setFont(bfont); 1215 label->setFont(bfont);
1214 connect( label, SIGNAL( selectWeekNum ( int )),this, SLOT( selectInternalWeekNum ( int )) ); 1216 connect( label, SIGNAL( selectWeekNum ( int )),this, SLOT( selectInternalWeekNum ( int )) );
1215 label->setFlat(true); 1217 label->setFlat(true);
1216 QWhatsThis::add(label,i18n("Click on the week number to\nshow week zoomed")); 1218 QWhatsThis::add(label,i18n("Click on the week number to\nshow week zoomed"));
1217 //label->setFrameStyle(QFrame::Panel|QFrame::Raised); 1219 //label->setFrameStyle(QFrame::Panel|QFrame::Raised);
1218 //label->setLineWidth(1); 1220 //label->setLineWidth(1);
1219 //label->setAlignment(AlignCenter); 1221 //label->setAlignment(AlignCenter);
1220 mWeekLabels.insert( i, label ); 1222 mWeekLabels.insert( i, label );
1221 } 1223 }
1222 mWeekLabels[mNumWeeks]->setText( i18n("W")); 1224 mWeekLabels[mNumWeeks]->setText( i18n("W"));
1223 mWeekLabels[mNumWeeks]->setFocusPolicy(WheelFocus); 1225 mWeekLabels[mNumWeeks]->setFocusPolicy(WheelFocus);
1224 QWhatsThis::add(mWeekLabels[mNumWeeks],i18n("Click on this to\nselect week number")); 1226 QWhatsThis::add(mWeekLabels[mNumWeeks],i18n("Click on this to\nselect week number"));
1225 1227
1226 for( i = 0; i < 1+1; i++ ) { 1228 for( i = 0; i < 1+1; i++ ) {
1227 KOWeekButton *label = new KOWeekButton( mWeekView ); 1229 KOWeekButton *label = new KOWeekButton( mWeekView );
1228 label->setFocusPolicy(NoFocus); 1230 label->setFocusPolicy(NoFocus);
1229 label->setFont(bfont); 1231 label->setFont(bfont);
1230 connect( label, SIGNAL( selectWeekNum ( int )),this, SLOT( selectInternalWeekNum ( int )) ); 1232 connect( label, SIGNAL( selectWeekNum ( int )),this, SLOT( selectInternalWeekNum ( int )) );
1231 label->setFlat(true); 1233 label->setFlat(true);
1232 QWhatsThis::add(label,i18n("Click on the week number to\nshow week zoomed")); 1234 QWhatsThis::add(label,i18n("Click on the week number to\nshow week zoomed"));
1233 //label->setFrameStyle(QFrame::Panel|QFrame::Raised); 1235 //label->setFrameStyle(QFrame::Panel|QFrame::Raised);
1234 //label->setLineWidth(1); 1236 //label->setLineWidth(1);
1235 //label->setAlignment(AlignCenter); 1237 //label->setAlignment(AlignCenter);
1236 mWeekLabelsW.insert( i, label ); 1238 mWeekLabelsW.insert( i, label );
1237 } 1239 }
1238 mWeekLabelsW[1]->setText( i18n("W")); 1240 mWeekLabelsW[1]->setText( i18n("W"));
1239 mWeekLabelsW[1]->setFocusPolicy(WheelFocus); 1241 mWeekLabelsW[1]->setFocusPolicy(WheelFocus);
1240 1242
1241 1243
1242 int row, col; 1244 int row, col;
1243 mCells.resize( mNumCells ); 1245 mCells.resize( mNumCells );
1244 for( row = 0; row < mNumWeeks; ++row ) { 1246 for( row = 0; row < mNumWeeks; ++row ) {
1245 for( col = 0; col < mDaysPerWeek; ++col ) { 1247 for( col = 0; col < mDaysPerWeek; ++col ) {
1246 MonthViewCell *cell = new MonthViewCell( this, mMonthView ); 1248 MonthViewCell *cell = new MonthViewCell( this, mMonthView );
1247 mCells.insert( row * mDaysPerWeek + col, cell ); 1249 mCells.insert( row * mDaysPerWeek + col, cell );
1248 1250
1249 connect( cell, SIGNAL( defaultAction( Incidence * ) ), 1251 connect( cell, SIGNAL( defaultAction( Incidence * ) ),
1250 SLOT( defaultAction( Incidence * ) ) ); 1252 SLOT( defaultAction( Incidence * ) ) );
1251 connect( cell, SIGNAL( newEventSignal( QDateTime ) ), 1253 connect( cell, SIGNAL( newEventSignal( QDateTime ) ),
1252 SIGNAL( newEventSignal( QDateTime ) ) ); 1254 SIGNAL( newEventSignal( QDateTime ) ) );
1253 connect( cell, SIGNAL( showDaySignal( QDate ) ), 1255 connect( cell, SIGNAL( showDaySignal( QDate ) ),
1254 SIGNAL( showDaySignal( QDate ) ) ); 1256 SIGNAL( showDaySignal( QDate ) ) );
1255 connect( cell, SIGNAL( nextCell() ), 1257 connect( cell, SIGNAL( nextCell() ),
1256 SLOT( nextCell() ) ); 1258 SLOT( nextCell() ) );
1257 connect( cell, SIGNAL( prevCell() ), 1259 connect( cell, SIGNAL( prevCell() ),
1258 SLOT( prevCell() ) ); 1260 SLOT( prevCell() ) );
1259 connect( cell, SIGNAL( highlightIncidence( Incidence * , MonthViewCell *, int ) ), 1261 connect( cell, SIGNAL( highlightIncidence( Incidence * , MonthViewCell *, int ) ),
1260 SLOT( incidenceHighlighted( Incidence *, MonthViewCell *, int ) )); 1262 SLOT( incidenceHighlighted( Incidence *, MonthViewCell *, int ) ));
1261 } 1263 }
1262 } 1264 }
1263 mCellsW.resize( mDaysPerWeek ); 1265 mCellsW.resize( mDaysPerWeek );
1264 for( col = 0; col < mDaysPerWeek; ++col ) { 1266 for( col = 0; col < mDaysPerWeek; ++col ) {
1265 MonthViewCell *cell = new MonthViewCell( this, mWeekView ); 1267 MonthViewCell *cell = new MonthViewCell( this, mWeekView );
1266 mCellsW.insert( col, cell ); 1268 mCellsW.insert( col, cell );
1267 1269
1268 connect( cell, SIGNAL( defaultAction( Incidence * ) ), 1270 connect( cell, SIGNAL( defaultAction( Incidence * ) ),
1269 SLOT( defaultAction( Incidence * ) ) ); 1271 SLOT( defaultAction( Incidence * ) ) );
1270 connect( cell, SIGNAL( newEventSignal( QDateTime ) ), 1272 connect( cell, SIGNAL( newEventSignal( QDateTime ) ),
1271 SIGNAL( newEventSignal( QDateTime ) ) ); 1273 SIGNAL( newEventSignal( QDateTime ) ) );
1272 connect( cell, SIGNAL( showDaySignal( QDate ) ), 1274 connect( cell, SIGNAL( showDaySignal( QDate ) ),
1273 SIGNAL( showDaySignal( QDate ) ) ); 1275 SIGNAL( showDaySignal( QDate ) ) );
1274 connect( cell, SIGNAL( nextCell() ), 1276 connect( cell, SIGNAL( nextCell() ),
1275 SLOT( nextCell() ) ); 1277 SLOT( nextCell() ) );
1276 connect( cell, SIGNAL( prevCell() ), 1278 connect( cell, SIGNAL( prevCell() ),
1277 SLOT( prevCell() ) ); 1279 SLOT( prevCell() ) );
1278 connect( cell, SIGNAL( highlightIncidence( Incidence * , MonthViewCell *, int ) ), 1280 connect( cell, SIGNAL( highlightIncidence( Incidence * , MonthViewCell *, int ) ),
1279 SLOT( incidenceHighlighted( Incidence *, MonthViewCell *, int ) )); 1281 SLOT( incidenceHighlighted( Incidence *, MonthViewCell *, int ) ));
1280 cell->updateConfig(KOPrefs::instance()->mMonthViewUsesBigFont ); 1282 cell->updateConfig(KOPrefs::instance()->mMonthViewUsesBigFont );
1281 } 1283 }
1282 1284
1283 //connect( mWeekLabels[mNumWeeks], SIGNAL( clicked() ), SLOT( switchView() ) ); 1285 //connect( mWeekLabels[mNumWeeks], SIGNAL( clicked() ), SLOT( switchView() ) );
1284 mContextMenu = eventPopup(); 1286 mContextMenu = eventPopup();
1285 mContextMenu->addAdditionalItem(QIconSet(QPixmap()), 1287 mContextMenu->addAdditionalItem(QIconSet(QPixmap()),
1286 i18n("New Event..."),this, 1288 i18n("New Event..."),this,
1287 SLOT(slotNewEvent()),false); 1289 SLOT(slotNewEvent()),false);
1288 mContextMenu->addAdditionalItem(QIconSet(QPixmap()), 1290 mContextMenu->addAdditionalItem(QIconSet(QPixmap()),
1289 i18n("New Todo..."),this, 1291 i18n("New Todo..."),this,
1290 SLOT(slotNewTodo()),false); 1292 SLOT(slotNewTodo()),false);
1291 mContextMenu->addAdditionalItem(QIconSet(QPixmap()), 1293 mContextMenu->addAdditionalItem(QIconSet(QPixmap()),
1292 i18n("Journal"),this, 1294 i18n("Journal"),this,
1293 SLOT(slotEditJournal()),false); 1295 SLOT(slotEditJournal()),false);
1294 1296
1295 connect (mContextMenu ,SIGNAL(categoryChanged( Incidence * )),this, 1297 connect (mContextMenu ,SIGNAL(categoryChanged( Incidence * )),this,
1296 SLOT( catChanged( Incidence * ) )); 1298 SLOT( catChanged( Incidence * ) ));
1297 1299
1298 1300
1299 QString pathString = ""; 1301 QString pathString = "";
1300 if ( !KOPrefs::instance()->mToolBarMiniIcons ) { 1302 if ( !KOPrefs::instance()->mToolBarMiniIcons ) {
1301 if ( QApplication::desktop()->width() < 480 ) 1303 if ( QApplication::desktop()->width() < 480 )
1302 pathString += "icons16/"; 1304 pathString += "icons16/";
1303 } else 1305 } else
1304 pathString += "iconsmini/"; 1306 pathString += "iconsmini/";
1305 mNewItemMenu = new QPopupMenu( this ); 1307 mNewItemMenu = new QPopupMenu( this );
1306 mNewItemMenu->insertItem( SmallIcon( pathString +"newevent" ), i18n("New Event..."),this, SLOT(slotNewEvent())); 1308 mNewItemMenu->insertItem( SmallIcon( pathString +"newevent" ), i18n("New Event..."),this, SLOT(slotNewEvent()));
1307 mNewItemMenu->insertItem( SmallIcon( pathString +"newtodo" ),i18n("New Todo..."),this,SLOT(slotNewTodo()),false); 1309 mNewItemMenu->insertItem( SmallIcon( pathString +"newtodo" ),i18n("New Todo..."),this,SLOT(slotNewTodo()),false);
1308 mNewItemMenu->insertItem( SmallIcon( pathString +"journal" ),i18n("Journal"),this,SLOT(slotEditJournal()),false); 1310 mNewItemMenu->insertItem( SmallIcon( pathString +"journal" ),i18n("Journal"),this,SLOT(slotEditJournal()),false);
1309 1311
1310 // updateConfig(); //useless here... 1312 // updateConfig(); //useless here...
1311 // ... but we need mWidthLongDayLabel computed 1313 // ... but we need mWidthLongDayLabel computed
1312 QFontMetrics fontmetric(mDayLabels[0]->font()); 1314 QFontMetrics fontmetric(mDayLabels[0]->font());
1313 mWidthLongDayLabel = 0; 1315 mWidthLongDayLabel = 0;
1314 for (int i = 0; i < 7; i++) { 1316 for (int i = 0; i < 7; i++) {
1315 int width = fontmetric.width(KOGlobals::self()->calendarSystem()->weekDayName(i+1)); 1317 int width = fontmetric.width(KOGlobals::self()->calendarSystem()->weekDayName(i+1));
1316 if ( width > mWidthLongDayLabel ) mWidthLongDayLabel = width; 1318 if ( width > mWidthLongDayLabel ) mWidthLongDayLabel = width;
1317 } 1319 }
1318 1320
1319 //mWeekLabels[mNumWeeks]->setText( i18n("W")); 1321 //mWeekLabels[mNumWeeks]->setText( i18n("W"));
1320 1322
1321#if 0 1323#if 0
1322 if ( mShowWeekView ) 1324 if ( mShowWeekView )
1323 mWidStack->raiseWidget( mWeekView ); 1325 mWidStack->raiseWidget( mWeekView );
1324 else 1326 else
1325 mWidStack->raiseWidget( mMonthView ); 1327 mWidStack->raiseWidget( mMonthView );
1326#endif 1328#endif
1327 1329
1328 emit incidenceSelected( 0 ); 1330 emit incidenceSelected( 0 );
1329 1331
1330 mComputeLayoutTimer = new QTimer( this ); 1332 mComputeLayoutTimer = new QTimer( this );
1331 connect (mComputeLayoutTimer ,SIGNAL(timeout()), this, SLOT ( slotComputeLayout())); 1333 connect (mComputeLayoutTimer ,SIGNAL(timeout()), this, SLOT ( slotComputeLayout()));
1332 1334
1333 1335
1334#ifndef DESKTOP_VERSION 1336#ifndef DESKTOP_VERSION
1335 resize( QApplication::desktop()->size() ); 1337 resize( QApplication::desktop()->size() );
1336#else 1338#else
1337 resize(640, 480 ); 1339 resize(640, 480 );
1338 updatePossible = true; 1340 updatePossible = true;
1339#endif 1341#endif
1340 computeLayout(); 1342 computeLayout();
1341 1343
1342 if ( mShowWeekView ) 1344 if ( mShowWeekView )
1343 mWidStack->raiseWidget( mWeekView ); 1345 mWidStack->raiseWidget( mWeekView );
1344 else 1346 else
1345 mWidStack->raiseWidget( mMonthView ); 1347 mWidStack->raiseWidget( mMonthView );
1346} 1348}
1347 1349
1348KOMonthView::~KOMonthView() 1350KOMonthView::~KOMonthView()
1349{ 1351{
1350 delete mContextMenu; 1352 delete mContextMenu;
1351} 1353}
1352 1354
1353void KOMonthView::catChanged( Incidence * ) 1355void KOMonthView::catChanged( Incidence * )
1354{ 1356{
1355 updateView(); 1357 updateView();
1356} 1358}
1357void KOMonthView::incidenceHighlighted( Incidence * inc , MonthViewCell* mc, int mday ) 1359void KOMonthView::incidenceHighlighted( Incidence * inc , MonthViewCell* mc, int mday )
1358{ 1360{
1359 static Incidence * lastInc = 0; 1361 static Incidence * lastInc = 0;
1360 static MonthViewCell * lastCell = 0; 1362 static MonthViewCell * lastCell = 0;
1361 1363
1362 if ( lastInc == inc && lastCell == mc ) 1364 if ( lastInc == inc && lastCell == mc )
1363 return; 1365 return;
1364 lastInc = inc; 1366 lastInc = inc;
1365 lastCell = mc; 1367 lastCell = mc;
1366 //qDebug("KOMonthView::incidenceHighlighted %d %d %d", inc, mc, mday ); 1368 //qDebug("KOMonthView::incidenceHighlighted %d %d %d", inc, mc, mday );
1367 1369
1368 bool weekview = false; 1370 bool weekview = false;
1369 uint index = 0; 1371 uint index = 0;
1370 for (uint i = 0; i < mCellsW.count(); ++i) { 1372 for (uint i = 0; i < mCellsW.count(); ++i) {
1371 if ( mCellsW[i] == mc ) { 1373 if ( mCellsW[i] == mc ) {
1372 weekview = true; 1374 weekview = true;
1373 index = i; 1375 index = i;
1374 break; 1376 break;
1375 } 1377 }
1376 } 1378 }
1377 QPtrVector<MonthViewCell> *cells; 1379 QPtrVector<MonthViewCell> *cells;
1378 if ( weekview ) 1380 if ( weekview )
1379 cells = &mCellsW; 1381 cells = &mCellsW;
1380 else { 1382 else {
1381 for (uint i = 0; i < mCells.count(); ++i) { 1383 for (uint i = 0; i < mCells.count(); ++i) {
1382 if ( mCells[i] == mc ) { 1384 if ( mCells[i] == mc ) {
1383 index = i; 1385 index = i;
1384 break; 1386 break;
1385 } 1387 }
1386 } 1388 }
1387 cells = &mCells; 1389 cells = &mCells;
1388 } 1390 }
1389 for (uint i = 0; i < (*cells).count(); ++i) { 1391 for (uint i = 0; i < (*cells).count(); ++i) {
1390 (*cells)[i]->deHighLight(); 1392 (*cells)[i]->deHighLight();
1391 } 1393 }
1392 if ( ! inc ) 1394 if ( ! inc )
1393 return; 1395 return;
1394 1396
1395 uint count = (*cells).count(); 1397 uint count = (*cells).count();
1396 bool goLeft = (mday > 1 && index > 0); 1398 bool goLeft = (mday > 1 && index > 0);
1397 bool goRight = (mday < 3 && mday > 0 && index < count -1); 1399 bool goRight = (mday < 3 && mday > 0 && index < count -1);
1398 for (uint iii = 1; iii < count; ++iii) { 1400 for (uint iii = 1; iii < count; ++iii) {
1399 if ( goLeft ) { 1401 if ( goLeft ) {
1400 int left = index - iii; 1402 int left = index - iii;
1401 if ( left >= 0 ) { 1403 if ( left >= 0 ) {
1402 if ( (*cells)[(uint)left]->doHighLight(inc) ) 1404 if ( (*cells)[(uint)left]->doHighLight(inc) )
1403 goLeft = false; 1405 goLeft = false;
1404 } else 1406 } else
1405 goLeft = false; 1407 goLeft = false;
1406 } 1408 }
1407 if ( goRight ) { 1409 if ( goRight ) {
1408 uint right = index + iii; 1410 uint right = index + iii;
1409 if ( right < count ) { 1411 if ( right < count ) {
1410 if ( (*cells)[right]->doHighLight(inc) ) 1412 if ( (*cells)[right]->doHighLight(inc) )
1411 goRight = false; 1413 goRight = false;
1412 1414
1413 } else 1415 } else
1414 goRight = false; 1416 goRight = false;
1415 } 1417 }
1416 1418
1417 } 1419 }
1418#if 0 1420#if 0
1419 if ( mday > 1 && index > 0 ) 1421 if ( mday > 1 && index > 0 )
1420 for (int i = index-1; i >= 0; --i) { 1422 for (int i = index-1; i >= 0; --i) {
1421 //qDebug("index %d iii %d ", index, i); 1423 //qDebug("index %d iii %d ", index, i);
1422 if ( (*cells)[(uint)i]->doHighLight(inc) ) 1424 if ( (*cells)[(uint)i]->doHighLight(inc) )
1423 break; 1425 break;
1424 } 1426 }
1425 if ( mday < 3 && mday > 0 && index < (*cells).count()-1) 1427 if ( mday < 3 && mday > 0 && index < (*cells).count()-1)
1426 for (uint i = index+1; i < (*cells).count(); ++i) { 1428 for (uint i = index+1; i < (*cells).count(); ++i) {
1427 if ( (*cells)[i]->doHighLight(inc) ) 1429 if ( (*cells)[i]->doHighLight(inc) )
1428 break; 1430 break;
1429 } 1431 }
1430#endif 1432#endif
1431 1433
1432} 1434}
1433void KOMonthView::selectInternalWeekNum ( int n ) 1435void KOMonthView::selectInternalWeekNum ( int n )
1434{ 1436{
1435 switchView(); 1437 switchView();
1436 if ( !KOPrefs::instance()->mMonthViewWeek ) 1438 if ( !KOPrefs::instance()->mMonthViewWeek )
1437 emit selectMonth (); 1439 emit selectMonth ();
1438 else 1440 else
1439 emit selectWeekNum ( n ); 1441 emit selectWeekNum ( n );
1440} 1442}
1441 1443
1442int KOMonthView::currentWeek() 1444int KOMonthView::currentWeek()
1443{ 1445{
1444 if ( mShowWeekView ) 1446 if ( mShowWeekView )
1445 return mWeekLabelsW[0]->getWeekNum(); 1447 return mWeekLabelsW[0]->getWeekNum();
1446 return mWeekLabels[0]->getWeekNum(); 1448 return mWeekLabels[0]->getWeekNum();
1447} 1449}
1448void KOMonthView::switchView() 1450void KOMonthView::switchView()
1449{ 1451{
1450 if ( selectedCell( ) ) 1452 if ( selectedCell( ) )
1451 selectedCell()->deselect(); 1453 selectedCell()->deselect();
1452 mShowWeekView = !mShowWeekView; 1454 mShowWeekView = !mShowWeekView;
1453 KOPrefs::instance()->mMonthViewWeek = mShowWeekView; 1455 KOPrefs::instance()->mMonthViewWeek = mShowWeekView;
1454 if ( clPending ) { 1456 if ( clPending ) {
1455 computeLayout(); 1457 computeLayout();
1456 updateConfig(); 1458 updateConfig();
1457 } 1459 }
1458 if ( mShowWeekView ) 1460 if ( mShowWeekView )
1459 mWidStack->raiseWidget( mWeekView ); 1461 mWidStack->raiseWidget( mWeekView );
1460 else 1462 else
1461 mWidStack->raiseWidget( mMonthView ); 1463 mWidStack->raiseWidget( mMonthView );
1462 clPending = false; 1464 clPending = false;
1463} 1465}
1464 1466
1465int KOMonthView::maxDatesHint() 1467int KOMonthView::maxDatesHint()
1466{ 1468{
1467 return mNumCells; 1469 return mNumCells;
1468} 1470}
1469 1471
1470int KOMonthView::currentDateCount() 1472int KOMonthView::currentDateCount()
1471{ 1473{
1472 return mNumCells; 1474 return mNumCells;
1473} 1475}
1474 1476
1475QPtrList<Incidence> KOMonthView::selectedIncidences() 1477QPtrList<Incidence> KOMonthView::selectedIncidences()
1476{ 1478{
1477 QPtrList<Incidence> selected; 1479 QPtrList<Incidence> selected;
1478 1480
1479 if ( mSelectedCell ) { 1481 if ( mSelectedCell ) {
1480 Incidence *incidence = mSelectedCell->selectedIncidence(); 1482 Incidence *incidence = mSelectedCell->selectedIncidence();
1481 if ( incidence ) selected.append( incidence ); 1483 if ( incidence ) selected.append( incidence );
1482 } 1484 }
1483 1485
1484 return selected; 1486 return selected;
1485} 1487}
1486 1488
1487DateList KOMonthView::selectedDates() 1489DateList KOMonthView::selectedDates()
1488{ 1490{
1489 DateList selected; 1491 DateList selected;
1490 1492
1491 if ( mSelectedCell ) { 1493 if ( mSelectedCell ) {
1492 QDate qd = mSelectedCell->selectedIncidenceDate(); 1494 QDate qd = mSelectedCell->selectedIncidenceDate();
1493 if ( qd.isValid() ) selected.append( qd ); 1495 if ( qd.isValid() ) selected.append( qd );
1494 } 1496 }
1495 1497
1496 return selected; 1498 return selected;
1497} 1499}
1498#if 0 1500#if 0
1499void KOMonthView::printPreview(CalPrinter *calPrinter, const QDate &fd, 1501void KOMonthView::printPreview(CalPrinter *calPrinter, const QDate &fd,
1500 const QDate &td) 1502 const QDate &td)
1501{ 1503{
1502#ifndef KORG_NOPRINTER 1504#ifndef KORG_NOPRINTER
1503 calPrinter->preview(CalPrinter::Month, fd, td); 1505 calPrinter->preview(CalPrinter::Month, fd, td);
1504#endif 1506#endif
1505} 1507}
1506#endif 1508#endif
1507void KOMonthView::updateConfig() 1509void KOMonthView::updateConfig()
1508{ 1510{
1509 1511
1510 int mWeekStartsMonday = KGlobal::locale()->weekStartsMonday(); 1512 int mWeekStartsMonday = KGlobal::locale()->weekStartsMonday();
1511 1513
1512 if ( mShowWeekView || KOPrefs::instance()->mMonthViewSatSunTog ) { 1514 if ( mShowWeekView || KOPrefs::instance()->mMonthViewSatSunTog ) {
1513 mWeekStartsMonday = true; 1515 mWeekStartsMonday = true;
1514 } 1516 }
1515 QFontMetrics fontmetric(mDayLabels[0]->font()); 1517 QFontMetrics fontmetric(mDayLabels[0]->font());
1516 mWidthLongDayLabel = 0; 1518 mWidthLongDayLabel = 0;
1517 1519
1518 for (int i = 0; i < 7; i++) { 1520 for (int i = 0; i < 7; i++) {
1519 int width = fontmetric.width(KOGlobals::self()->calendarSystem()->weekDayName(i+1)); 1521 int width = fontmetric.width(KOGlobals::self()->calendarSystem()->weekDayName(i+1));
1520 if ( width > mWidthLongDayLabel ) mWidthLongDayLabel = width; 1522 if ( width > mWidthLongDayLabel ) mWidthLongDayLabel = width;
1521 } 1523 }
1522 bool temp = mShowSatSunComp ; 1524 bool temp = mShowSatSunComp ;
1523 mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ; 1525 mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ;
1524 if ( ! mShowWeekView ) { 1526 if ( ! mShowWeekView ) {
1525 if ( temp != KOPrefs::instance()->mMonthViewSatSunTog ) 1527 if ( temp != KOPrefs::instance()->mMonthViewSatSunTog )
1526 computeLayout(); 1528 computeLayout();
1527 } else 1529 } else
1528 doComputeLayoutWeek(); 1530 doComputeLayoutWeek();
1529 updateDayLabels(); 1531 updateDayLabels();
1530 //qDebug("KOMonthView::updateConfig() %d %d %d ",height(), mDayLabels[0]->sizeHint().height() ,mNumWeeks); 1532 //qDebug("KOMonthView::updateConfig() %d %d %d ",height(), mDayLabels[0]->sizeHint().height() ,mNumWeeks);
1531 //int cellHeight = (height() - mDayLabels[0]->sizeHint().height()) /mNumWeeks; 1533 //int cellHeight = (height() - mDayLabels[0]->sizeHint().height()) /mNumWeeks;
1532 //resizeEvent( 0 ); 1534 //resizeEvent( 0 );
1533 for (uint i = 0; i < mCells.count(); ++i) { 1535 for (uint i = 0; i < mCells.count(); ++i) {
1534 mCells[i]->updateConfig(); 1536 mCells[i]->updateConfig();
1535 } 1537 }
1536 1538
1537 for (uint i = 0; i < mCellsW.count(); ++i) { 1539 for (uint i = 0; i < mCellsW.count(); ++i) {
1538 mCellsW[i]->updateConfig(KOPrefs::instance()->mMonthViewUsesBigFont); 1540 mCellsW[i]->updateConfig(KOPrefs::instance()->mMonthViewUsesBigFont);
1539 } 1541 }
1540#ifdef DESKTOP_VERSION 1542#ifdef DESKTOP_VERSION
1541 MonthViewCell::toolTipGroup()->setEnabled(KOPrefs::instance()->mEnableToolTips); 1543 MonthViewCell::toolTipGroup()->setEnabled(KOPrefs::instance()->mEnableToolTips);
1542#endif 1544#endif
1543 updateView(); 1545 updateView();
1544} 1546}
1545 1547
1546void KOMonthView::updateDayLabels() 1548void KOMonthView::updateDayLabels()
1547{ 1549{
1548 1550
1549 QPtrVector<QLabel> *mDayLabelsT; 1551 QPtrVector<QLabel> *mDayLabelsT;
1550 1552
1551 mDayLabelsT = &mDayLabelsW; 1553 mDayLabelsT = &mDayLabelsW;
1552 for (int i = 0; i < 7; i++) { 1554 for (int i = 0; i < 7; i++) {
1553 { 1555 {
1554 bool show = mShortDayLabelsW; 1556 bool show = mShortDayLabelsW;
1555 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() ) 1557 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() )
1556 show = true; 1558 show = true;
1557 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); 1559 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show));
1558 } 1560 }
1559 } 1561 }
1560 mDayLabelsT = &mDayLabels; 1562 mDayLabelsT = &mDayLabels;
1561 for (int i = 0; i < 7; i++) { 1563 for (int i = 0; i < 7; i++) {
1562 if (KGlobal::locale()->weekStartsMonday() || KOPrefs::instance()->mMonthViewSatSunTog ) { 1564 if (KGlobal::locale()->weekStartsMonday() || KOPrefs::instance()->mMonthViewSatSunTog ) {
1563 bool show = mShortDayLabelsM; 1565 bool show = mShortDayLabelsM;
1564 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() ) 1566 if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() )
1565 show = true; 1567 show = true;
1566 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); 1568 (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show));
1567 } else { 1569 } else {
1568 if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabelsM)); 1570 if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabelsM));
1569 else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabelsM)); 1571 else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabelsM));
1570 1572
1571 } 1573 }
1572 } 1574 }
1573 1575
1574} 1576}
1575 1577
1576void KOMonthView::clearList() 1578void KOMonthView::clearList()
1577{ 1579{
1578 unsigned int i; 1580 unsigned int i;
1579 for( i = 0; i < mCells.size(); ++i ) { 1581 for( i = 0; i < mCells.size(); ++i ) {
1580 mCells[i]->clear(); 1582 mCells[i]->clear();
1581 } 1583 }
1582 for( i = 0; i < mCellsW.size(); ++i ) { 1584 for( i = 0; i < mCellsW.size(); ++i ) {
1583 mCellsW[i]->clear(); 1585 mCellsW[i]->clear();
1584 } 1586 }
1585} 1587}
1586void KOMonthView::showDates(const QDate &start, const QDate &) 1588void KOMonthView::showDates(const QDate &start, const QDate &)
1587{ 1589{
1588 // kdDebug() << "KOMonthView::showDates(): " << start.toString() << endl; 1590 // kdDebug() << "KOMonthView::showDates(): " << start.toString() << endl;
1589 1591
1590 QPtrVector<MonthViewCell> *cells; 1592 QPtrVector<MonthViewCell> *cells;
1591 QPtrVector<QLabel> *dayLabels; 1593 QPtrVector<QLabel> *dayLabels;
1592 QPtrVector<KOWeekButton> *weekLabels; 1594 QPtrVector<KOWeekButton> *weekLabels;
1593 uint weekNum = 6; 1595 uint weekNum = 6;
1594 mStartDate = start; 1596 mStartDate = start;
1595 if ( mShowWeekView ) { 1597 if ( mShowWeekView ) {
1596 weekNum = 1; 1598 weekNum = 1;
1597 cells = &mCellsW; 1599 cells = &mCellsW;
1598 dayLabels = &mDayLabelsW; 1600 dayLabels = &mDayLabelsW;
1599 weekLabels = &mWeekLabelsW; 1601 weekLabels = &mWeekLabelsW;
1600 if ( !KGlobal::locale()->weekStartsMonday() ) { 1602 if ( !KGlobal::locale()->weekStartsMonday() ) {
1601 mStartDate = mStartDate.addDays( 1 ); 1603 mStartDate = mStartDate.addDays( 1 );
1602 } 1604 }
1603 } else { 1605 } else {
1604 cells = &mCells; 1606 cells = &mCells;
1605 dayLabels = &mDayLabels; 1607 dayLabels = &mDayLabels;
1606 weekLabels = &mWeekLabels; 1608 weekLabels = &mWeekLabels;
1607 } 1609 }
1608 1610
1609 int mWeekStartsMonday = KGlobal::locale()->weekStartsMonday(); 1611 int mWeekStartsMonday = KGlobal::locale()->weekStartsMonday();
1610 1612
1611 if ( mShowWeekView || KOPrefs::instance()->mMonthViewSatSunTog ) { 1613 if ( mShowWeekView || KOPrefs::instance()->mMonthViewSatSunTog ) {
1612 mWeekStartsMonday = true; 1614 mWeekStartsMonday = true;
1613 } 1615 }
1614 int startWeekDay = mWeekStartsMonday ? 1 : 7; 1616 int startWeekDay = mWeekStartsMonday ? 1 : 7;
1615 1617
1616 while( KOGlobals::self()->calendarSystem()->dayOfWeek(mStartDate) != startWeekDay ) { 1618 while( KOGlobals::self()->calendarSystem()->dayOfWeek(mStartDate) != startWeekDay ) {
1617 mStartDate = mStartDate.addDays( -1 ); 1619 mStartDate = mStartDate.addDays( -1 );
1618 } 1620 }
1619 uint i; 1621 uint i;
1620 for( i = 0; i < (*cells).size(); ++i ) { 1622 for( i = 0; i < (*cells).size(); ++i ) {
1621 QDate date = mStartDate.addDays( i ); 1623 QDate date = mStartDate.addDays( i );
1622 (*cells)[i]->setDate( date ); 1624 (*cells)[i]->setDate( date );
1623 1625
1624#ifndef KORG_NOPLUGINS 1626#ifndef KORG_NOPLUGINS
1625 // add holiday, if present 1627 // add holiday, if present
1626 QString hstring(KOCore::self()->holiday(date)); 1628 QString hstring(KOCore::self()->holiday(date));
1627 (*cells)[i]->setHoliday( hstring ); 1629 (*cells)[i]->setHoliday( hstring );
1628#endif 1630#endif
1629 1631
1630 } 1632 }
1631 QDate date = mStartDate.addDays( mWeekStartsMonday ? 3 : 4 ); 1633 QDate date = mStartDate.addDays( mWeekStartsMonday ? 3 : 4 );
1632 for( i = 0; i < weekNum; ++i ) { 1634 for( i = 0; i < weekNum; ++i ) {
1633 int wno; 1635 int wno;
1634 // remember, according to ISO 8601, the first week of the year is the 1636 // remember, according to ISO 8601, the first week of the year is the
1635 // first week that contains a thursday. Thus we must subtract off 4, 1637 // first week that contains a thursday. Thus we must subtract off 4,
1636 // not just 1. 1638 // not just 1.
1637 int dayOfYear = date.dayOfYear(); 1639 int dayOfYear = date.dayOfYear();
1638 if (dayOfYear % 7 != 0) 1640 if (dayOfYear % 7 != 0)
1639 wno = dayOfYear / 7 + 1; 1641 wno = dayOfYear / 7 + 1;
1640 else 1642 else
1641 wno =dayOfYear / 7; 1643 wno =dayOfYear / 7;
1642 (*weekLabels)[i]->setWeekNum( wno ); 1644 (*weekLabels)[i]->setWeekNum( wno );
1643 date = date.addDays( 7 ); 1645 date = date.addDays( 7 );
1644 } 1646 }
1645 updateView(); 1647 updateView();
1646} 1648}
1647 1649
1648void KOMonthView::showEvents(QPtrList<Event>) 1650void KOMonthView::showEvents(QPtrList<Event>)
1649{ 1651{
1650 qDebug("KOMonthView::selectEvents is not implemented yet. "); 1652 qDebug("KOMonthView::selectEvents is not implemented yet. ");
1651} 1653}
1652 1654
1653void KOMonthView::changeEventDisplay(Event *, int) 1655void KOMonthView::changeEventDisplay(Event *, int)
1654{ 1656{
1655 // this should be re-written to be much more efficient, but this 1657 // this should be re-written to be much more efficient, but this
1656 // quick-and-dirty-hack gets the job done for right now. 1658 // quick-and-dirty-hack gets the job done for right now.
1657 //qDebug("KOMonthView::changeEventDisplay "); 1659 //qDebug("KOMonthView::changeEventDisplay ");
1658 updateView(); 1660 updateView();
1659} 1661}
1660 1662
1661void KOMonthView::updateView() 1663void KOMonthView::updateView()
1662{ 1664{
1663 1665
1664 if ( !updatePossible ) 1666 if ( !updatePossible )
1665 return; 1667 return;
1666 //qDebug("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU "); 1668 //qDebug("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU ");
1667 //QTime ti; 1669 //QTime ti;
1668 //ti.start(); 1670 //ti.start();
1669 clearSelection(); 1671 clearSelection();
1670 QPtrVector<MonthViewCell> *cells; 1672 QPtrVector<MonthViewCell> *cells;
1671 if ( mShowWeekView ) { 1673 if ( mShowWeekView ) {
1672 cells = &mCellsW; 1674 cells = &mCellsW;
1673 } else { 1675 } else {
1674 cells = &mCells; 1676 cells = &mCells;
1675 } 1677 }
1676#if 1 1678#if 1
1677 int i; 1679 int i;
1678 int timeSpan = (*cells).size()-1; 1680 int timeSpan = (*cells).size()-1;
1679 if ( KOPrefs::instance()->mMonthViewWeek ) 1681 if ( KOPrefs::instance()->mMonthViewWeek )
1680 timeSpan = 6; 1682 timeSpan = 6;
1681 for( i = 0; i < timeSpan + 1; ++i ) { 1683 for( i = 0; i < timeSpan + 1; ++i ) {
1682 (*cells)[i]->startUpdateCell(); 1684 (*cells)[i]->startUpdateCell();
1683 } 1685 }
1684 1686
1685 QPtrList<Event> events = calendar()->events(); 1687 QPtrList<Event> events = calendar()->events();
1686 Event *event; 1688 Event *event;
1687 QDateTime dt; 1689 QDateTime dt;
1688 QDate endDate = mStartDate.addDays( timeSpan ); 1690 QDate endDate = mStartDate.addDays( timeSpan );
1689 for( event = events.first(); event; event = events.next() ) { // for event 1691 for( event = events.first(); event; event = events.next() ) { // for event
1690 if ( event->doesRecur() ) { 1692 if ( event->doesRecur() ) {
1691 bool last; 1693 bool last;
1692 QDateTime incidenceStart = event->recurrence()->getPreviousDateTime( QDateTime( mStartDate ) , &last ); 1694 QDateTime incidenceStart = event->recurrence()->getPreviousDateTime( QDateTime( mStartDate ) , &last );
1693 QDateTime incidenceEnd; 1695 QDateTime incidenceEnd;
1694 int eventlen = event->dtStart().date().daysTo ( event->dtEnd().date() ); 1696 int eventlen = event->dtStart().date().daysTo ( event->dtEnd().date() );
1695 bool invalid = false; 1697 bool invalid = false;
1696 while( true ) { 1698 while( true ) {
1697 if ( incidenceStart.isValid() ) { 1699 if ( incidenceStart.isValid() ) {
1698 incidenceEnd = incidenceStart.addDays( eventlen ); 1700 incidenceEnd = incidenceStart.addDays( eventlen );
1699 int st = incidenceStart.date().daysTo( endDate ); 1701 int st = incidenceStart.date().daysTo( endDate );
1700 if ( st >= 0 ) { // start before timeend 1702 if ( st >= 0 ) { // start before timeend
1701 int end = mStartDate.daysTo( incidenceEnd.date() ); 1703 int end = mStartDate.daysTo( incidenceEnd.date() );
1702 if ( end >= 0 ) { // end after timestart --- got one! 1704 if ( end >= 0 ) { // end after timestart --- got one!
1703 //normalize 1705 //normalize
1704 st = timeSpan - st; 1706 st = timeSpan - st;
1705 if ( st < 0 ) st = 0; 1707 if ( st < 0 ) st = 0;
1706 if ( end > timeSpan ) end = timeSpan; 1708 if ( end > timeSpan ) end = timeSpan;
1707 int iii; 1709 int iii;
1708 //qDebug("found %s %d %d ",event->summary().latin1(), st, end ); 1710 //qDebug("found %s %d %d ",event->summary().latin1(), st, end );
1709 for ( iii = st;iii<= end;++iii) 1711 for ( iii = st;iii<= end;++iii)
1710 (*cells)[iii]->insertEvent( event ); 1712 (*cells)[iii]->insertEvent( event );
1711 } 1713 }
1712 } 1714 }
1713 } else { 1715 } else {
1714 if ( invalid ) 1716 if ( invalid )
1715 break; 1717 break;
1716 invalid = true; 1718 invalid = true;
1717 //qDebug("invalid %s", event->summary().latin1()); 1719 //qDebug("invalid %s", event->summary().latin1());
1718 incidenceStart = QDateTime( mStartDate ).addSecs( -2 );; 1720 incidenceStart = QDateTime( mStartDate ).addSecs( -2 );;
1719 } 1721 }
1720 if ( last ) 1722 if ( last )
1721 break; 1723 break;
1722 bool ok; 1724 bool ok;
1723 incidenceStart = event->getNextOccurence( incidenceStart.addSecs( 1 ) ,&ok ); 1725 incidenceStart = event->getNextOccurence( incidenceStart.addSecs( 1 ) ,&ok );
1724 if ( ! ok ) 1726 if ( ! ok )
1725 break; 1727 break;
1726 if ( incidenceStart.date() > endDate ) 1728 if ( incidenceStart.date() > endDate )
1727 break; 1729 break;
1728 } 1730 }
1729 } else { // no recur 1731 } else { // no recur
1730 if ( !KOPrefs::instance()->mShowSyncEvents && event->uid().left(2) == QString("la") ) 1732 if ( !KOPrefs::instance()->mShowSyncEvents && event->uid().left(2) == QString("la") )
1731 if ( event->uid().left(15) == QString("last-syncEvent-") ) 1733 if ( event->uid().left(15) == QString("last-syncEvent-") )
1732 continue; 1734 continue;
1733 int st = event->dtStart().date().daysTo( endDate ); 1735 int st = event->dtStart().date().daysTo( endDate );
1734 if ( st >= 0 ) { // start before timeend 1736 if ( st >= 0 ) { // start before timeend
1735 int end = mStartDate.daysTo( event->dtEnd().date() ); 1737 int end = mStartDate.daysTo( event->dtEnd().date() );
1736 if ( end >= 0 ) { // end after timestart --- got one! 1738 if ( end >= 0 ) { // end after timestart --- got one!
1737 //normalize 1739 //normalize
1738 st = timeSpan - st; 1740 st = timeSpan - st;
1739 if ( st < 0 ) st = 0; 1741 if ( st < 0 ) st = 0;
1740 if ( end > timeSpan ) end = timeSpan; 1742 if ( end > timeSpan ) end = timeSpan;
1741 int iii; 1743 int iii;
1742 for ( iii = st;iii<= end;++iii) 1744 for ( iii = st;iii<= end;++iii)
1743 (*cells)[iii]->insertEvent( event ); 1745 (*cells)[iii]->insertEvent( event );
1744 } 1746 }
1745 } 1747 }
1746 } 1748 }
1747 } 1749 }
1748 // insert due todos 1750 // insert due todos
1749 QPtrList<Todo> todos = calendar()->todos( ); 1751 QPtrList<Todo> todos = calendar()->todos( );
1750 Todo *todo; 1752 Todo *todo;
1751 for(todo = todos.first(); todo; todo = todos.next()) { 1753 for(todo = todos.first(); todo; todo = todos.next()) {
1752 //insertTodo( todo ); 1754 //insertTodo( todo );
1753 if ( todo->hasDueDate() ) { 1755 if ( todo->hasDueDate() ) {
1754 int day = mStartDate.daysTo( todo->dtDue().date() ); 1756 int day = mStartDate.daysTo( todo->dtDue().date() );
1755 if ( day >= 0 && day < timeSpan + 1) { 1757 if ( day >= 0 && day < timeSpan + 1) {
1756 (*cells)[day]->insertTodo( todo ); 1758 (*cells)[day]->insertTodo( todo );
1757 } 1759 }
1758 } 1760 }
1759 } 1761 }
1760 1762
1761 for( i = 0; i < timeSpan+1; ++i ) { 1763 for( i = 0; i < timeSpan+1; ++i ) {
1762 (*cells)[i]->finishUpdateCell(); 1764 (*cells)[i]->finishUpdateCell();
1763 } 1765 }
1764 processSelectionChange(); 1766 processSelectionChange();
1765 //qApp->processEvents(); 1767 //qApp->processEvents();
1766 for( i = 0; i < timeSpan+1; ++i ) { 1768 for( i = 0; i < timeSpan+1; ++i ) {
1767 //(*cells)[i]->repaintfinishUpdateCell(); 1769 //(*cells)[i]->repaintfinishUpdateCell();
1768 QTimer::singleShot( 0, (*cells)[i], SLOT ( repaintfinishUpdateCell() ) ); 1770 QTimer::singleShot( 0, (*cells)[i], SLOT ( repaintfinishUpdateCell() ) );
1769 } 1771 }
1770 setKeyBFocus(); 1772 setKeyBFocus();
1771#else 1773#else
1772 // old code 1774 // old code
1773 //qDebug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ "); 1775 //qDebug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ");
1774 int i; 1776 int i;
1775 for( i = 0; i < (*cells).count(); ++i ) { 1777 for( i = 0; i < (*cells).count(); ++i ) {
1776 (*cells)[i]->updateCell(); 1778 (*cells)[i]->updateCell();
1777 } 1779 }
1778 1780
1779 //qDebug("KOMonthView::updateView() "); 1781 //qDebug("KOMonthView::updateView() ");
1780 processSelectionChange(); 1782 processSelectionChange();
1781 // qDebug("---------------------------------------------------------------------+ "); 1783 // qDebug("---------------------------------------------------------------------+ ");
1782 (*cells)[0]->setFocus(); 1784 (*cells)[0]->setFocus();
1783#endif 1785#endif
1784 1786
1785 //qDebug("update time %d ", ti.elapsed()); 1787 //qDebug("update time %d ", ti.elapsed());
1786} 1788}
1787 1789
1788void KOMonthView::setKeyBoardFocus() 1790void KOMonthView::setKeyBoardFocus()
1789{ 1791{
1790 //qDebug("KOMonthView::setKeyBoardFocus() "); 1792 //qDebug("KOMonthView::setKeyBoardFocus() ");
1791 bool shootAgain = false; 1793 bool shootAgain = false;
1792 if ( mShowWeekView ) { 1794 if ( mShowWeekView ) {
1793 shootAgain = !mWeekLabelsW[1]->hasFocus(); 1795 shootAgain = !mWeekLabelsW[1]->hasFocus();
1794 mWeekLabelsW[1]->setFocus(); 1796 mWeekLabelsW[1]->setFocus();
1795 } 1797 }
1796 else { 1798 else {
1797 shootAgain = !mWeekLabels[mNumWeeks]->hasFocus(); 1799 shootAgain = !mWeekLabels[mNumWeeks]->hasFocus();
1798 mWeekLabels[mNumWeeks]->setFocus(); 1800 mWeekLabels[mNumWeeks]->setFocus();
1799 } 1801 }
1800 --mKBFcounter; 1802 --mKBFcounter;
1801 if ( shootAgain && mKBFcounter > 0 ) { 1803 if ( shootAgain && mKBFcounter > 0 ) {
1802 QTimer::singleShot( 50, this, SLOT ( setKeyBoardFocus() ) ); 1804 QTimer::singleShot( 50, this, SLOT ( setKeyBoardFocus() ) );
1803 } 1805 }
1804} 1806}
1805void KOMonthView::setKeyBFocus() 1807void KOMonthView::setKeyBFocus()
1806{ 1808{
1807 //qDebug("KOMonthView::setKeyBFocus() "); 1809 //qDebug("KOMonthView::setKeyBFocus() ");
1808 mKBFcounter = 10; 1810 mKBFcounter = 10;
1809 QTimer::singleShot( 0, this, SLOT ( setKeyBoardFocus() ) ); 1811 QTimer::singleShot( 0, this, SLOT ( setKeyBoardFocus() ) );
1810} 1812}
1811void KOMonthView::resizeEvent(QResizeEvent * e) 1813void KOMonthView::resizeEvent(QResizeEvent * e)
1812{ 1814{
1813 //qDebug("KOMonthView::resizeEvent %d %d -- %d %d ", e->size().width(), e->size().height(), e->oldSize().width(), e->oldSize().height()); 1815 //qDebug("KOMonthView::resizeEvent %d %d -- %d %d ", e->size().width(), e->size().height(), e->oldSize().width(), e->oldSize().height());
1814 if ( isVisible() ) { 1816 if ( isVisible() ) {
1815 //qDebug("KOMonthView::isVisible "); 1817 //qDebug("KOMonthView::isVisible ");
1816 slotComputeLayout(); 1818 slotComputeLayout();
1817 } else 1819 } else
1818 mComputeLayoutTimer->start( 100 ); 1820 mComputeLayoutTimer->start( 100 );
1819 if ( e ) 1821 if ( e )
1820 KOEventView::resizeEvent( e ); 1822 KOEventView::resizeEvent( e );
1821} 1823}
1822 1824
1823void KOMonthView::slotComputeLayout() 1825void KOMonthView::slotComputeLayout()
1824{ 1826{
1825 mComputeLayoutTimer->stop(); 1827 mComputeLayoutTimer->stop();
1826 //qDebug("KOMonthView::Post - resizeEvent %d %d ", width(), height() ); 1828 //qDebug("KOMonthView::Post - resizeEvent %d %d ", width(), height() );
1827 computeLayout(); 1829 computeLayout();
1828 clPending = true; 1830 clPending = true;
1829 setKeyBFocus(); 1831 setKeyBFocus();
1830} 1832}
1831 1833
1832void KOMonthView::doComputeLayoutWeek() 1834void KOMonthView::doComputeLayoutWeek()
1833{ 1835{
1834 1836
1835 int daysToShow; 1837 int daysToShow;
1836 bool combinedSatSun = false; 1838 bool combinedSatSun = false;
1837 if (mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ) { 1839 if (mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ) {
1838 daysToShow = 6; 1840 daysToShow = 6;
1839 combinedSatSun = true; 1841 combinedSatSun = true;
1840 } 1842 }
1841 int wid = width();//e 1843 int wid = width();//e
1842 int hei = height()-1-mNavigatorBar->height(); 1844 int hei = height()-1-mNavigatorBar->height();
1843#ifdef DESKTOP_VERSION 1845#ifdef DESKTOP_VERSION
1844 if ( !KOPrefs::instance()->mMonthViewWeekRowlayout ) { 1846 if ( !KOPrefs::instance()->mMonthViewWeekRowlayout ) {
1845 daysToShow = 2; 1847 daysToShow = 2;
1846 } else 1848 } else
1847#endif 1849#endif
1848 { 1850 {
1849 if ( wid < hei + 40 ) 1851 if ( wid < hei + 40 )
1850 daysToShow = 2; 1852 daysToShow = 2;
1851 else 1853 else
1852 daysToShow = 3; 1854 daysToShow = 3;
1853 } 1855 }
1854 bool landscape = (daysToShow == 3); 1856 bool landscape = (daysToShow == 3);
1855 mShowSatSunComp = true; 1857 mShowSatSunComp = true;
1856 combinedSatSun = true; 1858 combinedSatSun = true;
1857 1859
1858 //qDebug("KOMonthView::computeLayout() WWW ------------------------------------ "); 1860 //qDebug("KOMonthView::computeLayout() WWW ------------------------------------ ");
1859 QFontMetrics fm ( mWeekLabels[0]->font() ); 1861 QFontMetrics fm ( mWeekLabels[0]->font() );
1860 int weeklabelwid = fm.width( "888" ); 1862 int weeklabelwid = fm.width( "888" );
1861 wid -= weeklabelwid; 1863 wid -= weeklabelwid;
1862 1864
1863 int colWid = wid / daysToShow; 1865 int colWid = wid / daysToShow;
1864 int dayLabelHei = mDayLabelsW[0]->sizeHint().height(); 1866 int dayLabelHei = mDayLabelsW[0]->sizeHint().height();
1865 int cellHei = (hei - (5- daysToShow )*dayLabelHei) /(5- daysToShow ); 1867 int cellHei = (hei - (5- daysToShow )*dayLabelHei) /(5- daysToShow );
1866 int colModulo = wid % daysToShow; 1868 int colModulo = wid % daysToShow;
1867 int rowModulo = (hei- (5- daysToShow )*dayLabelHei) % daysToShow-1; 1869 int rowModulo = (hei- (5- daysToShow )*dayLabelHei) % daysToShow-1;
1868 //qDebug("rowmod %d ", rowModulo); 1870 //qDebug("rowmod %d ", rowModulo);
1869 int i; 1871 int i;
1870 int x,y,w,h; 1872 int x,y,w,h;
1871 x= 0; 1873 x= 0;
1872 y= 0; 1874 y= 0;
1873 w = colWid; 1875 w = colWid;
1874 h = dayLabelHei ; 1876 h = dayLabelHei ;
1875 for ( i = 0; i < 7; i++) { 1877 for ( i = 0; i < 7; i++) {
diff --git a/korganizer/kotodoeditor.cpp b/korganizer/kotodoeditor.cpp
index 100a81b..682f83b 100644
--- a/korganizer/kotodoeditor.cpp
+++ b/korganizer/kotodoeditor.cpp
@@ -1,453 +1,454 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 1997, 1998 Preston Brown 3 Copyright (c) 1997, 1998 Preston Brown
4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software 17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 19
20 As a special exception, permission is given to link this program 20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source code for Qt in the source distribution. 22 without including the source code for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qtooltip.h> 25#include <qtooltip.h>
26#include <qframe.h> 26#include <qframe.h>
27#include <qpixmap.h> 27#include <qpixmap.h>
28#include <qlayout.h> 28#include <qlayout.h>
29#include <qhbox.h> 29#include <qhbox.h>
30#include <qdir.h> 30#include <qdir.h>
31#include <qdatetime.h> 31#include <qdatetime.h>
32#include <qapplication.h> 32#include <qapplication.h>
33#include <qtabwidget.h> 33#include <qtabwidget.h>
34 34
35#include <kiconloader.h> 35#include <kiconloader.h>
36#include <klocale.h> 36#include <klocale.h>
37#include <kfiledialog.h> 37#include <kfiledialog.h>
38#include <kstandarddirs.h> 38#include <kstandarddirs.h>
39#include <kmessagebox.h> 39#include <kmessagebox.h>
40 40
41#include <libkdepim/categoryselectdialog.h> 41#include <libkdepim/categoryselectdialog.h>
42#include <libkcal/calendarlocal.h> 42#include <libkcal/calendarlocal.h>
43#include <libkcal/calendarresources.h> 43#include <libkcal/calendarresources.h>
44#include <libkcal/resourcecalendar.h> 44#include <libkcal/resourcecalendar.h>
45#include <libkcal/icalformat.h> 45#include <libkcal/icalformat.h>
46#include <kresources/resourceselectdialog.h> 46#include <kresources/resourceselectdialog.h>
47#include <libkdepim/kdateedit.h> 47#include <libkdepim/kdateedit.h>
48 48
49#include "koprefs.h" 49#include "koprefs.h"
50#include "kolocationbox.h" 50#include "kolocationbox.h"
51 51
52#include "kotodoeditor.h" 52#include "kotodoeditor.h"
53extern int globalFlagBlockAgenda; 53extern int globalFlagBlockAgenda;
54 54
55KOTodoEditor::KOTodoEditor( Calendar *calendar, QWidget *parent ) : 55KOTodoEditor::KOTodoEditor( Calendar *calendar, QWidget *parent ) :
56 KOIncidenceEditor( i18n("Edit To-Do"), calendar, parent ) 56 KOIncidenceEditor( i18n("Edit To-Do"), calendar, parent )
57{ 57{
58 mTodo = 0; 58 mTodo = 0;
59 mRelatedTodo = 0; 59 mRelatedTodo = 0;
60 findButton(User1)->hide(); 60 findButton(User1)->hide();
61 init(); 61 init();
62 if ( QApplication::desktop()->height() <= 240 ) 62 if ( QApplication::desktop()->height() <= 240 )
63 hideButtons(); 63 hideButtons();
64} 64}
65 65
66KOTodoEditor::~KOTodoEditor() 66KOTodoEditor::~KOTodoEditor()
67{ 67{
68 emit dialogClose( mTodo ); 68 emit dialogClose( mTodo );
69} 69}
70 70
71void KOTodoEditor::init() 71void KOTodoEditor::init()
72{ 72{
73 setupGeneral(); 73 setupGeneral();
74 setupAttendeesTab(); 74 setupAttendeesTab();
75 setupRecurrence(); 75 setupRecurrence();
76 connect(mGeneral,SIGNAL(datesChecked()),this ,SLOT(checkRecurrence())); 76 connect(mGeneral,SIGNAL(datesChecked()),this ,SLOT(checkRecurrence()));
77 mRecurrence->setDateTimeStr( i18n("<i>The recurrence is computed from the start datetime!</i>") ); 77 mRecurrence->setDateTimeStr( i18n("<i>The recurrence is computed from the start datetime!</i>") );
78 connect(mGeneral,SIGNAL(dateTimesChanged(QDateTime,QDateTime)), 78 connect(mGeneral,SIGNAL(dateTimesChanged(QDateTime,QDateTime)),
79 mRecurrence,SLOT(setDefaultsDates(QDateTime,QDateTime))); 79 mRecurrence,SLOT(setDefaultsDates(QDateTime,QDateTime)));
80} 80}
81void KOTodoEditor::setupRecurrence() 81void KOTodoEditor::setupRecurrence()
82{ 82{
83 QFrame *topFrame = addPage( i18n("Recurrence") ); 83 QFrame *topFrame = addPage( i18n("Recurrence") );
84 QBoxLayout *topLayout = new QVBoxLayout( topFrame ); 84 QBoxLayout *topLayout = new QVBoxLayout( topFrame );
85 85
86 mRecurrence = new KOEditorRecurrence( topFrame ); 86 mRecurrence = new KOEditorRecurrence( topFrame );
87 topLayout->addWidget( mRecurrence ); 87 topLayout->addWidget( mRecurrence );
88} 88}
89 89
90void KOTodoEditor::setCategories( QString s ) 90void KOTodoEditor::setCategories( QString s )
91{ 91{
92 mGeneral->setCategories(s); 92 mGeneral->setCategories(s);
93} 93}
94void KOTodoEditor::setSecrecy( int sec ) 94void KOTodoEditor::setSecrecy( int sec )
95{ 95{
96 mGeneral->setSecrecy( sec ); 96 mGeneral->setSecrecy( sec );
97} 97}
98void KOTodoEditor::reload() 98void KOTodoEditor::reload()
99{ 99{
100 if ( mTodo ) readTodo( mTodo ); 100 if ( mTodo ) readTodo( mTodo );
101} 101}
102 102
103void KOTodoEditor::setupGeneral() 103void KOTodoEditor::setupGeneral()
104{ 104{
105 mGeneral = new KOEditorGeneralTodo(this); 105 mGeneral = new KOEditorGeneralTodo(this);
106 connect ( mGeneral, SIGNAL ( allAccepted() ), this, SLOT ( slotOk () ) ); 106 connect ( mGeneral, SIGNAL ( allAccepted() ), this, SLOT ( slotOk () ) );
107 107
108 // connect(mGeneral,SIGNAL(openCategoryDialog()),mCategoryDialog,SLOT(show())); 108 // connect(mGeneral,SIGNAL(openCategoryDialog()),mCategoryDialog,SLOT(show()));
109 //connect(mCategoryDialog, SIGNAL(categoriesSelected(const QString &)), 109 //connect(mCategoryDialog, SIGNAL(categoriesSelected(const QString &)),
110 // mGeneral,SLOT(setCategories(const QString &))); 110 // mGeneral,SLOT(setCategories(const QString &)));
111 111
112 if (KOPrefs::instance()->mCompactDialogs) { 112 if (KOPrefs::instance()->mCompactDialogs) {
113 QFrame *topFrame = addPage(i18n("General")); 113 QFrame *topFrame = addPage(i18n("General"));
114 114
115 QBoxLayout *topLayout = new QVBoxLayout(topFrame); 115 QBoxLayout *topLayout = new QVBoxLayout(topFrame);
116 if ( QApplication::desktop()->width() < 480 ) { 116 if ( QApplication::desktop()->width() < 480 ) {
117 topLayout->setMargin(marginHintSmall()); 117 topLayout->setMargin(marginHintSmall());
118 topLayout->setSpacing(spacingHintSmall()); 118 topLayout->setSpacing(spacingHintSmall());
119 } else { 119 } else {
120 topLayout->setMargin(marginHint()); 120 topLayout->setMargin(marginHint());
121 topLayout->setSpacing(spacingHint()); 121 topLayout->setSpacing(spacingHint());
122 } 122 }
123 topLayout->addStretch( 1 ); 123 topLayout->addStretch( 1 );
124 mGeneral->initHeader(topFrame,topLayout); 124 mGeneral->initHeader(topFrame,topLayout);
125 topLayout->addStretch( 1 ); 125 topLayout->addStretch( 1 );
126 mGeneral->initTime(topFrame,topLayout); 126 mGeneral->initTime(topFrame,topLayout);
127 topLayout->addStretch( 1 ); 127 topLayout->addStretch( 1 );
128 mGeneral->initAlarm(topFrame,topLayout); 128 mGeneral->initAlarm(topFrame,topLayout);
129 topLayout->addStretch( 1 ); 129 topLayout->addStretch( 1 );
130 mGeneral->enableAlarm( false ); 130 mGeneral->enableAlarm( false );
131 131
132 132
133 QBoxLayout *priorityLayout; 133 QBoxLayout *priorityLayout;
134 if ( QApplication::desktop()->width() < 500 ) 134 if ( QApplication::desktop()->width() < 500 )
135 priorityLayout = new QVBoxLayout( topLayout ); 135 priorityLayout = new QVBoxLayout( topLayout );
136 else 136 else
137 priorityLayout = new QHBoxLayout( topLayout ); 137 priorityLayout = new QHBoxLayout( topLayout );
138 QWidget* prioWidget = new QWidget (topFrame); 138 QWidget* prioWidget = new QWidget (topFrame);
139 priorityLayout->addWidget( prioWidget ); 139 priorityLayout->addWidget( prioWidget );
140 QHBoxLayout* priorityLayout2 = new QHBoxLayout( prioWidget); 140 QHBoxLayout* priorityLayout2 = new QHBoxLayout( prioWidget);
141 141
142 142
143 QIconSet icon; 143 QIconSet icon;
144 if ( QApplication::desktop()->width() < 321 ) 144 if ( QApplication::desktop()->width() < 321 )
145 icon = SmallIcon("fileimport16"); 145 icon = SmallIcon("fileimport16");
146 else 146 else
147 icon = SmallIcon("fileimport"); 147 icon = SmallIcon("fileimport");
148 QPushButton * loadTemplate = new QPushButton( prioWidget); 148 QPushButton * loadTemplate = new QPushButton( prioWidget);
149 loadTemplate->setIconSet (icon ) ; 149 loadTemplate->setIconSet (icon ) ;
150 int size = loadTemplate->sizeHint().height(); 150 int size = loadTemplate->sizeHint().height();
151 loadTemplate->setFixedSize( size, size ); 151 loadTemplate->setFixedSize( size, size );
152 if ( QApplication::desktop()->width() < 321 ) 152 if ( QApplication::desktop()->width() < 321 )
153 icon = SmallIcon("fileexport16"); 153 icon = SmallIcon("fileexport16");
154 else 154 else
155 icon = SmallIcon("fileexport"); 155 icon = SmallIcon("fileexport");
156 QPushButton * saveTemplate = new QPushButton( prioWidget); 156 QPushButton * saveTemplate = new QPushButton( prioWidget);
157 saveTemplate->setIconSet (icon ) ; 157 saveTemplate->setIconSet (icon ) ;
158 saveTemplate->setFixedSize( size, size ); 158 saveTemplate->setFixedSize( size, size );
159 159
160 priorityLayout2->addWidget(loadTemplate); 160 priorityLayout2->addWidget(loadTemplate);
161 priorityLayout2->addWidget(saveTemplate); 161 priorityLayout2->addWidget(saveTemplate);
162 mGeneral->initPriority(prioWidget,priorityLayout2); 162 mGeneral->initPriority(prioWidget,priorityLayout2);
163 mGeneral->initCategories( topFrame, priorityLayout ); 163 mGeneral->initCategories( topFrame, priorityLayout );
164 topLayout->addStretch(1); 164 topLayout->addStretch(1);
165 165
166 QFrame *topFrame2 = addPage(i18n("Details")); 166 QFrame *topFrame2 = addPage(i18n("Details"));
167 167
168 QBoxLayout *topLayout2 = new QVBoxLayout(topFrame2); 168 QBoxLayout *topLayout2 = new QVBoxLayout(topFrame2);
169 topLayout2->setMargin(marginHint()); 169 topLayout2->setMargin(marginHint());
170 topLayout2->setSpacing(spacingHint()); 170 topLayout2->setSpacing(spacingHint());
171 171
172 QHBoxLayout *completionLayout = new QHBoxLayout( topLayout2 ); 172 QHBoxLayout *completionLayout = new QHBoxLayout( topLayout2 );
173 mGeneral->initCompletion(topFrame2,completionLayout); 173 mGeneral->initCompletion(topFrame2,completionLayout);
174 174
175 175
176 mGeneral->initSecrecy( topFrame2, topLayout2 ); 176 mGeneral->initSecrecy( topFrame2, topLayout2 );
177 mGeneral->initDescription(topFrame2,topLayout2); 177 mGeneral->initDescription(topFrame2,topLayout2);
178 178
179 // QHBox * hb = new QHBox ( topFrame2 ); 179 // QHBox * hb = new QHBox ( topFrame2 );
180 // topLayout2->addWidget(hb); 180 // topLayout2->addWidget(hb);
181 // hb->setSpacing( 3 ); 181 // hb->setSpacing( 3 );
182 182
183 connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) ); 183 connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) );
184 connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) ); 184 connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) );
185 185
186 } else { 186 } else {
187 QFrame *topFrame = addPage(i18n("General")); 187 QFrame *topFrame = addPage(i18n("General"));
188 188
189 QBoxLayout *topLayout = new QVBoxLayout(topFrame); 189 QBoxLayout *topLayout = new QVBoxLayout(topFrame);
190 topLayout->setSpacing(spacingHint()); 190 topLayout->setSpacing(spacingHint());
191 191
192 mGeneral->initHeader(topFrame,topLayout); 192 mGeneral->initHeader(topFrame,topLayout);
193 mGeneral->initTime(topFrame,topLayout); 193 mGeneral->initTime(topFrame,topLayout);
194 mGeneral->initStatus(topFrame,topLayout); 194 mGeneral->initStatus(topFrame,topLayout);
195 QBoxLayout *alarmLineLayout = new QHBoxLayout(topLayout); 195 QBoxLayout *alarmLineLayout = new QHBoxLayout(topLayout);
196 mGeneral->initAlarm(topFrame,alarmLineLayout); 196 mGeneral->initAlarm(topFrame,alarmLineLayout);
197 mGeneral->initDescription(topFrame,topLayout); 197 mGeneral->initDescription(topFrame,topLayout);
198 QBoxLayout *detailsLayout = new QHBoxLayout(topLayout); 198 QBoxLayout *detailsLayout = new QHBoxLayout(topLayout);
199 mGeneral->initCategories( topFrame, detailsLayout ); 199 mGeneral->initCategories( topFrame, detailsLayout );
200 mGeneral->initSecrecy( topFrame, detailsLayout ); 200 mGeneral->initSecrecy( topFrame, detailsLayout );
201 } 201 }
202 mGeneral->finishSetup(); 202 mGeneral->finishSetup();
203 203
204} 204}
205 205
206void KOTodoEditor::editTodo(Todo *todo, bool editDescription) 206void KOTodoEditor::editTodo(Todo *todo, bool editDescription)
207{ 207{
208 //init(); 208 //init();
209 209
210 mTodo = todo; 210 mTodo = todo;
211 readTodo(mTodo); 211 readTodo(mTodo);
212 if ( editDescription ) { 212 if ( editDescription ) {
213 showPage( 1 ); 213 showPage( 1 );
214 mGeneral->setFocusOn( 1 ); 214 mGeneral->setFocusOn( 1 );
215 } else { 215 } else {
216 showPage( 0 ); 216 showPage( 0 );
217 mGeneral->setFocusOn( 2 ); 217 mGeneral->setFocusOn( 2 );
218 } 218 }
219 checkRecurrence(); 219 checkRecurrence();
220} 220}
221 221
222void KOTodoEditor::newTodo(QDateTime due,Todo *relatedTodo,bool allDay) 222void KOTodoEditor::newTodo(QDateTime due,Todo *relatedTodo,bool allDay)
223{ 223{
224 //init(); 224 //init();
225 225
226 mTodo = 0; 226 mTodo = 0;
227 setDefaults(due,relatedTodo,allDay); 227 setDefaults(due,relatedTodo,allDay);
228} 228}
229 229
230void KOTodoEditor::loadDefaults() 230void KOTodoEditor::loadDefaults()
231{ 231{
232 setDefaults(QDateTime::currentDateTime().addDays(7),0,false); 232 setDefaults(QDateTime::currentDateTime().addDays(7),0,false);
233} 233}
234 234
235bool KOTodoEditor::processInput( bool emitTime ) 235bool KOTodoEditor::processInput( bool emitTime )
236{ 236{
237 if (!validateInput()) return false; 237 if (!validateInput()) return false;
238 238
239 Todo *todo = 0; 239 Todo *todo = 0;
240 240
241 if (mTodo) todo = mTodo; 241 if (mTodo) todo = mTodo;
242 else { 242 else {
243 todo = new Todo; 243 todo = new Todo;
244 todo->setOrganizer(KOPrefs::instance()->email()); 244 todo->setOrganizer(KOPrefs::instance()->email());
245 } 245 }
246 246
247 writeTodo(todo); 247 writeTodo(todo);
248 if ( emitTime ) { 248 if ( emitTime ) {
249 globalFlagBlockAgenda = 1; 249 globalFlagBlockAgenda = 1;
250 emit showAgendaView( false ); 250 emit showAgendaView( false );
251 if ( todo->hasDueDate() ) 251 if ( todo->hasDueDate() )
252 emit jumpToTime( todo->dtDue().date() ); 252 emit jumpToTime( todo->dtDue().date() );
253 globalFlagBlockAgenda = 2; 253 globalFlagBlockAgenda = 2;
254 } 254 }
255 if (mTodo) { 255 if (mTodo) {
256 todo->setRevision(todo->revision()+1); 256 todo->setRevision(todo->revision()+1);
257 emit todoChanged(todo); 257 emit todoChanged(todo);
258 } else { 258 } else {
259 mCalendar->addTodo(todo); 259 mCalendar->addTodo(todo);
260 mTodo = todo; 260 mTodo = todo;
261 emit todoAdded(todo); 261 emit todoAdded(todo);
262 } 262 }
263 263
264 return true; 264 return true;
265} 265}
266 266
267void KOTodoEditor::deleteTodo() 267void KOTodoEditor::deleteTodo()
268{ 268{
269 if (mTodo) { 269 if (mTodo) {
270 if (KOPrefs::instance()->mConfirm) { 270 if (KOPrefs::instance()->mConfirm) {
271 switch (msgItemDelete()) { 271 switch (msgItemDelete()) {
272 case KMessageBox::Continue: // OK 272 case KMessageBox::Continue: // OK
273 emit todoToBeDeleted(mTodo); 273 emit todoToBeDeleted(mTodo);
274 emit dialogClose(mTodo); 274 emit dialogClose(mTodo);
275 mCalendar->deleteTodo(mTodo); 275 mCalendar->deleteTodo(mTodo);
276 emit todoDeleted(); 276 emit todoDeleted();
277 reject(); 277 reject();
278 break; 278 break;
279 } 279 }
280 } 280 }
281 else { 281 else {
282 emit todoToBeDeleted(mTodo); 282 emit todoToBeDeleted(mTodo);
283 emit dialogClose(mTodo); 283 emit dialogClose(mTodo);
284 mCalendar->deleteTodo(mTodo); 284 mCalendar->deleteTodo(mTodo);
285 emit todoDeleted(); 285 emit todoDeleted();
286 reject(); 286 reject();
287 } 287 }
288 } else { 288 } else {
289 reject(); 289 reject();
290 } 290 }
291} 291}
292 292
293void KOTodoEditor::setDefaults(QDateTime due,Todo *relatedEvent,bool allDay) 293void KOTodoEditor::setDefaults(QDateTime due,Todo *relatedEvent,bool allDay)
294{ 294{
295 mRelatedTodo = relatedEvent; 295 mRelatedTodo = relatedEvent;
296 296
297 mGeneral->setDefaults(due,allDay); 297 mGeneral->setDefaults(due,allDay);
298 mDetails->setDefaults(); 298 mDetails->setDefaults();
299 showPage( 0 ); 299 showPage( 0 );
300 if ( mRelatedTodo ) { 300 if ( mRelatedTodo ) {
301 mGeneral->fillCalCombo(mRelatedTodo->calID() ); 301 mGeneral->fillCalCombo(mRelatedTodo->calID() );
302 mGeneral->setCategories (mRelatedTodo->categoriesStr ()); 302 mGeneral->setCategories (mRelatedTodo->categoriesStr ());
303 mGeneral->setSecrecy (mRelatedTodo->secrecy ()); 303 mGeneral->setSecrecy (mRelatedTodo->secrecy ());
304 if ( mRelatedTodo->priority() < 3 ) 304 if ( mRelatedTodo->priority() < 3 )
305 mGeneral->mPriorityCombo->setCurrentItem(mRelatedTodo->priority()-1); 305 mGeneral->mPriorityCombo->setCurrentItem(mRelatedTodo->priority()-1);
306 mGeneral->mSummaryEdit->lineEdit()->setText(mRelatedTodo->summary()+": "); 306 mGeneral->mSummaryEdit->lineEdit()->setText(mRelatedTodo->summary()+": ");
307 int len = mRelatedTodo->summary().length(); 307 int len = mRelatedTodo->summary().length();
308 mGeneral->mSummaryEdit->lineEdit()->setFocus(); 308 mGeneral->mSummaryEdit->lineEdit()->setFocus();
309 mGeneral->mSummaryEdit->lineEdit()->setCursorPosition ( len+2 ); 309 mGeneral->mSummaryEdit->lineEdit()->setCursorPosition ( len+2 );
310 mGeneral->mSummaryEdit->lineEdit()->setSelection ( 0, len+2 ); 310 mGeneral->mSummaryEdit->lineEdit()->setSelection ( 0, len+2 );
311 311
312 } else 312 } else
313 mGeneral->setFocusOn( 2 ); 313 mGeneral->setFocusOn( 2 );
314 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false ); 314 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false );
315 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 )); 315 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ));
316} 316}
317void KOTodoEditor::checkRecurrence() 317void KOTodoEditor::checkRecurrence()
318{ 318{
319 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) { 319 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) {
320 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), true ); 320 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), true );
321 321
322 if ( mTodo ) 322 if ( mTodo )
323 mRecurrence->readEvent( mTodo ); 323 mRecurrence->readEvent( mTodo );
324 else { 324 else {
325 bool time = mGeneral->mTimeButton->isChecked(); 325 bool time = mGeneral->mTimeButton->isChecked();
326 QDateTime from,to; 326 QDateTime from,to;
327 if ( time ) { 327 if ( time ) {
328 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ; 328 to = QDateTime( mGeneral->mDueDateEdit->date(), mGeneral->mDueTimeEdit->getTime() ) ;
329 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ; 329 from = QDateTime( mGeneral->mStartDateEdit->date(),mGeneral->mStartTimeEdit->getTime( )) ;
330 } else { 330 } else {
331 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ; 331 to = QDateTime( mGeneral->mDueDateEdit->date(), QTime( 0,0,0) ) ;
332 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ; 332 from = QDateTime( mGeneral->mStartDateEdit->date(),QTime( 0,0,0) ) ;
333 } 333 }
334 if ( to < from ) 334 if ( to < from )
335 to = from; 335 to = from;
336 mRecurrence->setDefaults(from,to); 336 mRecurrence->setDefaults(from,to);
337 } 337 }
338 } else { 338 } else {
339 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false ); 339 tabWidget()->setTabEnabled ( mRecurrence->parentWidget(), false );
340 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 )); 340 mRecurrence->setDefaults(QDateTime::currentDateTime(),QDateTime::currentDateTime().addSecs( 3600 ));
341 } 341 }
342} 342}
343void KOTodoEditor::readTodo(Todo *todo) 343void KOTodoEditor::readTodo(Todo *todo)
344{ 344{
345 mGeneral->readTodo(todo); 345 mGeneral->readTodo(todo);
346 mDetails->readEvent(todo); 346 mDetails->readEvent(todo);
347 mRelatedTodo = 0;//todo->relatedTo(); 347 mRelatedTodo = 0;//todo->relatedTo();
348 // categories 348 // categories
349 // mCategoryDialog->setSelected(todo->categories()); 349 // mCategoryDialog->setSelected(todo->categories());
350 350
351 // We should handle read-only events here. 351 // We should handle read-only events here.
352} 352}
353 353
354void KOTodoEditor::writeTodo(Todo *event) 354void KOTodoEditor::writeTodo(Todo *event)
355{ 355{
356 bool maybeComputeRecurrenceTime = false; 356 bool maybeComputeRecurrenceTime = false;
357 if( event->hasRecurrenceID() && event->percentComplete() < 100) 357 if( event->hasRecurrenceID() && event->percentComplete() < 100)
358 maybeComputeRecurrenceTime = true; 358 maybeComputeRecurrenceTime = true;
359 event->setHasRecurrenceID( false ); 359 event->setHasRecurrenceID( false );
360 mGeneral->writeTodo(event); 360 mGeneral->writeTodo(event);
361 mDetails->writeEvent(event); 361 mDetails->writeEvent(event);
362 362
363 // set related event, i.e. parent to-do in this case. 363 // set related event, i.e. parent to-do in this case.
364 if (mRelatedTodo) { 364 if (mRelatedTodo) {
365 event->setRelatedTo(mRelatedTodo); 365 event->setRelatedTo(mRelatedTodo);
366 } 366 }
367 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) { 367 if ( mGeneral->mDueCheck->isChecked() && mGeneral->mStartCheck->isChecked()) {
368 mRecurrence->writeEvent(event); 368 mRecurrence->writeEvent(event);
369 if ( event->doesRecur() ) { 369 if ( event->doesRecur() ) {
370 int addSec = -1 ; 370 int addSec = -1 ;
371 if ( maybeComputeRecurrenceTime && event->percentComplete() == 100 ) 371 if ( maybeComputeRecurrenceTime && event->percentComplete() == 100 )
372 addSec = 1; 372 addSec = 1;
373 event->setRecurrenceID( event->dtStart().addSecs( addSec ) ); 373 event->setRecurrenceID( event->dtStart().addSecs( addSec ) );
374 event->setRecurDates(); 374 event->setRecurDates();
375 } else { 375 } else {
376 event->setHasRecurrenceID( false ); 376 event->setHasRecurrenceID( false );
377 } 377 }
378 } else { 378 } else {
379 event->setHasRecurrenceID( false ); 379 event->setHasRecurrenceID( false );
380 event->recurrence()->unsetRecurs(); 380 if ( event->doesRecur() )
381 event->recurrence()->unsetRecurs();
381 } 382 }
382} 383}
383 384
384bool KOTodoEditor::validateInput() 385bool KOTodoEditor::validateInput()
385{ 386{
386 if (!mGeneral->validateInput()) return false; 387 if (!mGeneral->validateInput()) return false;
387 if (!mDetails->validateInput()) return false; 388 if (!mDetails->validateInput()) return false;
388 return true; 389 return true;
389} 390}
390 391
391int KOTodoEditor::msgItemDelete() 392int KOTodoEditor::msgItemDelete()
392{ 393{
393 return KMessageBox::warningContinueCancel(this, 394 return KMessageBox::warningContinueCancel(this,
394 i18n("This item will be permanently deleted."), 395 i18n("This item will be permanently deleted."),
395 i18n("KOrganizer Confirmation"),i18n("Delete")); 396 i18n("KOrganizer Confirmation"),i18n("Delete"));
396} 397}
397 398
398void KOTodoEditor::modified (int modification) 399void KOTodoEditor::modified (int modification)
399{ 400{
400 if (modification == KOGlobals::CATEGORY_MODIFIED || 401 if (modification == KOGlobals::CATEGORY_MODIFIED ||
401 KOGlobals::UNKNOWN_MODIFIED == modification ) 402 KOGlobals::UNKNOWN_MODIFIED == modification )
402 // mCategoryDialog->setSelected (mTodo->categories ()); 403 // mCategoryDialog->setSelected (mTodo->categories ());
403 mGeneral->modified (mTodo, modification); 404 mGeneral->modified (mTodo, modification);
404 405
405} 406}
406 407
407void KOTodoEditor::slotLoadTemplate() 408void KOTodoEditor::slotLoadTemplate()
408{ 409{
409 410
410 QString fileName =locateLocal( "templates", "todos" ); 411 QString fileName =locateLocal( "templates", "todos" );
411 QDir t_dir; 412 QDir t_dir;
412 if ( !t_dir.exists(fileName) ) 413 if ( !t_dir.exists(fileName) )
413 t_dir.mkdir ( fileName ); 414 t_dir.mkdir ( fileName );
414 fileName += "/todo"; 415 fileName += "/todo";
415 fileName = KFileDialog::getSaveFileName( fileName , "Load Todo template", this ); 416 fileName = KFileDialog::getSaveFileName( fileName , "Load Todo template", this );
416 if ( fileName.length() == 0 ) 417 if ( fileName.length() == 0 )
417 return; 418 return;
418 CalendarLocal cal; 419 CalendarLocal cal;
419 ICalFormat format; 420 ICalFormat format;
420 if ( !format.load( &cal, fileName ) ) { 421 if ( !format.load( &cal, fileName ) ) {
421 KMessageBox::error( this, i18n("Error loading template file\n '%1'.") 422 KMessageBox::error( this, i18n("Error loading template file\n '%1'.")
422 .arg( fileName ) ); 423 .arg( fileName ) );
423 return ; 424 return ;
424 } 425 }
425 QPtrList<Todo> todos = cal.todos(); 426 QPtrList<Todo> todos = cal.todos();
426 Todo * todo = todos.first(); 427 Todo * todo = todos.first();
427 if ( !todo ) { 428 if ( !todo ) {
428 KMessageBox::error( this, 429 KMessageBox::error( this,
429 i18n("Template does not\ncontain a valid Todo.")); 430 i18n("Template does not\ncontain a valid Todo."));
430 } else { 431 } else {
431 readTodo( todo ); 432 readTodo( todo );
432 } 433 }
433 434
434} 435}
435 436
436void KOTodoEditor::slotSaveTemplate() 437void KOTodoEditor::slotSaveTemplate()
437{ 438{
438 QString fileName =locateLocal( "templates", "todos" ); 439 QString fileName =locateLocal( "templates", "todos" );
439 QDir t_dir; 440 QDir t_dir;
440 if ( !t_dir.exists(fileName) ) 441 if ( !t_dir.exists(fileName) )
441 t_dir.mkdir ( fileName ); 442 t_dir.mkdir ( fileName );
442 fileName += "/todo"; 443 fileName += "/todo";
443 fileName = KFileDialog::getSaveFileName( fileName , "Save as Todo template", this ); 444 fileName = KFileDialog::getSaveFileName( fileName , "Save as Todo template", this );
444 if ( fileName.length() > 0 ) 445 if ( fileName.length() > 0 )
445 saveTemplate( fileName ); 446 saveTemplate( fileName );
446} 447}
447 448
448void KOTodoEditor::saveTemplate( const QString &templateName ) 449void KOTodoEditor::saveTemplate( const QString &templateName )
449{ 450{
450 Todo *todo = new Todo; 451 Todo *todo = new Todo;
451 writeTodo( todo ); 452 writeTodo( todo );
452 saveAsTemplate( todo, templateName ); 453 saveAsTemplate( todo, templateName );
453} 454}
diff --git a/korganizer/kowhatsnextview.cpp b/korganizer/kowhatsnextview.cpp
index fafcb58..f88403c 100644
--- a/korganizer/kowhatsnextview.cpp
+++ b/korganizer/kowhatsnextview.cpp
@@ -1,803 +1,803 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18*/ 18*/
19 19
20#include <qlayout.h> 20#include <qlayout.h>
21#include <qtextbrowser.h> 21#include <qtextbrowser.h>
22#include <qtextcodec.h> 22#include <qtextcodec.h>
23#include <qfileinfo.h> 23#include <qfileinfo.h>
24#include <qlabel.h> 24#include <qlabel.h>
25 25
26#include <qapplication.h> 26#include <qapplication.h>
27#ifdef DESKTOP_VERSION 27#ifdef DESKTOP_VERSION
28#include <qpaintdevicemetrics.h> 28#include <qpaintdevicemetrics.h>
29#endif 29#endif
30#include <kglobal.h> 30#include <kglobal.h>
31#include <klocale.h> 31#include <klocale.h>
32#include <kdebug.h> 32#include <kdebug.h>
33#include <kiconloader.h> 33#include <kiconloader.h>
34#include <kmessagebox.h> 34#include <kmessagebox.h>
35 35
36#include <libkcal/calendar.h> 36#include <libkcal/calendar.h>
37 37
38#ifndef KORG_NOPRINTER 38#ifndef KORG_NOPRINTER
39#include "calprinter.h" 39#include "calprinter.h"
40#endif 40#endif
41#include "koglobals.h" 41#include "koglobals.h"
42#include "koprefs.h" 42#include "koprefs.h"
43#include "koeventviewerdialog.h" 43#include "koeventviewerdialog.h"
44#include "koeventviewer.h" 44#include "koeventviewer.h"
45#include <qstylesheet.h> 45#include <qstylesheet.h>
46#include "kowhatsnextview.h" 46#include "kowhatsnextview.h"
47using namespace KOrg; 47using namespace KOrg;
48 48
49void WhatsNextTextBrowser::setSource(const QString& n) 49void WhatsNextTextBrowser::setSource(const QString& n)
50{ 50{
51 51
52 if (n.startsWith("event:")) { 52 if (n.startsWith("event:")) {
53 emit showIncidence(n); 53 emit showIncidence(n);
54 return; 54 return;
55 } else if (n.startsWith("todo:")) { 55 } else if (n.startsWith("todo:")) {
56 emit showIncidence(n); 56 emit showIncidence(n);
57 return; 57 return;
58 } else { 58 } else {
59 QTextBrowser::setSource(n); 59 QTextBrowser::setSource(n);
60 } 60 }
61} 61}
62void WhatsNextTextBrowser::printMe() 62void WhatsNextTextBrowser::printMe()
63{ 63{
64#ifdef DESKTOP_VERSION 64#ifdef DESKTOP_VERSION
65 KOPrintPrefs pp ( this ); 65 KOPrintPrefs pp ( this );
66 if (!pp.exec() ) 66 if (!pp.exec() )
67 return; 67 return;
68 int scaleval = pp.printMode() ; 68 int scaleval = pp.printMode() ;
69 69
70 QPrinter printer; 70 QPrinter printer;
71 if (!printer.setup() ) 71 if (!printer.setup() )
72 return; 72 return;
73 QPainter p; 73 QPainter p;
74 p.begin ( &printer ); 74 p.begin ( &printer );
75 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer ); 75 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer );
76 float dx, dy; 76 float dx, dy;
77 int wid = (m.width() * 9)/10; 77 int wid = (m.width() * 9)/10;
78 dx = (float) wid/(float)contentsWidth (); 78 dx = (float) wid/(float)contentsWidth ();
79 dy = (float)(m.height()) / (float)contentsHeight (); 79 dy = (float)(m.height()) / (float)contentsHeight ();
80 float scale; 80 float scale;
81 // scale to fit the width or height of the paper 81 // scale to fit the width or height of the paper
82 if ( dx < dy ) 82 if ( dx < dy )
83 scale = dx; 83 scale = dx;
84 else 84 else
85 scale = dy; 85 scale = dy;
86 p.translate( m.width()/10,0 ); 86 p.translate( m.width()/10,0 );
87 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) { 87 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) {
88 p.scale( scale, scale ); 88 p.scale( scale, scale );
89 } 89 }
90 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () ); 90 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () );
91 p.end(); 91 p.end();
92#endif 92#endif
93} 93}
94 94
95KOWhatsNextView::KOWhatsNextView(Calendar *calendar, QWidget *parent, 95KOWhatsNextView::KOWhatsNextView(Calendar *calendar, QWidget *parent,
96 const char *name) 96 const char *name)
97 : KOrg::BaseView(calendar, parent, name) 97 : KOrg::BaseView(calendar, parent, name)
98{ 98{
99 // mDateLabel = 99 // mDateLabel =
100 // new QLabel(KGlobal::locale()->formatDate(QDate::currentDate()),this); 100 // new QLabel(KGlobal::locale()->formatDate(QDate::currentDate()),this);
101 // mDateLabel->setMargin(2); 101 // mDateLabel->setMargin(2);
102 // mDateLabel->setAlignment(AlignCenter); 102 // mDateLabel->setAlignment(AlignCenter);
103 setFont( KOPrefs::instance()->mWhatsNextFont ); 103 setFont( KOPrefs::instance()->mWhatsNextFont );
104 mView = new WhatsNextTextBrowser(this); 104 mView = new WhatsNextTextBrowser(this);
105 connect(mView,SIGNAL(showIncidence(const QString &)),SLOT(showIncidence(const QString &))); 105 connect(mView,SIGNAL(showIncidence(const QString &)),SLOT(showIncidence(const QString &)));
106 QStyleSheet* stsh = mView->styleSheet(); 106 QStyleSheet* stsh = mView->styleSheet();
107 QStyleSheetItem * style ; 107 QStyleSheetItem * style ;
108 style = stsh->item ("h2" ); 108 style = stsh->item ("h2" );
109 if ( style ) { 109 if ( style ) {
110 style->setMargin(QStyleSheetItem::MarginAll,0); 110 style->setMargin(QStyleSheetItem::MarginAll,0);
111 } 111 }
112 style = stsh->item ("h3" ); 112 style = stsh->item ("h3" );
113 if ( style ) { 113 if ( style ) {
114 style->setMargin(QStyleSheetItem::MarginAll,0); 114 style->setMargin(QStyleSheetItem::MarginAll,0);
115 } 115 }
116 mEventViewer = 0; 116 mEventViewer = 0;
117 117
118 QBoxLayout *topLayout = new QVBoxLayout(this); 118 QBoxLayout *topLayout = new QVBoxLayout(this);
119 // topLayout->addWidget(mDateLabel); 119 // topLayout->addWidget(mDateLabel);
120 topLayout->addWidget(mView); 120 topLayout->addWidget(mView);
121 mTimer = new QTimer( this ); 121 mTimer = new QTimer( this );
122 connect(mTimer,SIGNAL( timeout() ),this, SLOT(updateView())); 122 connect(mTimer,SIGNAL( timeout() ),this, SLOT(updateView()));
123 123
124 connect(mView->horizontalScrollBar (),SIGNAL( sliderReleased () ),this, SLOT(restartTimer())); 124 connect(mView->horizontalScrollBar (),SIGNAL( sliderReleased () ),this, SLOT(restartTimer()));
125 connect(mView->verticalScrollBar (),SIGNAL( sliderReleased () ),this, SLOT(restartTimer())); 125 connect(mView->verticalScrollBar (),SIGNAL( sliderReleased () ),this, SLOT(restartTimer()));
126} 126}
127 127
128KOWhatsNextView::~KOWhatsNextView() 128KOWhatsNextView::~KOWhatsNextView()
129{ 129{
130} 130}
131 131
132int KOWhatsNextView::maxDatesHint() 132int KOWhatsNextView::maxDatesHint()
133{ 133{
134 return 0; 134 return 0;
135} 135}
136 136
137int KOWhatsNextView::currentDateCount() 137int KOWhatsNextView::currentDateCount()
138{ 138{
139 return 0; 139 return 0;
140} 140}
141 141
142void KOWhatsNextView::clearList() 142void KOWhatsNextView::clearList()
143{ 143{
144 mTimer->stop(); 144 mTimer->stop();
145 mView->setText(" "); 145 mView->setText(" ");
146} 146}
147QPtrList<Incidence> KOWhatsNextView::selectedIncidences() 147QPtrList<Incidence> KOWhatsNextView::selectedIncidences()
148{ 148{
149 QPtrList<Incidence> eventList; 149 QPtrList<Incidence> eventList;
150 150
151 return eventList; 151 return eventList;
152} 152}
153 153
154void KOWhatsNextView::printMe() 154void KOWhatsNextView::printMe()
155{ 155{
156#ifdef DESKTOP_VERSION 156#ifdef DESKTOP_VERSION
157 mView->printMe(); 157 mView->printMe();
158#endif 158#endif
159} 159}
160void KOWhatsNextView::printPreview(CalPrinter *calPrinter, const QDate &fd, 160void KOWhatsNextView::printPreview(CalPrinter *calPrinter, const QDate &fd,
161 const QDate &td) 161 const QDate &td)
162{ 162{
163#ifndef KORG_NOPRINTER 163#ifndef KORG_NOPRINTER
164 calPrinter->preview(CalPrinter::Day, fd, td); 164 calPrinter->preview(CalPrinter::Day, fd, td);
165#endif 165#endif
166} 166}
167void KOWhatsNextView::updateConfig() 167void KOWhatsNextView::updateConfig()
168{ 168{
169 setFont( KOPrefs::instance()->mWhatsNextFont ); 169 setFont( KOPrefs::instance()->mWhatsNextFont );
170 updateView(); 170 updateView();
171 171
172} 172}
173void KOWhatsNextView::showEvent ( QShowEvent * e ) 173void KOWhatsNextView::showEvent ( QShowEvent * e )
174{ 174{
175 //qDebug("KOWhatsNextView::showEvent "); 175 //qDebug("KOWhatsNextView::showEvent ");
176 restartTimer(); 176 restartTimer();
177 QWidget::showEvent ( e ); 177 QWidget::showEvent ( e );
178} 178}
179void KOWhatsNextView::hideEvent ( QHideEvent * e) 179void KOWhatsNextView::hideEvent ( QHideEvent * e)
180{ 180{
181 //qDebug(" KOWhatsNextView::hideEvent"); 181 //qDebug(" KOWhatsNextView::hideEvent");
182 mTimer->stop(); 182 mTimer->stop();
183 QWidget::hideEvent ( e ); 183 QWidget::hideEvent ( e );
184} 184}
185void KOWhatsNextView::restartTimer() 185void KOWhatsNextView::restartTimer()
186{ 186{
187 //qDebug("KOWhatsNextView::restartTimer() "); 187 //qDebug("KOWhatsNextView::restartTimer() ");
188 mTimer->start( 300000 ); 188 mTimer->start( 300000 );
189 //mTimer->start( 5000 ); 189 //mTimer->start( 5000 );
190} 190}
191void KOWhatsNextView::updateView() 191void KOWhatsNextView::updateView()
192{ 192{
193 //qDebug("KOWhatsNextView::updateView() "); 193 //qDebug("KOWhatsNextView::updateView() ");
194 if ( mTimer->isActive() ) 194 if ( mTimer->isActive() )
195 restartTimer(); 195 restartTimer();
196 mCurrentMaxPrio = 5; 196 mCurrentMaxPrio = 5;
197 //qDebug("KOWhatsNextView::updateView() "); 197 //qDebug("KOWhatsNextView::updateView() ");
198 // mDateLabel->setText(KGlobal::locale()->formatDate(QDate::currentDate())); 198 // mDateLabel->setText(KGlobal::locale()->formatDate(QDate::currentDate()));
199 KIconLoader kil("korganizer"); 199 KIconLoader kil("korganizer");
200 QString ipath;// = new QString(); 200 QString ipath;// = new QString();
201 // kil.loadIcon("korganizer",KIcon::NoGroup,32,KIcon::DefaultState,&ipath); 201 // kil.loadIcon("korganizer",KIcon::NoGroup,32,KIcon::DefaultState,&ipath);
202 //<big><big><strong>" + date + "</strong></big></big>\n"; 202 //<big><big><strong>" + date + "</strong></big></big>\n";
203 mText = "<table width=\"100%\">\n"; 203 mText = "<table width=\"100%\">\n";
204 //mText += "<tr bgcolor=\"#3679AD\"><td><h2>"; 204 //mText += "<tr bgcolor=\"#3679AD\"><td><h2>";
205#ifdef DESKTOP_VERSION 205#ifdef DESKTOP_VERSION
206 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h1>"; 206 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h1>";
207#else 207#else
208 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h2>"; 208 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h2>";
209#endif 209#endif
210 // mText += "<img src=\""; 210 // mText += "<img src=\"";
211 // mText += ipath; 211 // mText += ipath;
212 // mText += "\">"; 212 // mText += "\">";
213 mEventDate = QDate::currentDate(); 213 mEventDate = QDate::currentDate();
214#ifdef DESKTOP_VERSION 214#ifdef DESKTOP_VERSION
215 mText += "<font color=\"#FFFFFF\"> <em>" + KGlobal::locale()->formatDate( mEventDate , false )+"</em></font></h1>"; 215 mText += "<font color=\"#FFFFFF\"> <em>" + KGlobal::locale()->formatDate( mEventDate , false )+"</em></font></h1>";
216#else 216#else
217 mText += "<font color=\"#FFFFFF\"> <em>" + KGlobal::locale()->formatDate( mEventDate , false )+"</em></font></h2>"; 217 mText += "<font color=\"#FFFFFF\"> <em>" + KGlobal::locale()->formatDate( mEventDate , false )+"</em></font></h2>";
218#endif 218#endif
219 mText += "</td></tr>\n<tr bgcolor=\"#EAF8FA\"><td>"; 219 mText += "</td></tr>\n<tr bgcolor=\"#EAF8FA\"><td>";
220 int iii; 220 int iii;
221 mTodos.clear(); 221 mTodos.clear();
222 QPtrList<Event> events; 222 QPtrList<Event> events;
223 QPtrList<Todo> todos = calendar()->todos(); 223 QPtrList<Todo> todos = calendar()->todos();
224 Todo * todo; 224 Todo * todo;
225 //mText += "<h2>" + i18n("Events: ") + "</h2>\n"; 225 //mText += "<h2>" + i18n("Events: ") + "</h2>\n";
226 int daysToShow = KOPrefs::instance()->mWhatsNextDays ; 226 int daysToShow = KOPrefs::instance()->mWhatsNextDays ;
227 bool itemAdded = false; 227 bool itemAdded = false;
228 for ( iii = 0; iii < daysToShow; ++iii ) { 228 for ( iii = 0; iii < daysToShow; ++iii ) {
229 QString date; 229 QString date;
230 itemAdded = false; 230 itemAdded = false;
231 events = calendar()->events( mEventDate, true ); 231 events = calendar()->events( mEventDate, true );
232 232
233 if ( iii == 0 ) { // today !!! 233 if ( iii == 0 ) { // today !!!
234 todo = todos.first(); 234 todo = todos.first();
235 while(todo) { 235 while(todo) {
236 if ( !todo->isCompleted() &&todo->hasDueDate() && todo->dtDue().date() < mEventDate ) { 236 if ( !todo->isCompleted() &&todo->hasDueDate() && todo->dtDue().date() < mEventDate ) {
237 if ( ! itemAdded ) { 237 if ( ! itemAdded ) {
238 appendDay ( iii, mEventDate ); 238 appendDay ( iii, mEventDate );
239 //itemAdded = true; 239 //itemAdded = true;
240 240
241 } //bool reply=false, bool notRed = true, bool appendTable = false); 241 } //bool reply=false, bool notRed = true, bool appendTable = false);
242 appendEvent(todo, false, false, !itemAdded ); 242 appendEvent(todo, false, false, !itemAdded );
243 itemAdded = true; 243 itemAdded = true;
244 } 244 }
245 todo = todos.next(); 245 todo = todos.next();
246 } 246 }
247 } 247 }
248 248
249 249
250 if (events.count() > 0) { 250 if (events.count() > 0) {
251 // mText += "<p></p>"; 251 // mText += "<p></p>";
252 // kil.loadIcon("month",KIcon::NoGroup,22,KIcon::DefaultState,&ipath); 252 // kil.loadIcon("month",KIcon::NoGroup,22,KIcon::DefaultState,&ipath);
253 // mText += "<h2>"; 253 // mText += "<h2>";
254 //mText += " <img src=\""; 254 //mText += " <img src=\"";
255 //mText += ipath; 255 //mText += ipath;
256 //mText += "\">"; 256 //mText += "\">";
257 if ( ! itemAdded ) { 257 if ( ! itemAdded ) {
258 appendDay ( iii, mEventDate ); 258 appendDay ( iii, mEventDate );
259 259
260 } 260 }
261 // for first day (iii == 0) 261 // for first day (iii == 0)
262 // we may have syncevents, or events in the past, which maybe should not be diaplayed 262 // we may have syncevents, or events in the past, which maybe should not be diaplayed
263 // for that reason we cannot append <table> in appendDay () for iii == 0 263 // for that reason we cannot append <table> in appendDay () for iii == 0
264 // we must append it in the first successful call of appendEvent() 264 // we must append it in the first successful call of appendEvent()
265 Event *ev = events.first(); 265 Event *ev = events.first();
266 while(ev) { 266 while(ev) {
267 //qDebug("+++++event append %s", ev->summary().latin1()); 267 //qDebug("+++++event append %s", ev->summary().latin1());
268 if ( true /*!ev->recurrence()->doesRecur() || ev->recursOn( mEventDate)*/) { 268 if ( true /*!ev->recurrence()->doesRecur() || ev->recursOn( mEventDate)*/) {
269 if ( appendEvent(ev, false , iii!= 0,!itemAdded ) ) 269 if ( appendEvent(ev, false , iii!= 0,!itemAdded ) )
270 itemAdded = true; 270 itemAdded = true;
271 } 271 }
272 ev = events.next(); 272 ev = events.next();
273 } 273 }
274 274
275 //mText += "</table>\n"; 275 //mText += "</table>\n";
276 } 276 }
277 277
278 todo = todos.first(); 278 todo = todos.first();
279 while(todo) { 279 while(todo) {
280 if ( !todo->isCompleted() &&todo->hasDueDate() && todo->dtDue().date() == mEventDate ) { 280 if ( !todo->isCompleted() &&todo->hasDueDate() && todo->dtDue().date() == mEventDate ) {
281 if ( ! itemAdded ) { 281 if ( ! itemAdded ) {
282 appendDay ( iii, mEventDate ); 282 appendDay ( iii, mEventDate );
283 //itemAdded = true; 283 //itemAdded = true;
284 } 284 }
285 appendEvent(todo, false , iii!= 0,!itemAdded); 285 appendEvent(todo, false , iii!= 0,!itemAdded);
286 itemAdded = true; 286 itemAdded = true;
287 } 287 }
288 todo = todos.next(); 288 todo = todos.next();
289 } 289 }
290 if ( !itemAdded && iii == 0 ) { 290 if ( !itemAdded && iii == 0 ) {
291 // appendDay ( iii, mEventDate ); 291 // appendDay ( iii, mEventDate );
292 //mText += "<table>"; 292 //mText += "<table>";
293 // mText += "<b><font color=\"#000080\"><em>"+i18n("No event, nothing to do.") +"</em></font></b>\n"; 293 // mText += "<b><font color=\"#000080\"><em>"+i18n("No event, nothing to do.") +"</em></font></b>\n";
294 mText += "<h3 align=\"center\"><font color=\"#008000\"><em>"+i18n("No event, nothing to do.") +"</em></font></h3>\n"; 294 mText += "<h3 align=\"center\"><font color=\"#008000\"><em>"+i18n("No event, nothing to do.") +"</em></font></h3>\n";
295 //mText +="</table>"; 295 //mText +="</table>";
296 } 296 }
297 if ( itemAdded ) 297 if ( itemAdded )
298 mText += "</table>\n"; 298 mText += "</table>\n";
299 mEventDate = mEventDate.addDays( 1 ); 299 mEventDate = mEventDate.addDays( 1 );
300 } 300 }
301 301
302 int topmostPrios = KOPrefs::instance()->mWhatsNextPrios; 302 int topmostPrios = KOPrefs::instance()->mWhatsNextPrios;
303 if (todos.count() > 0 && topmostPrios > 0 ) { 303 if (todos.count() > 0 && topmostPrios > 0 ) {
304 // kil.loadIcon("todo",KIcon::NoGroup,22,KIcon::DefaultState,&ipath); 304 // kil.loadIcon("todo",KIcon::NoGroup,22,KIcon::DefaultState,&ipath);
305 // mText += "<h2>"; 305 // mText += "<h2>";
306 //<img src=\""; 306 //<img src=\"";
307 // mText += ipath; 307 // mText += ipath;
308 // mText += "\">"; 308 // mText += "\">";
309 // mText += i18n("Overdue To-Do:") + "</h2>\n"; 309 // mText += i18n("Overdue To-Do:") + "</h2>\n";
310 310
311 //mText += "<ul>\n"; 311 //mText += "<ul>\n";
312 bool gotone = false; 312 bool gotone = false;
313 int priority = 1; 313 int priority = 1;
314 int priosFound = 0; 314 int priosFound = 0;
315#ifdef DESKTOP_VERSION 315#ifdef DESKTOP_VERSION
316 mText +="<p></p>"; 316 mText +="<p></p>";
317#endif 317#endif
318 318
319 mText +="<h2><em><font color=\"#000080\">" + i18n("Incomplete Todo:") + "</font></em></h2>\n"; 319 mText +="<h2><em><font color=\"#000080\">" + i18n("Incomplete Todo:") + "</font></em></h2>\n";
320 mText += "<ul>\n"; 320 mText += "<ul>\n";
321 while (!gotone && priority<6) { 321 while (!gotone && priority<6) {
322 todo = todos.first(); 322 todo = todos.first();
323 while(todo) { 323 while(todo) {
324 if (!todo->isCompleted() && (todo->priority() == priority) ) { 324 if (!todo->isCompleted() && (todo->priority() == priority) ) {
325 mCurrentMaxPrio = priority - priosFound + topmostPrios -1; 325 mCurrentMaxPrio = priority - priosFound + topmostPrios -1;
326 if ( appendTodo(todo) ) 326 if ( appendTodo(todo) )
327 gotone = true; 327 gotone = true;
328 } 328 }
329 todo = todos.next(); 329 todo = todos.next();
330 } 330 }
331 if ( gotone ) { 331 if ( gotone ) {
332 gotone = false; 332 gotone = false;
333 ++priosFound; 333 ++priosFound;
334 if ( priosFound == topmostPrios ) 334 if ( priosFound == topmostPrios )
335 break; 335 break;
336 } 336 }
337 priority++; 337 priority++;
338 // kdDebug() << "adding the todos..." << endl; 338 // kdDebug() << "adding the todos..." << endl;
339 } 339 }
340 mText += "</ul>\n"; 340 mText += "</ul>\n";
341 } 341 }
342 342
343 int replys = 0; 343 int replys = 0;
344 events = calendar()->events(QDate::currentDate(), QDate(2975,12,6)); 344 events = calendar()->events(QDate::currentDate(), QDate(2975,12,6));
345 if (events.count() > 0) { 345 if (events.count() > 0) {
346 Event *ev = events.first(); 346 Event *ev = events.first();
347 while(ev) { 347 while(ev) {
348 Attendee *me = ev->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email()); 348 Attendee *me = ev->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email());
349 if (me!=0) { 349 if (me!=0) {
350 if (me->status()==Attendee::NeedsAction && me->RSVP()) { 350 if (me->status()==Attendee::NeedsAction && me->RSVP()) {
351 if (replys == 0) { 351 if (replys == 0) {
352 mText += "<p></p>"; 352 mText += "<p></p>";
353 // kil.loadIcon("reply",KIcon::NoGroup,22,KIcon::DefaultState,&ipath); 353 // kil.loadIcon("reply",KIcon::NoGroup,22,KIcon::DefaultState,&ipath);
354 //mText += "<h2>"; 354 //mText += "<h2>";
355 //<img src=\""; 355 //<img src=\"";
356 // mText += ipath; 356 // mText += ipath;
357 // mText += "\">"; 357 // mText += "\">";
358 //mText += i18n("Events and To-Dos that need a reply:") + "</h2>\n"; 358 //mText += i18n("Events and To-Dos that need a reply:") + "</h2>\n";
359 mText +="<h2><em><font color=\"#000080\">" + i18n("Events and To-Dos that need a reply:") + "</font></em></h2>\n"; 359 mText +="<h2><em><font color=\"#000080\">" + i18n("Events and To-Dos that need a reply:") + "</font></em></h2>\n";
360 mText += "<table>\n"; 360 mText += "<table>\n";
361 } 361 }
362 replys++; 362 replys++;
363 appendEvent(ev,true); 363 appendEvent(ev,true);
364 } 364 }
365 } 365 }
366 ev = events.next(); 366 ev = events.next();
367 } 367 }
368 } 368 }
369 todos = calendar()->todos(); 369 todos = calendar()->todos();
370 if (todos.count() > 0) { 370 if (todos.count() > 0) {
371 Todo *to = todos.first(); 371 Todo *to = todos.first();
372 while(to) { 372 while(to) {
373 if ( !to->isCompleted() ){ 373 if ( !to->isCompleted() ){
374 Attendee *me = to->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email()); 374 Attendee *me = to->attendeeByMails(KOPrefs::instance()->mAdditionalMails,KOPrefs::instance()->email());
375 if (me!=0) { 375 if (me!=0) {
376 if (me->status()==Attendee::NeedsAction && me->RSVP()) { 376 if (me->status()==Attendee::NeedsAction && me->RSVP()) {
377 if (replys == 0) { 377 if (replys == 0) {
378 mText +="<h2><em><font color=\"#000080\">" + i18n("Events and To-Dos that need a reply:") + "</font></em></h2>\n"; 378 mText +="<h2><em><font color=\"#000080\">" + i18n("Events and To-Dos that need a reply:") + "</font></em></h2>\n";
379 mText += "<table>\n"; 379 mText += "<table>\n";
380 } 380 }
381 replys++; 381 replys++;
382 appendEvent(to, true); 382 appendEvent(to, true);
383 } 383 }
384 } 384 }
385 } 385 }
386 to = todos.next(); 386 to = todos.next();
387 } 387 }
388 } 388 }
389 if (replys > 0 ) mText += "</table>\n"; 389 if (replys > 0 ) mText += "</table>\n";
390 390
391 391
392 mText += "</td></tr>\n</table>\n"; 392 mText += "</td></tr>\n</table>\n";
393 393
394 mView->setText(mText); 394 mView->setText(mText);
395 mView->setFocus(); 395 mView->setFocus();
396 396
397 // QPixmap bPix = SmallIcon( "back" ); 397 // QPixmap bPix = SmallIcon( "back" );
398 // qDebug("xxxxxxxxxxxxxxxxxxxxx "); 398 // qDebug("xxxxxxxxxxxxxxxxxxxxx ");
399 // QWidget* test = new QWidget(); 399 // QWidget* test = new QWidget();
400 // test->setBackgroundMode(FixedPixmap ); 400 // test->setBackgroundMode(FixedPixmap );
401 // test->setBackgroundPixmap ( bPix ); 401 // test->setBackgroundPixmap ( bPix );
402 // test->resize( 300, 400 ); 402 // test->resize( 300, 400 );
403 // test->show(); 403 // test->show();
404 // mView->setBackgroundMode(FixedPixmap ); 404 // mView->setBackgroundMode(FixedPixmap );
405 // mView->setBackgroundPixmap ( bPix ); 405 // mView->setBackgroundPixmap ( bPix );
406 // qDebug("%s ",mText.latin1()); 406 // qDebug("%s ",mText.latin1());
407} 407}
408 408
409void KOWhatsNextView::appendDay( int i, QDate eventDate ) 409void KOWhatsNextView::appendDay( int i, QDate eventDate )
410{ 410{
411 QString date; 411 QString date;
412 QString day = KGlobal::locale()->formatDate( eventDate , KOPrefs::instance()->mShortDateInViewer); 412 QString day = KGlobal::locale()->formatDate( eventDate , KOPrefs::instance()->mShortDateInViewer);
413 if ( ! KOPrefs::instance()->mShortDateInViewer && QApplication::desktop()->width() < 320 ) { 413 if ( ! KOPrefs::instance()->mShortDateInViewer && QApplication::desktop()->width() < 320 ) {
414 if ( i == 0 ) { 414 if ( i == 0 ) {
415 //mText += "<table>\n"; 415 //mText += "<table>\n";
416 return;//date = "<em><font color=\"#008000\"><em>" + day+"</font></em>"; 416 return;//date = "<em><font color=\"#008000\"><em>" + day+"</font></em>";
417 } 417 }
418 else if ( i == 1 ) 418 else if ( i == 1 )
419 date = "<em><font color=\"#000080\">" + day + "</font></em>" ; 419 date = "<em><font color=\"#000080\">" + day + "</font></em>" ;
420 else date = "<em><font color=\"#000080\">" + day + "</font></em>"; 420 else date = "<em><font color=\"#000080\">" + day + "</font></em>";
421 mText += "<h2>" + date + "</h2>\n"; 421 mText += "<h2>" + date + "</h2>\n";
422 //mText += "<big><big><strong>" + date + "</strong></big></big>\n"; 422 //mText += "<big><big><strong>" + date + "</strong></big></big>\n";
423 mText += "<table>\n"; 423 mText += "<table>\n";
424 424
425 425
426 426
427 } else { 427 } else {
428 if ( i == 0 ) { 428 if ( i == 0 ) {
429 //mText += "<table>\n"; 429 //mText += "<table>\n";
430 return;// date = "<font color=\"#008000\"><em>" +i18n("Today: ") +"</em>" + day+"</font>"; 430 return;// date = "<font color=\"#008000\"><em>" +i18n("Today: ") +"</em>" + day+"</font>";
431 } 431 }
432 432
433#ifdef DESKTOP_VERSION 433#ifdef DESKTOP_VERSION
434 else if ( i == 1 ) { 434 else if ( i == 1 ) {
435 date = "<h2><em><font color=\"#000080\">" + i18n("Tomorrow: ") + day +"</font></em></h2>" ; 435 date = "<h2><em><font color=\"#000080\">" + i18n("Tomorrow: ") + day +"</font></em></h2>" ;
436 } 436 }
437 else date = "<h2><em><font color=\"#000080\">" + i18n("In %1 days: ").arg( i ) +day + "</font></em></h2>"; 437 else date = "<h2><em><font color=\"#000080\">" + i18n("In %1 days: ").arg( i ) +day + "</font></em></h2>";
438#else 438#else
439 else if ( i == 1 ) { 439 else if ( i == 1 ) {
440 date = "<em><font color=\"#000080\">" + i18n("Tomorrow: ") + day +"</font></em>" ; 440 date = "<em><font color=\"#000080\">" + i18n("Tomorrow: ") + day +"</font></em>" ;
441 } 441 }
442 else date = "<em><font color=\"#000080\">" + i18n("In %1 days: ").arg( i ) +day + "</font></em>"; 442 else date = "<em><font color=\"#000080\">" + i18n("In %1 days: ").arg( i ) +day + "</font></em>";
443 443
444#endif 444#endif
445 mText += "<h2>" + date + "</h2>\n"; 445 mText += "<h2>" + date + "</h2>\n";
446 //mText += "<big><big><strong>" + date + "</strong></big></big>\n"; 446 //mText += "<big><big><strong>" + date + "</strong></big></big>\n";
447 mText += "<table>\n"; 447 mText += "<table>\n";
448 } 448 }
449} 449}
450 450
451 451
452void KOWhatsNextView::showDates(const QDate &, const QDate &) 452void KOWhatsNextView::showDates(const QDate &, const QDate &)
453{ 453{
454 updateView(); 454 updateView();
455} 455}
456 456
457void KOWhatsNextView::showEvents(QPtrList<Event>) 457void KOWhatsNextView::showEvents(QPtrList<Event>)
458{ 458{
459} 459}
460 460
461void KOWhatsNextView::changeEventDisplay(Event *, int action) 461void KOWhatsNextView::changeEventDisplay(Event *, int action)
462{ 462{
463 switch(action) { 463 switch(action) {
464 case KOGlobals::EVENTADDED: 464 case KOGlobals::EVENTADDED:
465 updateView(); 465 updateView();
466 break; 466 break;
467 case KOGlobals::EVENTEDITED: 467 case KOGlobals::EVENTEDITED:
468 updateView(); 468 updateView();
469 break; 469 break;
470 case KOGlobals::EVENTDELETED: 470 case KOGlobals::EVENTDELETED:
471 updateView(); 471 updateView();
472 break; 472 break;
473 default: 473 default:
474 updateView(); 474 updateView();
475 kdDebug() << "KOWhatsNextView::changeEventDisplay(): Illegal action " << action << endl; 475 kdDebug() << "KOWhatsNextView::changeEventDisplay(): Illegal action " << action << endl;
476 } 476 }
477} 477}
478 478
479bool KOWhatsNextView::appendEvent(Incidence *ev, bool reply, bool notRed, bool appendTable ) 479bool KOWhatsNextView::appendEvent(Incidence *ev, bool reply, bool notRed, bool appendTable )
480{ 480{
481 if ( !KOPrefs::instance()->mShowSyncEvents && ev->uid().left(15) == QString("last-syncEvent-") ) 481 if ( !KOPrefs::instance()->mShowSyncEvents && ev->uid().left(15) == QString("last-syncEvent-") )
482 return false; 482 return false;
483 QDateTime cdt = QDateTime::currentDateTime(); 483 QDateTime cdt = QDateTime::currentDateTime();
484 QDateTime noc; 484 QDateTime noc;
485 QString tempText; 485 QString tempText;
486 if ( appendTable && !notRed ) { 486 if ( appendTable && !notRed ) {
487 tempText = "<table>"; 487 tempText = "<table>";
488 } 488 }
489 bool ok = true; 489 bool ok = true;
490 if ( reply ) { 490 if ( reply ) {
491 noc = ev->getNextOccurence( cdt, &ok ); 491 noc = ev->getNextOccurence( cdt, &ok );
492 if (! ok && ev->typeID() == eventID) 492 if (! ok && ev->typeID() == eventID)
493 return false; 493 return false;
494 } 494 }
495 bool bDay = false; 495 bool bDay = false;
496 if ( ev->isBirthday() || ev->isAnniversary() ) 496 if ( ev->isBirthday() || ev->isAnniversary() )
497 bDay = true; 497 bDay = true;
498 tempText += "<tr><td><b>"; 498 tempText += "<tr><td><b>";
499 if (ev->typeID() == eventID ) { 499 if (ev->typeID() == eventID ) {
500 if (reply) { 500 if (reply) {
501 if (!ev->doesFloat()) 501 if (!ev->doesFloat())
502 tempText += KGlobal::locale()->formatDateTime( noc , KOPrefs::instance()->mShortDateInViewer) +": "; 502 tempText += KGlobal::locale()->formatDateTime( noc , KOPrefs::instance()->mShortDateInViewer) +": ";
503 else 503 else
504 tempText += KGlobal::locale()->formatDate( noc.date() , KOPrefs::instance()->mShortDateInViewer) +": "; 504 tempText += KGlobal::locale()->formatDate( noc.date() , KOPrefs::instance()->mShortDateInViewer) +": ";
505 505
506 } else { 506 } else {
507 if (!ev->doesFloat()) { 507 if (!ev->doesFloat()) {
508 Event *event = static_cast<Event *>(ev); 508 Event *event = static_cast<Event *>(ev);
509 QDateTime st,end; 509 QDateTime st,end;
510 if ( event->recurrence()->doesRecur() ) { 510 if ( event->doesRecur() ) {
511 QDate recDate= mEventDate; 511 QDate recDate= mEventDate;
512 int days = event->dtStart().date().daysTo (event->dtEnd().date() ); 512 int days = event->dtStart().date().daysTo (event->dtEnd().date() );
513 while ( ! event->recursOn( recDate ) ) { 513 while ( ! event->recursOn( recDate ) ) {
514 recDate = recDate.addDays( -1 ); 514 recDate = recDate.addDays( -1 );
515 515
516 } 516 }
517 st = QDateTime ( recDate, event->dtStart().time() ); 517 st = QDateTime ( recDate, event->dtStart().time() );
518 end = QDateTime ( recDate.addDays( days ), event->dtEnd().time() ); 518 end = QDateTime ( recDate.addDays( days ), event->dtEnd().time() );
519 } 519 }
520 else { 520 else {
521 st = event->dtStart(); 521 st = event->dtStart();
522 end = event->dtEnd(); 522 end = event->dtEnd();
523 } 523 }
524 524
525 525
526 QString dateText; 526 QString dateText;
527 // qDebug("%s %s %s %s ", mEventDate.toString().latin1(),event->summary().latin1(), st .toString().latin1(),end.toString().latin1() ); 527 // qDebug("%s %s %s %s ", mEventDate.toString().latin1(),event->summary().latin1(), st .toString().latin1(),end.toString().latin1() );
528 if ( st.date() < mEventDate ) 528 if ( st.date() < mEventDate )
529 dateText = "++:++-"; 529 dateText = "++:++-";
530 else 530 else
531 dateText = event->dtStartTimeStr() + "-"; 531 dateText = event->dtStartTimeStr() + "-";
532 if ( KOPrefs::instance()->mWhatsNextTime2Lines ) 532 if ( KOPrefs::instance()->mWhatsNextTime2Lines )
533 dateText += " "; 533 dateText += " ";
534 if ( end.date() > mEventDate ) 534 if ( end.date() > mEventDate )
535 dateText += "++:++"; 535 dateText += "++:++";
536 else 536 else
537 dateText += event->dtEndTimeStr(); 537 dateText += event->dtEndTimeStr();
538 if ( notRed ) 538 if ( notRed )
539 tempText += dateText; 539 tempText += dateText;
540 else { 540 else {
541 if ( end < cdt ) { 541 if ( end < cdt ) {
542 if ( !KOPrefs::instance()->mWNViewShowsPast ) 542 if ( !KOPrefs::instance()->mWNViewShowsPast )
543 return false; 543 return false;
544 tempText += "<font color=\"#F00000\">" + dateText + "</font>"; 544 tempText += "<font color=\"#F00000\">" + dateText + "</font>";
545 } 545 }
546 else if ( st < cdt ) 546 else if ( st < cdt )
547 tempText += "<font color=\"#008000\">" + dateText + "</font>"; 547 tempText += "<font color=\"#008000\">" + dateText + "</font>";
548 else 548 else
549 tempText += dateText; 549 tempText += dateText;
550 550
551 } 551 }
552 552
553 } else { 553 } else {
554 if ( bDay ) { 554 if ( bDay ) {
555 555
556 if ( ev->isBirthday()) 556 if ( ev->isBirthday())
557 tempText += "<font color=\"#00B000\">" + i18n("Birthday") +":</font>"; 557 tempText += "<font color=\"#00B000\">" + i18n("Birthday") +":</font>";
558 else 558 else
559 tempText += "<font color=\"#00B0000\">" + i18n("Anniversary")+":</font>"; 559 tempText += "<font color=\"#00B0000\">" + i18n("Anniversary")+":</font>";
560 } else { 560 } else {
561 if ( ((Event*)ev)->isMultiDay() ) { 561 if ( ((Event*)ev)->isMultiDay() ) {
562 QString dfs = KGlobal::locale()->dateFormatShort(); 562 QString dfs = KGlobal::locale()->dateFormatShort();
563 KGlobal::locale()->setDateFormatShort("%d.%b"); 563 KGlobal::locale()->setDateFormatShort("%d.%b");
564 tempText +=KGlobal::locale()->formatDate(((Event*)ev)->dtStart().date(), true, KLocale::Userdefined) + "-"; 564 tempText +=KGlobal::locale()->formatDate(((Event*)ev)->dtStart().date(), true, KLocale::Userdefined) + "-";
565 if ( KOPrefs::instance()->mWhatsNextTime2Lines ) 565 if ( KOPrefs::instance()->mWhatsNextTime2Lines )
566 tempText += " "; 566 tempText += " ";
567 tempText +=KGlobal::locale()->formatDate(((Event*)ev)->dtEnd().date(), true, KLocale::Userdefined); 567 tempText +=KGlobal::locale()->formatDate(((Event*)ev)->dtEnd().date(), true, KLocale::Userdefined);
568 KGlobal::locale()->setDateFormatShort(dfs); 568 KGlobal::locale()->setDateFormatShort(dfs);
569 } else { 569 } else {
570 tempText += " " ;//i18n("Allday:"); 570 tempText += " " ;//i18n("Allday:");
571 } 571 }
572 } 572 }
573 573
574 } 574 }
575 } 575 }
576 } else { 576 } else {
577 mTodos.append( ev ); 577 mTodos.append( ev );
578 tempText += i18n("ToDo:"); 578 tempText += i18n("ToDo:");
579 if ( KOPrefs::instance()->mWhatsNextTime2Lines ) 579 if ( KOPrefs::instance()->mWhatsNextTime2Lines )
580 tempText += " "; 580 tempText += " ";
581 if (reply) { 581 if (reply) {
582 tempText += " "; 582 tempText += " ";
583 if ( noc != cdt ) { 583 if ( noc != cdt ) {
584 tempText += KGlobal::locale()->formatDate( noc.date() , KOPrefs::instance()->mShortDateInViewer) +": "; 584 tempText += KGlobal::locale()->formatDate( noc.date() , KOPrefs::instance()->mShortDateInViewer) +": ";
585 } 585 }
586 } else { 586 } else {
587 if ( ((Todo*)ev)->dtDue().date() < QDate::currentDate() ) { 587 if ( ((Todo*)ev)->dtDue().date() < QDate::currentDate() ) {
588 // tempText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 588 // tempText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
589 QString dfs = KGlobal::locale()->dateFormatShort(); 589 QString dfs = KGlobal::locale()->dateFormatShort();
590 KGlobal::locale()->setDateFormatShort("%d.%b"); 590 KGlobal::locale()->setDateFormatShort("%d.%b");
591 tempText +="<font color=\"#F00000\">" + KGlobal::locale()->formatDate(((Todo*)ev)->dtDue().date(), true, KLocale::Userdefined) + "</font>"; 591 tempText +="<font color=\"#F00000\">" + KGlobal::locale()->formatDate(((Todo*)ev)->dtDue().date(), true, KLocale::Userdefined) + "</font>";
592 KGlobal::locale()->setDateFormatShort(dfs); 592 KGlobal::locale()->setDateFormatShort(dfs);
593 } else { 593 } else {
594 if (!ev->doesFloat() ) 594 if (!ev->doesFloat() )
595 if( ( (Todo*)ev)->dtDue() < cdt ) { 595 if( ( (Todo*)ev)->dtDue() < cdt ) {
596 tempText +="<font color=\"#F00000\">" + ((Todo*)ev)->dtDueTimeStr() + "</font>"; 596 tempText +="<font color=\"#F00000\">" + ((Todo*)ev)->dtDueTimeStr() + "</font>";
597 597
598 598
599 } else 599 } else
600 tempText +=((Todo*)ev)->dtDueTimeStr(); 600 tempText +=((Todo*)ev)->dtDueTimeStr();
601 mTodos.append( ev ); 601 mTodos.append( ev );
602 } 602 }
603 } 603 }
604 } 604 }
605 tempText += "</b></td><td>"; 605 tempText += "</b></td><td>";
606 bool needClose = false; 606 bool needClose = false;
607 if ( ev->cancelled() ) { 607 if ( ev->cancelled() ) {
608 tempText += "<font color=\"#F00000\">[c"; 608 tempText += "<font color=\"#F00000\">[c";
609 needClose =true; 609 needClose =true;
610 610
611 } 611 }
612 if ( ev->isAlarmEnabled() && ev->alarmEnabled()) { 612 if ( ev->isAlarmEnabled() && ev->alarmEnabled()) {
613 if ( !needClose) 613 if ( !needClose)
614 tempText +="["; 614 tempText +="[";
615 tempText += "a"; 615 tempText += "a";
616 needClose =true; 616 needClose =true;
617 617
618 } 618 }
619 if ( ev->description().length() > 0 ) { 619 if ( ev->description().length() > 0 ) {
620 if ( !needClose) 620 if ( !needClose)
621 tempText +="["; 621 tempText +="[";
622 tempText += "i"; 622 tempText += "i";
623 needClose =true; 623 needClose =true;
624 } 624 }
625 if ( ev->recurrence()->doesRecur() ) { 625 if ( ev->doesRecur() ) {
626 if ( !needClose) 626 if ( !needClose)
627 tempText +="["; 627 tempText +="[";
628 tempText += "r"; 628 tempText += "r";
629 needClose =true; 629 needClose =true;
630 } 630 }
631 if ( needClose ) { 631 if ( needClose ) {
632 tempText += "] "; 632 tempText += "] ";
633 } 633 }
634 if ( ev->cancelled() ) 634 if ( ev->cancelled() )
635 tempText += "</font>"; 635 tempText += "</font>";
636 tempText += "<a "; 636 tempText += "<a ";
637 if (ev->typeID() == eventID ) tempText += "href=\"event:"; 637 if (ev->typeID() == eventID ) tempText += "href=\"event:";
638 if (ev->typeID() == todoID ) tempText += "href=\"todo:"; 638 if (ev->typeID() == todoID ) tempText += "href=\"todo:";
639 tempText += ev->uid() + "\">"; 639 tempText += ev->uid() + "\">";
640 if ( ev->summary().length() > 0 ) 640 if ( ev->summary().length() > 0 )
641 tempText += ev->summary(); 641 tempText += ev->summary();
642 else 642 else
643 tempText += i18n("-no summary-"); 643 tempText += i18n("-no summary-");
644 if ( bDay ) { 644 if ( bDay ) {
645 noc = ev->getNextOccurence( cdt.addDays(-1), &ok ); 645 noc = ev->getNextOccurence( cdt.addDays(-1), &ok );
646 if ( ok ) { 646 if ( ok ) {
647 int years = 0; 647 int years = 0;
648 if ( ev->typeID() == todoID ) { 648 if ( ev->typeID() == todoID ) {
649 years = noc.date().year() -((Todo*)ev)->dtDue().date().year(); 649 years = noc.date().year() -((Todo*)ev)->dtDue().date().year();
650 } else 650 } else
651 years = noc.date().year() - ev->dtStart().date().year(); 651 years = noc.date().year() - ev->dtStart().date().year();
652 tempText += i18n(" (%1 y.)"). arg( years ); 652 tempText += i18n(" (%1 y.)"). arg( years );
653 } 653 }
654 } 654 }
655 655
656 tempText += "</a>"; 656 tempText += "</a>";
657 if ( KOPrefs::instance()->mWNViewShowLocation ) 657 if ( KOPrefs::instance()->mWNViewShowLocation )
658 if ( !ev->location().isEmpty() ) 658 if ( !ev->location().isEmpty() )
659 tempText += " ("+ev->location() +")"; 659 tempText += " ("+ev->location() +")";
660 if ( ev->relatedTo() && KOPrefs::instance()->mWNViewShowsParents) 660 if ( ev->relatedTo() && KOPrefs::instance()->mWNViewShowsParents)
661 tempText += " ["+ev->relatedTo()->summary() +"]"; 661 tempText += " ["+ev->relatedTo()->summary() +"]";
662 tempText += "</td></tr>\n"; 662 tempText += "</td></tr>\n";
663 mText += tempText; 663 mText += tempText;
664 return true; 664 return true;
665} 665}
666 666
667bool KOWhatsNextView::appendTodo(Incidence *ev, QString ind , bool isSub ) 667bool KOWhatsNextView::appendTodo(Incidence *ev, QString ind , bool isSub )
668{ 668{
669 if ( mTodos.find( ev ) != mTodos.end() ) return false; 669 if ( mTodos.find( ev ) != mTodos.end() ) return false;
670 670
671 mTodos.append( ev ); 671 mTodos.append( ev );
672 if ( !isSub ) 672 if ( !isSub )
673 mText += "<p>"; 673 mText += "<p>";
674 else 674 else
675 mText += "<li>"; 675 mText += "<li>";
676 mText += "[" +QString::number(ev->priority()) + "/" + QString::number(((Todo*)ev)->percentComplete())+"%] "; 676 mText += "[" +QString::number(ev->priority()) + "/" + QString::number(((Todo*)ev)->percentComplete())+"%] ";
677 677
678 678
679 mText += ind; 679 mText += ind;
680 bool needClose = false; 680 bool needClose = false;
681 if ( ev->cancelled() ) { 681 if ( ev->cancelled() ) {
682 mText += "<font color=\"#F00000\">[c"; 682 mText += "<font color=\"#F00000\">[c";
683 needClose =true; 683 needClose =true;
684 684
685 } 685 }
686 if ( ev->isAlarmEnabled() && ev->alarmEnabled() ) { 686 if ( ev->isAlarmEnabled() && ev->alarmEnabled() ) {
687 if ( !needClose) 687 if ( !needClose)
688 mText +="["; 688 mText +="[";
689 mText += "a"; 689 mText += "a";
690 needClose =true; 690 needClose =true;
691 691
692 } 692 }
693 693
694 if ( ev->description().length() > 0 ) { 694 if ( ev->description().length() > 0 ) {
695 if ( !needClose) 695 if ( !needClose)
696 mText +="["; 696 mText +="[";
697 mText += "i"; 697 mText += "i";
698 needClose =true; 698 needClose =true;
699 } 699 }
700 if ( ev->doesRecur() ) { 700 if ( ev->doesRecur() ) {
701 if ( !needClose) 701 if ( !needClose)
702 mText +="["; 702 mText +="[";
703 mText += "r"; 703 mText += "r";
704 needClose =true; 704 needClose =true;
705 } 705 }
706 // if ( ev->recurrence()->doesRecur() ) { 706 // if ( ev->recurrence()->doesRecur() ) {
707 // if ( !needClose) 707 // if ( !needClose)
708 // mText +="("; 708 // mText +="(";
709 // mText += "r"; 709 // mText += "r";
710 // needClose =true; 710 // needClose =true;
711 // } 711 // }
712 if ( needClose ) 712 if ( needClose )
713 mText += "] "; 713 mText += "] ";
714 if ( ev->cancelled() ) 714 if ( ev->cancelled() )
715 mText += "</font>"; 715 mText += "</font>";
716 mText += "<a href=\"todo:" + ev->uid() + "\">"; 716 mText += "<a href=\"todo:" + ev->uid() + "\">";
717 if ( ev->summary().length() > 0 ) 717 if ( ev->summary().length() > 0 )
718 mText += ev->summary(); 718 mText += ev->summary();
719 else 719 else
720 mText += i18n("-no summary-"); 720 mText += i18n("-no summary-");
721 mText += "</a>"; 721 mText += "</a>";
722 if ( ((Todo*)ev)->hasDueDate () ) { 722 if ( ((Todo*)ev)->hasDueDate () ) {
723 QString year = ""; 723 QString year = "";
724 int ye = ((Todo*)ev)->dtDue().date().year(); 724 int ye = ((Todo*)ev)->dtDue().date().year();
725 if ( QDateTime::currentDateTime().date().year() != ye ) 725 if ( QDateTime::currentDateTime().date().year() != ye )
726 year = QString::number( ye ); 726 year = QString::number( ye );
727 QString dfs = KGlobal::locale()->dateFormatShort(); 727 QString dfs = KGlobal::locale()->dateFormatShort();
728 KGlobal::locale()->setDateFormatShort("%d.%b"); 728 KGlobal::locale()->setDateFormatShort("%d.%b");
729 mText +="<font color=\"#00A000\"> [" + KGlobal::locale()->formatDate(((Todo*)ev)->dtDue().date(), true, KLocale::Userdefined) + "."+ year +"]</font>"; 729 mText +="<font color=\"#00A000\"> [" + KGlobal::locale()->formatDate(((Todo*)ev)->dtDue().date(), true, KLocale::Userdefined) + "."+ year +"]</font>";
730 KGlobal::locale()->setDateFormatShort(dfs); 730 KGlobal::locale()->setDateFormatShort(dfs);
731 } 731 }
732 if ( KOPrefs::instance()->mWNViewShowLocation ) 732 if ( KOPrefs::instance()->mWNViewShowLocation )
733 if ( !ev->location().isEmpty() ) 733 if ( !ev->location().isEmpty() )
734 mText += " ("+ev->location() +")"; 734 mText += " ("+ev->location() +")";
735 if ( !isSub ) { 735 if ( !isSub ) {
736 if ( ((Todo*)ev)->relatedTo()&& KOPrefs::instance()->mWNViewShowsParents) 736 if ( ((Todo*)ev)->relatedTo()&& KOPrefs::instance()->mWNViewShowsParents)
737 mText += " ["+ev->relatedTo()->summary() +"]"; 737 mText += " ["+ev->relatedTo()->summary() +"]";
738 mText += "</p>\n"; 738 mText += "</p>\n";
739 } 739 }
740 else { 740 else {
741 ind += "-"; 741 ind += "-";
742 mText += "</li>\n"; 742 mText += "</li>\n";
743 } 743 }
744 QPtrList<Incidence> Relations = ev->relations(); 744 QPtrList<Incidence> Relations = ev->relations();
745 Incidence *to; 745 Incidence *to;
746 for (to=Relations.first();to;to=Relations.next()) { 746 for (to=Relations.first();to;to=Relations.next()) {
747 if (!((Todo*)to)->isCompleted() && ((Todo*)to)->priority() <= mCurrentMaxPrio ) 747 if (!((Todo*)to)->isCompleted() && ((Todo*)to)->priority() <= mCurrentMaxPrio )
748 appendTodo( to, ind , true ); 748 appendTodo( to, ind , true );
749 } 749 }
750 750
751 return true; 751 return true;
752} 752}
753 753
754/* 754/*
755 void KOWhatsNextView::createEventViewer() 755 void KOWhatsNextView::createEventViewer()
756 { 756 {
757 if (!mEventViewer) { 757 if (!mEventViewer) {
758 758
759 mEventViewer = new KOEventViewerDialog(this); 759 mEventViewer = new KOEventViewerDialog(this);
760 } 760 }
761 } 761 }
762*/ 762*/
763void KOWhatsNextView::setEventViewer(KOEventViewerDialog* v ) 763void KOWhatsNextView::setEventViewer(KOEventViewerDialog* v )
764{ 764{
765 mEventViewer = v; 765 mEventViewer = v;
766} 766}
767 767
768// TODO: Create this function in CalendarView and remove it from here 768// TODO: Create this function in CalendarView and remove it from here
769void KOWhatsNextView::showIncidence(const QString &uid) 769void KOWhatsNextView::showIncidence(const QString &uid)
770{ 770{
771 771
772 if ( !mEventViewer ) { 772 if ( !mEventViewer ) {
773 qDebug("KOWhatsNextView::showIncidence::sorry, no event viewer set "); 773 qDebug("KOWhatsNextView::showIncidence::sorry, no event viewer set ");
774 return; 774 return;
775 } 775 }
776 //kdDebug() << "KOWhatsNextView::showIncidence(): " << uid << endl; 776 //kdDebug() << "KOWhatsNextView::showIncidence(): " << uid << endl;
777 //qDebug("KOWhatsNextView::showIncidence %s ", uid.latin1()); 777 //qDebug("KOWhatsNextView::showIncidence %s ", uid.latin1());
778 if (uid.startsWith("event:")) { 778 if (uid.startsWith("event:")) {
779#ifdef DESKTOP_VERSION 779#ifdef DESKTOP_VERSION
780 Event *event = calendar()->event(uid.mid(8)); 780 Event *event = calendar()->event(uid.mid(8));
781#else 781#else
782 Event *event = calendar()->event(uid.mid(6)); 782 Event *event = calendar()->event(uid.mid(6));
783#endif 783#endif
784 //qDebug("event %d uid %s ", event, uid.mid(6).latin1()); 784 //qDebug("event %d uid %s ", event, uid.mid(6).latin1());
785 if (!event) return; 785 if (!event) return;
786 //createEventViewer(); 786 //createEventViewer();
787 mEventViewer->setEvent(event); 787 mEventViewer->setEvent(event);
788 } else if (uid.startsWith("todo:")) { 788 } else if (uid.startsWith("todo:")) {
789#ifdef DESKTOP_VERSION 789#ifdef DESKTOP_VERSION
790 Todo *todo = calendar()->todo(uid.mid(7)); 790 Todo *todo = calendar()->todo(uid.mid(7));
791#else 791#else
792 Todo *todo = calendar()->todo(uid.mid(5)); 792 Todo *todo = calendar()->todo(uid.mid(5));
793#endif 793#endif
794 if (!todo) return; 794 if (!todo) return;
795 //createEventViewer(); 795 //createEventViewer();
796 mEventViewer->setTodo(todo); 796 mEventViewer->setTodo(todo);
797 } else { 797 } else {
798 return; 798 return;
799 799
800 } 800 }
801 mEventViewer->showMe(); 801 mEventViewer->showMe();
802 mEventViewer->raise(); 802 mEventViewer->raise();
803} 803}
diff --git a/libkcal/event.cpp b/libkcal/event.cpp
index ad66639..0766fd9 100644
--- a/libkcal/event.cpp
+++ b/libkcal/event.cpp
@@ -1,415 +1,416 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24 24
25#include "event.h" 25#include "event.h"
26 26
27using namespace KCal; 27using namespace KCal;
28 28
29Event::Event() : 29Event::Event() :
30 mHasEndDate( false ), mTransparency( Opaque ) 30 mHasEndDate( false ), mTransparency( Opaque )
31{ 31{
32} 32}
33 33
34Event::Event(const Event &e) : Incidence(e) 34Event::Event(const Event &e) : Incidence(e)
35{ 35{
36 mDtEnd = e.mDtEnd; 36 mDtEnd = e.mDtEnd;
37 mHasEndDate = e.mHasEndDate; 37 mHasEndDate = e.mHasEndDate;
38 mTransparency = e.mTransparency; 38 mTransparency = e.mTransparency;
39} 39}
40 40
41Event::~Event() 41Event::~Event()
42{ 42{
43} 43}
44 44
45Incidence *Event::clone() 45Incidence *Event::clone()
46{ 46{
47 return new Event(*this); 47 return new Event(*this);
48} 48}
49 49
50bool KCal::operator==( const Event& e1, const Event& e2 ) 50bool KCal::operator==( const Event& e1, const Event& e2 )
51{ 51{
52 return operator==( (const Incidence&)e1, (const Incidence&)e2 ) && 52 return operator==( (const Incidence&)e1, (const Incidence&)e2 ) &&
53 e1.dtEnd() == e2.dtEnd() && 53 e1.dtEnd() == e2.dtEnd() &&
54 e1.hasEndDate() == e2.hasEndDate() && 54 e1.hasEndDate() == e2.hasEndDate() &&
55 e1.transparency() == e2.transparency(); 55 e1.transparency() == e2.transparency();
56} 56}
57 57
58 58
59bool Event::contains ( Event* from ) 59bool Event::contains ( Event* from )
60{ 60{
61 61
62 if ( !from->summary().isEmpty() ) 62 if ( !from->summary().isEmpty() )
63 if ( !summary().startsWith( from->summary() )) 63 if ( !summary().startsWith( from->summary() ))
64 return false; 64 return false;
65 if ( from->dtStart().isValid() ) 65 if ( from->dtStart().isValid() )
66 if (dtStart() != from->dtStart() ) 66 if (dtStart() != from->dtStart() )
67 return false; 67 return false;
68 if ( from->dtEnd().isValid() ) 68 if ( from->dtEnd().isValid() )
69 if ( dtEnd() != from->dtEnd() ) 69 if ( dtEnd() != from->dtEnd() )
70 return false; 70 return false;
71 if ( !from->location().isEmpty() ) 71 if ( !from->location().isEmpty() )
72 if ( !location().startsWith( from->location() ) ) 72 if ( !location().startsWith( from->location() ) )
73 return false; 73 return false;
74 if ( !from->description().isEmpty() ) 74 if ( !from->description().isEmpty() )
75 if ( !description().startsWith( from->description() )) 75 if ( !description().startsWith( from->description() ))
76 return false; 76 return false;
77 if ( from->alarms().count() ) { 77 if ( from->alarms().count() ) {
78 Alarm *a = from->alarms().first(); 78 Alarm *a = from->alarms().first();
79 if ( a->enabled() ){ 79 if ( a->enabled() ){
80 if ( !alarms().count() ) 80 if ( !alarms().count() )
81 return false; 81 return false;
82 Alarm *b = alarms().first(); 82 Alarm *b = alarms().first();
83 if( ! b->enabled() ) 83 if( ! b->enabled() )
84 return false; 84 return false;
85 if ( ! (a->offset() == b->offset() )) 85 if ( ! (a->offset() == b->offset() ))
86 return false; 86 return false;
87 } 87 }
88 } 88 }
89 QStringList cat = categories(); 89 QStringList cat = categories();
90 QStringList catFrom = from->categories(); 90 QStringList catFrom = from->categories();
91 QString nCat; 91 QString nCat;
92 unsigned int iii; 92 unsigned int iii;
93 for ( iii = 0; iii < catFrom.count();++iii ) { 93 for ( iii = 0; iii < catFrom.count();++iii ) {
94 nCat = catFrom[iii]; 94 nCat = catFrom[iii];
95 if ( !nCat.isEmpty() ) 95 if ( !nCat.isEmpty() )
96 if ( !cat.contains( nCat )) { 96 if ( !cat.contains( nCat )) {
97 return false; 97 return false;
98 } 98 }
99 } 99 }
100 if ( from->doesRecur() ) 100 if ( from->doesRecur() )
101 if ( from->doesRecur() != doesRecur() && ! (from->doesRecur()== Recurrence::rYearlyMonth && doesRecur()== Recurrence::rYearlyDay) ) 101 if ( from->doesRecur() != doesRecur() && ! (from->doesRecur()== Recurrence::rYearlyMonth && doesRecur()== Recurrence::rYearlyDay) )
102 return false; 102 return false;
103 return true; 103 return true;
104} 104}
105 105
106void Event::setDtEnd(const QDateTime &dtEnd) 106void Event::setDtEnd(const QDateTime &dtEnd)
107{ 107{
108 if (mReadOnly) return; 108 if (mReadOnly) return;
109 109
110 mDtEnd = getEvenTime( dtEnd ); 110 mDtEnd = getEvenTime( dtEnd );
111 111
112 setHasEndDate(true); 112 setHasEndDate(true);
113 setHasDuration(false); 113 setHasDuration(false);
114 114
115 updated(); 115 updated();
116} 116}
117 117
118QDateTime Event::dtEnd() const 118QDateTime Event::dtEnd() const
119{ 119{
120 if (hasEndDate()) return mDtEnd; 120 if (hasEndDate()) return mDtEnd;
121 if (hasDuration()) return dtStart().addSecs(duration()); 121 if (hasDuration()) return dtStart().addSecs(duration());
122 122
123 return dtStart(); 123 return dtStart();
124} 124}
125 125
126QString Event::dtEndTimeStr() const 126QString Event::dtEndTimeStr() const
127{ 127{
128 return KGlobal::locale()->formatTime(mDtEnd.time()); 128 return KGlobal::locale()->formatTime(mDtEnd.time());
129} 129}
130 130
131QString Event::dtEndDateStr(bool shortfmt) const 131QString Event::dtEndDateStr(bool shortfmt) const
132{ 132{
133 return KGlobal::locale()->formatDate(mDtEnd.date(),shortfmt); 133 return KGlobal::locale()->formatDate(mDtEnd.date(),shortfmt);
134} 134}
135 135
136QString Event::dtEndStr(bool shortfmt) const 136QString Event::dtEndStr(bool shortfmt) const
137{ 137{
138 return KGlobal::locale()->formatDateTime(mDtEnd, shortfmt); 138 return KGlobal::locale()->formatDateTime(mDtEnd, shortfmt);
139} 139}
140 140
141void Event::setHasEndDate(bool b) 141void Event::setHasEndDate(bool b)
142{ 142{
143 mHasEndDate = b; 143 mHasEndDate = b;
144} 144}
145 145
146bool Event::hasEndDate() const 146bool Event::hasEndDate() const
147{ 147{
148 return mHasEndDate; 148 return mHasEndDate;
149} 149}
150 150
151bool Event::isMultiDay() const 151bool Event::isMultiDay() const
152{ 152{
153 bool multi = !(dtStart().date() == dtEnd().date()); 153 bool multi = !(dtStart().date() == dtEnd().date());
154 return multi; 154 return multi;
155} 155}
156 156
157void Event::setTransparency(Event::Transparency transparency) 157void Event::setTransparency(Event::Transparency transparency)
158{ 158{
159 if (mReadOnly) return; 159 if (mReadOnly) return;
160 mTransparency = transparency; 160 mTransparency = transparency;
161 updated(); 161 updated();
162} 162}
163 163
164Event::Transparency Event::transparency() const 164Event::Transparency Event::transparency() const
165{ 165{
166 return mTransparency; 166 return mTransparency;
167} 167}
168 168
169void Event::setDuration(int seconds) 169void Event::setDuration(int seconds)
170{ 170{
171 setHasEndDate(false); 171 setHasEndDate(false);
172 Incidence::setDuration(seconds); 172 Incidence::setDuration(seconds);
173} 173}
174bool Event::matchTime(QDateTime*startDT, QDateTime* endDT) 174bool Event::matchTime(QDateTime*startDT, QDateTime* endDT)
175{ 175{
176 if ( cancelled() ) return false;
176 if ( ! doesRecur() ) { 177 if ( ! doesRecur() ) {
177 if ( doesFloat() ) { 178 if ( doesFloat() ) {
178 if ( mDtEnd.addDays( 1 ) < *startDT) 179 if ( mDtEnd.addDays( 1 ) < *startDT)
179 return false; 180 return false;
180 if ( endDT && mDtStart > * endDT) 181 if ( endDT && mDtStart > * endDT)
181 return false; 182 return false;
182 } else { 183 } else {
183 if ( mDtEnd < *startDT ) 184 if ( mDtEnd < *startDT )
184 return false; 185 return false;
185 if ( endDT && mDtStart > * endDT) 186 if ( endDT && mDtStart > * endDT)
186 return false; 187 return false;
187 } 188 }
188 } else { 189 } else {
189 if ( endDT && mDtStart > * endDT) 190 if ( endDT && mDtStart > * endDT)
190 return false; 191 return false;
191 } 192 }
192 return true; 193 return true;
193} 194}
194bool Event::isOverlapping ( Event* testEvent, QDateTime* overlapDT, QDateTime* startDT ) 195bool Event::isOverlapping ( Event* testEvent, QDateTime* overlapDT, QDateTime* startDT )
195{ 196{
196 if ( testEvent == this ) 197 if ( testEvent == this )
197 return false; 198 return false;
198 if ( ! doesRecur() && !testEvent->doesRecur() ) { 199 if ( ! doesRecur() && !testEvent->doesRecur() ) {
199 QDateTime te; 200 QDateTime te;
200 if ( testEvent->doesFloat() ) 201 if ( testEvent->doesFloat() )
201 te = testEvent->mDtEnd.addDays( 1 ); 202 te = testEvent->mDtEnd.addDays( 1 );
202 else 203 else
203 te = testEvent->mDtEnd; 204 te = testEvent->mDtEnd;
204 QDateTime e; 205 QDateTime e;
205 if ( doesFloat() ) 206 if ( doesFloat() )
206 e = mDtEnd.addDays( 1 ); 207 e = mDtEnd.addDays( 1 );
207 else 208 else
208 e = mDtEnd; 209 e = mDtEnd;
209 if ( mDtStart < te && testEvent->mDtStart < e ) { 210 if ( mDtStart < te && testEvent->mDtStart < e ) {
210 if ( mDtStart < testEvent->mDtStart ) 211 if ( mDtStart < testEvent->mDtStart )
211 *overlapDT = testEvent->mDtStart; 212 *overlapDT = testEvent->mDtStart;
212 else 213 else
213 *overlapDT = mDtStart; 214 *overlapDT = mDtStart;
214 if ( startDT ) 215 if ( startDT )
215 return (*overlapDT >= *startDT ); 216 return (*overlapDT >= *startDT );
216 return true; 217 return true;
217 } 218 }
218 return false; 219 return false;
219 } 220 }
220 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) { 221 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) {
221 if ( mDtStart.time() >= testEvent->mDtEnd.time() || testEvent->mDtStart.time() >= mDtEnd.time() ) { 222 if ( mDtStart.time() >= testEvent->mDtEnd.time() || testEvent->mDtStart.time() >= mDtEnd.time() ) {
222 // no need to test. times mismatch 223 // no need to test. times mismatch
223 //fprintf(stderr,"timi "); 224 //fprintf(stderr,"timi ");
224 return false; 225 return false;
225 } 226 }
226 } 227 }
227 Event *nonRecur = 0; 228 Event *nonRecur = 0;
228 Event *recurEvent = 0; 229 Event *recurEvent = 0;
229 if ( ! doesRecur() ) { 230 if ( ! doesRecur() ) {
230 nonRecur = this; 231 nonRecur = this;
231 recurEvent = testEvent; 232 recurEvent = testEvent;
232 } 233 }
233 else if ( !testEvent->doesRecur() ) { 234 else if ( !testEvent->doesRecur() ) {
234 nonRecur = testEvent; 235 nonRecur = testEvent;
235 recurEvent = this; 236 recurEvent = this;
236 } 237 }
237 if ( nonRecur ) { 238 if ( nonRecur ) {
238 QDateTime enr; 239 QDateTime enr;
239 if ( nonRecur->doesFloat() ) 240 if ( nonRecur->doesFloat() )
240 enr = nonRecur->mDtEnd.addDays( 1 ); 241 enr = nonRecur->mDtEnd.addDays( 1 );
241 else 242 else
242 enr = nonRecur->mDtEnd; 243 enr = nonRecur->mDtEnd;
243 if ( enr < recurEvent->mDtStart ) 244 if ( enr < recurEvent->mDtStart )
244 return false; 245 return false;
245 if ( startDT && enr < *startDT ) 246 if ( startDT && enr < *startDT )
246 return false; 247 return false;
247 248
248 int recDuration = recurEvent->mDtStart.secsTo( recurEvent->mDtEnd ); 249 int recDuration = recurEvent->mDtStart.secsTo( recurEvent->mDtEnd );
249 if ( recurEvent->doesFloat() ) 250 if ( recurEvent->doesFloat() )
250 recDuration += 86400; 251 recDuration += 86400;
251 bool ok = false; 252 bool ok = false;
252 QDateTime recStart; 253 QDateTime recStart;
253 if ( startDT ) { 254 if ( startDT ) {
254 recStart = recurEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok ); 255 recStart = recurEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
255 } 256 }
256 if ( recStart.isValid() ) { 257 if ( recStart.isValid() ) {
257 //qDebug("%s start at %s ", startDT-> toString().latin1(), recStart.toString().latin1()); 258 //qDebug("%s start at %s ", startDT-> toString().latin1(), recStart.toString().latin1());
258 recStart = recStart.addSecs( -300); 259 recStart = recStart.addSecs( -300);
259 } 260 }
260 else 261 else
261 recStart = recurEvent->mDtStart.addSecs( -300); 262 recStart = recurEvent->mDtStart.addSecs( -300);
262 ok = true; 263 ok = true;
263 264
264 while ( ok ) { 265 while ( ok ) {
265 recStart = recurEvent->getNextOccurence( recStart.addSecs( 60 ), &ok ); 266 recStart = recurEvent->getNextOccurence( recStart.addSecs( 60 ), &ok );
266 if ( ok ) { 267 if ( ok ) {
267 if ( recStart > enr ) 268 if ( recStart > enr )
268 return false; 269 return false;
269 QDateTime recEnd = recStart.addSecs( recDuration ); 270 QDateTime recEnd = recStart.addSecs( recDuration );
270 if ( nonRecur->mDtStart < recEnd && recStart < nonRecur->mDtEnd ) { 271 if ( nonRecur->mDtStart < recEnd && recStart < nonRecur->mDtEnd ) {
271 if ( nonRecur->mDtStart < recStart ) 272 if ( nonRecur->mDtStart < recStart )
272 *overlapDT = recStart; 273 *overlapDT = recStart;
273 else 274 else
274 *overlapDT = nonRecur->mDtStart; 275 *overlapDT = nonRecur->mDtStart;
275 if ( startDT ) { 276 if ( startDT ) {
276 if ( *overlapDT >= *startDT ) 277 if ( *overlapDT >= *startDT )
277 return true; 278 return true;
278 } else 279 } else
279 return true; 280 return true;
280 } 281 }
281 } 282 }
282 } 283 }
283 return false; 284 return false;
284 } 285 }
285 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) { 286 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) {
286 if ( recurrence()->doesRecur() == Recurrence::rWeekly && testEvent->recurrence()->doesRecur() == Recurrence::rWeekly ) { 287 if ( recurrence()->doesRecur() == Recurrence::rWeekly && testEvent->recurrence()->doesRecur() == Recurrence::rWeekly ) {
287 bool found = false; 288 bool found = false;
288 uint i; 289 uint i;
289 for ( i=0; i< recurrence()->days().size();++i ) { 290 for ( i=0; i< recurrence()->days().size();++i ) {
290 found = found || (recurrence()->days().testBit( i ) && testEvent->recurrence()->days().testBit( i ) ); 291 found = found || (recurrence()->days().testBit( i ) && testEvent->recurrence()->days().testBit( i ) );
291 } 292 }
292 if ( ! found ) { 293 if ( ! found ) {
293 //qDebug("recurring days mismatch %s -- %s", summary().latin1(),testEvent->summary().latin1()); 294 //qDebug("recurring days mismatch %s -- %s", summary().latin1(),testEvent->summary().latin1());
294 return false; 295 return false;
295 } 296 }
296 297
297 } 298 }
298 } 299 }
299 bool ok = true; 300 bool ok = true;
300 QDateTime incidenceStart;// = mDtStart; 301 QDateTime incidenceStart;// = mDtStart;
301 QDateTime testincidenceStart;// = testEvent->mDtStart; 302 QDateTime testincidenceStart;// = testEvent->mDtStart;
302 if ( startDT ) { 303 if ( startDT ) {
303 incidenceStart = recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok ); 304 incidenceStart = recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
304 testincidenceStart = testEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok ); 305 testincidenceStart = testEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
305 } 306 }
306 if ( !testincidenceStart.isValid() ) 307 if ( !testincidenceStart.isValid() )
307 testincidenceStart = testEvent->mDtStart; 308 testincidenceStart = testEvent->mDtStart;
308 if ( !incidenceStart.isValid() ) 309 if ( !incidenceStart.isValid() )
309 incidenceStart = mDtStart; 310 incidenceStart = mDtStart;
310 int duration = mDtStart.secsTo( mDtEnd ); 311 int duration = mDtStart.secsTo( mDtEnd );
311 if ( doesFloat() ) 312 if ( doesFloat() )
312 duration += 86400; 313 duration += 86400;
313 int testduration = testEvent->mDtStart.secsTo( testEvent->mDtEnd ); 314 int testduration = testEvent->mDtStart.secsTo( testEvent->mDtEnd );
314 if ( testEvent->doesFloat() ) 315 if ( testEvent->doesFloat() )
315 testduration += 86400; 316 testduration += 86400;
316 bool computeThis = false; 317 bool computeThis = false;
317 if ( incidenceStart < testincidenceStart ) 318 if ( incidenceStart < testincidenceStart )
318 computeThis = true; 319 computeThis = true;
319 if ( computeThis ) 320 if ( computeThis )
320 incidenceStart = incidenceStart.addSecs( -300 ); 321 incidenceStart = incidenceStart.addSecs( -300 );
321 else 322 else
322 testincidenceStart = testincidenceStart.addSecs( -300 ); 323 testincidenceStart = testincidenceStart.addSecs( -300 );
323 int count = 0; 324 int count = 0;
324 ok = true; 325 ok = true;
325 int countbreak = 2000; 326 int countbreak = 2000;
326 QDateTime stopSearch; 327 QDateTime stopSearch;
327 bool testStop = false; 328 bool testStop = false;
328 if ( startDT ) { 329 if ( startDT ) {
329 stopSearch = startDT->addDays( 365*3 ); 330 stopSearch = startDT->addDays( 365*3 );
330 testStop = true; 331 testStop = true;
331 } 332 }
332 while ( ok ) { 333 while ( ok ) {
333 ++count; 334 ++count;
334 if ( count > countbreak ) break; 335 if ( count > countbreak ) break;
335 if ( computeThis ) { 336 if ( computeThis ) {
336 if ( testStop ) 337 if ( testStop )
337 if ( testincidenceStart > stopSearch ) 338 if ( testincidenceStart > stopSearch )
338 break; 339 break;
339 incidenceStart = getNextOccurence( incidenceStart.addSecs( 60 ), &ok ); 340 incidenceStart = getNextOccurence( incidenceStart.addSecs( 60 ), &ok );
340 } 341 }
341 else { 342 else {
342 if ( testStop ) 343 if ( testStop )
343 if ( incidenceStart > stopSearch ) 344 if ( incidenceStart > stopSearch )
344 break; 345 break;
345 testincidenceStart = testEvent->getNextOccurence( testincidenceStart.addSecs( 60 ), &ok ); 346 testincidenceStart = testEvent->getNextOccurence( testincidenceStart.addSecs( 60 ), &ok );
346 } 347 }
347 if ( ok ) { 348 if ( ok ) {
348 if ( incidenceStart < testincidenceStart.addSecs( testduration ) && testincidenceStart < incidenceStart.addSecs( duration ) ) { 349 if ( incidenceStart < testincidenceStart.addSecs( testduration ) && testincidenceStart < incidenceStart.addSecs( duration ) ) {
349 if ( incidenceStart < testincidenceStart ) 350 if ( incidenceStart < testincidenceStart )
350 *overlapDT = testincidenceStart; 351 *overlapDT = testincidenceStart;
351 else 352 else
352 *overlapDT = incidenceStart; 353 *overlapDT = incidenceStart;
353 if ( startDT ) { 354 if ( startDT ) {
354 if ( *overlapDT >= *startDT ) 355 if ( *overlapDT >= *startDT )
355 return true; 356 return true;
356 } else 357 } else
357 return true; 358 return true;
358 } 359 }
359 computeThis = ( incidenceStart < testincidenceStart ); 360 computeThis = ( incidenceStart < testincidenceStart );
360 } 361 }
361 362
362 } 363 }
363 //qDebug("%d rec counter stopped at %d - %s %s", ok ,count, summary().latin1(),testEvent->summary().latin1() ); 364 //qDebug("%d rec counter stopped at %d - %s %s", ok ,count, summary().latin1(),testEvent->summary().latin1() );
364 return false; 365 return false;
365} 366}
366QDateTime Event::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 367QDateTime Event::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
367{ 368{
368 *ok = false; 369 *ok = false;
369 if ( !alarmEnabled() ) 370 if ( !alarmEnabled() )
370 return QDateTime (); 371 return QDateTime ();
371 bool yes; 372 bool yes;
372 QDateTime incidenceStart = getNextOccurence( start_dt, &yes ); 373 QDateTime incidenceStart = getNextOccurence( start_dt, &yes );
373 if ( ! yes || cancelled() ) { 374 if ( ! yes || cancelled() ) {
374 *ok = false; 375 *ok = false;
375 return QDateTime (); 376 return QDateTime ();
376 } 377 }
377 378
378 bool enabled = false; 379 bool enabled = false;
379 Alarm* alarm; 380 Alarm* alarm;
380 int off = 0; 381 int off = 0;
381 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 382 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
382 // if ( QDateTime::currentDateTime() > incidenceStart ){ 383 // if ( QDateTime::currentDateTime() > incidenceStart ){
383// *ok = false; 384// *ok = false;
384// return incidenceStart; 385// return incidenceStart;
385// } 386// }
386 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 387 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
387 if (alarm->enabled()) { 388 if (alarm->enabled()) {
388 if ( alarm->hasTime () ) { 389 if ( alarm->hasTime () ) {
389 if ( alarm->time() < alarmStart ) { 390 if ( alarm->time() < alarmStart ) {
390 alarmStart = alarm->time(); 391 alarmStart = alarm->time();
391 enabled = true; 392 enabled = true;
392 off = alarmStart.secsTo( incidenceStart ); 393 off = alarmStart.secsTo( incidenceStart );
393 } 394 }
394 395
395 } else { 396 } else {
396 int secs = alarm->startOffset().asSeconds(); 397 int secs = alarm->startOffset().asSeconds();
397 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 398 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
398 alarmStart = incidenceStart.addSecs( secs ); 399 alarmStart = incidenceStart.addSecs( secs );
399 enabled = true; 400 enabled = true;
400 off = -secs; 401 off = -secs;
401 } 402 }
402 } 403 }
403 } 404 }
404 } 405 }
405 if ( enabled ) { 406 if ( enabled ) {
406 if ( alarmStart > start_dt ) { 407 if ( alarmStart > start_dt ) {
407 *ok = true; 408 *ok = true;
408 * offset = off; 409 * offset = off;
409 return alarmStart; 410 return alarmStart;
410 } 411 }
411 } 412 }
412 *ok = false; 413 *ok = false;
413 return QDateTime (); 414 return QDateTime ();
414 415
415} 416}
diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp
index 4794bc9..f349681 100644
--- a/libkcal/icalformatimpl.cpp
+++ b/libkcal/icalformatimpl.cpp
@@ -1,2066 +1,2064 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <qdatetime.h> 21#include <qdatetime.h>
22#include <qstring.h> 22#include <qstring.h>
23#include <qptrlist.h> 23#include <qptrlist.h>
24#include <qfile.h> 24#include <qfile.h>
25 25
26#include <kdebug.h> 26#include <kdebug.h>
27#include <klocale.h> 27#include <klocale.h>
28#include <kglobal.h> 28#include <kglobal.h>
29 29
30extern "C" { 30extern "C" {
31 #include <ical.h> 31 #include <ical.h>
32 #include <icalss.h> 32 #include <icalss.h>
33 #include <icalparser.h> 33 #include <icalparser.h>
34 #include <icalrestriction.h> 34 #include <icalrestriction.h>
35} 35}
36 36
37#include "calendar.h" 37#include "calendar.h"
38#include "journal.h" 38#include "journal.h"
39#include "icalformat.h" 39#include "icalformat.h"
40#include "icalformatimpl.h" 40#include "icalformatimpl.h"
41#include "compat.h" 41#include "compat.h"
42 42
43#define _ICAL_VERSION "2.0" 43#define _ICAL_VERSION "2.0"
44 44
45using namespace KCal; 45using namespace KCal;
46 46
47const int gSecondsPerMinute = 60; 47const int gSecondsPerMinute = 60;
48const int gSecondsPerHour = gSecondsPerMinute * 60; 48const int gSecondsPerHour = gSecondsPerMinute * 60;
49const int gSecondsPerDay = gSecondsPerHour * 24; 49const int gSecondsPerDay = gSecondsPerHour * 24;
50const int gSecondsPerWeek = gSecondsPerDay * 7; 50const int gSecondsPerWeek = gSecondsPerDay * 7;
51 51
52ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) : 52ICalFormatImpl::ICalFormatImpl( ICalFormat *parent ) :
53 mParent( parent ), mCalendarVersion( 0 ) 53 mParent( parent ), mCalendarVersion( 0 )
54{ 54{
55 mCompat = new Compat; 55 mCompat = new Compat;
56} 56}
57 57
58ICalFormatImpl::~ICalFormatImpl() 58ICalFormatImpl::~ICalFormatImpl()
59{ 59{
60 delete mCompat; 60 delete mCompat;
61} 61}
62 62
63class ToStringVisitor : public Incidence::Visitor 63class ToStringVisitor : public Incidence::Visitor
64{ 64{
65 public: 65 public:
66 ToStringVisitor( ICalFormatImpl *impl ) : mImpl( impl ), mComponent( 0 ) {} 66 ToStringVisitor( ICalFormatImpl *impl ) : mImpl( impl ), mComponent( 0 ) {}
67 67
68 bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; } 68 bool visit( Event *e ) { mComponent = mImpl->writeEvent( e ); return true; }
69 bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; } 69 bool visit( Todo *e ) { mComponent = mImpl->writeTodo( e ); return true; }
70 bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; } 70 bool visit( Journal *e ) { mComponent = mImpl->writeJournal( e ); return true; }
71 71
72 icalcomponent *component() { return mComponent; } 72 icalcomponent *component() { return mComponent; }
73 73
74 private: 74 private:
75 ICalFormatImpl *mImpl; 75 ICalFormatImpl *mImpl;
76 icalcomponent *mComponent; 76 icalcomponent *mComponent;
77}; 77};
78 78
79icalcomponent *ICalFormatImpl::writeIncidence(Incidence *incidence) 79icalcomponent *ICalFormatImpl::writeIncidence(Incidence *incidence)
80{ 80{
81 ToStringVisitor v( this ); 81 ToStringVisitor v( this );
82 incidence->accept(v); 82 incidence->accept(v);
83 return v.component(); 83 return v.component();
84} 84}
85 85
86icalcomponent *ICalFormatImpl::writeTodo(Todo *todo) 86icalcomponent *ICalFormatImpl::writeTodo(Todo *todo)
87{ 87{
88 QString tmpStr; 88 QString tmpStr;
89 QStringList tmpStrList; 89 QStringList tmpStrList;
90 90
91 icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT); 91 icalcomponent *vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
92 92
93 writeIncidence(vtodo,todo); 93 writeIncidence(vtodo,todo);
94 94
95 // due date 95 // due date
96 if (todo->hasDueDate()) { 96 if (todo->hasDueDate()) {
97 icaltimetype due; 97 icaltimetype due;
98 if (todo->doesFloat()) { 98 if (todo->doesFloat()) {
99 due = writeICalDate(todo->dtDue().date()); 99 due = writeICalDate(todo->dtDue().date());
100 } else { 100 } else {
101 due = writeICalDateTime(todo->dtDue()); 101 due = writeICalDateTime(todo->dtDue());
102 } 102 }
103 icalcomponent_add_property(vtodo,icalproperty_new_due(due)); 103 icalcomponent_add_property(vtodo,icalproperty_new_due(due));
104 } 104 }
105 105
106 // start time 106 // start time
107 if (todo->hasStartDate()) { 107 if (todo->hasStartDate()) {
108 icaltimetype start; 108 icaltimetype start;
109 if (todo->doesFloat()) { 109 if (todo->doesFloat()) {
110// kdDebug(5800) << "§§ Incidence " << todo->summary() << " floats." << endl; 110// kdDebug(5800) << "§§ Incidence " << todo->summary() << " floats." << endl;
111 start = writeICalDate(todo->dtStart().date()); 111 start = writeICalDate(todo->dtStart().date());
112 } else { 112 } else {
113// kdDebug(5800) << "§§ incidence " << todo->summary() << " has time." << endl; 113// kdDebug(5800) << "§§ incidence " << todo->summary() << " has time." << endl;
114 start = writeICalDateTime(todo->dtStart()); 114 start = writeICalDateTime(todo->dtStart());
115 } 115 }
116 icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start)); 116 icalcomponent_add_property(vtodo,icalproperty_new_dtstart(start));
117 } 117 }
118 118
119 // completion date 119 // completion date
120 if (todo->isCompleted()) { 120 if (todo->isCompleted()) {
121 if (!todo->hasCompletedDate()) { 121 if (!todo->hasCompletedDate()) {
122 // If todo was created by KOrganizer <2.2 it has no correct completion 122 // If todo was created by KOrganizer <2.2 it has no correct completion
123 // date. Set it to now. 123 // date. Set it to now.
124 todo->setCompleted(QDateTime::currentDateTime()); 124 todo->setCompleted(QDateTime::currentDateTime());
125 } 125 }
126 icaltimetype completed = writeICalDateTime(todo->completed()); 126 icaltimetype completed = writeICalDateTime(todo->completed());
127 icalcomponent_add_property(vtodo,icalproperty_new_completed(completed)); 127 icalcomponent_add_property(vtodo,icalproperty_new_completed(completed));
128 } 128 }
129 129
130 icalcomponent_add_property(vtodo, 130 icalcomponent_add_property(vtodo,
131 icalproperty_new_percentcomplete(todo->percentComplete())); 131 icalproperty_new_percentcomplete(todo->percentComplete()));
132 132
133 return vtodo; 133 return vtodo;
134} 134}
135 135
136icalcomponent *ICalFormatImpl::writeEvent(Event *event) 136icalcomponent *ICalFormatImpl::writeEvent(Event *event)
137{ 137{
138 kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid() 138 kdDebug(5800) << "Write Event '" << event->summary() << "' (" << event->uid()
139 << ")" << endl; 139 << ")" << endl;
140 140
141 QString tmpStr; 141 QString tmpStr;
142 QStringList tmpStrList; 142 QStringList tmpStrList;
143 143
144 icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT); 144 icalcomponent *vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
145 145
146 writeIncidence(vevent,event); 146 writeIncidence(vevent,event);
147 147
148 // start time 148 // start time
149 icaltimetype start; 149 icaltimetype start;
150 if (event->doesFloat()) { 150 if (event->doesFloat()) {
151// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl; 151// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl;
152 start = writeICalDate(event->dtStart().date()); 152 start = writeICalDate(event->dtStart().date());
153 } else { 153 } else {
154// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl; 154// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl;
155 start = writeICalDateTime(event->dtStart()); 155 start = writeICalDateTime(event->dtStart());
156 } 156 }
157 icalcomponent_add_property(vevent,icalproperty_new_dtstart(start)); 157 icalcomponent_add_property(vevent,icalproperty_new_dtstart(start));
158 158
159 if (event->hasEndDate()) { 159 if (event->hasEndDate()) {
160 // end time 160 // end time
161 icaltimetype end; 161 icaltimetype end;
162 if (event->doesFloat()) { 162 if (event->doesFloat()) {
163// kdDebug(5800) << "§§ Event " << event->summary() << " floats." << endl; 163// kdDebug(5800) << "§§ Event " << event->summary() << " floats." << endl;
164 // +1 day because end date is non-inclusive. 164 // +1 day because end date is non-inclusive.
165 end = writeICalDate( event->dtEnd().date().addDays( 1 ) ); 165 end = writeICalDate( event->dtEnd().date().addDays( 1 ) );
166 } else { 166 } else {
167// kdDebug(5800) << "§§ Event " << event->summary() << " has time." << endl; 167// kdDebug(5800) << "§§ Event " << event->summary() << " has time." << endl;
168 end = writeICalDateTime(event->dtEnd()); 168 end = writeICalDateTime(event->dtEnd());
169 } 169 }
170 icalcomponent_add_property(vevent,icalproperty_new_dtend(end)); 170 icalcomponent_add_property(vevent,icalproperty_new_dtend(end));
171 } 171 }
172 172
173// TODO: attachments, resources 173// TODO: attachments, resources
174#if 0 174#if 0
175 // attachments 175 // attachments
176 tmpStrList = anEvent->attachments(); 176 tmpStrList = anEvent->attachments();
177 for ( QStringList::Iterator it = tmpStrList.begin(); 177 for ( QStringList::Iterator it = tmpStrList.begin();
178 it != tmpStrList.end(); 178 it != tmpStrList.end();
179 ++it ) 179 ++it )
180 addPropValue(vevent, VCAttachProp, (*it).utf8()); 180 addPropValue(vevent, VCAttachProp, (*it).utf8());
181 181
182 // resources 182 // resources
183 tmpStrList = anEvent->resources(); 183 tmpStrList = anEvent->resources();
184 tmpStr = tmpStrList.join(";"); 184 tmpStr = tmpStrList.join(";");
185 if (!tmpStr.isEmpty()) 185 if (!tmpStr.isEmpty())
186 addPropValue(vevent, VCResourcesProp, tmpStr.utf8()); 186 addPropValue(vevent, VCResourcesProp, tmpStr.utf8());
187 187
188#endif 188#endif
189 189
190 // Transparency 190 // Transparency
191 switch( event->transparency() ) { 191 switch( event->transparency() ) {
192 case Event::Transparent: 192 case Event::Transparent:
193 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT)); 193 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT));
194 break; 194 break;
195 case Event::Opaque: 195 case Event::Opaque:
196 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE)); 196 icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE));
197 break; 197 break;
198 } 198 }
199 199
200 return vevent; 200 return vevent;
201} 201}
202 202
203icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy, 203icalcomponent *ICalFormatImpl::writeFreeBusy(FreeBusy *freebusy,
204 Scheduler::Method method) 204 Scheduler::Method method)
205{ 205{
206 206
207 207
208 icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT); 208 icalcomponent *vfreebusy = icalcomponent_new(ICAL_VFREEBUSY_COMPONENT);
209 209
210 writeIncidenceBase(vfreebusy,freebusy); 210 writeIncidenceBase(vfreebusy,freebusy);
211 211
212 icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart( 212 icalcomponent_add_property(vfreebusy, icalproperty_new_dtstart(
213 writeICalDateTime(freebusy->dtStart()))); 213 writeICalDateTime(freebusy->dtStart())));
214 214
215 icalcomponent_add_property(vfreebusy, icalproperty_new_dtend( 215 icalcomponent_add_property(vfreebusy, icalproperty_new_dtend(
216 writeICalDateTime(freebusy->dtEnd()))); 216 writeICalDateTime(freebusy->dtEnd())));
217 217
218 if (method == Scheduler::Request) { 218 if (method == Scheduler::Request) {
219 icalcomponent_add_property(vfreebusy,icalproperty_new_uid( 219 icalcomponent_add_property(vfreebusy,icalproperty_new_uid(
220 freebusy->uid().utf8())); 220 freebusy->uid().utf8()));
221 } 221 }
222 222
223 //Loops through all the periods in the freebusy object 223 //Loops through all the periods in the freebusy object
224 QValueList<Period> list = freebusy->busyPeriods(); 224 QValueList<Period> list = freebusy->busyPeriods();
225 QValueList<Period>::Iterator it; 225 QValueList<Period>::Iterator it;
226 icalperiodtype period; 226 icalperiodtype period;
227 for (it = list.begin(); it!= list.end(); ++it) { 227 for (it = list.begin(); it!= list.end(); ++it) {
228 period.start = writeICalDateTime((*it).start()); 228 period.start = writeICalDateTime((*it).start());
229 period.end = writeICalDateTime((*it).end()); 229 period.end = writeICalDateTime((*it).end());
230 icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) ); 230 icalcomponent_add_property(vfreebusy, icalproperty_new_freebusy(period) );
231 } 231 }
232 232
233 return vfreebusy; 233 return vfreebusy;
234} 234}
235 235
236icalcomponent *ICalFormatImpl::writeJournal(Journal *journal) 236icalcomponent *ICalFormatImpl::writeJournal(Journal *journal)
237{ 237{
238 icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT); 238 icalcomponent *vjournal = icalcomponent_new(ICAL_VJOURNAL_COMPONENT);
239 239
240 writeIncidence(vjournal,journal); 240 writeIncidence(vjournal,journal);
241 241
242 // start time 242 // start time
243 if (journal->dtStart().isValid()) { 243 if (journal->dtStart().isValid()) {
244 icaltimetype start; 244 icaltimetype start;
245 if (journal->doesFloat()) { 245 if (journal->doesFloat()) {
246// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl; 246// kdDebug(5800) << "§§ Incidence " << event->summary() << " floats." << endl;
247 start = writeICalDate(journal->dtStart().date()); 247 start = writeICalDate(journal->dtStart().date());
248 } else { 248 } else {
249// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl; 249// kdDebug(5800) << "§§ incidence " << event->summary() << " has time." << endl;
250 start = writeICalDateTime(journal->dtStart()); 250 start = writeICalDateTime(journal->dtStart());
251 } 251 }
252 icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start)); 252 icalcomponent_add_property(vjournal,icalproperty_new_dtstart(start));
253 } 253 }
254 254
255 return vjournal; 255 return vjournal;
256} 256}
257 257
258void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence) 258void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence)
259{ 259{
260 // pilot sync stuff 260 // pilot sync stuff
261// TODO: move this application-specific code to kpilot 261// TODO: move this application-specific code to kpilot
262 if (incidence->pilotId()) { 262 if (incidence->pilotId()) {
263 incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId())); 263 incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId()));
264 incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus())); 264 incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus()));
265 } 265 }
266 if ( !incidence->IDStr().isEmpty()) { 266 if ( !incidence->IDStr().isEmpty()) {
267 incidence->setNonKDECustomProperty("X-KOPIEXTID",incidence->IDStr() ); 267 incidence->setNonKDECustomProperty("X-KOPIEXTID",incidence->IDStr() );
268 } 268 }
269 269
270 270
271 writeIncidenceBase(parent,incidence); 271 writeIncidenceBase(parent,incidence);
272 if (incidence->cancelled()) { 272 if (incidence->cancelled()) {
273 icalcomponent_add_property(parent,icalproperty_new_status(ICAL_STATUS_CANCELLED)); 273 icalcomponent_add_property(parent,icalproperty_new_status(ICAL_STATUS_CANCELLED));
274 } 274 }
275 275
276 // creation date 276 // creation date
277 icalcomponent_add_property(parent,icalproperty_new_created( 277 icalcomponent_add_property(parent,icalproperty_new_created(
278 writeICalDateTime(incidence->created()))); 278 writeICalDateTime(incidence->created())));
279 279
280 // unique id 280 // unique id
281 icalcomponent_add_property(parent,icalproperty_new_uid( 281 icalcomponent_add_property(parent,icalproperty_new_uid(
282 incidence->uid().utf8())); 282 incidence->uid().utf8()));
283 283
284 // revision 284 // revision
285 icalcomponent_add_property(parent,icalproperty_new_sequence( 285 icalcomponent_add_property(parent,icalproperty_new_sequence(
286 incidence->revision())); 286 incidence->revision()));
287 287
288 // last modification date 288 // last modification date
289 icalcomponent_add_property(parent,icalproperty_new_lastmodified( 289 icalcomponent_add_property(parent,icalproperty_new_lastmodified(
290 writeICalDateTime(incidence->lastModified()))); 290 writeICalDateTime(incidence->lastModified())));
291 291
292 // description 292 // description
293 if (!incidence->description().isEmpty()) { 293 if (!incidence->description().isEmpty()) {
294 icalcomponent_add_property(parent,icalproperty_new_description( 294 icalcomponent_add_property(parent,icalproperty_new_description(
295 incidence->description().utf8())); 295 incidence->description().utf8()));
296 } 296 }
297 297
298 // summary 298 // summary
299 if (!incidence->summary().isEmpty()) { 299 if (!incidence->summary().isEmpty()) {
300 icalcomponent_add_property(parent,icalproperty_new_summary( 300 icalcomponent_add_property(parent,icalproperty_new_summary(
301 incidence->summary().utf8())); 301 incidence->summary().utf8()));
302 } 302 }
303 303
304 // location 304 // location
305 if (!incidence->location().isEmpty()) { 305 if (!incidence->location().isEmpty()) {
306 icalcomponent_add_property(parent,icalproperty_new_location( 306 icalcomponent_add_property(parent,icalproperty_new_location(
307 incidence->location().utf8())); 307 incidence->location().utf8()));
308 } 308 }
309 309
310// TODO: 310// TODO:
311 // status 311 // status
312// addPropValue(parent, VCStatusProp, incidence->getStatusStr().utf8()); 312// addPropValue(parent, VCStatusProp, incidence->getStatusStr().utf8());
313 313
314 // secrecy 314 // secrecy
315 enum icalproperty_class classInt; 315 enum icalproperty_class classInt;
316 switch (incidence->secrecy()) { 316 switch (incidence->secrecy()) {
317 case Incidence::SecrecyPublic: 317 case Incidence::SecrecyPublic:
318 classInt = ICAL_CLASS_PUBLIC; 318 classInt = ICAL_CLASS_PUBLIC;
319 break; 319 break;
320 case Incidence::SecrecyConfidential: 320 case Incidence::SecrecyConfidential:
321 classInt = ICAL_CLASS_CONFIDENTIAL; 321 classInt = ICAL_CLASS_CONFIDENTIAL;
322 break; 322 break;
323 case Incidence::SecrecyPrivate: 323 case Incidence::SecrecyPrivate:
324 classInt =ICAL_CLASS_PRIVATE ; 324 classInt =ICAL_CLASS_PRIVATE ;
325 default: 325 default:
326 classInt =ICAL_CLASS_PRIVATE ; 326 classInt =ICAL_CLASS_PRIVATE ;
327 break; 327 break;
328 } 328 }
329 icalcomponent_add_property(parent,icalproperty_new_class(classInt)); 329 icalcomponent_add_property(parent,icalproperty_new_class(classInt));
330 330
331 // priority 331 // priority
332 icalcomponent_add_property(parent,icalproperty_new_priority( 332 icalcomponent_add_property(parent,icalproperty_new_priority(
333 incidence->priority())); 333 incidence->priority()));
334 334
335 // categories 335 // categories
336 QStringList categories = incidence->categories(); 336 QStringList categories = incidence->categories();
337 QStringList::Iterator it; 337 QStringList::Iterator it;
338 for(it = categories.begin(); it != categories.end(); ++it ) { 338 for(it = categories.begin(); it != categories.end(); ++it ) {
339 icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8())); 339 icalcomponent_add_property(parent,icalproperty_new_categories((*it).utf8()));
340 } 340 }
341// TODO: Ensure correct concatenation of categories properties. 341// TODO: Ensure correct concatenation of categories properties.
342 342
343/* 343/*
344 // categories 344 // categories
345 tmpStrList = incidence->getCategories(); 345 tmpStrList = incidence->getCategories();
346 tmpStr = ""; 346 tmpStr = "";
347 QString catStr; 347 QString catStr;
348 for ( QStringList::Iterator it = tmpStrList.begin(); 348 for ( QStringList::Iterator it = tmpStrList.begin();
349 it != tmpStrList.end(); 349 it != tmpStrList.end();
350 ++it ) { 350 ++it ) {
351 catStr = *it; 351 catStr = *it;
352 if (catStr[0] == ' ') 352 if (catStr[0] == ' ')
353 tmpStr += catStr.mid(1); 353 tmpStr += catStr.mid(1);
354 else 354 else
355 tmpStr += catStr; 355 tmpStr += catStr;
356 // this must be a ';' character as the vCalendar specification requires! 356 // this must be a ';' character as the vCalendar specification requires!
357 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 357 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
358 // read in. 358 // read in.
359 tmpStr += ";"; 359 tmpStr += ";";
360 } 360 }
361 if (!tmpStr.isEmpty()) { 361 if (!tmpStr.isEmpty()) {
362 tmpStr.truncate(tmpStr.length()-1); 362 tmpStr.truncate(tmpStr.length()-1);
363 icalcomponent_add_property(parent,icalproperty_new_categories( 363 icalcomponent_add_property(parent,icalproperty_new_categories(
364 writeText(incidence->getCategories().join(";")))); 364 writeText(incidence->getCategories().join(";"))));
365 } 365 }
366*/ 366*/
367 367
368 // related event 368 // related event
369 if (!incidence->relatedToUid().isEmpty()) { 369 if (!incidence->relatedToUid().isEmpty()) {
370 icalcomponent_add_property(parent,icalproperty_new_relatedto( 370 icalcomponent_add_property(parent,icalproperty_new_relatedto(
371 incidence->relatedToUid().utf8())); 371 incidence->relatedToUid().utf8()));
372 } 372 }
373 373
374 // recurrence rule stuff 374 // recurrence rule stuff
375 Recurrence *recur = incidence->recurrence(); 375 if (incidence->doesRecur()) {
376 if (recur->doesRecur()) { 376 icalcomponent_add_property(parent,writeRecurrenceRule(incidence->recurrence()));
377 377 // recurrence excpetion dates
378 icalcomponent_add_property(parent,writeRecurrenceRule(recur)); 378 DateList dateList = incidence->exDates();
379 } 379 DateList::ConstIterator exIt;
380 380 for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) {
381 // recurrence excpetion dates 381 icalcomponent_add_property(parent,icalproperty_new_exdate(
382 DateList dateList = incidence->exDates(); 382 writeICalDate(*exIt)));
383 DateList::ConstIterator exIt; 383 }
384 for(exIt = dateList.begin(); exIt != dateList.end(); ++exIt) {
385 icalcomponent_add_property(parent,icalproperty_new_exdate(
386 writeICalDate(*exIt)));
387 } 384 }
388 385
389 // attachments 386 // attachments
390 QPtrList<Attachment> attachments = incidence->attachments(); 387 QPtrList<Attachment> attachments = incidence->attachments();
391 for (Attachment *at = attachments.first(); at; at = attachments.next()) 388 for (Attachment *at = attachments.first(); at; at = attachments.next())
392 icalcomponent_add_property(parent,writeAttachment(at)); 389 icalcomponent_add_property(parent,writeAttachment(at));
393 390
394 // alarms 391 // alarms
395 QPtrList<Alarm> alarms = incidence->alarms(); 392 QPtrList<Alarm> alarms = incidence->alarms();
396 Alarm* alarm; 393 Alarm* alarm;
397 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 394 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
398 if (alarm->enabled()) { 395 if (alarm->enabled()) {
399 kdDebug(5800) << "Write alarm for " << incidence->summary() << endl; 396 kdDebug(5800) << "Write alarm for " << incidence->summary() << endl;
400 icalcomponent_add_component(parent,writeAlarm(alarm)); 397 icalcomponent_add_component(parent,writeAlarm(alarm));
401 } 398 }
402 } 399 }
403 if( incidence->hasRecurrenceID() ) { 400 if( incidence->hasRecurrenceID() ) {
404 icalcomponent_add_property(parent, 401 icalcomponent_add_property(parent,
405 icalproperty_new_recurrenceid( writeICalDateTime( incidence->recurrenceID()))); 402 icalproperty_new_recurrenceid( writeICalDateTime( incidence->recurrenceID())));
406 } 403 }
407 // duration 404 // duration
408 405
409// turned off as it always is set to PTS0 (and must not occur together with DTEND 406// turned off as it always is set to PTS0 (and must not occur together with DTEND
410 407
411 if (incidence->hasDuration()) { 408 if (incidence->hasDuration()) {
412 icaldurationtype duration; 409 icaldurationtype duration;
413 duration = writeICalDuration(incidence->duration()); 410 duration = writeICalDuration(incidence->duration());
414 icalcomponent_add_property(parent,icalproperty_new_duration(duration)); 411 icalcomponent_add_property(parent,icalproperty_new_duration(duration));
415 } 412 }
416} 413}
417 414
418void ICalFormatImpl::writeIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase) 415void ICalFormatImpl::writeIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
419{ 416{
420 icalcomponent_add_property(parent,icalproperty_new_dtstamp( 417 icalcomponent_add_property(parent,icalproperty_new_dtstamp(
421 writeICalDateTime(QDateTime::currentDateTime()))); 418 writeICalDateTime(QDateTime::currentDateTime())));
422 419
423 // organizer stuff 420 // organizer stuff
424 icalcomponent_add_property(parent,icalproperty_new_organizer( 421 icalcomponent_add_property(parent,icalproperty_new_organizer(
425 ("MAILTO:" + incidenceBase->organizer()).utf8())); 422 ("MAILTO:" + incidenceBase->organizer()).utf8()));
426 423
427 // attendees 424 // attendees
428 if (incidenceBase->attendeeCount() != 0) { 425 if (incidenceBase->attendeeCount() != 0) {
429 QPtrList<Attendee> al = incidenceBase->attendees(); 426 QPtrList<Attendee> al = incidenceBase->attendees();
430 QPtrListIterator<Attendee> ai(al); 427 QPtrListIterator<Attendee> ai(al);
431 for (; ai.current(); ++ai) { 428 for (; ai.current(); ++ai) {
432 icalcomponent_add_property(parent,writeAttendee(ai.current())); 429 icalcomponent_add_property(parent,writeAttendee(ai.current()));
433 } 430 }
434 } 431 }
435 432
436 // custom properties 433 // custom properties
437 writeCustomProperties(parent, incidenceBase); 434 writeCustomProperties(parent, incidenceBase);
438} 435}
439 436
440void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties) 437void ICalFormatImpl::writeCustomProperties(icalcomponent *parent,CustomProperties *properties)
441{ 438{
442 QMap<QCString, QString> custom = properties->customProperties(); 439 QMap<QCString, QString> custom = properties->customProperties();
443 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) { 440 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
444 icalproperty *p = icalproperty_new_x(c.data().utf8()); 441 icalproperty *p = icalproperty_new_x(c.data().utf8());
445 icalproperty_set_x_name(p,c.key()); 442 icalproperty_set_x_name(p,c.key());
446 icalcomponent_add_property(parent,p); 443 icalcomponent_add_property(parent,p);
447 } 444 }
448} 445}
449 446
450icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee) 447icalproperty *ICalFormatImpl::writeAttendee(Attendee *attendee)
451{ 448{
452 icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8()); 449 icalproperty *p = icalproperty_new_attendee("mailto:" + attendee->email().utf8());
453 450
454 if (!attendee->name().isEmpty()) { 451 if (!attendee->name().isEmpty()) {
455 icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8())); 452 icalproperty_add_parameter(p,icalparameter_new_cn(attendee->name().utf8()));
456 } 453 }
457 454
458 455
459 icalproperty_add_parameter(p,icalparameter_new_rsvp( 456 icalproperty_add_parameter(p,icalparameter_new_rsvp(
460 attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE )); 457 attendee->RSVP() ? ICAL_RSVP_TRUE : ICAL_RSVP_FALSE ));
461 458
462 icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION; 459 icalparameter_partstat status = ICAL_PARTSTAT_NEEDSACTION;
463 switch (attendee->status()) { 460 switch (attendee->status()) {
464 default: 461 default:
465 case Attendee::NeedsAction: 462 case Attendee::NeedsAction:
466 status = ICAL_PARTSTAT_NEEDSACTION; 463 status = ICAL_PARTSTAT_NEEDSACTION;
467 break; 464 break;
468 case Attendee::Accepted: 465 case Attendee::Accepted:
469 status = ICAL_PARTSTAT_ACCEPTED; 466 status = ICAL_PARTSTAT_ACCEPTED;
470 break; 467 break;
471 case Attendee::Declined: 468 case Attendee::Declined:
472 status = ICAL_PARTSTAT_DECLINED; 469 status = ICAL_PARTSTAT_DECLINED;
473 break; 470 break;
474 case Attendee::Tentative: 471 case Attendee::Tentative:
475 status = ICAL_PARTSTAT_TENTATIVE; 472 status = ICAL_PARTSTAT_TENTATIVE;
476 break; 473 break;
477 case Attendee::Delegated: 474 case Attendee::Delegated:
478 status = ICAL_PARTSTAT_DELEGATED; 475 status = ICAL_PARTSTAT_DELEGATED;
479 break; 476 break;
480 case Attendee::Completed: 477 case Attendee::Completed:
481 status = ICAL_PARTSTAT_COMPLETED; 478 status = ICAL_PARTSTAT_COMPLETED;
482 break; 479 break;
483 case Attendee::InProcess: 480 case Attendee::InProcess:
484 status = ICAL_PARTSTAT_INPROCESS; 481 status = ICAL_PARTSTAT_INPROCESS;
485 break; 482 break;
486 } 483 }
487 icalproperty_add_parameter(p,icalparameter_new_partstat(status)); 484 icalproperty_add_parameter(p,icalparameter_new_partstat(status));
488 485
489 icalparameter_role role = ICAL_ROLE_REQPARTICIPANT; 486 icalparameter_role role = ICAL_ROLE_REQPARTICIPANT;
490 switch (attendee->role()) { 487 switch (attendee->role()) {
491 case Attendee::Chair: 488 case Attendee::Chair:
492 role = ICAL_ROLE_CHAIR; 489 role = ICAL_ROLE_CHAIR;
493 break; 490 break;
494 default: 491 default:
495 case Attendee::ReqParticipant: 492 case Attendee::ReqParticipant:
496 role = ICAL_ROLE_REQPARTICIPANT; 493 role = ICAL_ROLE_REQPARTICIPANT;
497 break; 494 break;
498 case Attendee::OptParticipant: 495 case Attendee::OptParticipant:
499 role = ICAL_ROLE_OPTPARTICIPANT; 496 role = ICAL_ROLE_OPTPARTICIPANT;
500 break; 497 break;
501 case Attendee::NonParticipant: 498 case Attendee::NonParticipant:
502 role = ICAL_ROLE_NONPARTICIPANT; 499 role = ICAL_ROLE_NONPARTICIPANT;
503 break; 500 break;
504 } 501 }
505 icalproperty_add_parameter(p,icalparameter_new_role(role)); 502 icalproperty_add_parameter(p,icalparameter_new_role(role));
506 503
507 if (!attendee->uid().isEmpty()) { 504 if (!attendee->uid().isEmpty()) {
508 icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8()); 505 icalparameter* icalparameter_uid = icalparameter_new_x(attendee->uid().utf8());
509 icalparameter_set_xname(icalparameter_uid,"X-UID"); 506 icalparameter_set_xname(icalparameter_uid,"X-UID");
510 icalproperty_add_parameter(p,icalparameter_uid); 507 icalproperty_add_parameter(p,icalparameter_uid);
511 } 508 }
512 509
513 return p; 510 return p;
514} 511}
515 512
516icalproperty *ICalFormatImpl::writeAttachment(Attachment *att) 513icalproperty *ICalFormatImpl::writeAttachment(Attachment *att)
517{ 514{
518#if 0 515#if 0
519 icalattachtype* attach = icalattachtype_new(); 516 icalattachtype* attach = icalattachtype_new();
520 if (att->isURI()) 517 if (att->isURI())
521 icalattachtype_set_url(attach, att->uri().utf8().data()); 518 icalattachtype_set_url(attach, att->uri().utf8().data());
522 else 519 else
523 icalattachtype_set_base64(attach, att->data(), 0); 520 icalattachtype_set_base64(attach, att->data(), 0);
524#endif 521#endif
525 icalattach *attach; 522 icalattach *attach;
526 if (att->isURI()) 523 if (att->isURI())
527 attach = icalattach_new_from_url( att->uri().utf8().data()); 524 attach = icalattach_new_from_url( att->uri().utf8().data());
528 else 525 else
529 attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0); 526 attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0);
530 icalproperty *p = icalproperty_new_attach(attach); 527 icalproperty *p = icalproperty_new_attach(attach);
531 if (!att->mimeType().isEmpty()) 528 if (!att->mimeType().isEmpty())
532 icalproperty_add_parameter(p,icalparameter_new_fmttype(att->mimeType().utf8().data())); 529 icalproperty_add_parameter(p,icalparameter_new_fmttype(att->mimeType().utf8().data()));
533 530
534 if (att->isBinary()) { 531 if (att->isBinary()) {
535 icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY)); 532 icalproperty_add_parameter(p,icalparameter_new_value(ICAL_VALUE_BINARY));
536 icalproperty_add_parameter(p,icalparameter_new_encoding(ICAL_ENCODING_BASE64)); 533 icalproperty_add_parameter(p,icalparameter_new_encoding(ICAL_ENCODING_BASE64));
537 } 534 }
538 return p; 535 return p;
539} 536}
540 537
541icalproperty *ICalFormatImpl::writeRecurrenceRule(Recurrence *recur) 538icalproperty *ICalFormatImpl::writeRecurrenceRule(Recurrence *recur)
542{ 539{
543// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl; 540// kdDebug(5800) << "ICalFormatImpl::writeRecurrenceRule()" << endl;
544 541
545 icalrecurrencetype r; 542 icalrecurrencetype r;
546 543
547 icalrecurrencetype_clear(&r); 544 icalrecurrencetype_clear(&r);
548 545
549 int index = 0; 546 int index = 0;
550 int index2 = 0; 547 int index2 = 0;
551 548
552 QPtrList<Recurrence::rMonthPos> tmpPositions; 549 QPtrList<Recurrence::rMonthPos> tmpPositions;
553 QPtrList<int> tmpDays; 550 QPtrList<int> tmpDays;
554 int *tmpDay; 551 int *tmpDay;
555 Recurrence::rMonthPos *tmpPos; 552 Recurrence::rMonthPos *tmpPos;
556 bool datetime = false; 553 bool datetime = false;
557 int day; 554 int day;
558 int i; 555 int i;
559 556
560 switch(recur->doesRecur()) { 557 switch(recur->doesRecur()) {
561 case Recurrence::rMinutely: 558 case Recurrence::rMinutely:
562 r.freq = ICAL_MINUTELY_RECURRENCE; 559 r.freq = ICAL_MINUTELY_RECURRENCE;
563 datetime = true; 560 datetime = true;
564 break; 561 break;
565 case Recurrence::rHourly: 562 case Recurrence::rHourly:
566 r.freq = ICAL_HOURLY_RECURRENCE; 563 r.freq = ICAL_HOURLY_RECURRENCE;
567 datetime = true; 564 datetime = true;
568 break; 565 break;
569 case Recurrence::rDaily: 566 case Recurrence::rDaily:
570 r.freq = ICAL_DAILY_RECURRENCE; 567 r.freq = ICAL_DAILY_RECURRENCE;
571 break; 568 break;
572 case Recurrence::rWeekly: 569 case Recurrence::rWeekly:
573 r.freq = ICAL_WEEKLY_RECURRENCE; 570 r.freq = ICAL_WEEKLY_RECURRENCE;
574 r.week_start = static_cast<icalrecurrencetype_weekday>(recur->weekStart()%7 + 1); 571 r.week_start = static_cast<icalrecurrencetype_weekday>(recur->weekStart()%7 + 1);
575 for (i = 0; i < 7; i++) { 572 for (i = 0; i < 7; i++) {
576 if (recur->days().testBit(i)) { 573 if (recur->days().testBit(i)) {
577 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 574 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
578 r.by_day[index++] = icalrecurrencetype_day_day_of_week(day); 575 r.by_day[index++] = icalrecurrencetype_day_day_of_week(day);
579 } 576 }
580 } 577 }
581// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 578// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
582 break; 579 break;
583 case Recurrence::rMonthlyPos: 580 case Recurrence::rMonthlyPos:
584 r.freq = ICAL_MONTHLY_RECURRENCE; 581 r.freq = ICAL_MONTHLY_RECURRENCE;
585 582
586 tmpPositions = recur->monthPositions(); 583 tmpPositions = recur->monthPositions();
587 for (tmpPos = tmpPositions.first(); 584 for (tmpPos = tmpPositions.first();
588 tmpPos; 585 tmpPos;
589 tmpPos = tmpPositions.next()) { 586 tmpPos = tmpPositions.next()) {
590 for (i = 0; i < 7; i++) { 587 for (i = 0; i < 7; i++) {
591 if (tmpPos->rDays.testBit(i)) { 588 if (tmpPos->rDays.testBit(i)) {
592 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 589 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
593 day += tmpPos->rPos*8; 590 day += tmpPos->rPos*8;
594 if (tmpPos->negative) day = -day; 591 if (tmpPos->negative) day = -day;
595 r.by_day[index++] = day; 592 r.by_day[index++] = day;
596 } 593 }
597 } 594 }
598 } 595 }
599// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 596// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
600 break; 597 break;
601 case Recurrence::rMonthlyDay: 598 case Recurrence::rMonthlyDay:
602 r.freq = ICAL_MONTHLY_RECURRENCE; 599 r.freq = ICAL_MONTHLY_RECURRENCE;
603 600
604 tmpDays = recur->monthDays(); 601 tmpDays = recur->monthDays();
605 for (tmpDay = tmpDays.first(); 602 for (tmpDay = tmpDays.first();
606 tmpDay; 603 tmpDay;
607 tmpDay = tmpDays.next()) { 604 tmpDay = tmpDays.next()) {
608 r.by_month_day[index++] = icalrecurrencetype_day_position(*tmpDay*8);//*tmpDay); 605 r.by_month_day[index++] = icalrecurrencetype_day_position(*tmpDay*8);//*tmpDay);
609 } 606 }
610// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 607// r.by_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
611 break; 608 break;
612 case Recurrence::rYearlyMonth: 609 case Recurrence::rYearlyMonth:
613 case Recurrence::rYearlyPos: 610 case Recurrence::rYearlyPos:
614 r.freq = ICAL_YEARLY_RECURRENCE; 611 r.freq = ICAL_YEARLY_RECURRENCE;
615 612
616 tmpDays = recur->yearNums(); 613 tmpDays = recur->yearNums();
617 for (tmpDay = tmpDays.first(); 614 for (tmpDay = tmpDays.first();
618 tmpDay; 615 tmpDay;
619 tmpDay = tmpDays.next()) { 616 tmpDay = tmpDays.next()) {
620 r.by_month[index++] = *tmpDay; 617 r.by_month[index++] = *tmpDay;
621 } 618 }
622// r.by_set_pos[index] = ICAL_RECURRENCE_ARRAY_MAX; 619// r.by_set_pos[index] = ICAL_RECURRENCE_ARRAY_MAX;
623 if (recur->doesRecur() == Recurrence::rYearlyPos) { 620 if (recur->doesRecur() == Recurrence::rYearlyPos) {
624 tmpPositions = recur->monthPositions(); 621 tmpPositions = recur->monthPositions();
625 for (tmpPos = tmpPositions.first(); 622 for (tmpPos = tmpPositions.first();
626 tmpPos; 623 tmpPos;
627 tmpPos = tmpPositions.next()) { 624 tmpPos = tmpPositions.next()) {
628 for (i = 0; i < 7; i++) { 625 for (i = 0; i < 7; i++) {
629 if (tmpPos->rDays.testBit(i)) { 626 if (tmpPos->rDays.testBit(i)) {
630 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1 627 day = (i + 1)%7 + 1; // convert from Monday=0 to Sunday=1
631 day += tmpPos->rPos*8; 628 day += tmpPos->rPos*8;
632 if (tmpPos->negative) day = -day; 629 if (tmpPos->negative) day = -day;
633 r.by_day[index2++] = day; 630 r.by_day[index2++] = day;
634 } 631 }
635 } 632 }
636 } 633 }
637// r.by_day[index2] = ICAL_RECURRENCE_ARRAY_MAX; 634// r.by_day[index2] = ICAL_RECURRENCE_ARRAY_MAX;
638 } 635 }
639 break; 636 break;
640 case Recurrence::rYearlyDay: 637 case Recurrence::rYearlyDay:
641 r.freq = ICAL_YEARLY_RECURRENCE; 638 r.freq = ICAL_YEARLY_RECURRENCE;
642 639
643 tmpDays = recur->yearNums(); 640 tmpDays = recur->yearNums();
644 for (tmpDay = tmpDays.first(); 641 for (tmpDay = tmpDays.first();
645 tmpDay; 642 tmpDay;
646 tmpDay = tmpDays.next()) { 643 tmpDay = tmpDays.next()) {
647 r.by_year_day[index++] = *tmpDay; 644 r.by_year_day[index++] = *tmpDay;
648 } 645 }
649// r.by_year_day[index] = ICAL_RECURRENCE_ARRAY_MAX; 646// r.by_year_day[index] = ICAL_RECURRENCE_ARRAY_MAX;
650 break; 647 break;
651 default: 648 default:
652 r.freq = ICAL_NO_RECURRENCE; 649 r.freq = ICAL_NO_RECURRENCE;
653 kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl; 650 kdDebug(5800) << "ICalFormatImpl::writeRecurrence(): no recurrence" << endl;
654 break; 651 break;
655 } 652 }
656 653
657 r.interval = recur->frequency(); 654 r.interval = recur->frequency();
658 655
659 if (recur->duration() > 0) { 656 if (recur->duration() > 0) {
660 r.count = recur->duration(); 657 r.count = recur->duration();
661 } else if (recur->duration() == -1) { 658 } else if (recur->duration() == -1) {
662 r.count = 0; 659 r.count = 0;
663 } else { 660 } else {
664 if (datetime) 661 if (datetime)
665 r.until = writeICalDateTime(recur->endDateTime()); 662 r.until = writeICalDateTime(recur->endDateTime());
666 else 663 else
667 r.until = writeICalDate(recur->endDate()); 664 r.until = writeICalDate(recur->endDate());
668 } 665 }
669 666
670// Debug output 667// Debug output
671#if 0 668#if 0
672 const char *str = icalrecurrencetype_as_string(&r); 669 const char *str = icalrecurrencetype_as_string(&r);
673 if (str) { 670 if (str) {
674 kdDebug(5800) << " String: " << str << endl; 671 kdDebug(5800) << " String: " << str << endl;
675 } else { 672 } else {
676 kdDebug(5800) << " No String" << endl; 673 kdDebug(5800) << " No String" << endl;
677 } 674 }
678#endif 675#endif
679 676
680 return icalproperty_new_rrule(r); 677 return icalproperty_new_rrule(r);
681} 678}
682 679
683icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) 680icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm)
684{ 681{
685 icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT); 682 icalcomponent *a = icalcomponent_new(ICAL_VALARM_COMPONENT);
686 683
687 icalproperty_action action; 684 icalproperty_action action;
688 icalattach *attach = 0; 685 icalattach *attach = 0;
689 686
690 switch (alarm->type()) { 687 switch (alarm->type()) {
691 case Alarm::Procedure: 688 case Alarm::Procedure:
692 action = ICAL_ACTION_PROCEDURE; 689 action = ICAL_ACTION_PROCEDURE;
693 attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() ); 690 attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() );
694 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 691 icalcomponent_add_property(a,icalproperty_new_attach(attach));
695 if (!alarm->programArguments().isEmpty()) { 692 if (!alarm->programArguments().isEmpty()) {
696 icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8())); 693 icalcomponent_add_property(a,icalproperty_new_description(alarm->programArguments().utf8()));
697 } 694 }
698 icalattach_unref( attach ); 695 icalattach_unref( attach );
699 break; 696 break;
700 case Alarm::Audio: 697 case Alarm::Audio:
701 action = ICAL_ACTION_AUDIO; 698 action = ICAL_ACTION_AUDIO;
702 if (!alarm->audioFile().isEmpty()) { 699 if (!alarm->audioFile().isEmpty()) {
703 attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data()); 700 attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data());
704 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 701 icalcomponent_add_property(a,icalproperty_new_attach(attach));
705 icalattach_unref( attach ); 702 icalattach_unref( attach );
706 } 703 }
707 break; 704 break;
708 case Alarm::Email: { 705 case Alarm::Email: {
709 action = ICAL_ACTION_EMAIL; 706 action = ICAL_ACTION_EMAIL;
710 QValueList<Person> addresses = alarm->mailAddresses(); 707 QValueList<Person> addresses = alarm->mailAddresses();
711 for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) { 708 for (QValueList<Person>::Iterator ad = addresses.begin(); ad != addresses.end(); ++ad) {
712 icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8()); 709 icalproperty *p = icalproperty_new_attendee("MAILTO:" + (*ad).email().utf8());
713 if (!(*ad).name().isEmpty()) { 710 if (!(*ad).name().isEmpty()) {
714 icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8())); 711 icalproperty_add_parameter(p,icalparameter_new_cn((*ad).name().utf8()));
715 } 712 }
716 icalcomponent_add_property(a,p); 713 icalcomponent_add_property(a,p);
717 } 714 }
718 icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8())); 715 icalcomponent_add_property(a,icalproperty_new_summary(alarm->mailSubject().utf8()));
719 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8())); 716 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
720 QStringList attachments = alarm->mailAttachments(); 717 QStringList attachments = alarm->mailAttachments();
721 if (attachments.count() > 0) { 718 if (attachments.count() > 0) {
722 for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) { 719 for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) {
723 attach = icalattach_new_from_url(QFile::encodeName( *at ).data()); 720 attach = icalattach_new_from_url(QFile::encodeName( *at ).data());
724 icalcomponent_add_property(a,icalproperty_new_attach(attach)); 721 icalcomponent_add_property(a,icalproperty_new_attach(attach));
725 icalattach_unref( attach ); 722 icalattach_unref( attach );
726 } 723 }
727 } 724 }
728 break; 725 break;
729 } 726 }
730 case Alarm::Display: 727 case Alarm::Display:
731 action = ICAL_ACTION_DISPLAY; 728 action = ICAL_ACTION_DISPLAY;
732 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8())); 729 icalcomponent_add_property(a,icalproperty_new_description(alarm->text().utf8()));
733 break; 730 break;
734 case Alarm::Invalid: 731 case Alarm::Invalid:
735 default: 732 default:
736 kdDebug(5800) << "Unknown type of alarm" << endl; 733 kdDebug(5800) << "Unknown type of alarm" << endl;
737 action = ICAL_ACTION_NONE; 734 action = ICAL_ACTION_NONE;
738 break; 735 break;
739 } 736 }
740 icalcomponent_add_property(a,icalproperty_new_action(action)); 737 icalcomponent_add_property(a,icalproperty_new_action(action));
741 738
742 // Trigger time 739 // Trigger time
743 icaltriggertype trigger; 740 icaltriggertype trigger;
744 if ( alarm->hasTime() ) { 741 if ( alarm->hasTime() ) {
745 trigger.time = writeICalDateTime(alarm->time()); 742 trigger.time = writeICalDateTime(alarm->time());
746 trigger.duration = icaldurationtype_null_duration(); 743 trigger.duration = icaldurationtype_null_duration();
747 } else { 744 } else {
748 trigger.time = icaltime_null_time(); 745 trigger.time = icaltime_null_time();
749 Duration offset; 746 Duration offset;
750 if ( alarm->hasStartOffset() ) 747 if ( alarm->hasStartOffset() )
751 offset = alarm->startOffset(); 748 offset = alarm->startOffset();
752 else 749 else
753 offset = alarm->endOffset(); 750 offset = alarm->endOffset();
754 trigger.duration = icaldurationtype_from_int( offset.asSeconds() ); 751 trigger.duration = icaldurationtype_from_int( offset.asSeconds() );
755 } 752 }
756 icalproperty *p = icalproperty_new_trigger(trigger); 753 icalproperty *p = icalproperty_new_trigger(trigger);
757 if ( alarm->hasEndOffset() ) 754 if ( alarm->hasEndOffset() )
758 icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END)); 755 icalproperty_add_parameter(p,icalparameter_new_related(ICAL_RELATED_END));
759 icalcomponent_add_property(a,p); 756 icalcomponent_add_property(a,p);
760 757
761 // Repeat count and duration 758 // Repeat count and duration
762 if (alarm->repeatCount()) { 759 if (alarm->repeatCount()) {
763 icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount())); 760 icalcomponent_add_property(a,icalproperty_new_repeat(alarm->repeatCount()));
764 icalcomponent_add_property(a,icalproperty_new_duration( 761 icalcomponent_add_property(a,icalproperty_new_duration(
765 icaldurationtype_from_int(alarm->snoozeTime()*60))); 762 icaldurationtype_from_int(alarm->snoozeTime()*60)));
766 } 763 }
767 764
768 // Custom properties 765 // Custom properties
769 QMap<QCString, QString> custom = alarm->customProperties(); 766 QMap<QCString, QString> custom = alarm->customProperties();
770 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) { 767 for (QMap<QCString, QString>::Iterator c = custom.begin(); c != custom.end(); ++c) {
771 icalproperty *p = icalproperty_new_x(c.data().utf8()); 768 icalproperty *p = icalproperty_new_x(c.data().utf8());
772 icalproperty_set_x_name(p,c.key()); 769 icalproperty_set_x_name(p,c.key());
773 icalcomponent_add_property(a,p); 770 icalcomponent_add_property(a,p);
774 } 771 }
775 772
776 return a; 773 return a;
777} 774}
778 775
779Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo) 776Todo *ICalFormatImpl::readTodo(icalcomponent *vtodo)
780{ 777{
781 Todo *todo = new Todo; 778 Todo *todo = new Todo;
782 779
783 readIncidence(vtodo,todo); 780 readIncidence(vtodo,todo);
784 781
785 icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY); 782 icalproperty *p = icalcomponent_get_first_property(vtodo,ICAL_ANY_PROPERTY);
786 783
787// int intvalue; 784// int intvalue;
788 icaltimetype icaltime; 785 icaltimetype icaltime;
789 786
790 QStringList categories; 787 QStringList categories;
791 788
792 while (p) { 789 while (p) {
793 icalproperty_kind kind = icalproperty_isa(p); 790 icalproperty_kind kind = icalproperty_isa(p);
794 switch (kind) { 791 switch (kind) {
795 792
796 case ICAL_DUE_PROPERTY: // due date 793 case ICAL_DUE_PROPERTY: // due date
797 icaltime = icalproperty_get_due(p); 794 icaltime = icalproperty_get_due(p);
798 if (icaltime.is_date) { 795 if (icaltime.is_date) {
799 todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0))); 796 todo->setDtDue(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
800 todo->setFloats(true); 797 todo->setFloats(true);
801 798
802 } else { 799 } else {
803 todo->setDtDue(readICalDateTime(icaltime)); 800 todo->setDtDue(readICalDateTime(icaltime));
804 todo->setFloats(false); 801 todo->setFloats(false);
805 } 802 }
806 todo->setHasDueDate(true); 803 todo->setHasDueDate(true);
807 break; 804 break;
808 805
809 case ICAL_COMPLETED_PROPERTY: // completion date 806 case ICAL_COMPLETED_PROPERTY: // completion date
810 icaltime = icalproperty_get_completed(p); 807 icaltime = icalproperty_get_completed(p);
811 todo->setCompleted(readICalDateTime(icaltime)); 808 todo->setCompleted(readICalDateTime(icaltime));
812 break; 809 break;
813 810
814 case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed 811 case ICAL_PERCENTCOMPLETE_PROPERTY: // Percent completed
815 todo->setPercentComplete(icalproperty_get_percentcomplete(p)); 812 todo->setPercentComplete(icalproperty_get_percentcomplete(p));
816 break; 813 break;
817 814
818 case ICAL_RELATEDTO_PROPERTY: // related todo (parent) 815 case ICAL_RELATEDTO_PROPERTY: // related todo (parent)
819 todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p))); 816 todo->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
820 mTodosRelate.append(todo); 817 mTodosRelate.append(todo);
821 break; 818 break;
822 819
823 case ICAL_DTSTART_PROPERTY: 820 case ICAL_DTSTART_PROPERTY:
824 // Flag that todo has start date. Value is read in by readIncidence(). 821 // Flag that todo has start date. Value is read in by readIncidence().
825 todo->setHasStartDate(true); 822 todo->setHasStartDate(true);
826 break; 823 break;
827 824
828 default: 825 default:
829// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind 826// kdDebug(5800) << "ICALFormat::readTodo(): Unknown property: " << kind
830// << endl; 827// << endl;
831 break; 828 break;
832 } 829 }
833 830
834 p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY); 831 p = icalcomponent_get_next_property(vtodo,ICAL_ANY_PROPERTY);
835 } 832 }
836 833
837 return todo; 834 return todo;
838} 835}
839 836
840Event *ICalFormatImpl::readEvent(icalcomponent *vevent) 837Event *ICalFormatImpl::readEvent(icalcomponent *vevent)
841{ 838{
842 Event *event = new Event; 839 Event *event = new Event;
843 event->setFloats(false); 840 event->setFloats(false);
844 841
845 readIncidence(vevent,event); 842 readIncidence(vevent,event);
846 843
847 icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY); 844 icalproperty *p = icalcomponent_get_first_property(vevent,ICAL_ANY_PROPERTY);
848 845
849// int intvalue; 846// int intvalue;
850 icaltimetype icaltime; 847 icaltimetype icaltime;
851 848
852 QStringList categories; 849 QStringList categories;
853 QString transparency; 850 QString transparency;
854 851
855 while (p) { 852 while (p) {
856 icalproperty_kind kind = icalproperty_isa(p); 853 icalproperty_kind kind = icalproperty_isa(p);
857 switch (kind) { 854 switch (kind) {
858 855
859 case ICAL_DTEND_PROPERTY: // start date and time 856 case ICAL_DTEND_PROPERTY: // start date and time
860 icaltime = icalproperty_get_dtend(p); 857 icaltime = icalproperty_get_dtend(p);
861 if (icaltime.is_date) { 858 if (icaltime.is_date) {
862 event->setFloats( true ); 859 event->setFloats( true );
863 // End date is non-inclusive 860 // End date is non-inclusive
864 QDate endDate = readICalDate( icaltime ).addDays( -1 ); 861 QDate endDate = readICalDate( icaltime ).addDays( -1 );
865 mCompat->fixFloatingEnd( endDate ); 862 mCompat->fixFloatingEnd( endDate );
866 if ( endDate < event->dtStart().date() ) { 863 if ( endDate < event->dtStart().date() ) {
867 endDate = event->dtStart().date(); 864 endDate = event->dtStart().date();
868 } 865 }
869 event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) ); 866 event->setDtEnd( QDateTime( endDate, QTime( 0, 0, 0 ) ) );
870 } else { 867 } else {
871 event->setDtEnd(readICalDateTime(icaltime)); 868 event->setDtEnd(readICalDateTime(icaltime));
872 } 869 }
873 break; 870 break;
874 871
875// TODO: 872// TODO:
876 // at this point, there should be at least a start or end time. 873 // at this point, there should be at least a start or end time.
877 // fix up for events that take up no time but have a time associated 874 // fix up for events that take up no time but have a time associated
878#if 0 875#if 0
879 if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) 876 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
880 anEvent->setDtStart(anEvent->dtEnd()); 877 anEvent->setDtStart(anEvent->dtEnd());
881 if (!(vo = isAPropertyOf(vevent, VCDTendProp))) 878 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
882 anEvent->setDtEnd(anEvent->dtStart()); 879 anEvent->setDtEnd(anEvent->dtStart());
883#endif 880#endif
884 881
885// TODO: exdates 882// TODO: exdates
886#if 0 883#if 0
887 // recurrence exceptions 884 // recurrence exceptions
888 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) { 885 if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) {
889 anEvent->setExDates(s = fakeCString(vObjectUStringZValue(vo))); 886 anEvent->setExDates(s = fakeCString(vObjectUStringZValue(vo)));
890 deleteStr(s); 887 deleteStr(s);
891 } 888 }
892#endif 889#endif
893 890
894#if 0 891#if 0
895 // secrecy 892 // secrecy
896 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) { 893 if ((vo = isAPropertyOf(vevent, VCClassProp)) != 0) {
897 anEvent->setSecrecy(s = fakeCString(vObjectUStringZValue(vo))); 894 anEvent->setSecrecy(s = fakeCString(vObjectUStringZValue(vo)));
898 deleteStr(s); 895 deleteStr(s);
899 } 896 }
900 else 897 else
901 anEvent->setSecrecy("PUBLIC"); 898 anEvent->setSecrecy("PUBLIC");
902 899
903 // attachments 900 // attachments
904 tmpStrList.clear(); 901 tmpStrList.clear();
905 initPropIterator(&voi, vevent); 902 initPropIterator(&voi, vevent);
906 while (moreIteration(&voi)) { 903 while (moreIteration(&voi)) {
907 vo = nextVObject(&voi); 904 vo = nextVObject(&voi);
908 if (strcmp(vObjectName(vo), VCAttachProp) == 0) { 905 if (strcmp(vObjectName(vo), VCAttachProp) == 0) {
909 tmpStrList.append(s = fakeCString(vObjectUStringZValue(vo))); 906 tmpStrList.append(s = fakeCString(vObjectUStringZValue(vo)));
910 deleteStr(s); 907 deleteStr(s);
911 } 908 }
912 } 909 }
913 anEvent->setAttachments(tmpStrList); 910 anEvent->setAttachments(tmpStrList);
914 911
915 // resources 912 // resources
916 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) { 913 if ((vo = isAPropertyOf(vevent, VCResourcesProp)) != 0) {
917 QString resources = (s = fakeCString(vObjectUStringZValue(vo))); 914 QString resources = (s = fakeCString(vObjectUStringZValue(vo)));
918 deleteStr(s); 915 deleteStr(s);
919 tmpStrList.clear(); 916 tmpStrList.clear();
920 index1 = 0; 917 index1 = 0;
921 index2 = 0; 918 index2 = 0;
922 QString resource; 919 QString resource;
923 while ((index2 = resources.find(';', index1)) != -1) { 920 while ((index2 = resources.find(';', index1)) != -1) {
924 resource = resources.mid(index1, (index2 - index1)); 921 resource = resources.mid(index1, (index2 - index1));
925 tmpStrList.append(resource); 922 tmpStrList.append(resource);
926 index1 = index2; 923 index1 = index2;
927 } 924 }
928 anEvent->setResources(tmpStrList); 925 anEvent->setResources(tmpStrList);
929 } 926 }
930#endif 927#endif
931 928
932 case ICAL_RELATEDTO_PROPERTY: // releated event (parent) 929 case ICAL_RELATEDTO_PROPERTY: // releated event (parent)
933 event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p))); 930 event->setRelatedToUid(QString::fromUtf8(icalproperty_get_relatedto(p)));
934 mEventsRelate.append(event); 931 mEventsRelate.append(event);
935 break; 932 break;
936 933
937 case ICAL_TRANSP_PROPERTY: // Transparency 934 case ICAL_TRANSP_PROPERTY: // Transparency
938 if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT ) 935 if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT )
939 event->setTransparency( Event::Transparent ); 936 event->setTransparency( Event::Transparent );
940 else 937 else
941 event->setTransparency( Event::Opaque ); 938 event->setTransparency( Event::Opaque );
942 break; 939 break;
943 940
944 default: 941 default:
945// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind 942// kdDebug(5800) << "ICALFormat::readEvent(): Unknown property: " << kind
946// << endl; 943// << endl;
947 break; 944 break;
948 } 945 }
949 946
950 p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY); 947 p = icalcomponent_get_next_property(vevent,ICAL_ANY_PROPERTY);
951 } 948 }
952 949
953 QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT"); 950 QString msade = event->nonKDECustomProperty("X-MICROSOFT-CDO-ALLDAYEVENT");
954 if (!msade.isNull()) { 951 if (!msade.isNull()) {
955 bool floats = (msade == QString::fromLatin1("TRUE")); 952 bool floats = (msade == QString::fromLatin1("TRUE"));
956 kdDebug(5800) << "ICALFormat::readEvent(): all day event: " << floats << endl; 953 kdDebug(5800) << "ICALFormat::readEvent(): all day event: " << floats << endl;
957 event->setFloats(floats); 954 event->setFloats(floats);
958 if (floats) { 955 if (floats) {
959 QDateTime endDate = event->dtEnd(); 956 QDateTime endDate = event->dtEnd();
960 event->setDtEnd(endDate.addDays(-1)); 957 event->setDtEnd(endDate.addDays(-1));
961 } 958 }
962 } 959 }
963 960
964 // some stupid vCal exporters ignore the standard and use Description 961 // some stupid vCal exporters ignore the standard and use Description
965 // instead of Summary for the default field. Correct for this. 962 // instead of Summary for the default field. Correct for this.
966 if (event->summary().isEmpty() && 963 if (event->summary().isEmpty() &&
967 !(event->description().isEmpty())) { 964 !(event->description().isEmpty())) {
968 QString tmpStr = event->description().simplifyWhiteSpace(); 965 QString tmpStr = event->description().simplifyWhiteSpace();
969 event->setDescription(""); 966 event->setDescription("");
970 event->setSummary(tmpStr); 967 event->setSummary(tmpStr);
971 } 968 }
972 969
973 return event; 970 return event;
974} 971}
975 972
976FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy) 973FreeBusy *ICalFormatImpl::readFreeBusy(icalcomponent *vfreebusy)
977{ 974{
978 FreeBusy *freebusy = new FreeBusy; 975 FreeBusy *freebusy = new FreeBusy;
979 976
980 readIncidenceBase(vfreebusy,freebusy); 977 readIncidenceBase(vfreebusy,freebusy);
981 978
982 icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY); 979 icalproperty *p = icalcomponent_get_first_property(vfreebusy,ICAL_ANY_PROPERTY);
983 980
984 icaltimetype icaltime; 981 icaltimetype icaltime;
985 icalperiodtype icalperiod; 982 icalperiodtype icalperiod;
986 QDateTime period_start, period_end; 983 QDateTime period_start, period_end;
987 984
988 while (p) { 985 while (p) {
989 icalproperty_kind kind = icalproperty_isa(p); 986 icalproperty_kind kind = icalproperty_isa(p);
990 switch (kind) { 987 switch (kind) {
991 988
992 case ICAL_DTSTART_PROPERTY: // start date and time 989 case ICAL_DTSTART_PROPERTY: // start date and time
993 icaltime = icalproperty_get_dtstart(p); 990 icaltime = icalproperty_get_dtstart(p);
994 freebusy->setDtStart(readICalDateTime(icaltime)); 991 freebusy->setDtStart(readICalDateTime(icaltime));
995 break; 992 break;
996 993
997 case ICAL_DTEND_PROPERTY: // start End Date and Time 994 case ICAL_DTEND_PROPERTY: // start End Date and Time
998 icaltime = icalproperty_get_dtend(p); 995 icaltime = icalproperty_get_dtend(p);
999 freebusy->setDtEnd(readICalDateTime(icaltime)); 996 freebusy->setDtEnd(readICalDateTime(icaltime));
1000 break; 997 break;
1001 998
1002 case ICAL_FREEBUSY_PROPERTY: //Any FreeBusy Times 999 case ICAL_FREEBUSY_PROPERTY: //Any FreeBusy Times
1003 icalperiod = icalproperty_get_freebusy(p); 1000 icalperiod = icalproperty_get_freebusy(p);
1004 period_start = readICalDateTime(icalperiod.start); 1001 period_start = readICalDateTime(icalperiod.start);
1005 period_end = readICalDateTime(icalperiod.end); 1002 period_end = readICalDateTime(icalperiod.end);
1006 freebusy->addPeriod(period_start, period_end); 1003 freebusy->addPeriod(period_start, period_end);
1007 break; 1004 break;
1008 1005
1009 default: 1006 default:
1010 kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind 1007 kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
1011 << endl; 1008 << endl;
1012 break; 1009 break;
1013 } 1010 }
1014 p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY); 1011 p = icalcomponent_get_next_property(vfreebusy,ICAL_ANY_PROPERTY);
1015 } 1012 }
1016 1013
1017 return freebusy; 1014 return freebusy;
1018} 1015}
1019 1016
1020Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal) 1017Journal *ICalFormatImpl::readJournal(icalcomponent *vjournal)
1021{ 1018{
1022 Journal *journal = new Journal; 1019 Journal *journal = new Journal;
1023 1020
1024 readIncidence(vjournal,journal); 1021 readIncidence(vjournal,journal);
1025 1022
1026 if ( !journal->dtStart().isValid() && journal->created().isValid() ) { 1023 if ( !journal->dtStart().isValid() && journal->created().isValid() ) {
1027 journal->setDtStart( journal->created() ); 1024 journal->setDtStart( journal->created() );
1028 } 1025 }
1029 return journal; 1026 return journal;
1030} 1027}
1031 1028
1032Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee) 1029Attendee *ICalFormatImpl::readAttendee(icalproperty *attendee)
1033{ 1030{
1034 icalparameter *p = 0; 1031 icalparameter *p = 0;
1035 1032
1036 QString email = QString::fromUtf8(icalproperty_get_attendee(attendee)); 1033 QString email = QString::fromUtf8(icalproperty_get_attendee(attendee));
1037 1034
1038 QString name; 1035 QString name;
1039 QString uid = QString::null; 1036 QString uid = QString::null;
1040 p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER); 1037 p = icalproperty_get_first_parameter(attendee,ICAL_CN_PARAMETER);
1041 if (p) { 1038 if (p) {
1042 name = QString::fromUtf8(icalparameter_get_cn(p)); 1039 name = QString::fromUtf8(icalparameter_get_cn(p));
1043 } else { 1040 } else {
1044 } 1041 }
1045 1042
1046 bool rsvp=false; 1043 bool rsvp=false;
1047 p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER); 1044 p = icalproperty_get_first_parameter(attendee,ICAL_RSVP_PARAMETER);
1048 if (p) { 1045 if (p) {
1049 icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p); 1046 icalparameter_rsvp rsvpParameter = icalparameter_get_rsvp(p);
1050 if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true; 1047 if (rsvpParameter == ICAL_RSVP_TRUE) rsvp = true;
1051 } 1048 }
1052 1049
1053 Attendee::PartStat status = Attendee::NeedsAction; 1050 Attendee::PartStat status = Attendee::NeedsAction;
1054 p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER); 1051 p = icalproperty_get_first_parameter(attendee,ICAL_PARTSTAT_PARAMETER);
1055 if (p) { 1052 if (p) {
1056 icalparameter_partstat partStatParameter = icalparameter_get_partstat(p); 1053 icalparameter_partstat partStatParameter = icalparameter_get_partstat(p);
1057 switch(partStatParameter) { 1054 switch(partStatParameter) {
1058 default: 1055 default:
1059 case ICAL_PARTSTAT_NEEDSACTION: 1056 case ICAL_PARTSTAT_NEEDSACTION:
1060 status = Attendee::NeedsAction; 1057 status = Attendee::NeedsAction;
1061 break; 1058 break;
1062 case ICAL_PARTSTAT_ACCEPTED: 1059 case ICAL_PARTSTAT_ACCEPTED:
1063 status = Attendee::Accepted; 1060 status = Attendee::Accepted;
1064 break; 1061 break;
1065 case ICAL_PARTSTAT_DECLINED: 1062 case ICAL_PARTSTAT_DECLINED:
1066 status = Attendee::Declined; 1063 status = Attendee::Declined;
1067 break; 1064 break;
1068 case ICAL_PARTSTAT_TENTATIVE: 1065 case ICAL_PARTSTAT_TENTATIVE:
1069 status = Attendee::Tentative; 1066 status = Attendee::Tentative;
1070 break; 1067 break;
1071 case ICAL_PARTSTAT_DELEGATED: 1068 case ICAL_PARTSTAT_DELEGATED:
1072 status = Attendee::Delegated; 1069 status = Attendee::Delegated;
1073 break; 1070 break;
1074 case ICAL_PARTSTAT_COMPLETED: 1071 case ICAL_PARTSTAT_COMPLETED:
1075 status = Attendee::Completed; 1072 status = Attendee::Completed;
1076 break; 1073 break;
1077 case ICAL_PARTSTAT_INPROCESS: 1074 case ICAL_PARTSTAT_INPROCESS:
1078 status = Attendee::InProcess; 1075 status = Attendee::InProcess;
1079 break; 1076 break;
1080 } 1077 }
1081 } 1078 }
1082 1079
1083 Attendee::Role role = Attendee::ReqParticipant; 1080 Attendee::Role role = Attendee::ReqParticipant;
1084 p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER); 1081 p = icalproperty_get_first_parameter(attendee,ICAL_ROLE_PARAMETER);
1085 if (p) { 1082 if (p) {
1086 icalparameter_role roleParameter = icalparameter_get_role(p); 1083 icalparameter_role roleParameter = icalparameter_get_role(p);
1087 switch(roleParameter) { 1084 switch(roleParameter) {
1088 case ICAL_ROLE_CHAIR: 1085 case ICAL_ROLE_CHAIR:
1089 role = Attendee::Chair; 1086 role = Attendee::Chair;
1090 break; 1087 break;
1091 default: 1088 default:
1092 case ICAL_ROLE_REQPARTICIPANT: 1089 case ICAL_ROLE_REQPARTICIPANT:
1093 role = Attendee::ReqParticipant; 1090 role = Attendee::ReqParticipant;
1094 break; 1091 break;
1095 case ICAL_ROLE_OPTPARTICIPANT: 1092 case ICAL_ROLE_OPTPARTICIPANT:
1096 role = Attendee::OptParticipant; 1093 role = Attendee::OptParticipant;
1097 break; 1094 break;
1098 case ICAL_ROLE_NONPARTICIPANT: 1095 case ICAL_ROLE_NONPARTICIPANT:
1099 role = Attendee::NonParticipant; 1096 role = Attendee::NonParticipant;
1100 break; 1097 break;
1101 } 1098 }
1102 } 1099 }
1103 1100
1104 p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER); 1101 p = icalproperty_get_first_parameter(attendee,ICAL_X_PARAMETER);
1105 uid = icalparameter_get_xvalue(p); 1102 uid = icalparameter_get_xvalue(p);
1106 // This should be added, but there seems to be a libical bug here. 1103 // This should be added, but there seems to be a libical bug here.
1107 /*while (p) { 1104 /*while (p) {
1108 // if (icalparameter_get_xname(p) == "X-UID") { 1105 // if (icalparameter_get_xname(p) == "X-UID") {
1109 uid = icalparameter_get_xvalue(p); 1106 uid = icalparameter_get_xvalue(p);
1110 p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER); 1107 p = icalproperty_get_next_parameter(attendee,ICAL_X_PARAMETER);
1111 } */ 1108 } */
1112 1109
1113 return new Attendee( name, email, rsvp, status, role, uid ); 1110 return new Attendee( name, email, rsvp, status, role, uid );
1114} 1111}
1115 1112
1116Attachment *ICalFormatImpl::readAttachment(icalproperty *attach) 1113Attachment *ICalFormatImpl::readAttachment(icalproperty *attach)
1117{ 1114{
1118 icalattach *a = icalproperty_get_attach(attach); 1115 icalattach *a = icalproperty_get_attach(attach);
1119 icalparameter_value v = ICAL_VALUE_NONE; 1116 icalparameter_value v = ICAL_VALUE_NONE;
1120 icalparameter_encoding e = ICAL_ENCODING_NONE; 1117 icalparameter_encoding e = ICAL_ENCODING_NONE;
1121 1118
1122 Attachment *attachment = 0; 1119 Attachment *attachment = 0;
1123 /* 1120 /*
1124 icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER); 1121 icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER);
1125 if (vp) 1122 if (vp)
1126 v = icalparameter_get_value(vp); 1123 v = icalparameter_get_value(vp);
1127 1124
1128 icalparameter *ep = icalproperty_get_first_parameter(attach, ICAL_ENCODING_PARAMETER); 1125 icalparameter *ep = icalproperty_get_first_parameter(attach, ICAL_ENCODING_PARAMETER);
1129 if (ep) 1126 if (ep)
1130 e = icalparameter_get_encoding(ep); 1127 e = icalparameter_get_encoding(ep);
1131 */ 1128 */
1132 int isurl = icalattach_get_is_url (a); 1129 int isurl = icalattach_get_is_url (a);
1133 if (isurl == 0) 1130 if (isurl == 0)
1134 attachment = new Attachment((const char*)icalattach_get_data(a)); 1131 attachment = new Attachment((const char*)icalattach_get_data(a));
1135 else { 1132 else {
1136 attachment = new Attachment(QString(icalattach_get_url(a))); 1133 attachment = new Attachment(QString(icalattach_get_url(a)));
1137 } 1134 }
1138 1135
1139 icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER); 1136 icalparameter *p = icalproperty_get_first_parameter(attach, ICAL_FMTTYPE_PARAMETER);
1140 if (p) 1137 if (p)
1141 attachment->setMimeType(QString(icalparameter_get_fmttype(p))); 1138 attachment->setMimeType(QString(icalparameter_get_fmttype(p)));
1142 1139
1143 return attachment; 1140 return attachment;
1144} 1141}
1145#include <qtextcodec.h> 1142#include <qtextcodec.h>
1146void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence) 1143void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence)
1147{ 1144{
1148 readIncidenceBase(parent,incidence); 1145 readIncidenceBase(parent,incidence);
1149 1146
1150 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY); 1147 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
1151 bool readrec = false; 1148 bool readrec = false;
1152 const char *text; 1149 const char *text;
1153 int intvalue; 1150 int intvalue;
1154 icaltimetype icaltime; 1151 icaltimetype icaltime;
1155 icaldurationtype icalduration; 1152 icaldurationtype icalduration;
1156 struct icalrecurrencetype rectype; 1153 struct icalrecurrencetype rectype;
1157 QStringList categories; 1154 QStringList categories;
1158 1155
1159 while (p) { 1156 while (p) {
1160 icalproperty_kind kind = icalproperty_isa(p); 1157 icalproperty_kind kind = icalproperty_isa(p);
1161 switch (kind) { 1158 switch (kind) {
1162 1159
1163 case ICAL_CREATED_PROPERTY: 1160 case ICAL_CREATED_PROPERTY:
1164 icaltime = icalproperty_get_created(p); 1161 icaltime = icalproperty_get_created(p);
1165 incidence->setCreated(readICalDateTime(icaltime)); 1162 incidence->setCreated(readICalDateTime(icaltime));
1166 break; 1163 break;
1167 1164
1168 case ICAL_SEQUENCE_PROPERTY: // sequence 1165 case ICAL_SEQUENCE_PROPERTY: // sequence
1169 intvalue = icalproperty_get_sequence(p); 1166 intvalue = icalproperty_get_sequence(p);
1170 incidence->setRevision(intvalue); 1167 incidence->setRevision(intvalue);
1171 break; 1168 break;
1172 1169
1173 case ICAL_LASTMODIFIED_PROPERTY: // last modification date 1170 case ICAL_LASTMODIFIED_PROPERTY: // last modification date
1174 icaltime = icalproperty_get_lastmodified(p); 1171 icaltime = icalproperty_get_lastmodified(p);
1175 incidence->setLastModified(readICalDateTime(icaltime)); 1172 incidence->setLastModified(readICalDateTime(icaltime));
1176 break; 1173 break;
1177 1174
1178 case ICAL_DTSTART_PROPERTY: // start date and time 1175 case ICAL_DTSTART_PROPERTY: // start date and time
1179 icaltime = icalproperty_get_dtstart(p); 1176 icaltime = icalproperty_get_dtstart(p);
1180 if (icaltime.is_date) { 1177 if (icaltime.is_date) {
1181 incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0))); 1178 incidence->setDtStart(QDateTime(readICalDate(icaltime),QTime(0,0,0)));
1182 incidence->setFloats(true); 1179 incidence->setFloats(true);
1183 } else { 1180 } else {
1184 incidence->setDtStart(readICalDateTime(icaltime)); 1181 incidence->setDtStart(readICalDateTime(icaltime));
1185 } 1182 }
1186 break; 1183 break;
1187 1184
1188 case ICAL_DURATION_PROPERTY: // start date and time 1185 case ICAL_DURATION_PROPERTY: // start date and time
1189 icalduration = icalproperty_get_duration(p); 1186 icalduration = icalproperty_get_duration(p);
1190 incidence->setDuration(readICalDuration(icalduration)); 1187 incidence->setDuration(readICalDuration(icalduration));
1191 break; 1188 break;
1192 1189
1193 case ICAL_DESCRIPTION_PROPERTY: // description 1190 case ICAL_DESCRIPTION_PROPERTY: // description
1194 text = icalproperty_get_description(p); 1191 text = icalproperty_get_description(p);
1195 incidence->setDescription(QString::fromUtf8(text)); 1192 incidence->setDescription(QString::fromUtf8(text));
1196 break; 1193 break;
1197 1194
1198 case ICAL_SUMMARY_PROPERTY: // summary 1195 case ICAL_SUMMARY_PROPERTY: // summary
1199 { 1196 {
1200 text = icalproperty_get_summary(p); 1197 text = icalproperty_get_summary(p);
1201 incidence->setSummary(QString::fromUtf8(text)); 1198 incidence->setSummary(QString::fromUtf8(text));
1202 } 1199 }
1203 break; 1200 break;
1204 case ICAL_STATUS_PROPERTY: // summary 1201 case ICAL_STATUS_PROPERTY: // summary
1205 { 1202 {
1206 if ( ICAL_STATUS_CANCELLED == icalproperty_get_status(p) ) 1203 if ( ICAL_STATUS_CANCELLED == icalproperty_get_status(p) )
1207 incidence->setCancelled( true ); 1204 incidence->setCancelled( true );
1208 } 1205 }
1209 break; 1206 break;
1210 1207
1211 case ICAL_LOCATION_PROPERTY: // location 1208 case ICAL_LOCATION_PROPERTY: // location
1212 text = icalproperty_get_location(p); 1209 text = icalproperty_get_location(p);
1213 incidence->setLocation(QString::fromUtf8(text)); 1210 incidence->setLocation(QString::fromUtf8(text));
1214 break; 1211 break;
1215 1212
1216 case ICAL_RECURRENCEID_PROPERTY: 1213 case ICAL_RECURRENCEID_PROPERTY:
1217 icaltime = icalproperty_get_recurrenceid(p); 1214 icaltime = icalproperty_get_recurrenceid(p);
1218 incidence->setRecurrenceID( readICalDateTime(icaltime) ); 1215 incidence->setRecurrenceID( readICalDateTime(icaltime) );
1219 //qDebug(" RecurrenceID %s",incidence->recurrenceID().toString().latin1() ); 1216 //qDebug(" RecurrenceID %s",incidence->recurrenceID().toString().latin1() );
1220 break; 1217 break;
1221#if 0 1218#if 0
1222 // status 1219 // status
1223 if ((vo = isAPropertyOf(vincidence, VCStatusProp)) != 0) { 1220 if ((vo = isAPropertyOf(vincidence, VCStatusProp)) != 0) {
1224 incidence->setStatus(s = fakeCString(vObjectUStringZValue(vo))); 1221 incidence->setStatus(s = fakeCString(vObjectUStringZValue(vo)));
1225 deleteStr(s); 1222 deleteStr(s);
1226 } 1223 }
1227 else 1224 else
1228 incidence->setStatus("NEEDS ACTION"); 1225 incidence->setStatus("NEEDS ACTION");
1229#endif 1226#endif
1230 1227
1231 case ICAL_PRIORITY_PROPERTY: // priority 1228 case ICAL_PRIORITY_PROPERTY: // priority
1232 intvalue = icalproperty_get_priority(p); 1229 intvalue = icalproperty_get_priority(p);
1233 incidence->setPriority(intvalue); 1230 incidence->setPriority(intvalue);
1234 break; 1231 break;
1235 1232
1236 case ICAL_CATEGORIES_PROPERTY: // categories 1233 case ICAL_CATEGORIES_PROPERTY: // categories
1237 text = icalproperty_get_categories(p); 1234 text = icalproperty_get_categories(p);
1238 categories.append(QString::fromUtf8(text)); 1235 categories.append(QString::fromUtf8(text));
1239 break; 1236 break;
1240 //******************************************* 1237 //*******************************************
1241 case ICAL_RRULE_PROPERTY: 1238 case ICAL_RRULE_PROPERTY:
1242 // we do need (maybe )start datetime of incidence for recurrence 1239 // we do need (maybe )start datetime of incidence for recurrence
1243 // such that we can read recurrence only after we read incidence completely 1240 // such that we can read recurrence only after we read incidence completely
1244 readrec = true; 1241 readrec = true;
1245 rectype = icalproperty_get_rrule(p); 1242 rectype = icalproperty_get_rrule(p);
1246 break; 1243 break;
1247 1244
1248 case ICAL_EXDATE_PROPERTY: 1245 case ICAL_EXDATE_PROPERTY:
1249 icaltime = icalproperty_get_exdate(p); 1246 icaltime = icalproperty_get_exdate(p);
1250 incidence->addExDate(readICalDate(icaltime)); 1247 incidence->addExDate(readICalDate(icaltime));
1251 break; 1248 break;
1252 1249
1253 case ICAL_CLASS_PROPERTY: { 1250 case ICAL_CLASS_PROPERTY: {
1254 int inttext = icalproperty_get_class(p); 1251 int inttext = icalproperty_get_class(p);
1255 if (inttext == ICAL_CLASS_PUBLIC ) { 1252 if (inttext == ICAL_CLASS_PUBLIC ) {
1256 incidence->setSecrecy(Incidence::SecrecyPublic); 1253 incidence->setSecrecy(Incidence::SecrecyPublic);
1257 } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) { 1254 } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) {
1258 incidence->setSecrecy(Incidence::SecrecyConfidential); 1255 incidence->setSecrecy(Incidence::SecrecyConfidential);
1259 } else { 1256 } else {
1260 incidence->setSecrecy(Incidence::SecrecyPrivate); 1257 incidence->setSecrecy(Incidence::SecrecyPrivate);
1261 } 1258 }
1262 } 1259 }
1263 break; 1260 break;
1264 1261
1265 case ICAL_ATTACH_PROPERTY: // attachments 1262 case ICAL_ATTACH_PROPERTY: // attachments
1266 incidence->addAttachment(readAttachment(p)); 1263 incidence->addAttachment(readAttachment(p));
1267 break; 1264 break;
1268 1265
1269 default: 1266 default:
1270// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind 1267// kdDebug(5800) << "ICALFormat::readIncidence(): Unknown property: " << kind
1271// << endl; 1268// << endl;
1272 break; 1269 break;
1273 } 1270 }
1274 1271
1275 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY); 1272 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
1276 } 1273 }
1277 if ( readrec ) { 1274 if ( readrec ) {
1278 readRecurrenceRule(rectype,incidence); 1275 readRecurrenceRule(rectype,incidence);
1279 } 1276 }
1280 // kpilot stuff 1277 // kpilot stuff
1281// TODO: move this application-specific code to kpilot 1278// TODO: move this application-specific code to kpilot
1282 QString kp = incidence->nonKDECustomProperty("X-PILOTID"); 1279 QString kp = incidence->nonKDECustomProperty("X-PILOTID");
1283 if (!kp.isNull()) { 1280 if (!kp.isNull()) {
1284 incidence->setPilotId(kp.toInt()); 1281 incidence->setPilotId(kp.toInt());
1285 } 1282 }
1286 kp = incidence->nonKDECustomProperty("X-PILOTSTAT"); 1283 kp = incidence->nonKDECustomProperty("X-PILOTSTAT");
1287 if (!kp.isNull()) { 1284 if (!kp.isNull()) {
1288 incidence->setSyncStatus(kp.toInt()); 1285 incidence->setSyncStatus(kp.toInt());
1289 } 1286 }
1290 1287
1291 1288
1292 kp = incidence->nonKDECustomProperty("X-KOPIEXTID"); 1289 kp = incidence->nonKDECustomProperty("X-KOPIEXTID");
1293 if (!kp.isNull()) { 1290 if (!kp.isNull()) {
1294 incidence->setIDStr(kp); 1291 incidence->setIDStr(kp);
1295 } 1292 }
1296 1293
1297 // Cancel backwards compatibility mode for subsequent changes by the application 1294 // Cancel backwards compatibility mode for subsequent changes by the application
1298 incidence->recurrence()->setCompatVersion(); 1295 if ( readrec )
1296 incidence->recurrence()->setCompatVersion();
1299 1297
1300 // add categories 1298 // add categories
1301 incidence->setCategories(categories); 1299 incidence->setCategories(categories);
1302 1300
1303 // iterate through all alarms 1301 // iterate through all alarms
1304 for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT); 1302 for (icalcomponent *alarm = icalcomponent_get_first_component(parent,ICAL_VALARM_COMPONENT);
1305 alarm; 1303 alarm;
1306 alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) { 1304 alarm = icalcomponent_get_next_component(parent,ICAL_VALARM_COMPONENT)) {
1307 readAlarm(alarm,incidence); 1305 readAlarm(alarm,incidence);
1308 } 1306 }
1309} 1307}
1310 1308
1311void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase) 1309void ICalFormatImpl::readIncidenceBase(icalcomponent *parent,IncidenceBase *incidenceBase)
1312{ 1310{
1313 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY); 1311 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_ANY_PROPERTY);
1314 1312
1315 while (p) { 1313 while (p) {
1316 icalproperty_kind kind = icalproperty_isa(p); 1314 icalproperty_kind kind = icalproperty_isa(p);
1317 switch (kind) { 1315 switch (kind) {
1318 1316
1319 case ICAL_UID_PROPERTY: // unique id 1317 case ICAL_UID_PROPERTY: // unique id
1320 incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p))); 1318 incidenceBase->setUid(QString::fromUtf8(icalproperty_get_uid(p)));
1321 break; 1319 break;
1322 1320
1323 case ICAL_ORGANIZER_PROPERTY: // organizer 1321 case ICAL_ORGANIZER_PROPERTY: // organizer
1324 incidenceBase->setOrganizer(QString::fromUtf8(icalproperty_get_organizer(p))); 1322 incidenceBase->setOrganizer(QString::fromUtf8(icalproperty_get_organizer(p)));
1325 break; 1323 break;
1326 1324
1327 case ICAL_ATTENDEE_PROPERTY: // attendee 1325 case ICAL_ATTENDEE_PROPERTY: // attendee
1328 incidenceBase->addAttendee(readAttendee(p)); 1326 incidenceBase->addAttendee(readAttendee(p));
1329 break; 1327 break;
1330 1328
1331 default: 1329 default:
1332 break; 1330 break;
1333 } 1331 }
1334 1332
1335 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY); 1333 p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
1336 } 1334 }
1337 1335
1338 // custom properties 1336 // custom properties
1339 readCustomProperties(parent, incidenceBase); 1337 readCustomProperties(parent, incidenceBase);
1340} 1338}
1341 1339
1342void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties) 1340void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties *properties)
1343{ 1341{
1344 QMap<QCString, QString> customProperties; 1342 QMap<QCString, QString> customProperties;
1345 1343
1346 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY); 1344 icalproperty *p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY);
1347 1345
1348 while (p) { 1346 while (p) {
1349 QString value = QString::fromUtf8(icalproperty_get_x(p)); 1347 QString value = QString::fromUtf8(icalproperty_get_x(p));
1350 customProperties[icalproperty_get_x_name(p)] = value; 1348 customProperties[icalproperty_get_x_name(p)] = value;
1351 //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) ); 1349 //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) );
1352 1350
1353 p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY); 1351 p = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY);
1354 } 1352 }
1355 1353
1356 properties->setCustomProperties(customProperties); 1354 properties->setCustomProperties(customProperties);
1357} 1355}
1358 1356
1359void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidence *incidence) 1357void ICalFormatImpl::readRecurrenceRule(struct icalrecurrencetype rrule,Incidence *incidence)
1360{ 1358{
1361// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl; 1359// kdDebug(5800) << "Read recurrence for " << incidence->summary() << endl;
1362 1360
1363 Recurrence *recur = incidence->recurrence(); 1361 Recurrence *recur = incidence->recurrence();
1364 recur->setCompatVersion(mCalendarVersion); 1362 recur->setCompatVersion(mCalendarVersion);
1365 recur->unsetRecurs(); 1363 recur->unsetRecurs();
1366 1364
1367 struct icalrecurrencetype r = rrule; 1365 struct icalrecurrencetype r = rrule;
1368 1366
1369 dumpIcalRecurrence(r); 1367 dumpIcalRecurrence(r);
1370 readRecurrence( r, recur, incidence); 1368 readRecurrence( r, recur, incidence);
1371} 1369}
1372 1370
1373void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence) 1371void ICalFormatImpl::readRecurrence( const struct icalrecurrencetype &r, Recurrence* recur, Incidence *incidence)
1374{ 1372{
1375 int wkst; 1373 int wkst;
1376 int index = 0; 1374 int index = 0;
1377 short day = 0; 1375 short day = 0;
1378 QBitArray qba(7); 1376 QBitArray qba(7);
1379 int frequ = r.freq; 1377 int frequ = r.freq;
1380 int interv = r.interval; 1378 int interv = r.interval;
1381 // preprocessing for odd recurrence definitions 1379 // preprocessing for odd recurrence definitions
1382 1380
1383 if ( r.freq == ICAL_MONTHLY_RECURRENCE ) { 1381 if ( r.freq == ICAL_MONTHLY_RECURRENCE ) {
1384 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1382 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1385 interv = 12; 1383 interv = 12;
1386 } 1384 }
1387 } 1385 }
1388 if ( r.freq == ICAL_YEARLY_RECURRENCE ) { 1386 if ( r.freq == ICAL_YEARLY_RECURRENCE ) {
1389 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) { 1387 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX && r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
1390 frequ = ICAL_MONTHLY_RECURRENCE; 1388 frequ = ICAL_MONTHLY_RECURRENCE;
1391 interv = 12* r.interval; 1389 interv = 12* r.interval;
1392 } 1390 }
1393 } 1391 }
1394 1392
1395 switch (frequ) { 1393 switch (frequ) {
1396 case ICAL_MINUTELY_RECURRENCE: 1394 case ICAL_MINUTELY_RECURRENCE:
1397 if (!icaltime_is_null_time(r.until)) { 1395 if (!icaltime_is_null_time(r.until)) {
1398 recur->setMinutely(interv,readICalDateTime(r.until)); 1396 recur->setMinutely(interv,readICalDateTime(r.until));
1399 } else { 1397 } else {
1400 if (r.count == 0) 1398 if (r.count == 0)
1401 recur->setMinutely(interv,-1); 1399 recur->setMinutely(interv,-1);
1402 else 1400 else
1403 recur->setMinutely(interv,r.count); 1401 recur->setMinutely(interv,r.count);
1404 } 1402 }
1405 break; 1403 break;
1406 case ICAL_HOURLY_RECURRENCE: 1404 case ICAL_HOURLY_RECURRENCE:
1407 if (!icaltime_is_null_time(r.until)) { 1405 if (!icaltime_is_null_time(r.until)) {
1408 recur->setHourly(interv,readICalDateTime(r.until)); 1406 recur->setHourly(interv,readICalDateTime(r.until));
1409 } else { 1407 } else {
1410 if (r.count == 0) 1408 if (r.count == 0)
1411 recur->setHourly(interv,-1); 1409 recur->setHourly(interv,-1);
1412 else 1410 else
1413 recur->setHourly(interv,r.count); 1411 recur->setHourly(interv,r.count);
1414 } 1412 }
1415 break; 1413 break;
1416 case ICAL_DAILY_RECURRENCE: 1414 case ICAL_DAILY_RECURRENCE:
1417 if (!icaltime_is_null_time(r.until)) { 1415 if (!icaltime_is_null_time(r.until)) {
1418 recur->setDaily(interv,readICalDate(r.until)); 1416 recur->setDaily(interv,readICalDate(r.until));
1419 } else { 1417 } else {
1420 if (r.count == 0) 1418 if (r.count == 0)
1421 recur->setDaily(interv,-1); 1419 recur->setDaily(interv,-1);
1422 else 1420 else
1423 recur->setDaily(interv,r.count); 1421 recur->setDaily(interv,r.count);
1424 } 1422 }
1425 break; 1423 break;
1426 case ICAL_WEEKLY_RECURRENCE: 1424 case ICAL_WEEKLY_RECURRENCE:
1427 // kdDebug(5800) << "WEEKLY_RECURRENCE" << endl; 1425 // kdDebug(5800) << "WEEKLY_RECURRENCE" << endl;
1428 wkst = (r.week_start + 5)%7 + 1; 1426 wkst = (r.week_start + 5)%7 + 1;
1429 if (!icaltime_is_null_time(r.until)) { 1427 if (!icaltime_is_null_time(r.until)) {
1430 recur->setWeekly(interv,qba,readICalDate(r.until),wkst); 1428 recur->setWeekly(interv,qba,readICalDate(r.until),wkst);
1431 } else { 1429 } else {
1432 if (r.count == 0) 1430 if (r.count == 0)
1433 recur->setWeekly(interv,qba,-1,wkst); 1431 recur->setWeekly(interv,qba,-1,wkst);
1434 else 1432 else
1435 recur->setWeekly(interv,qba,r.count,wkst); 1433 recur->setWeekly(interv,qba,r.count,wkst);
1436 } 1434 }
1437 if ( r.by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) { 1435 if ( r.by_day[0] == ICAL_RECURRENCE_ARRAY_MAX) {
1438 int wday = incidence->dtStart().date().dayOfWeek ()-1; 1436 int wday = incidence->dtStart().date().dayOfWeek ()-1;
1439 //qDebug("weekly error found "); 1437 //qDebug("weekly error found ");
1440 qba.setBit(wday); 1438 qba.setBit(wday);
1441 } else { 1439 } else {
1442 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1440 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1443 // kdDebug(5800) << " " << day << endl; 1441 // kdDebug(5800) << " " << day << endl;
1444 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1442 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1445 } 1443 }
1446 } 1444 }
1447 break; 1445 break;
1448 case ICAL_MONTHLY_RECURRENCE: 1446 case ICAL_MONTHLY_RECURRENCE:
1449 1447
1450 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1448 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1451 if (!icaltime_is_null_time(r.until)) { 1449 if (!icaltime_is_null_time(r.until)) {
1452 recur->setMonthly(Recurrence::rMonthlyPos,interv, 1450 recur->setMonthly(Recurrence::rMonthlyPos,interv,
1453 readICalDate(r.until)); 1451 readICalDate(r.until));
1454 } else { 1452 } else {
1455 if (r.count == 0) 1453 if (r.count == 0)
1456 recur->setMonthly(Recurrence::rMonthlyPos,interv,-1); 1454 recur->setMonthly(Recurrence::rMonthlyPos,interv,-1);
1457 else 1455 else
1458 recur->setMonthly(Recurrence::rMonthlyPos,interv,r.count); 1456 recur->setMonthly(Recurrence::rMonthlyPos,interv,r.count);
1459 } 1457 }
1460 bool useSetPos = false; 1458 bool useSetPos = false;
1461 short pos = 0; 1459 short pos = 0;
1462 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1460 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1463 // kdDebug(5800) << "----a " << index << ": " << day << endl; 1461 // kdDebug(5800) << "----a " << index << ": " << day << endl;
1464 pos = icalrecurrencetype_day_position(day); 1462 pos = icalrecurrencetype_day_position(day);
1465 if (pos) { 1463 if (pos) {
1466 day = icalrecurrencetype_day_day_of_week(day); 1464 day = icalrecurrencetype_day_day_of_week(day);
1467 QBitArray ba(7); // don't wipe qba 1465 QBitArray ba(7); // don't wipe qba
1468 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1466 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1469 recur->addMonthlyPos(pos,ba); 1467 recur->addMonthlyPos(pos,ba);
1470 } else { 1468 } else {
1471 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1469 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1472 useSetPos = true; 1470 useSetPos = true;
1473 } 1471 }
1474 } 1472 }
1475 if (useSetPos) { 1473 if (useSetPos) {
1476 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1474 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1477 recur->addMonthlyPos(r.by_set_pos[0],qba); 1475 recur->addMonthlyPos(r.by_set_pos[0],qba);
1478 } 1476 }
1479 } 1477 }
1480 } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1478 } else if (r.by_month_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1481 if (!icaltime_is_null_time(r.until)) { 1479 if (!icaltime_is_null_time(r.until)) {
1482 recur->setMonthly(Recurrence::rMonthlyDay,interv, 1480 recur->setMonthly(Recurrence::rMonthlyDay,interv,
1483 readICalDate(r.until)); 1481 readICalDate(r.until));
1484 } else { 1482 } else {
1485 if (r.count == 0) 1483 if (r.count == 0)
1486 recur->setMonthly(Recurrence::rMonthlyDay,interv,-1); 1484 recur->setMonthly(Recurrence::rMonthlyDay,interv,-1);
1487 else 1485 else
1488 recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count); 1486 recur->setMonthly(Recurrence::rMonthlyDay,interv,r.count);
1489 } 1487 }
1490 while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1488 while((day = r.by_month_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1491 // kdDebug(5800) << "----b " << day << endl; 1489 // kdDebug(5800) << "----b " << day << endl;
1492 recur->addMonthlyDay(day); 1490 recur->addMonthlyDay(day);
1493 } 1491 }
1494 } 1492 }
1495 break; 1493 break;
1496 case ICAL_YEARLY_RECURRENCE: 1494 case ICAL_YEARLY_RECURRENCE:
1497 if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1495 if (r.by_year_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1498 //qDebug(" YEARLY DAY OF YEAR"); 1496 //qDebug(" YEARLY DAY OF YEAR");
1499 if (!icaltime_is_null_time(r.until)) { 1497 if (!icaltime_is_null_time(r.until)) {
1500 recur->setYearly(Recurrence::rYearlyDay,interv, 1498 recur->setYearly(Recurrence::rYearlyDay,interv,
1501 readICalDate(r.until)); 1499 readICalDate(r.until));
1502 } else { 1500 } else {
1503 if (r.count == 0) 1501 if (r.count == 0)
1504 recur->setYearly(Recurrence::rYearlyDay,interv,-1); 1502 recur->setYearly(Recurrence::rYearlyDay,interv,-1);
1505 else 1503 else
1506 recur->setYearly(Recurrence::rYearlyDay,interv,r.count); 1504 recur->setYearly(Recurrence::rYearlyDay,interv,r.count);
1507 } 1505 }
1508 while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1506 while((day = r.by_year_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1509 recur->addYearlyNum(day); 1507 recur->addYearlyNum(day);
1510 } 1508 }
1511 } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) { 1509 } else if ( true /*r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX*/) {
1512 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1510 if (r.by_day[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1513 qDebug("YEARLY POS NOT SUPPORTED BY GUI"); 1511 qDebug("YEARLY POS NOT SUPPORTED BY GUI");
1514 if (!icaltime_is_null_time(r.until)) { 1512 if (!icaltime_is_null_time(r.until)) {
1515 recur->setYearly(Recurrence::rYearlyPos,interv, 1513 recur->setYearly(Recurrence::rYearlyPos,interv,
1516 readICalDate(r.until)); 1514 readICalDate(r.until));
1517 } else { 1515 } else {
1518 if (r.count == 0) 1516 if (r.count == 0)
1519 recur->setYearly(Recurrence::rYearlyPos,interv,-1); 1517 recur->setYearly(Recurrence::rYearlyPos,interv,-1);
1520 else 1518 else
1521 recur->setYearly(Recurrence::rYearlyPos,interv,r.count); 1519 recur->setYearly(Recurrence::rYearlyPos,interv,r.count);
1522 } 1520 }
1523 bool useSetPos = false; 1521 bool useSetPos = false;
1524 short pos = 0; 1522 short pos = 0;
1525 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1523 while((day = r.by_day[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1526 // kdDebug(5800) << "----a " << index << ": " << day << endl; 1524 // kdDebug(5800) << "----a " << index << ": " << day << endl;
1527 pos = icalrecurrencetype_day_position(day); 1525 pos = icalrecurrencetype_day_position(day);
1528 if (pos) { 1526 if (pos) {
1529 day = icalrecurrencetype_day_day_of_week(day); 1527 day = icalrecurrencetype_day_day_of_week(day);
1530 QBitArray ba(7); // don't wipe qba 1528 QBitArray ba(7); // don't wipe qba
1531 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1529 ba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1532 recur->addYearlyMonthPos(pos,ba); 1530 recur->addYearlyMonthPos(pos,ba);
1533 } else { 1531 } else {
1534 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0 1532 qba.setBit((day+5)%7); // convert from Sunday=1 to Monday=0
1535 useSetPos = true; 1533 useSetPos = true;
1536 } 1534 }
1537 } 1535 }
1538 if (useSetPos) { 1536 if (useSetPos) {
1539 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) { 1537 if (r.by_set_pos[0] != ICAL_RECURRENCE_ARRAY_MAX) {
1540 recur->addYearlyMonthPos(r.by_set_pos[0],qba); 1538 recur->addYearlyMonthPos(r.by_set_pos[0],qba);
1541 } 1539 }
1542 } 1540 }
1543 } else { 1541 } else {
1544 //qDebug("YEARLY MONTH "); 1542 //qDebug("YEARLY MONTH ");
1545 if (!icaltime_is_null_time(r.until)) { 1543 if (!icaltime_is_null_time(r.until)) {
1546 recur->setYearly(Recurrence::rYearlyMonth,interv, 1544 recur->setYearly(Recurrence::rYearlyMonth,interv,
1547 readICalDate(r.until)); 1545 readICalDate(r.until));
1548 } else { 1546 } else {
1549 if (r.count == 0) 1547 if (r.count == 0)
1550 recur->setYearly(Recurrence::rYearlyMonth,interv,-1); 1548 recur->setYearly(Recurrence::rYearlyMonth,interv,-1);
1551 else 1549 else
1552 recur->setYearly(Recurrence::rYearlyMonth,interv,r.count); 1550 recur->setYearly(Recurrence::rYearlyMonth,interv,r.count);
1553 } 1551 }
1554 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) { 1552 if ( r.by_month[0] != ICAL_RECURRENCE_ARRAY_MAX ) {
1555 index = 0; 1553 index = 0;
1556 while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) { 1554 while((day = r.by_month[index++]) != ICAL_RECURRENCE_ARRAY_MAX) {
1557 recur->addYearlyNum(day); 1555 recur->addYearlyNum(day);
1558 } 1556 }
1559 } else { 1557 } else {
1560 recur->addYearlyNum(incidence->dtStart().date().month()); 1558 recur->addYearlyNum(incidence->dtStart().date().month());
1561 } 1559 }
1562 } 1560 }
1563 1561
1564 } 1562 }
1565 break; 1563 break;
1566 default: 1564 default:
1567 ; 1565 ;
1568 break; 1566 break;
1569 } 1567 }
1570} 1568}
1571 1569
1572void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) 1570void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence)
1573{ 1571{
1574 //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl; 1572 //kdDebug(5800) << "Read alarm for " << incidence->summary() << endl;
1575 1573
1576 Alarm* ialarm = incidence->newAlarm(); 1574 Alarm* ialarm = incidence->newAlarm();
1577 ialarm->setRepeatCount(0); 1575 ialarm->setRepeatCount(0);
1578 ialarm->setEnabled(true); 1576 ialarm->setEnabled(true);
1579 1577
1580 // Determine the alarm's action type 1578 // Determine the alarm's action type
1581 icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY); 1579 icalproperty *p = icalcomponent_get_first_property(alarm,ICAL_ACTION_PROPERTY);
1582 if ( !p ) { 1580 if ( !p ) {
1583 return; 1581 return;
1584 } 1582 }
1585 1583
1586 icalproperty_action action = icalproperty_get_action(p); 1584 icalproperty_action action = icalproperty_get_action(p);
1587 Alarm::Type type = Alarm::Display; 1585 Alarm::Type type = Alarm::Display;
1588 switch ( action ) { 1586 switch ( action ) {
1589 case ICAL_ACTION_DISPLAY: type = Alarm::Display; break; 1587 case ICAL_ACTION_DISPLAY: type = Alarm::Display; break;
1590 case ICAL_ACTION_AUDIO: type = Alarm::Audio; break; 1588 case ICAL_ACTION_AUDIO: type = Alarm::Audio; break;
1591 case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break; 1589 case ICAL_ACTION_PROCEDURE: type = Alarm::Procedure; break;
1592 case ICAL_ACTION_EMAIL: type = Alarm::Email; break; 1590 case ICAL_ACTION_EMAIL: type = Alarm::Email; break;
1593 default: 1591 default:
1594 ; 1592 ;
1595 return; 1593 return;
1596 } 1594 }
1597 ialarm->setType(type); 1595 ialarm->setType(type);
1598 1596
1599 p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY); 1597 p = icalcomponent_get_first_property(alarm,ICAL_ANY_PROPERTY);
1600 while (p) { 1598 while (p) {
1601 icalproperty_kind kind = icalproperty_isa(p); 1599 icalproperty_kind kind = icalproperty_isa(p);
1602 1600
1603 switch (kind) { 1601 switch (kind) {
1604 case ICAL_TRIGGER_PROPERTY: { 1602 case ICAL_TRIGGER_PROPERTY: {
1605 icaltriggertype trigger = icalproperty_get_trigger(p); 1603 icaltriggertype trigger = icalproperty_get_trigger(p);
1606 if (icaltime_is_null_time(trigger.time)) { 1604 if (icaltime_is_null_time(trigger.time)) {
1607 if (icaldurationtype_is_null_duration(trigger.duration)) { 1605 if (icaldurationtype_is_null_duration(trigger.duration)) {
1608 kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl; 1606 kdDebug(5800) << "ICalFormatImpl::readAlarm(): Trigger has no time and no duration." << endl;
1609 } else { 1607 } else {
1610 Duration duration = icaldurationtype_as_int( trigger.duration ); 1608 Duration duration = icaldurationtype_as_int( trigger.duration );
1611 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER); 1609 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_RELATED_PARAMETER);
1612 if (param && icalparameter_get_related(param) == ICAL_RELATED_END) 1610 if (param && icalparameter_get_related(param) == ICAL_RELATED_END)
1613 ialarm->setEndOffset(duration); 1611 ialarm->setEndOffset(duration);
1614 else 1612 else
1615 ialarm->setStartOffset(duration); 1613 ialarm->setStartOffset(duration);
1616 } 1614 }
1617 } else { 1615 } else {
1618 ialarm->setTime(readICalDateTime(trigger.time)); 1616 ialarm->setTime(readICalDateTime(trigger.time));
1619 } 1617 }
1620 break; 1618 break;
1621 } 1619 }
1622 case ICAL_DURATION_PROPERTY: { 1620 case ICAL_DURATION_PROPERTY: {
1623 icaldurationtype duration = icalproperty_get_duration(p); 1621 icaldurationtype duration = icalproperty_get_duration(p);
1624 ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60); 1622 ialarm->setSnoozeTime(icaldurationtype_as_int(duration)/60);
1625 break; 1623 break;
1626 } 1624 }
1627 case ICAL_REPEAT_PROPERTY: 1625 case ICAL_REPEAT_PROPERTY:
1628 ialarm->setRepeatCount(icalproperty_get_repeat(p)); 1626 ialarm->setRepeatCount(icalproperty_get_repeat(p));
1629 break; 1627 break;
1630 1628
1631 // Only in DISPLAY and EMAIL and PROCEDURE alarms 1629 // Only in DISPLAY and EMAIL and PROCEDURE alarms
1632 case ICAL_DESCRIPTION_PROPERTY: { 1630 case ICAL_DESCRIPTION_PROPERTY: {
1633 QString description = QString::fromUtf8(icalproperty_get_description(p)); 1631 QString description = QString::fromUtf8(icalproperty_get_description(p));
1634 switch ( action ) { 1632 switch ( action ) {
1635 case ICAL_ACTION_DISPLAY: 1633 case ICAL_ACTION_DISPLAY:
1636 ialarm->setText( description ); 1634 ialarm->setText( description );
1637 break; 1635 break;
1638 case ICAL_ACTION_PROCEDURE: 1636 case ICAL_ACTION_PROCEDURE:
1639 ialarm->setProgramArguments( description ); 1637 ialarm->setProgramArguments( description );
1640 break; 1638 break;
1641 case ICAL_ACTION_EMAIL: 1639 case ICAL_ACTION_EMAIL:
1642 ialarm->setMailText( description ); 1640 ialarm->setMailText( description );
1643 break; 1641 break;
1644 default: 1642 default:
1645 break; 1643 break;
1646 } 1644 }
1647 break; 1645 break;
1648 } 1646 }
1649 // Only in EMAIL alarm 1647 // Only in EMAIL alarm
1650 case ICAL_SUMMARY_PROPERTY: 1648 case ICAL_SUMMARY_PROPERTY:
1651 ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p))); 1649 ialarm->setMailSubject(QString::fromUtf8(icalproperty_get_summary(p)));
1652 break; 1650 break;
1653 1651
1654 // Only in EMAIL alarm 1652 // Only in EMAIL alarm
1655 case ICAL_ATTENDEE_PROPERTY: { 1653 case ICAL_ATTENDEE_PROPERTY: {
1656 QString email = QString::fromUtf8(icalproperty_get_attendee(p)); 1654 QString email = QString::fromUtf8(icalproperty_get_attendee(p));
1657 QString name; 1655 QString name;
1658 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER); 1656 icalparameter *param = icalproperty_get_first_parameter(p,ICAL_CN_PARAMETER);
1659 if (param) { 1657 if (param) {
1660 name = QString::fromUtf8(icalparameter_get_cn(param)); 1658 name = QString::fromUtf8(icalparameter_get_cn(param));
1661 } 1659 }
1662 ialarm->addMailAddress(Person(name, email)); 1660 ialarm->addMailAddress(Person(name, email));
1663 break; 1661 break;
1664 } 1662 }
1665 // Only in AUDIO and EMAIL and PROCEDURE alarms 1663 // Only in AUDIO and EMAIL and PROCEDURE alarms
1666 case ICAL_ATTACH_PROPERTY: { 1664 case ICAL_ATTACH_PROPERTY: {
1667 icalattach *attach = icalproperty_get_attach(p); 1665 icalattach *attach = icalproperty_get_attach(p);
1668 QString url = QFile::decodeName(icalattach_get_url(attach)); 1666 QString url = QFile::decodeName(icalattach_get_url(attach));
1669 switch ( action ) { 1667 switch ( action ) {
1670 case ICAL_ACTION_AUDIO: 1668 case ICAL_ACTION_AUDIO:
1671 ialarm->setAudioFile( url ); 1669 ialarm->setAudioFile( url );
1672 break; 1670 break;
1673 case ICAL_ACTION_PROCEDURE: 1671 case ICAL_ACTION_PROCEDURE:
1674 ialarm->setProgramFile( url ); 1672 ialarm->setProgramFile( url );
1675 break; 1673 break;
1676 case ICAL_ACTION_EMAIL: 1674 case ICAL_ACTION_EMAIL:
1677 ialarm->addMailAttachment( url ); 1675 ialarm->addMailAttachment( url );
1678 break; 1676 break;
1679 default: 1677 default:
1680 break; 1678 break;
1681 } 1679 }
1682 break; 1680 break;
1683 } 1681 }
1684 default: 1682 default:
1685 break; 1683 break;
1686 } 1684 }
1687 1685
1688 p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY); 1686 p = icalcomponent_get_next_property(alarm,ICAL_ANY_PROPERTY);
1689 } 1687 }
1690 1688
1691 // custom properties 1689 // custom properties
1692 readCustomProperties(alarm, ialarm); 1690 readCustomProperties(alarm, ialarm);
1693 1691
1694 // TODO: check for consistency of alarm properties 1692 // TODO: check for consistency of alarm properties
1695} 1693}
1696 1694
1697icaltimetype ICalFormatImpl::writeICalDate(const QDate &date) 1695icaltimetype ICalFormatImpl::writeICalDate(const QDate &date)
1698{ 1696{
1699 icaltimetype t; 1697 icaltimetype t;
1700 1698
1701 t.year = date.year(); 1699 t.year = date.year();
1702 t.month = date.month(); 1700 t.month = date.month();
1703 t.day = date.day(); 1701 t.day = date.day();
1704 1702
1705 t.hour = 0; 1703 t.hour = 0;
1706 t.minute = 0; 1704 t.minute = 0;
1707 t.second = 0; 1705 t.second = 0;
1708 1706
1709 t.is_date = 1; 1707 t.is_date = 1;
1710 1708
1711 t.is_utc = 0; 1709 t.is_utc = 0;
1712 1710
1713 t.zone = 0; 1711 t.zone = 0;
1714 1712
1715 return t; 1713 return t;
1716} 1714}
1717 1715
1718icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &dt ) 1716icaltimetype ICalFormatImpl::writeICalDateTime(const QDateTime &dt )
1719{ 1717{
1720 icaltimetype t; 1718 icaltimetype t;
1721 t.is_date = 0; 1719 t.is_date = 0;
1722 t.zone = 0; 1720 t.zone = 0;
1723 QDateTime datetime; 1721 QDateTime datetime;
1724 if ( mParent->utc() ) { 1722 if ( mParent->utc() ) {
1725 int offset = KGlobal::locale()->localTimeOffset( dt ); 1723 int offset = KGlobal::locale()->localTimeOffset( dt );
1726 datetime = dt.addSecs ( -offset*60); 1724 datetime = dt.addSecs ( -offset*60);
1727 t.is_utc = 1; 1725 t.is_utc = 1;
1728 } 1726 }
1729 else { 1727 else {
1730 datetime = dt; 1728 datetime = dt;
1731 t.is_utc = 0; 1729 t.is_utc = 0;
1732 1730
1733 } 1731 }
1734 t.year = datetime.date().year(); 1732 t.year = datetime.date().year();
1735 t.month = datetime.date().month(); 1733 t.month = datetime.date().month();
1736 t.day = datetime.date().day(); 1734 t.day = datetime.date().day();
1737 1735
1738 t.hour = datetime.time().hour(); 1736 t.hour = datetime.time().hour();
1739 t.minute = datetime.time().minute(); 1737 t.minute = datetime.time().minute();
1740 t.second = datetime.time().second(); 1738 t.second = datetime.time().second();
1741 1739
1742 //qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() ); 1740 //qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() );
1743 1741
1744// if ( mParent->utc() ) { 1742// if ( mParent->utc() ) {
1745// datetime = KGlobal::locale()->localTime( dt ); 1743// datetime = KGlobal::locale()->localTime( dt );
1746// qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() ); 1744// qDebug("*** time %s localtime %s ",dt .toString().latin1() ,datetime .toString().latin1() );
1747// if (mParent->timeZoneId().isEmpty()) 1745// if (mParent->timeZoneId().isEmpty())
1748// t = icaltime_as_utc(t, 0); 1746// t = icaltime_as_utc(t, 0);
1749// else 1747// else
1750// t = icaltime_as_utc(t,mParent->timeZoneId().local8Bit()); 1748// t = icaltime_as_utc(t,mParent->timeZoneId().local8Bit());
1751// } 1749// }
1752 1750
1753 return t; 1751 return t;
1754} 1752}
1755 1753
1756QDateTime ICalFormatImpl::readICalDateTime(icaltimetype t) 1754QDateTime ICalFormatImpl::readICalDateTime(icaltimetype t)
1757{ 1755{
1758 QDateTime dt (QDate(t.year,t.month,t.day), 1756 QDateTime dt (QDate(t.year,t.month,t.day),
1759 QTime(t.hour,t.minute,t.second) ); 1757 QTime(t.hour,t.minute,t.second) );
1760 1758
1761 if (t.is_utc) { 1759 if (t.is_utc) {
1762 int offset = KGlobal::locale()->localTimeOffset( dt ); 1760 int offset = KGlobal::locale()->localTimeOffset( dt );
1763 dt = dt.addSecs ( offset*60); 1761 dt = dt.addSecs ( offset*60);
1764 } 1762 }
1765 1763
1766 return dt; 1764 return dt;
1767} 1765}
1768 1766
1769QDate ICalFormatImpl::readICalDate(icaltimetype t) 1767QDate ICalFormatImpl::readICalDate(icaltimetype t)
1770{ 1768{
1771 return QDate(t.year,t.month,t.day); 1769 return QDate(t.year,t.month,t.day);
1772} 1770}
1773 1771
1774icaldurationtype ICalFormatImpl::writeICalDuration(int seconds) 1772icaldurationtype ICalFormatImpl::writeICalDuration(int seconds)
1775{ 1773{
1776 icaldurationtype d; 1774 icaldurationtype d;
1777 1775
1778 d.is_neg = (seconds<0)?1:0; 1776 d.is_neg = (seconds<0)?1:0;
1779 if (seconds<0) seconds = -seconds; 1777 if (seconds<0) seconds = -seconds;
1780 1778
1781 d.weeks = seconds / gSecondsPerWeek; 1779 d.weeks = seconds / gSecondsPerWeek;
1782 seconds %= gSecondsPerWeek; 1780 seconds %= gSecondsPerWeek;
1783 d.days = seconds / gSecondsPerDay; 1781 d.days = seconds / gSecondsPerDay;
1784 seconds %= gSecondsPerDay; 1782 seconds %= gSecondsPerDay;
1785 d.hours = seconds / gSecondsPerHour; 1783 d.hours = seconds / gSecondsPerHour;
1786 seconds %= gSecondsPerHour; 1784 seconds %= gSecondsPerHour;
1787 d.minutes = seconds / gSecondsPerMinute; 1785 d.minutes = seconds / gSecondsPerMinute;
1788 seconds %= gSecondsPerMinute; 1786 seconds %= gSecondsPerMinute;
1789 d.seconds = seconds; 1787 d.seconds = seconds;
1790 return d; 1788 return d;
1791} 1789}
1792 1790
1793int ICalFormatImpl::readICalDuration(icaldurationtype d) 1791int ICalFormatImpl::readICalDuration(icaldurationtype d)
1794{ 1792{
1795 int result = 0; 1793 int result = 0;
1796 1794
1797 result += d.weeks * gSecondsPerWeek; 1795 result += d.weeks * gSecondsPerWeek;
1798 result += d.days * gSecondsPerDay; 1796 result += d.days * gSecondsPerDay;
1799 result += d.hours * gSecondsPerHour; 1797 result += d.hours * gSecondsPerHour;
1800 result += d.minutes * gSecondsPerMinute; 1798 result += d.minutes * gSecondsPerMinute;
1801 result += d.seconds; 1799 result += d.seconds;
1802 1800
1803 if (d.is_neg) result *= -1; 1801 if (d.is_neg) result *= -1;
1804 1802
1805 return result; 1803 return result;
1806} 1804}
1807 1805
1808icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal) 1806icalcomponent *ICalFormatImpl::createCalendarComponent(Calendar *cal)
1809{ 1807{
1810 icalcomponent *calendar; 1808 icalcomponent *calendar;
1811 1809
1812 // Root component 1810 // Root component
1813 calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT); 1811 calendar = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
1814 1812
1815 icalproperty *p; 1813 icalproperty *p;
1816 1814
1817 // Product Identifier 1815 // Product Identifier
1818 p = icalproperty_new_prodid(CalFormat::productId().utf8()); 1816 p = icalproperty_new_prodid(CalFormat::productId().utf8());
1819 icalcomponent_add_property(calendar,p); 1817 icalcomponent_add_property(calendar,p);
1820 1818
1821 // TODO: Add time zone 1819 // TODO: Add time zone
1822 1820
1823 // iCalendar version (2.0) 1821 // iCalendar version (2.0)
1824 p = icalproperty_new_version(const_cast<char *>(_ICAL_VERSION)); 1822 p = icalproperty_new_version(const_cast<char *>(_ICAL_VERSION));
1825 icalcomponent_add_property(calendar,p); 1823 icalcomponent_add_property(calendar,p);
1826 1824
1827 // Custom properties 1825 // Custom properties
1828 if( cal != 0 ) 1826 if( cal != 0 )
1829 writeCustomProperties(calendar, cal); 1827 writeCustomProperties(calendar, cal);
1830 1828
1831 return calendar; 1829 return calendar;
1832} 1830}
1833 1831
1834 1832
1835 1833
1836// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc. 1834// take a raw vcalendar (i.e. from a file on disk, clipboard, etc. etc.
1837// and break it down from its tree-like format into the dictionary format 1835// and break it down from its tree-like format into the dictionary format
1838// that is used internally in the ICalFormatImpl. 1836// that is used internally in the ICalFormatImpl.
1839bool ICalFormatImpl::populate( Calendar *cal, icalcomponent *calendar) 1837bool ICalFormatImpl::populate( Calendar *cal, icalcomponent *calendar)
1840{ 1838{
1841 // this function will populate the caldict dictionary and other event 1839 // this function will populate the caldict dictionary and other event
1842 // lists. It turns vevents into Events and then inserts them. 1840 // lists. It turns vevents into Events and then inserts them.
1843 1841
1844 if (!calendar) return false; 1842 if (!calendar) return false;
1845 1843
1846// TODO: check for METHOD 1844// TODO: check for METHOD
1847#if 0 1845#if 0
1848 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) { 1846 if ((curVO = isAPropertyOf(vcal, ICMethodProp)) != 0) {
1849 char *methodType = 0; 1847 char *methodType = 0;
1850 methodType = fakeCString(vObjectUStringZValue(curVO)); 1848 methodType = fakeCString(vObjectUStringZValue(curVO));
1851 if (mEnableDialogs) 1849 if (mEnableDialogs)
1852 KMessageBox::information(mTopWidget, 1850 KMessageBox::information(mTopWidget,
1853 i18n("This calendar is an iTIP transaction of type \"%1\".") 1851 i18n("This calendar is an iTIP transaction of type \"%1\".")
1854 .arg(methodType), 1852 .arg(methodType),
1855 i18n("%1: iTIP Transaction").arg(CalFormat::application())); 1853 i18n("%1: iTIP Transaction").arg(CalFormat::application()));
1856 delete methodType; 1854 delete methodType;
1857 } 1855 }
1858#endif 1856#endif
1859 1857
1860 icalproperty *p; 1858 icalproperty *p;
1861 1859
1862 p = icalcomponent_get_first_property(calendar,ICAL_PRODID_PROPERTY); 1860 p = icalcomponent_get_first_property(calendar,ICAL_PRODID_PROPERTY);
1863 if (!p) { 1861 if (!p) {
1864// TODO: does no PRODID really matter? 1862// TODO: does no PRODID really matter?
1865// mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 1863// mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
1866// return false; 1864// return false;
1867 mLoadedProductId = ""; 1865 mLoadedProductId = "";
1868 mCalendarVersion = 0; 1866 mCalendarVersion = 0;
1869 } else { 1867 } else {
1870 mLoadedProductId = QString::fromUtf8(icalproperty_get_prodid(p)); 1868 mLoadedProductId = QString::fromUtf8(icalproperty_get_prodid(p));
1871 mCalendarVersion = CalFormat::calendarVersion(mLoadedProductId); 1869 mCalendarVersion = CalFormat::calendarVersion(mLoadedProductId);
1872 1870
1873 delete mCompat; 1871 delete mCompat;
1874 mCompat = CompatFactory::createCompat( mLoadedProductId ); 1872 mCompat = CompatFactory::createCompat( mLoadedProductId );
1875 } 1873 }
1876 1874
1877// TODO: check for unknown PRODID 1875// TODO: check for unknown PRODID
1878#if 0 1876#if 0
1879 if (!mCalendarVersion 1877 if (!mCalendarVersion
1880 && CalFormat::productId() != mLoadedProductId) { 1878 && CalFormat::productId() != mLoadedProductId) {
1881 // warn the user that we might have trouble reading non-known calendar. 1879 // warn the user that we might have trouble reading non-known calendar.
1882 if (mEnableDialogs) 1880 if (mEnableDialogs)
1883 KMessageBox::information(mTopWidget, 1881 KMessageBox::information(mTopWidget,
1884 i18n("This vCalendar file was not created by KOrganizer " 1882 i18n("This vCalendar file was not created by KOrganizer "
1885 "or any other product we support. Loading anyway..."), 1883 "or any other product we support. Loading anyway..."),
1886 i18n("%1: Unknown vCalendar Vendor").arg(CalFormat::application())); 1884 i18n("%1: Unknown vCalendar Vendor").arg(CalFormat::application()));
1887 } 1885 }
1888#endif 1886#endif
1889 1887
1890 p = icalcomponent_get_first_property(calendar,ICAL_VERSION_PROPERTY); 1888 p = icalcomponent_get_first_property(calendar,ICAL_VERSION_PROPERTY);
1891 if (!p) { 1889 if (!p) {
1892 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 1890 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
1893 return false; 1891 return false;
1894 } else { 1892 } else {
1895 const char *version = icalproperty_get_version(p); 1893 const char *version = icalproperty_get_version(p);
1896 1894
1897 if (strcmp(version,"1.0") == 0) { 1895 if (strcmp(version,"1.0") == 0) {
1898 mParent->setException(new ErrorFormat(ErrorFormat::CalVersion1, 1896 mParent->setException(new ErrorFormat(ErrorFormat::CalVersion1,
1899 i18n("Expected iCalendar format"))); 1897 i18n("Expected iCalendar format")));
1900 return false; 1898 return false;
1901 } else if (strcmp(version,"2.0") != 0) { 1899 } else if (strcmp(version,"2.0") != 0) {
1902 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 1900 mParent->setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
1903 return false; 1901 return false;
1904 } 1902 }
1905 } 1903 }
1906 1904
1907 1905
1908// TODO: check for calendar format version 1906// TODO: check for calendar format version
1909#if 0 1907#if 0
1910 // warn the user we might have trouble reading this unknown version. 1908 // warn the user we might have trouble reading this unknown version.
1911 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) { 1909 if ((curVO = isAPropertyOf(vcal, VCVersionProp)) != 0) {
1912 char *s = fakeCString(vObjectUStringZValue(curVO)); 1910 char *s = fakeCString(vObjectUStringZValue(curVO));
1913 if (strcmp(_VCAL_VERSION, s) != 0) 1911 if (strcmp(_VCAL_VERSION, s) != 0)
1914 if (mEnableDialogs) 1912 if (mEnableDialogs)
1915 KMessageBox::sorry(mTopWidget, 1913 KMessageBox::sorry(mTopWidget,
1916 i18n("This vCalendar file has version %1.\n" 1914 i18n("This vCalendar file has version %1.\n"
1917 "We only support %2.") 1915 "We only support %2.")
1918 .arg(s).arg(_VCAL_VERSION), 1916 .arg(s).arg(_VCAL_VERSION),
1919 i18n("%1: Unknown vCalendar Version").arg(CalFormat::application())); 1917 i18n("%1: Unknown vCalendar Version").arg(CalFormat::application()));
1920 deleteStr(s); 1918 deleteStr(s);
1921 } 1919 }
1922#endif 1920#endif
1923 1921
1924 // custom properties 1922 // custom properties
1925 readCustomProperties(calendar, cal); 1923 readCustomProperties(calendar, cal);
1926 1924
1927// TODO: set time zone 1925// TODO: set time zone
1928#if 0 1926#if 0
1929 // set the time zone 1927 // set the time zone
1930 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) { 1928 if ((curVO = isAPropertyOf(vcal, VCTimeZoneProp)) != 0) {
1931 char *s = fakeCString(vObjectUStringZValue(curVO)); 1929 char *s = fakeCString(vObjectUStringZValue(curVO));
1932 cal->setTimeZone(s); 1930 cal->setTimeZone(s);
1933 deleteStr(s); 1931 deleteStr(s);
1934 } 1932 }
1935#endif 1933#endif
1936 1934
1937 // Store all events with a relatedTo property in a list for post-processing 1935 // Store all events with a relatedTo property in a list for post-processing
1938 mEventsRelate.clear(); 1936 mEventsRelate.clear();
1939 mTodosRelate.clear(); 1937 mTodosRelate.clear();
1940 // TODO: make sure that only actually added ecvens go to this lists. 1938 // TODO: make sure that only actually added ecvens go to this lists.
1941 1939
1942 icalcomponent *c; 1940 icalcomponent *c;
1943 1941
1944 // Iterate through all todos 1942 // Iterate through all todos
1945 c = icalcomponent_get_first_component(calendar,ICAL_VTODO_COMPONENT); 1943 c = icalcomponent_get_first_component(calendar,ICAL_VTODO_COMPONENT);
1946 while (c) { 1944 while (c) {
1947// kdDebug(5800) << "----Todo found" << endl; 1945// kdDebug(5800) << "----Todo found" << endl;
1948 Todo *todo = readTodo(c); 1946 Todo *todo = readTodo(c);
1949 if (!cal->todo(todo->uid())) cal->addTodo(todo); 1947 if (!cal->todo(todo->uid())) cal->addTodo(todo);
1950 c = icalcomponent_get_next_component(calendar,ICAL_VTODO_COMPONENT); 1948 c = icalcomponent_get_next_component(calendar,ICAL_VTODO_COMPONENT);
1951 } 1949 }
1952 1950
1953 // Iterate through all events 1951 // Iterate through all events
1954 c = icalcomponent_get_first_component(calendar,ICAL_VEVENT_COMPONENT); 1952 c = icalcomponent_get_first_component(calendar,ICAL_VEVENT_COMPONENT);
1955 while (c) { 1953 while (c) {
1956// kdDebug(5800) << "----Event found" << endl; 1954// kdDebug(5800) << "----Event found" << endl;
1957 Event *event = readEvent(c); 1955 Event *event = readEvent(c);
1958 if (!cal->event(event->uid())) cal->addEvent(event); 1956 if (!cal->event(event->uid())) cal->addEvent(event);
1959 c = icalcomponent_get_next_component(calendar,ICAL_VEVENT_COMPONENT); 1957 c = icalcomponent_get_next_component(calendar,ICAL_VEVENT_COMPONENT);
1960 } 1958 }
1961 1959
1962 // Iterate through all journals 1960 // Iterate through all journals
1963 c = icalcomponent_get_first_component(calendar,ICAL_VJOURNAL_COMPONENT); 1961 c = icalcomponent_get_first_component(calendar,ICAL_VJOURNAL_COMPONENT);
1964 while (c) { 1962 while (c) {
1965// kdDebug(5800) << "----Journal found" << endl; 1963// kdDebug(5800) << "----Journal found" << endl;
1966 Journal *journal = readJournal(c); 1964 Journal *journal = readJournal(c);
1967 if (!cal->journal(journal->uid())) cal->addJournal(journal); 1965 if (!cal->journal(journal->uid())) cal->addJournal(journal);
1968 c = icalcomponent_get_next_component(calendar,ICAL_VJOURNAL_COMPONENT); 1966 c = icalcomponent_get_next_component(calendar,ICAL_VJOURNAL_COMPONENT);
1969 } 1967 }
1970 1968
1971#if 0 1969#if 0
1972 initPropIterator(&i, vcal); 1970 initPropIterator(&i, vcal);
1973 1971
1974 // go through all the vobjects in the vcal 1972 // go through all the vobjects in the vcal
1975 while (moreIteration(&i)) { 1973 while (moreIteration(&i)) {
1976 curVO = nextVObject(&i); 1974 curVO = nextVObject(&i);
1977 1975
1978 /************************************************************************/ 1976 /************************************************************************/
1979 1977
1980 // now, check to see that the object is an event or todo. 1978 // now, check to see that the object is an event or todo.
1981 if (strcmp(vObjectName(curVO), VCEventProp) == 0) { 1979 if (strcmp(vObjectName(curVO), VCEventProp) == 0) {
1982 1980
1983 if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) { 1981 if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) {
1984 char *s; 1982 char *s;
1985 s = fakeCString(vObjectUStringZValue(curVOProp)); 1983 s = fakeCString(vObjectUStringZValue(curVOProp));
1986 // check to see if event was deleted by the kpilot conduit 1984 // check to see if event was deleted by the kpilot conduit
1987 if (atoi(s) == Event::SYNCDEL) { 1985 if (atoi(s) == Event::SYNCDEL) {
1988 deleteStr(s); 1986 deleteStr(s);
1989 goto SKIP; 1987 goto SKIP;
1990 } 1988 }
1991 deleteStr(s); 1989 deleteStr(s);
1992 } 1990 }
1993 1991
1994 // this code checks to see if we are trying to read in an event 1992 // this code checks to see if we are trying to read in an event
1995 // that we already find to be in the calendar. If we find this 1993 // that we already find to be in the calendar. If we find this
1996 // to be the case, we skip the event. 1994 // to be the case, we skip the event.
1997 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) { 1995 if ((curVOProp = isAPropertyOf(curVO, VCUniqueStringProp)) != 0) {
1998 char *s = fakeCString(vObjectUStringZValue(curVOProp)); 1996 char *s = fakeCString(vObjectUStringZValue(curVOProp));
1999 QString tmpStr(s); 1997 QString tmpStr(s);
2000 deleteStr(s); 1998 deleteStr(s);
2001 1999
2002 if (cal->event(tmpStr)) { 2000 if (cal->event(tmpStr)) {
2003 goto SKIP; 2001 goto SKIP;
2004 } 2002 }
2005 if (cal->todo(tmpStr)) { 2003 if (cal->todo(tmpStr)) {
2006 goto SKIP; 2004 goto SKIP;
2007 } 2005 }
2008 } 2006 }
2009 2007
2010 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) && 2008 if ((!(curVOProp = isAPropertyOf(curVO, VCDTstartProp))) &&
2011 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) { 2009 (!(curVOProp = isAPropertyOf(curVO, VCDTendProp)))) {
2012 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl; 2010 kdDebug(5800) << "found a VEvent with no DTSTART and no DTEND! Skipping..." << endl;
2013 goto SKIP; 2011 goto SKIP;
2014 } 2012 }
2015 2013
2016 anEvent = VEventToEvent(curVO); 2014 anEvent = VEventToEvent(curVO);
2017 // we now use addEvent instead of insertEvent so that the 2015 // we now use addEvent instead of insertEvent so that the
2018 // signal/slot get connected. 2016 // signal/slot get connected.
2019 if (anEvent) 2017 if (anEvent)
2020 cal->addEvent(anEvent); 2018 cal->addEvent(anEvent);
2021 else { 2019 else {
2022 // some sort of error must have occurred while in translation. 2020 // some sort of error must have occurred while in translation.
2023 goto SKIP; 2021 goto SKIP;
2024 } 2022 }
2025 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) { 2023 } else if (strcmp(vObjectName(curVO), VCTodoProp) == 0) {
2026 anEvent = VTodoToEvent(curVO); 2024 anEvent = VTodoToEvent(curVO);
2027 cal->addTodo(anEvent); 2025 cal->addTodo(anEvent);
2028 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) || 2026 } else if ((strcmp(vObjectName(curVO), VCVersionProp) == 0) ||
2029 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) || 2027 (strcmp(vObjectName(curVO), VCProdIdProp) == 0) ||
2030 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) { 2028 (strcmp(vObjectName(curVO), VCTimeZoneProp) == 0)) {
2031 // do nothing, we know these properties and we want to skip them. 2029 // do nothing, we know these properties and we want to skip them.
2032 // we have either already processed them or are ignoring them. 2030 // we have either already processed them or are ignoring them.
2033 ; 2031 ;
2034 } else { 2032 } else {
2035 ; 2033 ;
2036 } 2034 }
2037 SKIP: 2035 SKIP:
2038 ; 2036 ;
2039 } // while 2037 } // while
2040#endif 2038#endif
2041 2039
2042 // Post-Process list of events with relations, put Event objects in relation 2040 // Post-Process list of events with relations, put Event objects in relation
2043 Event *ev; 2041 Event *ev;
2044 for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) { 2042 for ( ev=mEventsRelate.first(); ev != 0; ev=mEventsRelate.next() ) {
2045 Incidence * inc = cal->event(ev->relatedToUid()); 2043 Incidence * inc = cal->event(ev->relatedToUid());
2046 if ( inc ) 2044 if ( inc )
2047 ev->setRelatedTo( inc ); 2045 ev->setRelatedTo( inc );
2048 } 2046 }
2049 Todo *todo; 2047 Todo *todo;
2050 for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) { 2048 for ( todo=mTodosRelate.first(); todo != 0; todo=mTodosRelate.next() ) {
2051 Incidence * inc = cal->todo(todo->relatedToUid()); 2049 Incidence * inc = cal->todo(todo->relatedToUid());
2052 if ( inc ) 2050 if ( inc )
2053 todo->setRelatedTo( inc ); 2051 todo->setRelatedTo( inc );
2054 } 2052 }
2055 2053
2056 return true; 2054 return true;
2057} 2055}
2058 2056
2059QString ICalFormatImpl::extractErrorProperty(icalcomponent *c) 2057QString ICalFormatImpl::extractErrorProperty(icalcomponent *c)
2060{ 2058{
2061// kdDebug(5800) << "ICalFormatImpl:extractErrorProperty: " 2059// kdDebug(5800) << "ICalFormatImpl:extractErrorProperty: "
2062// << icalcomponent_as_ical_string(c) << endl; 2060// << icalcomponent_as_ical_string(c) << endl;
2063 2061
2064 QString errorMessage; 2062 QString errorMessage;
2065 2063
2066 icalproperty *error; 2064 icalproperty *error;
diff --git a/libkcal/incidence.cpp b/libkcal/incidence.cpp
index e4bcc5e..4643a3a 100644
--- a/libkcal/incidence.cpp
+++ b/libkcal/incidence.cpp
@@ -1,780 +1,811 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#include "incidence.h" 27#include "incidence.h"
28#include "todo.h" 28#include "todo.h"
29 29
30using namespace KCal; 30using namespace KCal;
31 31
32Incidence::Incidence() : 32Incidence::Incidence() :
33 IncidenceBase(), 33 IncidenceBase(),
34 mRelatedTo(0), mSecrecy(SecrecyPublic), mPriority(3) 34 mRelatedTo(0), mSecrecy(SecrecyPublic), mPriority(3)
35{ 35{
36 mRecurrence = new Recurrence(this); 36 mRecurrence = 0;//new Recurrence(this);
37 mCancelled = false; 37 mCancelled = false;
38 recreate(); 38 recreate();
39 mHasStartDate = true; 39 mHasStartDate = true;
40 mAlarms.setAutoDelete(true); 40 mAlarms.setAutoDelete(true);
41 mAttachments.setAutoDelete(true); 41 mAttachments.setAutoDelete(true);
42 mHasRecurrenceID = false; 42 mHasRecurrenceID = false;
43 mHoliday = false; 43 mHoliday = false;
44 mBirthday = false; 44 mBirthday = false;
45 mAnniversary = false; 45 mAnniversary = false;
46 46
47} 47}
48 48
49Incidence::Incidence( const Incidence &i ) : IncidenceBase( i ) 49Incidence::Incidence( const Incidence &i ) : IncidenceBase( i )
50{ 50{
51// TODO: reenable attributes currently commented out. 51// TODO: reenable attributes currently commented out.
52 mRevision = i.mRevision; 52 mRevision = i.mRevision;
53 mCreated = i.mCreated; 53 mCreated = i.mCreated;
54 mDescription = i.mDescription; 54 mDescription = i.mDescription;
55 mSummary = i.mSummary; 55 mSummary = i.mSummary;
56 mCategories = i.mCategories; 56 mCategories = i.mCategories;
57// Incidence *mRelatedTo; Incidence *mRelatedTo; 57// Incidence *mRelatedTo; Incidence *mRelatedTo;
58 mRelatedTo = 0; 58 mRelatedTo = 0;
59 mRelatedToUid = i.mRelatedToUid; 59 mRelatedToUid = i.mRelatedToUid;
60// QPtrList<Incidence> mRelations; QPtrList<Incidence> mRelations; 60// QPtrList<Incidence> mRelations; QPtrList<Incidence> mRelations;
61 mExDates = i.mExDates; 61 mExDates = i.mExDates;
62 mAttachments = i.mAttachments; 62 mAttachments = i.mAttachments;
63 mResources = i.mResources; 63 mResources = i.mResources;
64 mSecrecy = i.mSecrecy; 64 mSecrecy = i.mSecrecy;
65 mPriority = i.mPriority; 65 mPriority = i.mPriority;
66 mLocation = i.mLocation; 66 mLocation = i.mLocation;
67 mCancelled = i.mCancelled; 67 mCancelled = i.mCancelled;
68 mHasStartDate = i.mHasStartDate; 68 mHasStartDate = i.mHasStartDate;
69 QPtrListIterator<Alarm> it( i.mAlarms ); 69 QPtrListIterator<Alarm> it( i.mAlarms );
70 const Alarm *a; 70 const Alarm *a;
71 while( (a = it.current()) ) { 71 while( (a = it.current()) ) {
72 Alarm *b = new Alarm( *a ); 72 Alarm *b = new Alarm( *a );
73 b->setParent( this ); 73 b->setParent( this );
74 mAlarms.append( b ); 74 mAlarms.append( b );
75 75
76 ++it; 76 ++it;
77 } 77 }
78 mAlarms.setAutoDelete(true); 78 mAlarms.setAutoDelete(true);
79 mHasRecurrenceID = i.mHasRecurrenceID; 79 mHasRecurrenceID = i.mHasRecurrenceID;
80 mRecurrenceID = i.mRecurrenceID; 80 mRecurrenceID = i.mRecurrenceID;
81 mRecurrence = new Recurrence( *(i.mRecurrence), this ); 81 if ( i.mRecurrence )
82 mRecurrence = new Recurrence( *(i.mRecurrence), this );
83 else
84 mRecurrence = 0;
82 mHoliday = i.mHoliday ; 85 mHoliday = i.mHoliday ;
83 mBirthday = i.mBirthday; 86 mBirthday = i.mBirthday;
84 mAnniversary = i.mAnniversary; 87 mAnniversary = i.mAnniversary;
85} 88}
86 89
87Incidence::~Incidence() 90Incidence::~Incidence()
88{ 91{
89 92
90 Incidence *ev; 93 Incidence *ev;
91 QPtrList<Incidence> Relations = relations(); 94 QPtrList<Incidence> Relations = relations();
92 for (ev=Relations.first();ev;ev=Relations.next()) { 95 for (ev=Relations.first();ev;ev=Relations.next()) {
93 if (ev->relatedTo() == this) ev->setRelatedTo(0); 96 if (ev->relatedTo() == this) ev->setRelatedTo(0);
94 } 97 }
95 if (relatedTo()) relatedTo()->removeRelation(this); 98 if (relatedTo()) relatedTo()->removeRelation(this);
96 delete mRecurrence; 99 if ( mRecurrence )
100 delete mRecurrence;
97 101
98} 102}
99 103
100bool Incidence::isHoliday() const 104bool Incidence::isHoliday() const
101{ 105{
102 return mHoliday; 106 return mHoliday;
103} 107}
104bool Incidence::isBirthday() const 108bool Incidence::isBirthday() const
105{ 109{
106 110
107 return mBirthday ; 111 return mBirthday ;
108} 112}
109bool Incidence::isAnniversary() const 113bool Incidence::isAnniversary() const
110{ 114{
111 return mAnniversary ; 115 return mAnniversary ;
112 116
113} 117}
114 118
115bool Incidence::hasRecurrenceID() const 119bool Incidence::hasRecurrenceID() const
116{ 120{
117 return mHasRecurrenceID; 121 return mHasRecurrenceID;
118} 122}
119 123
120void Incidence::setHasRecurrenceID( bool b ) 124void Incidence::setHasRecurrenceID( bool b )
121{ 125{
122 mHasRecurrenceID = b; 126 mHasRecurrenceID = b;
123} 127}
124 128
125void Incidence::setRecurrenceID(QDateTime d) 129void Incidence::setRecurrenceID(QDateTime d)
126{ 130{
127 mRecurrenceID = d; 131 mRecurrenceID = d;
128 mHasRecurrenceID = true; 132 mHasRecurrenceID = true;
129 updated(); 133 updated();
130} 134}
131QDateTime Incidence::recurrenceID () const 135QDateTime Incidence::recurrenceID () const
132{ 136{
133 return mRecurrenceID; 137 return mRecurrenceID;
134} 138}
135 139
136bool Incidence::cancelled() const 140bool Incidence::cancelled() const
137{ 141{
138 return mCancelled; 142 return mCancelled;
139} 143}
140void Incidence::setCancelled( bool b ) 144void Incidence::setCancelled( bool b )
141{ 145{
142 mCancelled = b; 146 mCancelled = b;
143 updated(); 147 updated();
144} 148}
145bool Incidence::hasStartDate() const 149bool Incidence::hasStartDate() const
146{ 150{
147 return mHasStartDate; 151 return mHasStartDate;
148} 152}
149 153
150void Incidence::setHasStartDate(bool f) 154void Incidence::setHasStartDate(bool f)
151{ 155{
152 if (mReadOnly) return; 156 if (mReadOnly) return;
153 mHasStartDate = f; 157 mHasStartDate = f;
154 updated(); 158 updated();
155} 159}
156 160
157// A string comparison that considers that null and empty are the same 161// A string comparison that considers that null and empty are the same
158static bool stringCompare( const QString& s1, const QString& s2 ) 162static bool stringCompare( const QString& s1, const QString& s2 )
159{ 163{
160 if ( s1.isEmpty() && s2.isEmpty() ) 164 if ( s1.isEmpty() && s2.isEmpty() )
161 return true; 165 return true;
162 return s1 == s2; 166 return s1 == s2;
163} 167}
164 168
165bool KCal::operator==( const Incidence& i1, const Incidence& i2 ) 169bool KCal::operator==( const Incidence& i1, const Incidence& i2 )
166{ 170{
167 171
168 if( i1.alarms().count() != i2.alarms().count() ) { 172 if( i1.alarms().count() != i2.alarms().count() ) {
169 return false; // no need to check further 173 return false; // no need to check further
170 } 174 }
171 if ( i1.alarms().count() > 0 ) { 175 if ( i1.alarms().count() > 0 ) {
172 if ( !( *(i1.alarms().first()) == *(i2.alarms().first())) ) 176 if ( !( *(i1.alarms().first()) == *(i2.alarms().first())) )
173 { 177 {
174 qDebug("alarm not equal "); 178 qDebug("alarm not equal ");
175 return false; 179 return false;
176 } 180 }
177 } 181 }
178#if 0 182#if 0
179 QPtrListIterator<Alarm> a1( i1.alarms() ); 183 QPtrListIterator<Alarm> a1( i1.alarms() );
180 QPtrListIterator<Alarm> a2( i2.alarms() ); 184 QPtrListIterator<Alarm> a2( i2.alarms() );
181 for( ; a1.current() && a2.current(); ++a1, ++a2 ) { 185 for( ; a1.current() && a2.current(); ++a1, ++a2 ) {
182 if( *a1.current() == *a2.current() ) { 186 if( *a1.current() == *a2.current() ) {
183 continue; 187 continue;
184 } 188 }
185 else { 189 else {
186 return false; 190 return false;
187 } 191 }
188 } 192 }
189#endif 193#endif
190 194
191 if ( i1.hasRecurrenceID() == i2.hasRecurrenceID() ) { 195 if ( i1.hasRecurrenceID() == i2.hasRecurrenceID() ) {
192 if ( i1.hasRecurrenceID() ) { 196 if ( i1.hasRecurrenceID() ) {
193 if ( i1.recurrenceID() != i2.recurrenceID() ) 197 if ( i1.recurrenceID() != i2.recurrenceID() )
194 return false; 198 return false;
195 } 199 }
196 200
197 } else { 201 } else {
198 return false; 202 return false;
199 } 203 }
200 204
201 if ( ! operator==( (const IncidenceBase&)i1, (const IncidenceBase&)i2 ) ) 205 if ( ! operator==( (const IncidenceBase&)i1, (const IncidenceBase&)i2 ) )
202 return false; 206 return false;
203 if ( i1.hasStartDate() == i2.hasStartDate() ) { 207 if ( i1.hasStartDate() == i2.hasStartDate() ) {
204 if ( i1.hasStartDate() ) { 208 if ( i1.hasStartDate() ) {
205 if ( i1.dtStart() != i2.dtStart() ) 209 if ( i1.dtStart() != i2.dtStart() )
206 return false; 210 return false;
207 } 211 }
208 } else { 212 } else {
209 return false; 213 return false;
210 } 214 }
211 if (!( *i1.recurrence() == *i2.recurrence()) ) { 215 if ( i1.mRecurrence != 0 && i2.mRecurrence != 0 ) {
212 qDebug("recurrence is NOT equal "); 216 if (!( *i1.mRecurrence == *i2.mRecurrence) ) {
213 return false; 217 //qDebug("recurrence is NOT equal ");
218 return false;
219 }
220 } else {
221 // one ( or both ) recurrence is 0
222 if ( i1.mRecurrence == 0 ) {
223 if ( i2.mRecurrence != 0 && i2.mRecurrence->doesRecur() != Recurrence::rNone )
224 return false;
225 } else {
226 // i1.mRecurrence != 0
227 // i2.mRecurrence == 0
228 if ( i1.mRecurrence->doesRecur() != Recurrence::rNone )
229 return false;
230 }
214 } 231 }
232
215 return 233 return
216 // i1.created() == i2.created() && 234 // i1.created() == i2.created() &&
217 stringCompare( i1.description(), i2.description() ) && 235 stringCompare( i1.description(), i2.description() ) &&
218 stringCompare( i1.summary(), i2.summary() ) && 236 stringCompare( i1.summary(), i2.summary() ) &&
219 i1.categories() == i2.categories() && 237 i1.categories() == i2.categories() &&
220 // no need to compare mRelatedTo 238 // no need to compare mRelatedTo
221 stringCompare( i1.relatedToUid(), i2.relatedToUid() ) && 239 stringCompare( i1.relatedToUid(), i2.relatedToUid() ) &&
222 // i1.relations() == i2.relations() && 240 // i1.relations() == i2.relations() &&
223 i1.exDates() == i2.exDates() && 241 i1.exDates() == i2.exDates() &&
224 i1.attachments() == i2.attachments() && 242 i1.attachments() == i2.attachments() &&
225 i1.resources() == i2.resources() && 243 i1.resources() == i2.resources() &&
226 i1.secrecy() == i2.secrecy() && 244 i1.secrecy() == i2.secrecy() &&
227 i1.priority() == i2.priority() && 245 i1.priority() == i2.priority() &&
228 i1.cancelled() == i2.cancelled() && 246 i1.cancelled() == i2.cancelled() &&
229 stringCompare( i1.location(), i2.location() ); 247 stringCompare( i1.location(), i2.location() );
230} 248}
231 249
232Incidence* Incidence::recreateCloneException( QDate d ) 250Incidence* Incidence::recreateCloneException( QDate d )
233{ 251{
234 Incidence* newInc = clone(); 252 Incidence* newInc = clone();
235 newInc->recreate(); 253 newInc->recreate();
236 if ( doesRecur() ) { 254 if ( doesRecur() ) {
237 addExDate( d ); 255 addExDate( d );
238 newInc->recurrence()->unsetRecurs(); 256 newInc->recurrence()->unsetRecurs();
239 if ( typeID() == eventID ) { 257 if ( typeID() == eventID ) {
240 int len = dtStart().secsTo( ((Event*)this)->dtEnd()); 258 int len = dtStart().secsTo( ((Event*)this)->dtEnd());
241 QTime tim = dtStart().time(); 259 QTime tim = dtStart().time();
242 newInc->setDtStart( QDateTime(d, tim) ); 260 newInc->setDtStart( QDateTime(d, tim) );
243 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) ); 261 ((Event*)newInc)->setDtEnd( newInc->dtStart().addSecs( len ) );
244 } else { 262 } else {
245 int len = dtStart().secsTo( ((Todo*)this)->dtDue()); 263 int len = dtStart().secsTo( ((Todo*)this)->dtDue());
246 QTime tim = ((Todo*)this)->dtDue().time(); 264 QTime tim = ((Todo*)this)->dtDue().time();
247 ((Todo*)newInc)->setDtDue( QDateTime(d, tim) ); 265 ((Todo*)newInc)->setDtDue( QDateTime(d, tim) );
248 ((Todo*)newInc)->setDtStart( ((Todo*)newInc)->dtDue().addSecs( -len ) ); 266 ((Todo*)newInc)->setDtStart( ((Todo*)newInc)->dtDue().addSecs( -len ) );
249 ((Todo*)this)->setRecurDates(); 267 ((Todo*)this)->setRecurDates();
250 } 268 }
251 newInc->setExDates( DateList () ); 269 newInc->setExDates( DateList () );
252 } 270 }
253 return newInc; 271 return newInc;
254} 272}
255 273
256void Incidence::recreate() 274void Incidence::recreate()
257{ 275{
258 setCreated(QDateTime::currentDateTime()); 276 setCreated(QDateTime::currentDateTime());
259 277
260 setUid(CalFormat::createUniqueId()); 278 setUid(CalFormat::createUniqueId());
261 279
262 setRevision(0); 280 setRevision(0);
263 setIDStr( ":" ); 281 setIDStr( ":" );
264 setLastModified(QDateTime::currentDateTime()); 282 setLastModified(QDateTime::currentDateTime());
265} 283}
266void Incidence::cloneRelations( Incidence * newInc ) 284void Incidence::cloneRelations( Incidence * newInc )
267{ 285{
268 // newInc is already a clone of this incidence 286 // newInc is already a clone of this incidence
269 Incidence * inc; 287 Incidence * inc;
270 Incidence * cloneInc; 288 Incidence * cloneInc;
271 QPtrList<Incidence> Relations = relations(); 289 QPtrList<Incidence> Relations = relations();
272 for (inc=Relations.first();inc;inc=Relations.next()) { 290 for (inc=Relations.first();inc;inc=Relations.next()) {
273 cloneInc = inc->clone(); 291 cloneInc = inc->clone();
274 cloneInc->recreate(); 292 cloneInc->recreate();
275 cloneInc->setRelatedTo( newInc ); 293 cloneInc->setRelatedTo( newInc );
276 inc->cloneRelations( cloneInc ); 294 inc->cloneRelations( cloneInc );
277 } 295 }
278} 296}
279void Incidence::setReadOnly( bool readOnly ) 297void Incidence::setReadOnly( bool readOnly )
280{ 298{
281 IncidenceBase::setReadOnly( readOnly ); 299 IncidenceBase::setReadOnly( readOnly );
282 recurrence()->setRecurReadOnly( readOnly); 300 if ( mRecurrence )
301 mRecurrence->setRecurReadOnly( readOnly);
283} 302}
284void Incidence::setLastModifiedSubInvalid() 303void Incidence::setLastModifiedSubInvalid()
285{ 304{
286 mLastModifiedSub = QDateTime(); 305 mLastModifiedSub = QDateTime();
287 if ( mRelatedTo ) 306 if ( mRelatedTo )
288 mRelatedTo->setLastModifiedSubInvalid(); 307 mRelatedTo->setLastModifiedSubInvalid();
289} 308}
290QDateTime Incidence::lastModifiedSub() 309QDateTime Incidence::lastModifiedSub()
291{ 310{
292 if ( !mRelations.count() ) 311 if ( !mRelations.count() )
293 return lastModified(); 312 return lastModified();
294 if ( mLastModifiedSub.isValid() ) 313 if ( mLastModifiedSub.isValid() )
295 return mLastModifiedSub; 314 return mLastModifiedSub;
296 mLastModifiedSub = lastModified(); 315 mLastModifiedSub = lastModified();
297 Incidence * inc; 316 Incidence * inc;
298 QPtrList<Incidence> Relations = relations(); 317 QPtrList<Incidence> Relations = relations();
299 for (inc=Relations.first();inc;inc=Relations.next()) { 318 for (inc=Relations.first();inc;inc=Relations.next()) {
300 if ( inc->lastModifiedSub() > mLastModifiedSub ) 319 if ( inc->lastModifiedSub() > mLastModifiedSub )
301 mLastModifiedSub = inc->lastModifiedSub(); 320 mLastModifiedSub = inc->lastModifiedSub();
302 } 321 }
303 return mLastModifiedSub; 322 return mLastModifiedSub;
304} 323}
305void Incidence::setCreated(QDateTime created) 324void Incidence::setCreated(QDateTime created)
306{ 325{
307 if (mReadOnly) return; 326 if (mReadOnly) return;
308 mCreated = getEvenTime(created); 327 mCreated = getEvenTime(created);
309} 328}
310 329
311QDateTime Incidence::created() const 330QDateTime Incidence::created() const
312{ 331{
313 return mCreated; 332 return mCreated;
314} 333}
315 334
316void Incidence::setRevision(int rev) 335void Incidence::setRevision(int rev)
317{ 336{
318 if (mReadOnly) return; 337 if (mReadOnly) return;
319 mRevision = rev; 338 mRevision = rev;
320 339
321 updated(); 340 updated();
322} 341}
323 342
324int Incidence::revision() const 343int Incidence::revision() const
325{ 344{
326 return mRevision; 345 return mRevision;
327} 346}
328 347
329void Incidence::setDtStart(const QDateTime &dtStart) 348void Incidence::setDtStart(const QDateTime &dtStart)
330{ 349{
331 350
332 QDateTime dt = getEvenTime(dtStart); 351 QDateTime dt = getEvenTime(dtStart);
333 recurrence()->setRecurStart( dt); 352
353 if ( mRecurrence )
354 mRecurrence->setRecurStart( dt);
334 IncidenceBase::setDtStart( dt ); 355 IncidenceBase::setDtStart( dt );
335} 356}
336 357
337void Incidence::setDescription(const QString &description) 358void Incidence::setDescription(const QString &description)
338{ 359{
339 if (mReadOnly) return; 360 if (mReadOnly) return;
340 mDescription = description; 361 mDescription = description;
341 updated(); 362 updated();
342} 363}
343 364
344QString Incidence::description() const 365QString Incidence::description() const
345{ 366{
346 return mDescription; 367 return mDescription;
347} 368}
348 369
349 370
350void Incidence::setSummary(const QString &summary) 371void Incidence::setSummary(const QString &summary)
351{ 372{
352 if (mReadOnly) return; 373 if (mReadOnly) return;
353 mSummary = summary; 374 mSummary = summary;
354 updated(); 375 updated();
355} 376}
356 377
357QString Incidence::summary() const 378QString Incidence::summary() const
358{ 379{
359 return mSummary; 380 return mSummary;
360} 381}
361void Incidence::checkCategories() 382void Incidence::checkCategories()
362{ 383{
363 mHoliday = mCategories.contains("Holiday") || mCategories.contains(i18n("Holiday")); 384 mHoliday = mCategories.contains("Holiday") || mCategories.contains(i18n("Holiday"));
364 mBirthday = mCategories.contains("Birthday") || mCategories.contains(i18n("Birthday")); 385 mBirthday = mCategories.contains("Birthday") || mCategories.contains(i18n("Birthday"));
365 mAnniversary = mCategories.contains("Anniversary") || mCategories.contains(i18n("Anniversary")); 386 mAnniversary = mCategories.contains("Anniversary") || mCategories.contains(i18n("Anniversary"));
366} 387}
367 388
368void Incidence::addCategories(const QStringList &categories, bool addToRelations ) //addToRelations = false 389void Incidence::addCategories(const QStringList &categories, bool addToRelations ) //addToRelations = false
369{ 390{
370 if (mReadOnly) return; 391 if (mReadOnly) return;
371 int i; 392 int i;
372 for( i = 0; i < categories.count(); ++i ) { 393 for( i = 0; i < categories.count(); ++i ) {
373 if ( !mCategories.contains (categories[i])) 394 if ( !mCategories.contains (categories[i]))
374 mCategories.append( categories[i] ); 395 mCategories.append( categories[i] );
375 } 396 }
376 checkCategories(); 397 checkCategories();
377 updated(); 398 updated();
378 if ( addToRelations ) { 399 if ( addToRelations ) {
379 Incidence * inc; 400 Incidence * inc;
380 QPtrList<Incidence> Relations = relations(); 401 QPtrList<Incidence> Relations = relations();
381 for (inc=Relations.first();inc;inc=Relations.next()) { 402 for (inc=Relations.first();inc;inc=Relations.next()) {
382 inc->addCategories( categories, true ); 403 inc->addCategories( categories, true );
383 } 404 }
384 } 405 }
385} 406}
386 407
387void Incidence::setCategories(const QStringList &categories, bool setForRelations ) //setForRelations = false 408void Incidence::setCategories(const QStringList &categories, bool setForRelations ) //setForRelations = false
388{ 409{
389 if (mReadOnly) return; 410 if (mReadOnly) return;
390 mCategories = categories; 411 mCategories = categories;
391 checkCategories(); 412 checkCategories();
392 updated(); 413 updated();
393 if ( setForRelations ) { 414 if ( setForRelations ) {
394 Incidence * inc; 415 Incidence * inc;
395 QPtrList<Incidence> Relations = relations(); 416 QPtrList<Incidence> Relations = relations();
396 for (inc=Relations.first();inc;inc=Relations.next()) { 417 for (inc=Relations.first();inc;inc=Relations.next()) {
397 inc->setCategories( categories, true ); 418 inc->setCategories( categories, true );
398 } 419 }
399 } 420 }
400} 421}
401 422
402// TODO: remove setCategories(QString) function 423// TODO: remove setCategories(QString) function
403void Incidence::setCategories(const QString &catStr) 424void Incidence::setCategories(const QString &catStr)
404{ 425{
405 if (mReadOnly) return; 426 if (mReadOnly) return;
406 mCategories.clear(); 427 mCategories.clear();
407 428
408 if (catStr.isEmpty()) return; 429 if (catStr.isEmpty()) return;
409 430
410 mCategories = QStringList::split(",",catStr); 431 mCategories = QStringList::split(",",catStr);
411 432
412 QStringList::Iterator it; 433 QStringList::Iterator it;
413 for(it = mCategories.begin();it != mCategories.end(); ++it) { 434 for(it = mCategories.begin();it != mCategories.end(); ++it) {
414 *it = (*it).stripWhiteSpace(); 435 *it = (*it).stripWhiteSpace();
415 } 436 }
416 checkCategories(); 437 checkCategories();
417 updated(); 438 updated();
418} 439}
419// using this makes filtering 3 times faster 440// using this makes filtering 3 times faster
420QStringList* Incidence::categoriesP() 441QStringList* Incidence::categoriesP()
421{ 442{
422 return &mCategories; 443 return &mCategories;
423} 444}
424 445
425QStringList Incidence::categories() const 446QStringList Incidence::categories() const
426{ 447{
427 return mCategories; 448 return mCategories;
428} 449}
429 450
430QString Incidence::categoriesStr() 451QString Incidence::categoriesStr()
431{ 452{
432 return mCategories.join(","); 453 return mCategories.join(",");
433} 454}
434QString Incidence::categoriesStrWithSpace() 455QString Incidence::categoriesStrWithSpace()
435{ 456{
436 return mCategories.join(", "); 457 return mCategories.join(", ");
437} 458}
438 459
439void Incidence::setRelatedToUid(const QString &relatedToUid) 460void Incidence::setRelatedToUid(const QString &relatedToUid)
440{ 461{
441 if (mReadOnly) return; 462 if (mReadOnly) return;
442 mRelatedToUid = relatedToUid; 463 mRelatedToUid = relatedToUid;
443} 464}
444 465
445QString Incidence::relatedToUid() const 466QString Incidence::relatedToUid() const
446{ 467{
447 return mRelatedToUid; 468 return mRelatedToUid;
448} 469}
449 470
450void Incidence::setRelatedTo(Incidence *relatedTo) 471void Incidence::setRelatedTo(Incidence *relatedTo)
451{ 472{
452 //qDebug("Incidence::setRelatedTo %d ", relatedTo); 473 //qDebug("Incidence::setRelatedTo %d ", relatedTo);
453 //qDebug("setRelatedTo(Incidence *relatedTo) %s %s", summary().latin1(), relatedTo->summary().latin1() ); 474 //qDebug("setRelatedTo(Incidence *relatedTo) %s %s", summary().latin1(), relatedTo->summary().latin1() );
454 if (mReadOnly || mRelatedTo == relatedTo) return; 475 if (mReadOnly || mRelatedTo == relatedTo) return;
455 if(mRelatedTo) { 476 if(mRelatedTo) {
456 // updated(); 477 // updated();
457 mRelatedTo->removeRelation(this); 478 mRelatedTo->removeRelation(this);
458 } 479 }
459 mRelatedTo = relatedTo; 480 mRelatedTo = relatedTo;
460 if (mRelatedTo) { 481 if (mRelatedTo) {
461 mRelatedTo->addRelation(this); 482 mRelatedTo->addRelation(this);
462 mRelatedToUid = mRelatedTo->uid(); 483 mRelatedToUid = mRelatedTo->uid();
463 } else { 484 } else {
464 mRelatedToUid = ""; 485 mRelatedToUid = "";
465 } 486 }
466} 487}
467 488
468Incidence *Incidence::relatedTo() const 489Incidence *Incidence::relatedTo() const
469{ 490{
470 return mRelatedTo; 491 return mRelatedTo;
471} 492}
472 493
473QPtrList<Incidence> Incidence::relations() const 494QPtrList<Incidence> Incidence::relations() const
474{ 495{
475 return mRelations; 496 return mRelations;
476} 497}
477 498
478void Incidence::addRelationsToList(QPtrList<Incidence> *rel) 499void Incidence::addRelationsToList(QPtrList<Incidence> *rel)
479{ 500{
480 Incidence* inc; 501 Incidence* inc;
481 QPtrList<Incidence> Relations = relations(); 502 QPtrList<Incidence> Relations = relations();
482 for (inc=Relations.first();inc;inc=Relations.next()) { 503 for (inc=Relations.first();inc;inc=Relations.next()) {
483 inc->addRelationsToList( rel ); 504 inc->addRelationsToList( rel );
484 } 505 }
485 if ( rel->findRef( this ) == -1 ) 506 if ( rel->findRef( this ) == -1 )
486 rel->append( this ); 507 rel->append( this );
487} 508}
488 509
489void Incidence::addRelation(Incidence *event) 510void Incidence::addRelation(Incidence *event)
490{ 511{
491 setLastModifiedSubInvalid(); 512 setLastModifiedSubInvalid();
492 if( mRelations.findRef( event ) == -1 ) { 513 if( mRelations.findRef( event ) == -1 ) {
493 mRelations.append(event); 514 mRelations.append(event);
494 //updated(); 515 //updated();
495 } 516 }
496} 517}
497 518
498void Incidence::removeRelation(Incidence *event) 519void Incidence::removeRelation(Incidence *event)
499{ 520{
500 setLastModifiedSubInvalid(); 521 setLastModifiedSubInvalid();
501 mRelations.removeRef(event); 522 mRelations.removeRef(event);
502// if (event->getRelatedTo() == this) event->setRelatedTo(0); 523// if (event->getRelatedTo() == this) event->setRelatedTo(0);
503} 524}
504 525
505bool Incidence::recursOn(const QDate &qd) const 526bool Incidence::recursOn(const QDate &qd) const
506{ 527{
507 if (recurrence()->recursOnPure(qd) && !isException(qd)) return true; 528 if (mRecurrence && mRecurrence->recursOnPure(qd) && !isException(qd)) return true;
508 else return false; 529 else return false;
509} 530}
510 531
511void Incidence::setExDates(const DateList &exDates) 532void Incidence::setExDates(const DateList &exDates)
512{ 533{
513 if (mReadOnly) return; 534 if (mReadOnly) return;
514 mExDates = exDates; 535 mExDates = exDates;
515
516 recurrence()->setRecurExDatesCount(mExDates.count()); 536 recurrence()->setRecurExDatesCount(mExDates.count());
517 537
518 updated(); 538 updated();
519} 539}
520 540
521void Incidence::addExDate(const QDate &date) 541void Incidence::addExDate(const QDate &date)
522{ 542{
523 if (mReadOnly) return; 543 if (mReadOnly) return;
524 mExDates.append(date); 544 mExDates.append(date);
525 545
526 recurrence()->setRecurExDatesCount(mExDates.count()); 546 recurrence()->setRecurExDatesCount(mExDates.count());
527 547
528 updated(); 548 updated();
529} 549}
530 550
531DateList Incidence::exDates() const 551DateList Incidence::exDates() const
532{ 552{
533 return mExDates; 553 return mExDates;
534} 554}
535 555
536bool Incidence::isException(const QDate &date) const 556bool Incidence::isException(const QDate &date) const
537{ 557{
538 DateList::ConstIterator it; 558 DateList::ConstIterator it;
539 for( it = mExDates.begin(); it != mExDates.end(); ++it ) { 559 for( it = mExDates.begin(); it != mExDates.end(); ++it ) {
540 if ( (*it) == date ) { 560 if ( (*it) == date ) {
541 return true; 561 return true;
542 } 562 }
543 } 563 }
544 564
545 return false; 565 return false;
546} 566}
547 567
548void Incidence::addAttachment(Attachment *attachment) 568void Incidence::addAttachment(Attachment *attachment)
549{ 569{
550 if (mReadOnly || !attachment) return; 570 if (mReadOnly || !attachment) return;
551 mAttachments.append(attachment); 571 mAttachments.append(attachment);
552 updated(); 572 updated();
553} 573}
554 574
555void Incidence::deleteAttachment(Attachment *attachment) 575void Incidence::deleteAttachment(Attachment *attachment)
556{ 576{
557 mAttachments.removeRef(attachment); 577 mAttachments.removeRef(attachment);
558} 578}
559 579
560void Incidence::deleteAttachments(const QString& mime) 580void Incidence::deleteAttachments(const QString& mime)
561{ 581{
562 Attachment *at = mAttachments.first(); 582 Attachment *at = mAttachments.first();
563 while (at) { 583 while (at) {
564 if (at->mimeType() == mime) 584 if (at->mimeType() == mime)
565 mAttachments.remove(); 585 mAttachments.remove();
566 else 586 else
567 at = mAttachments.next(); 587 at = mAttachments.next();
568 } 588 }
569} 589}
570 590
571QPtrList<Attachment> Incidence::attachments() const 591QPtrList<Attachment> Incidence::attachments() const
572{ 592{
573 return mAttachments; 593 return mAttachments;
574} 594}
575 595
576QPtrList<Attachment> Incidence::attachments(const QString& mime) const 596QPtrList<Attachment> Incidence::attachments(const QString& mime) const
577{ 597{
578 QPtrList<Attachment> attachments; 598 QPtrList<Attachment> attachments;
579 QPtrListIterator<Attachment> it( mAttachments ); 599 QPtrListIterator<Attachment> it( mAttachments );
580 Attachment *at; 600 Attachment *at;
581 while ( (at = it.current()) ) { 601 while ( (at = it.current()) ) {
582 if (at->mimeType() == mime) 602 if (at->mimeType() == mime)
583 attachments.append(at); 603 attachments.append(at);
584 ++it; 604 ++it;
585 } 605 }
586 606
587 return attachments; 607 return attachments;
588} 608}
589 609
590void Incidence::setResources(const QStringList &resources) 610void Incidence::setResources(const QStringList &resources)
591{ 611{
592 if (mReadOnly) return; 612 if (mReadOnly) return;
593 mResources = resources; 613 mResources = resources;
594 updated(); 614 updated();
595} 615}
596 616
597QStringList Incidence::resources() const 617QStringList Incidence::resources() const
598{ 618{
599 return mResources; 619 return mResources;
600} 620}
601 621
602 622
603void Incidence::setPriority(int priority) 623void Incidence::setPriority(int priority)
604{ 624{
605 if (mReadOnly) return; 625 if (mReadOnly) return;
606 mPriority = priority; 626 mPriority = priority;
607 updated(); 627 updated();
608} 628}
609 629
610int Incidence::priority() const 630int Incidence::priority() const
611{ 631{
612 return mPriority; 632 return mPriority;
613} 633}
614 634
615void Incidence::setSecrecy(int sec) 635void Incidence::setSecrecy(int sec)
616{ 636{
617 if (mReadOnly) return; 637 if (mReadOnly) return;
618 mSecrecy = sec; 638 mSecrecy = sec;
619 updated(); 639 updated();
620} 640}
621 641
622int Incidence::secrecy() const 642int Incidence::secrecy() const
623{ 643{
624 return mSecrecy; 644 return mSecrecy;
625} 645}
626 646
627QString Incidence::secrecyStr() const 647QString Incidence::secrecyStr() const
628{ 648{
629 return secrecyName(mSecrecy); 649 return secrecyName(mSecrecy);
630} 650}
631 651
632QString Incidence::secrecyName(int secrecy) 652QString Incidence::secrecyName(int secrecy)
633{ 653{
634 switch (secrecy) { 654 switch (secrecy) {
635 case SecrecyPublic: 655 case SecrecyPublic:
636 return i18n("Public"); 656 return i18n("Public");
637 break; 657 break;
638 case SecrecyPrivate: 658 case SecrecyPrivate:
639 return i18n("Private"); 659 return i18n("Private");
640 break; 660 break;
641 case SecrecyConfidential: 661 case SecrecyConfidential:
642 return i18n("Confidential"); 662 return i18n("Confidential");
643 break; 663 break;
644 default: 664 default:
645 return i18n("Undefined"); 665 return i18n("Undefined");
646 break; 666 break;
647 } 667 }
648} 668}
649 669
650QStringList Incidence::secrecyList() 670QStringList Incidence::secrecyList()
651{ 671{
652 QStringList list; 672 QStringList list;
653 list << secrecyName(SecrecyPublic); 673 list << secrecyName(SecrecyPublic);
654 list << secrecyName(SecrecyPrivate); 674 list << secrecyName(SecrecyPrivate);
655 list << secrecyName(SecrecyConfidential); 675 list << secrecyName(SecrecyConfidential);
656 676
657 return list; 677 return list;
658} 678}
659 679
660 680
661QPtrList<Alarm> Incidence::alarms() const 681QPtrList<Alarm> Incidence::alarms() const
662{ 682{
663 return mAlarms; 683 return mAlarms;
664} 684}
665 685
666Alarm* Incidence::newAlarm() 686Alarm* Incidence::newAlarm()
667{ 687{
668 Alarm* alarm = new Alarm(this); 688 Alarm* alarm = new Alarm(this);
669 mAlarms.append(alarm); 689 mAlarms.append(alarm);
670// updated(); 690// updated();
671 return alarm; 691 return alarm;
672} 692}
673 693
674void Incidence::addAlarm(Alarm *alarm) 694void Incidence::addAlarm(Alarm *alarm)
675{ 695{
676 mAlarms.append(alarm); 696 mAlarms.append(alarm);
677 updated(); 697 updated();
678} 698}
679 699
680void Incidence::removeAlarm(Alarm *alarm) 700void Incidence::removeAlarm(Alarm *alarm)
681{ 701{
682 mAlarms.removeRef(alarm); 702 mAlarms.removeRef(alarm);
683 updated(); 703 updated();
684} 704}
685 705
686void Incidence::clearAlarms() 706void Incidence::clearAlarms()
687{ 707{
688 mAlarms.clear(); 708 mAlarms.clear();
689 updated(); 709 updated();
690} 710}
691 711
692bool Incidence::isAlarmEnabled() const 712bool Incidence::isAlarmEnabled() const
693{ 713{
694 Alarm* alarm; 714 Alarm* alarm;
695 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 715 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
696 if (alarm->enabled()) 716 if (alarm->enabled())
697 return true; 717 return true;
698 } 718 }
699 return false; 719 return false;
700} 720}
701 721#include <stdlib.h>
702Recurrence *Incidence::recurrence() const 722Recurrence *Incidence::recurrence()
703{ 723{
724 if ( ! mRecurrence ) {
725 mRecurrence = new Recurrence(this);
726 qDebug("creating new recurence ");
727 //abort();
728 }
704 return mRecurrence; 729 return mRecurrence;
705} 730}
706void Incidence::setRecurrence( Recurrence * r) 731void Incidence::setRecurrence( Recurrence * r)
707{ 732{
708 delete mRecurrence; 733 if ( mRecurrence )
709 mRecurrence = r; 734 delete mRecurrence;
735 mRecurrence = r;
710} 736}
711 737
712void Incidence::setLocation(const QString &location) 738void Incidence::setLocation(const QString &location)
713{ 739{
714 if (mReadOnly) return; 740 if (mReadOnly) return;
715 mLocation = location; 741 mLocation = location;
716 updated(); 742 updated();
717} 743}
718 744
719QString Incidence::location() const 745QString Incidence::location() const
720{ 746{
721 return mLocation; 747 return mLocation;
722} 748}
749QString Incidence::recurrenceText() const
750{
751 if ( mRecurrence ) return mRecurrence->recurrenceText();
752 return i18n("No");
753}
723 754
724ushort Incidence::doesRecur() const 755ushort Incidence::doesRecur() const
725{ 756{
726 if ( mRecurrence ) return mRecurrence->doesRecur(); 757 if ( mRecurrence ) return mRecurrence->doesRecur();
727 else return Recurrence::rNone; 758 else return Recurrence::rNone;
728} 759}
729 760
730QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const 761QDateTime Incidence::getNextOccurence( const QDateTime& dt, bool* ok ) const
731{ 762{
732 QDateTime incidenceStart = dt; 763 QDateTime incidenceStart = dt;
733 *ok = false; 764 *ok = false;
734 if ( doesRecur() ) { 765 if ( doesRecur() ) {
735 bool last; 766 bool last;
736 recurrence()->getPreviousDateTime( incidenceStart , &last ); 767 mRecurrence->getPreviousDateTime( incidenceStart , &last );
737 int count = 0; 768 int count = 0;
738 if ( !last ) { 769 if ( !last ) {
739 while ( !last ) { 770 while ( !last ) {
740 ++count; 771 ++count;
741 incidenceStart = recurrence()->getNextDateTime( incidenceStart, &last ); 772 incidenceStart = mRecurrence->getNextDateTime( incidenceStart, &last );
742 if ( recursOn( incidenceStart.date() ) ) { 773 if ( recursOn( incidenceStart.date() ) ) {
743 last = true; // exit while llop 774 last = true; // exit while llop
744 } else { 775 } else {
745 if ( last ) { // no alarm on last recurrence 776 if ( last ) { // no alarm on last recurrence
746 return QDateTime (); 777 return QDateTime ();
747 } 778 }
748 int year = incidenceStart.date().year(); 779 int year = incidenceStart.date().year();
749 // workaround for bug in recurrence 780 // workaround for bug in recurrence
750 if ( count == 100 || year < 1000 || year > 5000 ) { 781 if ( count == 100 || year < 1000 || year > 5000 ) {
751 return QDateTime (); 782 return QDateTime ();
752 } 783 }
753 incidenceStart = incidenceStart.addSecs( 1 ); 784 incidenceStart = incidenceStart.addSecs( 1 );
754 } 785 }
755 } 786 }
756 } else { 787 } else {
757 return QDateTime (); 788 return QDateTime ();
758 } 789 }
759 } else { 790 } else {
760 if ( hasStartDate () ) { 791 if ( hasStartDate () ) {
761 incidenceStart = dtStart(); 792 incidenceStart = dtStart();
762 } 793 }
763 if ( typeID() == todoID ) { 794 if ( typeID() == todoID ) {
764 if ( ((Todo*)this)->hasDueDate() ) 795 if ( ((Todo*)this)->hasDueDate() )
765 incidenceStart = ((Todo*)this)->dtDue(); 796 incidenceStart = ((Todo*)this)->dtDue();
766 } 797 }
767 } 798 }
768 if ( incidenceStart > dt ) 799 if ( incidenceStart > dt )
769 *ok = true; 800 *ok = true;
770 return incidenceStart; 801 return incidenceStart;
771} 802}
772QDateTime Incidence::dtStart() const 803QDateTime Incidence::dtStart() const
773{ 804{
774 if ( doesRecur() ) { 805 if ( doesRecur() ) {
775 if ( typeID() == todoID ) { 806 if ( typeID() == todoID ) {
776 ((Todo*)this)->checkSetCompletedFalse(); 807 ((Todo*)this)->checkSetCompletedFalse();
777 } 808 }
778 } 809 }
779 return mDtStart; 810 return mDtStart;
780} 811}
diff --git a/libkcal/incidence.h b/libkcal/incidence.h
index d4af9f0..8519f01 100644
--- a/libkcal/incidence.h
+++ b/libkcal/incidence.h
@@ -1,321 +1,322 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20#ifndef INCIDENCE_H 20#ifndef INCIDENCE_H
21#define INCIDENCE_H 21#define INCIDENCE_H
22// 22//
23// Incidence - base class of calendaring components 23// Incidence - base class of calendaring components
24// 24//
25 25
26#include <qdatetime.h> 26#include <qdatetime.h>
27#include <qstringlist.h> 27#include <qstringlist.h>
28#include <qvaluelist.h> 28#include <qvaluelist.h>
29 29
30#include "recurrence.h" 30#include "recurrence.h"
31#include "alarm.h" 31#include "alarm.h"
32#include "attachment.h" 32#include "attachment.h"
33#include "listbase.h" 33#include "listbase.h"
34#include "incidencebase.h" 34#include "incidencebase.h"
35 35
36namespace KCal { 36namespace KCal {
37 37
38class Event; 38class Event;
39class Todo; 39class Todo;
40class Journal; 40class Journal;
41 41
42/** 42/**
43 This class provides the base class common to all calendar components. 43 This class provides the base class common to all calendar components.
44*/ 44*/
45class Incidence : public IncidenceBase 45class Incidence : public IncidenceBase
46{ 46{
47 public: 47 public:
48 /** 48 /**
49 This class provides the interface for a visitor of calendar components. It 49 This class provides the interface for a visitor of calendar components. It
50 serves as base class for concrete visitors, which implement certain actions on 50 serves as base class for concrete visitors, which implement certain actions on
51 calendar components. It allows to add functions, which operate on the concrete 51 calendar components. It allows to add functions, which operate on the concrete
52 types of calendar components, without changing the calendar component classes. 52 types of calendar components, without changing the calendar component classes.
53 */ 53 */
54 class Visitor 54 class Visitor
55 { 55 {
56 public: 56 public:
57 /** Destruct Incidence::Visitor */ 57 /** Destruct Incidence::Visitor */
58 virtual ~Visitor() {} 58 virtual ~Visitor() {}
59 59
60 /** 60 /**
61 Reimplement this function in your concrete subclass of IncidenceVisitor to perform actions 61 Reimplement this function in your concrete subclass of IncidenceVisitor to perform actions
62 on an Event object. 62 on an Event object.
63 */ 63 */
64 virtual bool visit(Event *) { return false; } 64 virtual bool visit(Event *) { return false; }
65 /** 65 /**
66 Reimplement this function in your concrete subclass of IncidenceVisitor to perform actions 66 Reimplement this function in your concrete subclass of IncidenceVisitor to perform actions
67 on an Todo object. 67 on an Todo object.
68 */ 68 */
69 virtual bool visit(Todo *) { return false; } 69 virtual bool visit(Todo *) { return false; }
70 /** 70 /**
71 Reimplement this function in your concrete subclass of IncidenceVisitor to perform actions 71 Reimplement this function in your concrete subclass of IncidenceVisitor to perform actions
72 on an Journal object. 72 on an Journal object.
73 */ 73 */
74 virtual bool visit(Journal *) { return false; } 74 virtual bool visit(Journal *) { return false; }
75 75
76 protected: 76 protected:
77 /** Constructor is protected to prevent direct creation of visitor base class. */ 77 /** Constructor is protected to prevent direct creation of visitor base class. */
78 Visitor() {} 78 Visitor() {}
79 }; 79 };
80 80
81 /** 81 /**
82 This class implements a visitor for adding an Incidence to a resource 82 This class implements a visitor for adding an Incidence to a resource
83 supporting addEvent(), addTodo() and addJournal() calls. 83 supporting addEvent(), addTodo() and addJournal() calls.
84 */ 84 */
85 template<class T> 85 template<class T>
86 class AddVisitor : public Visitor 86 class AddVisitor : public Visitor
87 { 87 {
88 public: 88 public:
89 AddVisitor( T *r ) : mResource( r ) {} 89 AddVisitor( T *r ) : mResource( r ) {}
90 bool visit( Event *e ) { return mResource->addEvent( e ); } 90 bool visit( Event *e ) { return mResource->addEvent( e ); }
91 bool visit( Todo *t ) { return mResource->addTodo( t ); } 91 bool visit( Todo *t ) { return mResource->addTodo( t ); }
92 bool visit( Journal *j ) { return mResource->addJournal( j ); } 92 bool visit( Journal *j ) { return mResource->addJournal( j ); }
93 93
94 private: 94 private:
95 T *mResource; 95 T *mResource;
96 }; 96 };
97 97
98 /** enumeration for describing an event's secrecy. */ 98 /** enumeration for describing an event's secrecy. */
99 enum { SecrecyPublic = 0, SecrecyPrivate = 1, SecrecyConfidential = 2 }; 99 enum { SecrecyPublic = 0, SecrecyPrivate = 1, SecrecyConfidential = 2 };
100 typedef ListBase<Incidence> List; 100 typedef ListBase<Incidence> List;
101 Incidence(); 101 Incidence();
102 Incidence(const Incidence &); 102 Incidence(const Incidence &);
103 ~Incidence(); 103 ~Incidence();
104 104
105 /** 105 /**
106 Accept IncidenceVisitor. A class taking part in the visitor mechanism has to 106 Accept IncidenceVisitor. A class taking part in the visitor mechanism has to
107 provide this implementation: 107 provide this implementation:
108 <pre> 108 <pre>
109 bool accept(Visitor &v) { return v.visit(this); } 109 bool accept(Visitor &v) { return v.visit(this); }
110 </pre> 110 </pre>
111 */ 111 */
112 virtual bool accept(Visitor &) { return false; } 112 virtual bool accept(Visitor &) { return false; }
113 113
114 virtual Incidence *clone() = 0; 114 virtual Incidence *clone() = 0;
115 virtual void cloneRelations( Incidence * ); 115 virtual void cloneRelations( Incidence * );
116 void addRelationsToList(QPtrList<Incidence> *rel); 116 void addRelationsToList(QPtrList<Incidence> *rel);
117 virtual QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const = 0; 117 virtual QDateTime getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const = 0;
118 void setReadOnly( bool ); 118 void setReadOnly( bool );
119 119
120 /** 120 /**
121 Recreate event. The event is made a new unique event, but already stored 121 Recreate event. The event is made a new unique event, but already stored
122 event information is preserved. Sets uniquie id, creation date, last 122 event information is preserved. Sets uniquie id, creation date, last
123 modification date and revision number. 123 modification date and revision number.
124 */ 124 */
125 void recreate(); 125 void recreate();
126 Incidence* recreateCloneException(QDate); 126 Incidence* recreateCloneException(QDate);
127 127
128 /** set creation date */ 128 /** set creation date */
129 void setCreated(QDateTime); 129 void setCreated(QDateTime);
130 /** return time and date of creation. */ 130 /** return time and date of creation. */
131 QDateTime created() const; 131 QDateTime created() const;
132 132
133 /** set the number of revisions this event has seen */ 133 /** set the number of revisions this event has seen */
134 void setRevision(int rev); 134 void setRevision(int rev);
135 /** return the number of revisions this event has seen */ 135 /** return the number of revisions this event has seen */
136 int revision() const; 136 int revision() const;
137 137
138 /** Set starting date/time. */ 138 /** Set starting date/time. */
139 virtual void setDtStart(const QDateTime &dtStart); 139 virtual void setDtStart(const QDateTime &dtStart);
140 /** Return the incidence's ending date/time as a QDateTime. */ 140 /** Return the incidence's ending date/time as a QDateTime. */
141 virtual QDateTime dtEnd() const { return QDateTime(); } 141 virtual QDateTime dtEnd() const { return QDateTime(); }
142 142
143 /** sets the event's lengthy description. */ 143 /** sets the event's lengthy description. */
144 void setDescription(const QString &description); 144 void setDescription(const QString &description);
145 /** returns a reference to the event's description. */ 145 /** returns a reference to the event's description. */
146 QString description() const; 146 QString description() const;
147 147
148 /** sets the event's short summary. */ 148 /** sets the event's short summary. */
149 void setSummary(const QString &summary); 149 void setSummary(const QString &summary);
150 /** returns a reference to the event's summary. */ 150 /** returns a reference to the event's summary. */
151 QString summary() const; 151 QString summary() const;
152 152
153 /** set event's applicable categories */ 153 /** set event's applicable categories */
154 void setCategories(const QStringList &categories, bool setForRelations = false); 154 void setCategories(const QStringList &categories, bool setForRelations = false);
155 void addCategories(const QStringList &categories, bool addToRelations = false); 155 void addCategories(const QStringList &categories, bool addToRelations = false);
156 /** set event's categories based on a comma delimited string */ 156 /** set event's categories based on a comma delimited string */
157 void setCategories(const QString &catStr); 157 void setCategories(const QString &catStr);
158 /** return categories in a list */ 158 /** return categories in a list */
159 QStringList categories() const; 159 QStringList categories() const;
160 QStringList* categoriesP(); 160 QStringList* categoriesP();
161 /** return categories as a comma separated string */ 161 /** return categories as a comma separated string */
162 QString categoriesStr(); 162 QString categoriesStr();
163 QString categoriesStrWithSpace(); 163 QString categoriesStrWithSpace();
164 164
165 /** point at some other event to which the event relates. This function should 165 /** point at some other event to which the event relates. This function should
166 * only be used when constructing a calendar before the related Event 166 * only be used when constructing a calendar before the related Event
167 * exists. */ 167 * exists. */
168 void setRelatedToUid(const QString &); 168 void setRelatedToUid(const QString &);
169 /** what event does this one relate to? This function should 169 /** what event does this one relate to? This function should
170 * only be used when constructing a calendar before the related Event 170 * only be used when constructing a calendar before the related Event
171 * exists. */ 171 * exists. */
172 QString relatedToUid() const; 172 QString relatedToUid() const;
173 /** point at some other event to which the event relates */ 173 /** point at some other event to which the event relates */
174 void setRelatedTo(Incidence *relatedTo); 174 void setRelatedTo(Incidence *relatedTo);
175 /** what event does this one relate to? */ 175 /** what event does this one relate to? */
176 Incidence *relatedTo() const; 176 Incidence *relatedTo() const;
177 /** All events that are related to this event */ 177 /** All events that are related to this event */
178 QPtrList<Incidence> relations() const; 178 QPtrList<Incidence> relations() const;
179 /** Add an event which is related to this event */ 179 /** Add an event which is related to this event */
180 void addRelation(Incidence *); 180 void addRelation(Incidence *);
181 /** Remove event that is related to this event */ 181 /** Remove event that is related to this event */
182 void removeRelation(Incidence *); 182 void removeRelation(Incidence *);
183 183
184 /** returns the list of dates which are exceptions to the recurrence rule */ 184 /** returns the list of dates which are exceptions to the recurrence rule */
185 DateList exDates() const; 185 DateList exDates() const;
186 /** sets the list of dates which are exceptions to the recurrence rule */ 186 /** sets the list of dates which are exceptions to the recurrence rule */
187 void setExDates(const DateList &_exDates); 187 void setExDates(const DateList &_exDates);
188 void setExDates(const char *dates); 188 void setExDates(const char *dates);
189 /** Add a date to the list of exceptions of the recurrence rule. */ 189 /** Add a date to the list of exceptions of the recurrence rule. */
190 void addExDate(const QDate &date); 190 void addExDate(const QDate &date);
191 191
192 /** returns true if there is an exception for this date in the recurrence 192 /** returns true if there is an exception for this date in the recurrence
193 rule set, or false otherwise. */ 193 rule set, or false otherwise. */
194 bool isException(const QDate &qd) const; 194 bool isException(const QDate &qd) const;
195 195
196 /** add attachment to this event */ 196 /** add attachment to this event */
197 void addAttachment(Attachment *attachment); 197 void addAttachment(Attachment *attachment);
198 /** remove and delete a specific attachment */ 198 /** remove and delete a specific attachment */
199 void deleteAttachment(Attachment *attachment); 199 void deleteAttachment(Attachment *attachment);
200 /** remove and delete all attachments with this mime type */ 200 /** remove and delete all attachments with this mime type */
201 void deleteAttachments(const QString& mime); 201 void deleteAttachments(const QString& mime);
202 /** return list of all associated attachments */ 202 /** return list of all associated attachments */
203 QPtrList<Attachment> attachments() const; 203 QPtrList<Attachment> attachments() const;
204 /** find a list of attachments with this mime type */ 204 /** find a list of attachments with this mime type */
205 QPtrList<Attachment> attachments(const QString& mime) const; 205 QPtrList<Attachment> attachments(const QString& mime) const;
206 206
207 /** sets the event's status the value specified. See the enumeration 207 /** sets the event's status the value specified. See the enumeration
208 * above for possible values. */ 208 * above for possible values. */
209 void setSecrecy(int); 209 void setSecrecy(int);
210 /** return the event's secrecy. */ 210 /** return the event's secrecy. */
211 int secrecy() const; 211 int secrecy() const;
212 /** return the event's secrecy in string format. */ 212 /** return the event's secrecy in string format. */
213 QString secrecyStr() const; 213 QString secrecyStr() const;
214 /** return list of all availbale secrecy classes */ 214 /** return list of all availbale secrecy classes */
215 static QStringList secrecyList(); 215 static QStringList secrecyList();
216 /** return human-readable name of secrecy class */ 216 /** return human-readable name of secrecy class */
217 static QString secrecyName(int); 217 static QString secrecyName(int);
218 218
219 /** returns TRUE if the date specified is one on which the event will 219 /** returns TRUE if the date specified is one on which the event will
220 * recur. */ 220 * recur. */
221 bool recursOn(const QDate &qd) const; 221 bool recursOn(const QDate &qd) const;
222 222
223 // VEVENT and VTODO, but not VJOURNAL (move to EventBase class?): 223 // VEVENT and VTODO, but not VJOURNAL (move to EventBase class?):
224 224
225 /** set resources used, such as Office, Car, etc. */ 225 /** set resources used, such as Office, Car, etc. */
226 void setResources(const QStringList &resources); 226 void setResources(const QStringList &resources);
227 /** return list of current resources */ 227 /** return list of current resources */
228 QStringList resources() const; 228 QStringList resources() const;
229 229
230 /** set the event's priority, 0 is undefined, 1 highest (decreasing order) */ 230 /** set the event's priority, 0 is undefined, 1 highest (decreasing order) */
231 void setPriority(int priority); 231 void setPriority(int priority);
232 /** get the event's priority */ 232 /** get the event's priority */
233 int priority() const; 233 int priority() const;
234 234
235 /** All alarms that are associated with this incidence */ 235 /** All alarms that are associated with this incidence */
236 QPtrList<Alarm> alarms() const; 236 QPtrList<Alarm> alarms() const;
237 /** Create a new alarm which is associated with this incidence */ 237 /** Create a new alarm which is associated with this incidence */
238 Alarm* newAlarm(); 238 Alarm* newAlarm();
239 /** Add an alarm which is associated with this incidence */ 239 /** Add an alarm which is associated with this incidence */
240 void addAlarm(Alarm*); 240 void addAlarm(Alarm*);
241 /** Remove an alarm that is associated with this incidence */ 241 /** Remove an alarm that is associated with this incidence */
242 void removeAlarm(Alarm*); 242 void removeAlarm(Alarm*);
243 /** Remove all alarms that are associated with this incidence */ 243 /** Remove all alarms that are associated with this incidence */
244 void clearAlarms(); 244 void clearAlarms();
245 /** return whether any alarm associated with this incidence is enabled */ 245 /** return whether any alarm associated with this incidence is enabled */
246 bool isAlarmEnabled() const; 246 bool isAlarmEnabled() const;
247 247
248 /** 248 /**
249 Return the recurrence rule associated with this incidence. If there is 249 Return the recurrence rule associated with this incidence. If there is
250 none, returns an appropriate (non-0) object. 250 none, returns an appropriate (non-0) object.
251 */ 251 */
252 Recurrence *recurrence() const; 252 Recurrence *recurrence();
253 void setRecurrence(Recurrence * r); 253 void setRecurrence(Recurrence * r);
254 /** 254 /**
255 Forward to Recurrence::doesRecur(). 255 Forward to Recurrence::doesRecur().
256 */ 256 */
257 ushort doesRecur() const; 257 ushort doesRecur() const;
258 258
259 /** set the event's/todo's location. Do _not_ use it with journal */ 259 /** set the event's/todo's location. Do _not_ use it with journal */
260 void setLocation(const QString &location); 260 void setLocation(const QString &location);
261 /** return the event's/todo's location. Do _not_ use it with journal */ 261 /** return the event's/todo's location. Do _not_ use it with journal */
262 QString location() const; 262 QString location() const;
263 /** returns TRUE or FALSE depending on whether the todo has a start date */ 263 /** returns TRUE or FALSE depending on whether the todo has a start date */
264 bool hasStartDate() const; 264 bool hasStartDate() const;
265 /** sets the event's hasStartDate value. */ 265 /** sets the event's hasStartDate value. */
266 void setHasStartDate(bool f); 266 void setHasStartDate(bool f);
267 QDateTime getNextOccurence( const QDateTime& dt, bool* yes ) const; 267 QDateTime getNextOccurence( const QDateTime& dt, bool* yes ) const;
268 bool cancelled() const; 268 bool cancelled() const;
269 void setCancelled( bool b ); 269 void setCancelled( bool b );
270 270
271 bool hasRecurrenceID() const; 271 bool hasRecurrenceID() const;
272 void setHasRecurrenceID( bool b ); 272 void setHasRecurrenceID( bool b );
273 273
274 void setRecurrenceID(QDateTime); 274 void setRecurrenceID(QDateTime);
275 QDateTime recurrenceID () const; 275 QDateTime recurrenceID () const;
276 QDateTime dtStart() const; 276 QDateTime dtStart() const;
277 bool isHoliday() const; 277 bool isHoliday() const;
278 bool isBirthday() const; 278 bool isBirthday() const;
279 bool isAnniversary() const; 279 bool isAnniversary() const;
280 QDateTime lastModifiedSub(); 280 QDateTime lastModifiedSub();
281 QString recurrenceText() const;
281 void setLastModifiedSubInvalid(); 282 void setLastModifiedSubInvalid();
282 283
283 284
285 Recurrence *mRecurrence;
284protected: 286protected:
285 QPtrList<Alarm> mAlarms; 287 QPtrList<Alarm> mAlarms;
286 QPtrList<Incidence> mRelations; 288 QPtrList<Incidence> mRelations;
287 QDateTime mRecurrenceID; 289 QDateTime mRecurrenceID;
288 bool mHasRecurrenceID; 290 bool mHasRecurrenceID;
289 private: 291 private:
290 void checkCategories(); 292 void checkCategories();
291 bool mHoliday, mBirthday, mAnniversary; 293 bool mHoliday, mBirthday, mAnniversary;
292 int mRevision; 294 int mRevision;
293 bool mCancelled; 295 bool mCancelled;
294 296
295 // base components of jounal, event and todo 297 // base components of jounal, event and todo
296 QDateTime mCreated; 298 QDateTime mCreated;
297 QDateTime mLastModifiedSub; 299 QDateTime mLastModifiedSub;
298 QString mDescription; 300 QString mDescription;
299 QString mSummary; 301 QString mSummary;
300 QStringList mCategories; 302 QStringList mCategories;
301 Incidence *mRelatedTo; 303 Incidence *mRelatedTo;
302 QString mRelatedToUid; 304 QString mRelatedToUid;
303 DateList mExDates; 305 DateList mExDates;
304 QPtrList<Attachment> mAttachments; 306 QPtrList<Attachment> mAttachments;
305 QStringList mResources; 307 QStringList mResources;
306 bool mHasStartDate; // if todo has associated start date 308 bool mHasStartDate; // if todo has associated start date
307 309
308 int mSecrecy; 310 int mSecrecy;
309 int mPriority; // 1 = highest, 2 = less, etc. 311 int mPriority; // 1 = highest, 2 = less, etc.
310 312
311 //QPtrList<Alarm> mAlarms; 313 //QPtrList<Alarm> mAlarms;
312 Recurrence *mRecurrence;
313 314
314 QString mLocation; 315 QString mLocation;
315}; 316};
316 317
317bool operator==( const Incidence&, const Incidence& ); 318bool operator==( const Incidence&, const Incidence& );
318 319
319} 320}
320 321
321#endif 322#endif
diff --git a/libkcal/kincidenceformatter.cpp b/libkcal/kincidenceformatter.cpp
index 9359fad..f8f40f1 100644
--- a/libkcal/kincidenceformatter.cpp
+++ b/libkcal/kincidenceformatter.cpp
@@ -1,425 +1,425 @@
1#include "kincidenceformatter.h" 1#include "kincidenceformatter.h"
2#include <kstaticdeleter.h> 2#include <kstaticdeleter.h>
3#include <kglobal.h> 3#include <kglobal.h>
4#include <klocale.h> 4#include <klocale.h>
5#ifdef DEKTOP_VERSION 5#ifdef DEKTOP_VERSION
6#include <kabc/stdaddressbook.h> 6#include <kabc/stdaddressbook.h>
7#define size count 7#define size count
8#endif 8#endif
9 9
10KIncidenceFormatter* KIncidenceFormatter::mInstance = 0; 10KIncidenceFormatter* KIncidenceFormatter::mInstance = 0;
11static KStaticDeleter<KIncidenceFormatter> insd; 11static KStaticDeleter<KIncidenceFormatter> insd;
12 12
13QString KIncidenceFormatter::getFormattedText( Incidence * inc, bool details, bool created , bool modified ) 13QString KIncidenceFormatter::getFormattedText( Incidence * inc, bool details, bool created , bool modified )
14{ 14{
15// #ifndef QT_NO_INPUTDIALOG 15// #ifndef QT_NO_INPUTDIALOG
16// return QInputDialog::getItem( caption, label, items, current, editable ); 16// return QInputDialog::getItem( caption, label, items, current, editable );
17// #else 17// #else
18// return QString::null; 18// return QString::null;
19// #endif 19// #endif
20 mDetails = details; 20 mDetails = details;
21 mCreated = created ; 21 mCreated = created ;
22 mModified = modified; 22 mModified = modified;
23 mText = ""; 23 mText = "";
24 if ( inc->typeID() == eventID ) 24 if ( inc->typeID() == eventID )
25 setEvent((Event *) inc ); 25 setEvent((Event *) inc );
26 else if ( inc->typeID() == todoID ) 26 else if ( inc->typeID() == todoID )
27 setTodo((Todo *) inc ); 27 setTodo((Todo *) inc );
28 return mText; 28 return mText;
29} 29}
30 30
31KIncidenceFormatter* KIncidenceFormatter::instance() 31KIncidenceFormatter* KIncidenceFormatter::instance()
32{ 32{
33 if (!mInstance) { 33 if (!mInstance) {
34 mInstance = insd.setObject(new KIncidenceFormatter()); 34 mInstance = insd.setObject(new KIncidenceFormatter());
35 } 35 }
36 return mInstance; 36 return mInstance;
37} 37}
38KIncidenceFormatter::~KIncidenceFormatter() 38KIncidenceFormatter::~KIncidenceFormatter()
39{ 39{
40 if (mInstance == this) 40 if (mInstance == this)
41 mInstance = insd.setObject(0); 41 mInstance = insd.setObject(0);
42 //qDebug("KIncidenceFormatter::~KIncidenceFormatter "); 42 //qDebug("KIncidenceFormatter::~KIncidenceFormatter ");
43} 43}
44KIncidenceFormatter::KIncidenceFormatter() 44KIncidenceFormatter::KIncidenceFormatter()
45{ 45{
46 mColorMode = 0; 46 mColorMode = 0;
47} 47}
48void KIncidenceFormatter::setEvent(Event *event) 48void KIncidenceFormatter::setEvent(Event *event)
49{ 49{
50 int mode = 0; 50 int mode = 0;
51 mCurrentIncidence = event; 51 mCurrentIncidence = event;
52 bool shortDate = true; 52 bool shortDate = true;
53 if ( mode == 0 ) { 53 if ( mode == 0 ) {
54 addTag("h3",deTag(event->summary())); 54 addTag("h3",deTag(event->summary()));
55 formatReadOnly(event); 55 formatReadOnly(event);
56 } 56 }
57 else { 57 else {
58 if ( mColorMode == 1 ) { 58 if ( mColorMode == 1 ) {
59 mText +="<font color=\"#00A000\">"; 59 mText +="<font color=\"#00A000\">";
60 } 60 }
61 if ( mColorMode == 2 ) { 61 if ( mColorMode == 2 ) {
62 mText +="<font color=\"#C00000\">"; 62 mText +="<font color=\"#C00000\">";
63 } 63 }
64 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 64 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
65 if ( mode == 1 ) { 65 if ( mode == 1 ) {
66 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 66 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
67 } else { 67 } else {
68 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 68 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
69 } 69 }
70 formatReadOnly(event); 70 formatReadOnly(event);
71 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 71 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
72 if ( mColorMode ) 72 if ( mColorMode )
73 mText += "</font>"; 73 mText += "</font>";
74 } 74 }
75 if (event->cancelled ()) { 75 if (event->cancelled ()) {
76 mText +="<font color=\"#B00000\">"; 76 mText +="<font color=\"#B00000\">";
77 addTag("i",i18n("This event has been cancelled!")); 77 addTag("i",i18n("This event has been cancelled!"));
78 mText.append("<br>"); 78 mText.append("<br>");
79 mText += "</font>"; 79 mText += "</font>";
80 } 80 }
81 if (event->doesFloat()) { 81 if (event->doesFloat()) {
82 if (event->isMultiDay()) { 82 if (event->isMultiDay()) {
83 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 83 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
84 .arg(event->dtStartDateStr(shortDate)) 84 .arg(event->dtStartDateStr(shortDate))
85 .arg(event->dtEndDateStr(shortDate))); 85 .arg(event->dtEndDateStr(shortDate)));
86 } else { 86 } else {
87 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 87 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
88 } 88 }
89 } else { 89 } else {
90 if (event->isMultiDay()) { 90 if (event->isMultiDay()) {
91 mText.append(i18n("<p><b>From:</b> %1</p> ") 91 mText.append(i18n("<p><b>From:</b> %1</p> ")
92 .arg(event->dtStartStr( shortDate))); 92 .arg(event->dtStartStr( shortDate)));
93 mText.append(i18n("<p><b>To:</b> %1</p>") 93 mText.append(i18n("<p><b>To:</b> %1</p>")
94 .arg(event->dtEndStr(shortDate))); 94 .arg(event->dtEndStr(shortDate)));
95 } else { 95 } else {
96 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 96 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
97 .arg(event->dtStartTimeStr()) 97 .arg(event->dtStartTimeStr())
98 .arg(event->dtEndTimeStr())); 98 .arg(event->dtEndTimeStr()));
99 mText.append(i18n("<p><b>On:</b> %1</p> ") 99 mText.append(i18n("<p><b>On:</b> %1</p> ")
100 .arg(event->dtStartDateStr( shortDate ))); 100 .arg(event->dtStartDateStr( shortDate )));
101 } 101 }
102 } 102 }
103 if (!event->location().isEmpty()) { 103 if (!event->location().isEmpty()) {
104 addTag("b",i18n("Location: ")); 104 addTag("b",i18n("Location: "));
105 mText.append(deTag(event->location())+"<br>"); 105 mText.append(deTag(event->location())+"<br>");
106 } 106 }
107 107
108 if (event->recurrence()->doesRecur()) { 108 if (event->doesRecur()) {
109 109
110 QString recurText = event->recurrence()->recurrenceText(); 110 QString recurText = event->recurrence()->recurrenceText();
111 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 111 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
112 112
113 bool ok; 113 bool ok;
114 QDate start = QDate::currentDate(); 114 QDate start = QDate::currentDate();
115 QDateTime next; 115 QDateTime next;
116 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok ); 116 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
117 if ( ok ) { 117 if ( ok ) {
118 addTag("p",i18n("<b>Next recurrence is on:</b>") ); 118 addTag("p",i18n("<b>Next recurrence is on:</b>") );
119 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate )); 119 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
120 120
121 } else { 121 } else {
122 bool last; 122 bool last;
123 QDate nextd; 123 QDate nextd;
124 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last ); 124 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
125 if ( last ) { 125 if ( last ) {
126 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 126 addTag("p",i18n("<b>Last recurrence was on:</b>") );
127 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate )); 127 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
128 } 128 }
129 } 129 }
130 } 130 }
131 131
132 132
133 if (event->isAlarmEnabled()) { 133 if (event->isAlarmEnabled()) {
134 Alarm *alarm =event->alarms().first() ; 134 Alarm *alarm =event->alarms().first() ;
135 QDateTime t = alarm->time(); 135 QDateTime t = alarm->time();
136 QString s =i18n("( %1 before )").arg( alarm->offsetText() ); 136 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
137 addTag("p",i18n("<b>Alarm on: </b>") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate )); 137 addTag("p",i18n("<b>Alarm on: </b>") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate ));
138 //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 138 //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
139 //addTag("p",s); 139 //addTag("p",s);
140 } 140 }
141 141
142 142
143 143
144 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() ); 144 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() );
145 // mText.append(event->secrecyStr()+"<br>"); 145 // mText.append(event->secrecyStr()+"<br>");
146 formatCategories(event); 146 formatCategories(event);
147 147
148 formatAttendees(event); 148 formatAttendees(event);
149 149
150 if ( mCreated ) { 150 if ( mCreated ) {
151#ifdef DESKTOP_VERSION 151#ifdef DESKTOP_VERSION
152 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate )); 152 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate ));
153#else 153#else
154 addTag("p",i18n("<b>Created: ") +" </b>"); 154 addTag("p",i18n("<b>Created: ") +" </b>");
155 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 155 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
156#endif 156#endif
157 157
158 } 158 }
159 if ( mModified ) { 159 if ( mModified ) {
160#ifdef DESKTOP_VERSION 160#ifdef DESKTOP_VERSION
161 addTag("p",i18n("<b>Last modified: ") +" </b>"+KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 161 addTag("p",i18n("<b>Last modified: ") +" </b>"+KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
162#else 162#else
163 addTag("p",i18n("<b>Last modified: ") +" </b>"); 163 addTag("p",i18n("<b>Last modified: ") +" </b>");
164 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 164 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
165#endif 165#endif
166 166
167 } 167 }
168 if ( mDetails ) { 168 if ( mDetails ) {
169 if (!event->description().isEmpty()) { 169 if (!event->description().isEmpty()) {
170 addTag("p",i18n("<b>Details: </b>")); 170 addTag("p",i18n("<b>Details: </b>"));
171 addTag("p",deTag(event->description())); 171 addTag("p",deTag(event->description()));
172 } 172 }
173 } 173 }
174 174
175} 175}
176 176
177void KIncidenceFormatter::setTodo(Todo *event ) 177void KIncidenceFormatter::setTodo(Todo *event )
178{ 178{
179 int mode = 0; 179 int mode = 0;
180 mCurrentIncidence = event; 180 mCurrentIncidence = event;
181 bool shortDate = true; 181 bool shortDate = true;
182 if (mode == 0 ) { 182 if (mode == 0 ) {
183 addTag("h3",deTag(event->summary())); 183 addTag("h3",deTag(event->summary()));
184 formatReadOnly(event); 184 formatReadOnly(event);
185 } 185 }
186 else { 186 else {
187 if ( mColorMode == 1 ) { 187 if ( mColorMode == 1 ) {
188 mText +="<font color=\"#00A000\">"; 188 mText +="<font color=\"#00A000\">";
189 } 189 }
190 if ( mColorMode == 2 ) { 190 if ( mColorMode == 2 ) {
191 mText +="<font color=\"#B00000\">"; 191 mText +="<font color=\"#B00000\">";
192 } 192 }
193 if ( mode == 1 ) { 193 if ( mode == 1 ) {
194 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 194 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
195 } else { 195 } else {
196 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 196 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
197 } 197 }
198 formatReadOnly(event); 198 formatReadOnly(event);
199 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 199 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
200 if ( mColorMode ) 200 if ( mColorMode )
201 mText += "</font>"; 201 mText += "</font>";
202 } 202 }
203 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 203 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
204 mText +="<font color=\"#B00000\">"; 204 mText +="<font color=\"#B00000\">";
205 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(shortDate) ) ); 205 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(shortDate) ) );
206 mText += "</font>"; 206 mText += "</font>";
207 } else { 207 } else {
208 mText.append(i18n("<p><i>%1 % completed</i></p>") 208 mText.append(i18n("<p><i>%1 % completed</i></p>")
209 .arg(event->percentComplete())); 209 .arg(event->percentComplete()));
210 } 210 }
211 if (event->cancelled ()) { 211 if (event->cancelled ()) {
212 mText +="<font color=\"#B00000\">"; 212 mText +="<font color=\"#B00000\">";
213 addTag("i",i18n("This todo has been cancelled!")); 213 addTag("i",i18n("This todo has been cancelled!"));
214 mText.append("<br>"); 214 mText.append("<br>");
215 mText += "</font>"; 215 mText += "</font>";
216 } 216 }
217 217
218 218
219 if (event->recurrence()->doesRecur()) { 219 if (event->doesRecur()) {
220 220
221 QString recurText = event->recurrence()->recurrenceText(); 221 QString recurText = event->recurrence()->recurrenceText();
222 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>"); 222 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>");
223 } 223 }
224 224
225 if (event->hasStartDate()) { 225 if (event->hasStartDate()) {
226 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(shortDate))); 226 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(shortDate)));
227 } 227 }
228 228
229 229
230 if (event->hasDueDate()) { 230 if (event->hasDueDate()) {
231 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(shortDate))); 231 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(shortDate)));
232 } 232 }
233 233
234 if (!event->location().isEmpty()) { 234 if (!event->location().isEmpty()) {
235 addTag("b",i18n("Location: ")); 235 addTag("b",i18n("Location: "));
236 mText.append(deTag(event->location())+"<br>"); 236 mText.append(deTag(event->location())+"<br>");
237 } 237 }
238 238
239 mText.append(i18n("<p><b>Priority:</b> %2</p>") 239 mText.append(i18n("<p><b>Priority:</b> %2</p>")
240 .arg(QString::number(event->priority()))); 240 .arg(QString::number(event->priority())));
241 241
242 if (event->isAlarmEnabled()) { 242 if (event->isAlarmEnabled()) {
243 Alarm *alarm =event->alarms().first() ; 243 Alarm *alarm =event->alarms().first() ;
244 QDateTime t = alarm->time(); 244 QDateTime t = alarm->time();
245 QString s =i18n("( %1 before )").arg( alarm->offsetText() ); 245 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
246 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 246 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
247 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 247 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
248 //addTag("p",s); 248 //addTag("p",s);
249 } 249 }
250 250
251 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() ); 251 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() );
252 formatCategories(event); 252 formatCategories(event);
253 253
254 formatAttendees(event); 254 formatAttendees(event);
255 if ( mCreated ) { 255 if ( mCreated ) {
256#ifdef DESKTOP_VERSION 256#ifdef DESKTOP_VERSION
257 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate )); 257 addTag("p",i18n("<b>Created: ") +" </b>"+KGlobal::locale()->formatDateTime( event->created(), shortDate ));
258#else 258#else
259 addTag("p",i18n("<b>Created: ") +" </b>"); 259 addTag("p",i18n("<b>Created: ") +" </b>");
260 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 260 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
261#endif 261#endif
262 262
263 } 263 }
264 if ( mModified ) { 264 if ( mModified ) {
265#ifdef DESKTOP_VERSION 265#ifdef DESKTOP_VERSION
266 addTag("p",i18n("<b>Last modified: ") +" </b>"+KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 266 addTag("p",i18n("<b>Last modified: ") +" </b>"+KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
267#else 267#else
268 addTag("p",i18n("<b>Last modified: ") +" </b>"); 268 addTag("p",i18n("<b>Last modified: ") +" </b>");
269 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 269 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
270#endif 270#endif
271 271
272 } 272 }
273 if ( mDetails ) { 273 if ( mDetails ) {
274 if (!event->description().isEmpty()) { 274 if (!event->description().isEmpty()) {
275 addTag("p",i18n("<b>Details: </b>")); 275 addTag("p",i18n("<b>Details: </b>"));
276 addTag("p",deTag(event->description())); 276 addTag("p",deTag(event->description()));
277 } 277 }
278 } 278 }
279} 279}
280 280
281void KIncidenceFormatter::setJournal(Journal* ) 281void KIncidenceFormatter::setJournal(Journal* )
282{ 282{
283 283
284} 284}
285 285
286void KIncidenceFormatter::formatCategories(Incidence *event) 286void KIncidenceFormatter::formatCategories(Incidence *event)
287{ 287{
288 if (!event->categoriesStr().isEmpty()) { 288 if (!event->categoriesStr().isEmpty()) {
289 addTag("p",i18n("<b>Categories: </b>")+event->categoriesStrWithSpace() ); 289 addTag("p",i18n("<b>Categories: </b>")+event->categoriesStrWithSpace() );
290 //mText.append(event->categoriesStr()); 290 //mText.append(event->categoriesStr());
291 } 291 }
292} 292}
293void KIncidenceFormatter::addTag(const QString & tag,const QString & text) 293void KIncidenceFormatter::addTag(const QString & tag,const QString & text)
294{ 294{
295 int number=text.contains("\n"); 295 int number=text.contains("\n");
296 QString str = "<" + tag + ">"; 296 QString str = "<" + tag + ">";
297 QString tmpText=text; 297 QString tmpText=text;
298 QString tmpStr=str; 298 QString tmpStr=str;
299 if(number !=-1) 299 if(number !=-1)
300 { 300 {
301 if (number > 0) { 301 if (number > 0) {
302 int pos=0; 302 int pos=0;
303 QString tmp; 303 QString tmp;
304 for(int i=0;i<=number;i++) { 304 for(int i=0;i<=number;i++) {
305 pos=tmpText.find("\n"); 305 pos=tmpText.find("\n");
306 tmp=tmpText.left(pos); 306 tmp=tmpText.left(pos);
307 tmpText=tmpText.right(tmpText.length()-pos-1); 307 tmpText=tmpText.right(tmpText.length()-pos-1);
308 tmpStr+=tmp+"<br>"; 308 tmpStr+=tmp+"<br>";
309 } 309 }
310 } 310 }
311 else tmpStr += tmpText; 311 else tmpStr += tmpText;
312 tmpStr+="</" + tag + ">"; 312 tmpStr+="</" + tag + ">";
313 mText.append(tmpStr); 313 mText.append(tmpStr);
314 } 314 }
315 else 315 else
316 { 316 {
317 str += text + "</" + tag + ">"; 317 str += text + "</" + tag + ">";
318 mText.append(str); 318 mText.append(str);
319 } 319 }
320} 320}
321 321
322void KIncidenceFormatter::formatAttendees(Incidence *event) 322void KIncidenceFormatter::formatAttendees(Incidence *event)
323{ 323{
324 QPtrList<Attendee> attendees = event->attendees(); 324 QPtrList<Attendee> attendees = event->attendees();
325 if (attendees.count()) { 325 if (attendees.count()) {
326 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); 326 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small);
327 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small); 327 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small);
328 addTag("h3",i18n("Organizer")); 328 addTag("h3",i18n("Organizer"));
329 mText.append("<ul><li>"); 329 mText.append("<ul><li>");
330#if 0 330#if 0
331 //ndef KORG_NOKABC 331 //ndef KORG_NOKABC
332 332
333 KABC::AddressBook *add_book = KABC::StdAddressBook::self(); 333 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
334 KABC::Addressee::List addressList; 334 KABC::Addressee::List addressList;
335 addressList = add_book->findByEmail(event->organizer()); 335 addressList = add_book->findByEmail(event->organizer());
336 KABC::Addressee o = addressList.first(); 336 KABC::Addressee o = addressList.first();
337 if (!o.isEmpty() && addressList.size()<2) { 337 if (!o.isEmpty() && addressList.size()<2) {
338 mText += "<a href=\"uid:" + o.uid() + "\">"; 338 mText += "<a href=\"uid:" + o.uid() + "\">";
339 mText += o.formattedName(); 339 mText += o.formattedName();
340 mText += "</a>\n"; 340 mText += "</a>\n";
341 } else { 341 } else {
342 mText.append(event->organizer()); 342 mText.append(event->organizer());
343 } 343 }
344#else 344#else
345 mText.append(event->organizer()); 345 mText.append(event->organizer());
346#endif 346#endif
347 if (iconPath) { 347 if (iconPath) {
348 mText += " <a href=\"mailto:" + event->organizer() + "\">"; 348 mText += " <a href=\"mailto:" + event->organizer() + "\">";
349 mText += "<IMG src=\"" + iconPath + "\">"; 349 mText += "<IMG src=\"" + iconPath + "\">";
350 mText += "</a>\n"; 350 mText += "</a>\n";
351 } 351 }
352 mText.append("</li></ul>"); 352 mText.append("</li></ul>");
353 353
354 addTag("h3",i18n("Attendees")); 354 addTag("h3",i18n("Attendees"));
355 Attendee *a; 355 Attendee *a;
356 mText.append("<ul>"); 356 mText.append("<ul>");
357 for(a=attendees.first();a;a=attendees.next()) { 357 for(a=attendees.first();a;a=attendees.next()) {
358#if 0 358#if 0
359//ndef KORG_NOKABC 359//ndef KORG_NOKABC
360 if (a->name().isEmpty()) { 360 if (a->name().isEmpty()) {
361 addressList = add_book->findByEmail(a->email()); 361 addressList = add_book->findByEmail(a->email());
362 KABC::Addressee o = addressList.first(); 362 KABC::Addressee o = addressList.first();
363 if (!o.isEmpty() && addressList.size()<2) { 363 if (!o.isEmpty() && addressList.size()<2) {
364 mText += "<a href=\"uid:" + o.uid() + "\">"; 364 mText += "<a href=\"uid:" + o.uid() + "\">";
365 mText += o.formattedName(); 365 mText += o.formattedName();
366 mText += "</a>\n"; 366 mText += "</a>\n";
367 } else { 367 } else {
368 mText += "<li>"; 368 mText += "<li>";
369 mText.append(a->email()); 369 mText.append(a->email());
370 mText += "\n"; 370 mText += "\n";
371 } 371 }
372 } else { 372 } else {
373 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 373 mText += "<li><a href=\"uid:" + a->uid() + "\">";
374 if (!a->name().isEmpty()) mText += a->name(); 374 if (!a->name().isEmpty()) mText += a->name();
375 else mText += a->email(); 375 else mText += a->email();
376 mText += "</a>\n"; 376 mText += "</a>\n";
377 } 377 }
378#else 378#else
379 //qDebug("nokabc "); 379 //qDebug("nokabc ");
380 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 380 mText += "<li><a href=\"uid:" + a->uid() + "\">";
381 if (!a->name().isEmpty()) mText += a->name(); 381 if (!a->name().isEmpty()) mText += a->name();
382 else mText += a->email(); 382 else mText += a->email();
383 mText += "</a>\n"; 383 mText += "</a>\n";
384#endif 384#endif
385 385
386 if (!a->email().isEmpty()) { 386 if (!a->email().isEmpty()) {
387 if (iconPath) { 387 if (iconPath) {
388 mText += "<a href=\"mailto:" + a->name() +" "+ "<" + a->email() + ">" + "\">"; 388 mText += "<a href=\"mailto:" + a->name() +" "+ "<" + a->email() + ">" + "\">";
389 if ( a->RSVP() ) 389 if ( a->RSVP() )
390 mText += "<IMG src=\"" + iconPath + "\">"; 390 mText += "<IMG src=\"" + iconPath + "\">";
391 else 391 else
392 mText += "<IMG src=\"" + NOiconPath + "\">"; 392 mText += "<IMG src=\"" + NOiconPath + "\">";
393 mText += "</a>\n"; 393 mText += "</a>\n";
394 } 394 }
395 } 395 }
396 if (a->status() != Attendee::NeedsAction ) 396 if (a->status() != Attendee::NeedsAction )
397 mText +="[" + a->statusStr() + "] "; 397 mText +="[" + a->statusStr() + "] ";
398 if (a->role() == Attendee::Chair ) 398 if (a->role() == Attendee::Chair )
399 mText +="(" + a->roleStr().left(1) + ".)"; 399 mText +="(" + a->roleStr().left(1) + ".)";
400 } 400 }
401 mText.append("</li></ul>"); 401 mText.append("</li></ul>");
402 } 402 }
403} 403}
404 404
405void KIncidenceFormatter::formatReadOnly(Incidence *event) 405void KIncidenceFormatter::formatReadOnly(Incidence *event)
406{ 406{
407 if (event->isReadOnly()) { 407 if (event->isReadOnly()) {
408 addTag("p","<em>(" + i18n("read-only") + ")</em>"); 408 addTag("p","<em>(" + i18n("read-only") + ")</em>");
409 } 409 }
410} 410}
411QString KIncidenceFormatter::deTag(QString text) 411QString KIncidenceFormatter::deTag(QString text)
412{ 412{
413#if QT_VERSION >= 0x030000 413#if QT_VERSION >= 0x030000
414 text.replace( '<' , "&lt;" ); 414 text.replace( '<' , "&lt;" );
415 text.replace( '>' , "&gt;" ); 415 text.replace( '>' , "&gt;" );
416#else 416#else
417 if ( text.find ('<') >= 0 ) { 417 if ( text.find ('<') >= 0 ) {
418 text.replace( QRegExp("<") , "&lt;" ); 418 text.replace( QRegExp("<") , "&lt;" );
419 } 419 }
420 if ( text.find ('>') >= 0 ) { 420 if ( text.find ('>') >= 0 ) {
421 text.replace( QRegExp(">") , "&gt;" ); 421 text.replace( QRegExp(">") , "&gt;" );
422 } 422 }
423#endif 423#endif
424 return text; 424 return text;
425} 425}
diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp
index 8efc1ea..2e19740 100644
--- a/libkcal/vcalformat.cpp
+++ b/libkcal/vcalformat.cpp
@@ -1,1230 +1,1230 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brwon 3 Copyright (c) 1998 Preston Brwon
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <qapplication.h> 22#include <qapplication.h>
23#include <qdatetime.h> 23#include <qdatetime.h>
24#include <qstring.h> 24#include <qstring.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qclipboard.h> 27#include <qclipboard.h>
28#include <qdialog.h> 28#include <qdialog.h>
29#include <qfile.h> 29#include <qfile.h>
30 30
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kglobal.h> 32#include <kglobal.h>
33#include <kmessagebox.h> 33#include <kmessagebox.h>
34#include <kiconloader.h> 34#include <kiconloader.h>
35#include <klocale.h> 35#include <klocale.h>
36 36
37#include "vcc.h" 37#include "vcc.h"
38#include "vobject.h" 38#include "vobject.h"
39 39
40#include "vcaldrag.h" 40#include "vcaldrag.h"
41#include "calendar.h" 41#include "calendar.h"
42 42
43#include "vcalformat.h" 43#include "vcalformat.h"
44 44
45using namespace KCal; 45using namespace KCal;
46 46
47VCalFormat::VCalFormat() 47VCalFormat::VCalFormat()
48{ 48{
49 mCalendar = 0; 49 mCalendar = 0;
50 useLocalTime = false; 50 useLocalTime = false;
51} 51}
52 52
53VCalFormat::~VCalFormat() 53VCalFormat::~VCalFormat()
54{ 54{
55} 55}
56 56
57void VCalFormat::setLocalTime ( bool b ) 57void VCalFormat::setLocalTime ( bool b )
58{ 58{
59 useLocalTime = b; 59 useLocalTime = b;
60} 60}
61bool VCalFormat::load(Calendar *calendar, const QString &fileName) 61bool VCalFormat::load(Calendar *calendar, const QString &fileName)
62{ 62{
63 mCalendar = calendar; 63 mCalendar = calendar;
64 clearException(); 64 clearException();
65 if ( ! useLocalTime ) 65 if ( ! useLocalTime )
66 useLocalTime = mCalendar->isLocalTime(); 66 useLocalTime = mCalendar->isLocalTime();
67 VObject *vcal = 0; 67 VObject *vcal = 0;
68 68
69 // this is not necessarily only 1 vcal. Could be many vcals, or include 69 // this is not necessarily only 1 vcal. Could be many vcals, or include
70 // a vcard... 70 // a vcard...
71 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data())); 71 vcal = Parse_MIME_FromFileName(const_cast<char *>(QFile::encodeName(fileName).data()));
72 72
73 if (!vcal) { 73 if (!vcal) {
74 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown)); 74 setException(new ErrorFormat(ErrorFormat::CalVersionUnknown));
75 return FALSE; 75 return FALSE;
76 } 76 }
77 77
78 // any other top-level calendar stuff should be added/initialized here 78 // any other top-level calendar stuff should be added/initialized here
79 79
80 // put all vobjects into their proper places 80 // put all vobjects into their proper places
81 populate(vcal); 81 populate(vcal);
82 82
83 // clean up from vcal API stuff 83 // clean up from vcal API stuff
84 cleanVObjects(vcal); 84 cleanVObjects(vcal);
85 cleanStrTbl(); 85 cleanStrTbl();
86 86
87 return true; 87 return true;
88} 88}
89 89
90 90
91bool VCalFormat::save(Calendar *calendar, const QString &fileName) 91bool VCalFormat::save(Calendar *calendar, const QString &fileName)
92{ 92{
93 mCalendar = calendar; 93 mCalendar = calendar;
94 if ( ! useLocalTime ) 94 if ( ! useLocalTime )
95 useLocalTime = mCalendar->isLocalTime(); 95 useLocalTime = mCalendar->isLocalTime();
96 96
97 QString tmpStr; 97 QString tmpStr;
98 VObject *vcal, *vo; 98 VObject *vcal, *vo;
99 99
100 100
101 vcal = newVObject(VCCalProp); 101 vcal = newVObject(VCCalProp);
102 102
103 // addPropValue(vcal,VCLocationProp, "0.0"); 103 // addPropValue(vcal,VCLocationProp, "0.0");
104 addPropValue(vcal,VCProdIdProp, productId()); 104 addPropValue(vcal,VCProdIdProp, productId());
105 tmpStr = mCalendar->getTimeZoneStr(); 105 tmpStr = mCalendar->getTimeZoneStr();
106 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() ); 106 //qDebug("mCalendar->getTimeZoneStr() %s",tmpStr.latin1() );
107 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit()); 107 addPropValue(vcal,VCTimeZoneProp, tmpStr.local8Bit());
108 addPropValue(vcal,VCVersionProp, _VCAL_VERSION); 108 addPropValue(vcal,VCVersionProp, _VCAL_VERSION);
109 109
110 // TODO STUFF 110 // TODO STUFF
111 QPtrList<Todo> todoList = mCalendar->rawTodos(); 111 QPtrList<Todo> todoList = mCalendar->rawTodos();
112 QPtrListIterator<Todo> qlt(todoList); 112 QPtrListIterator<Todo> qlt(todoList);
113 for (; qlt.current(); ++qlt) { 113 for (; qlt.current(); ++qlt) {
114 vo = eventToVTodo(qlt.current()); 114 vo = eventToVTodo(qlt.current());
115 addVObjectProp(vcal, vo); 115 addVObjectProp(vcal, vo);
116 } 116 }
117 117
118 // EVENT STUFF 118 // EVENT STUFF
119 QPtrList<Event> events = mCalendar->rawEvents(); 119 QPtrList<Event> events = mCalendar->rawEvents();
120 Event *ev; 120 Event *ev;
121 for(ev=events.first();ev;ev=events.next()) { 121 for(ev=events.first();ev;ev=events.next()) {
122 vo = eventToVEvent(ev); 122 vo = eventToVEvent(ev);
123 addVObjectProp(vcal, vo); 123 addVObjectProp(vcal, vo);
124 } 124 }
125 125
126 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal); 126 writeVObjectToFile(QFile::encodeName(fileName).data() ,vcal);
127 cleanVObjects(vcal); 127 cleanVObjects(vcal);
128 cleanStrTbl(); 128 cleanStrTbl();
129 129
130 if (QFile::exists(fileName)) { 130 if (QFile::exists(fileName)) {
131 return true; 131 return true;
132 } else { 132 } else {
133 return false; // error 133 return false; // error
134 } 134 }
135} 135}
136 136
137bool VCalFormat::fromString( Calendar *calendar, const QString &text ) 137bool VCalFormat::fromString( Calendar *calendar, const QString &text )
138{ 138{
139 // TODO: Factor out VCalFormat::fromString() 139 // TODO: Factor out VCalFormat::fromString()
140 140
141 QCString data = text.utf8(); 141 QCString data = text.utf8();
142 142
143 if ( !data.size() ) return false; 143 if ( !data.size() ) return false;
144 144
145 VObject *vcal = Parse_MIME( data.data(), data.size()); 145 VObject *vcal = Parse_MIME( data.data(), data.size());
146 if ( !vcal ) return false; 146 if ( !vcal ) return false;
147 147
148 VObjectIterator i; 148 VObjectIterator i;
149 VObject *curvo; 149 VObject *curvo;
150 initPropIterator( &i, vcal ); 150 initPropIterator( &i, vcal );
151 151
152 // we only take the first object. TODO: parse all incidences. 152 // we only take the first object. TODO: parse all incidences.
153 do { 153 do {
154 curvo = nextVObject( &i ); 154 curvo = nextVObject( &i );
155 } while ( strcmp( vObjectName( curvo ), VCEventProp ) && 155 } while ( strcmp( vObjectName( curvo ), VCEventProp ) &&
156 strcmp( vObjectName( curvo ), VCTodoProp ) ); 156 strcmp( vObjectName( curvo ), VCTodoProp ) );
157 157
158 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) { 158 if ( strcmp( vObjectName( curvo ), VCEventProp ) == 0 ) {
159 Event *event = VEventToEvent( curvo ); 159 Event *event = VEventToEvent( curvo );
160 calendar->addEvent( event ); 160 calendar->addEvent( event );
161 } else { 161 } else {
162 qDebug("VCalFormat::fromString(): Unknown object type. "); 162 qDebug("VCalFormat::fromString(): Unknown object type. ");
163 deleteVObject( vcal ); 163 deleteVObject( vcal );
164 return false; 164 return false;
165 } 165 }
166 166
167 deleteVObject( vcal ); 167 deleteVObject( vcal );
168 168
169 return true; 169 return true;
170} 170}
171 171
172QString VCalFormat::eventToString( Event * event, Calendar *calendar, bool useLocal) 172QString VCalFormat::eventToString( Event * event, Calendar *calendar, bool useLocal)
173{ 173{
174 174
175 if ( !event ) return QString::null; 175 if ( !event ) return QString::null;
176 bool useL = useLocalTime; 176 bool useL = useLocalTime;
177 useLocalTime = useLocal; 177 useLocalTime = useLocal;
178 mCalendar = calendar; 178 mCalendar = calendar;
179 VObject *vevent = eventToVEvent( event ); 179 VObject *vevent = eventToVEvent( event );
180 char *buf = writeMemVObject( 0, 0, vevent ); 180 char *buf = writeMemVObject( 0, 0, vevent );
181 QString result( buf ); 181 QString result( buf );
182 cleanVObject( vevent ); 182 cleanVObject( vevent );
183 useLocalTime = useL; 183 useLocalTime = useL;
184 return result; 184 return result;
185} 185}
186QString VCalFormat::todoToString( Todo * todo, Calendar *calendar, bool useLocal ) 186QString VCalFormat::todoToString( Todo * todo, Calendar *calendar, bool useLocal )
187{ 187{
188 188
189 if ( !todo ) return QString::null; 189 if ( !todo ) return QString::null;
190 bool useL = useLocalTime; 190 bool useL = useLocalTime;
191 useLocalTime = useLocal; 191 useLocalTime = useLocal;
192 mCalendar = calendar; 192 mCalendar = calendar;
193 VObject *vevent = eventToVTodo( todo ); 193 VObject *vevent = eventToVTodo( todo );
194 char *buf = writeMemVObject( 0, 0, vevent ); 194 char *buf = writeMemVObject( 0, 0, vevent );
195 QString result( buf ); 195 QString result( buf );
196 cleanVObject( vevent ); 196 cleanVObject( vevent );
197 useLocalTime = useL; 197 useLocalTime = useL;
198 return result; 198 return result;
199} 199}
200 200
201QString VCalFormat::toString( Calendar *calendar ) 201QString VCalFormat::toString( Calendar *calendar )
202{ 202{
203 // TODO: Factor out VCalFormat::asString() 203 // TODO: Factor out VCalFormat::asString()
204 204
205 VObject *vcal = newVObject(VCCalProp); 205 VObject *vcal = newVObject(VCCalProp);
206 206
207 addPropValue( vcal, VCProdIdProp, CalFormat::productId() ); 207 addPropValue( vcal, VCProdIdProp, CalFormat::productId() );
208 QString tmpStr = mCalendar->getTimeZoneStr(); 208 QString tmpStr = mCalendar->getTimeZoneStr();
209 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() ); 209 addPropValue( vcal, VCTimeZoneProp, tmpStr.local8Bit() );
210 addPropValue( vcal, VCVersionProp, _VCAL_VERSION ); 210 addPropValue( vcal, VCVersionProp, _VCAL_VERSION );
211 211
212 // TODO: Use all data. 212 // TODO: Use all data.
213 QPtrList<Event> events = calendar->events(); 213 QPtrList<Event> events = calendar->events();
214 Event *event = events.first(); 214 Event *event = events.first();
215 if ( !event ) return QString::null; 215 if ( !event ) return QString::null;
216 216
217 VObject *vevent = eventToVEvent( event ); 217 VObject *vevent = eventToVEvent( event );
218 218
219 addVObjectProp( vcal, vevent ); 219 addVObjectProp( vcal, vevent );
220 220
221 char *buf = writeMemVObject( 0, 0, vcal ); 221 char *buf = writeMemVObject( 0, 0, vcal );
222 222
223 QString result( buf ); 223 QString result( buf );
224 224
225 cleanVObject( vcal ); 225 cleanVObject( vcal );
226 226
227 return result; 227 return result;
228} 228}
229 229
230VObject *VCalFormat::eventToVTodo(const Todo *anEvent) 230VObject *VCalFormat::eventToVTodo(const Todo *anEvent)
231{ 231{
232 VObject *vtodo; 232 VObject *vtodo;
233 QString tmpStr; 233 QString tmpStr;
234 234
235 235
236 vtodo = newVObject(VCTodoProp); 236 vtodo = newVObject(VCTodoProp);
237 237
238 // due date 238 // due date
239 if (anEvent->hasDueDate()) { 239 if (anEvent->hasDueDate()) {
240 tmpStr = qDateTimeToISO(anEvent->dtDue(), 240 tmpStr = qDateTimeToISO(anEvent->dtDue(),
241 !anEvent->doesFloat()); 241 !anEvent->doesFloat());
242 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit()); 242 addPropValue(vtodo, VCDueProp, tmpStr.local8Bit());
243 } 243 }
244 244
245 // start date 245 // start date
246 if (anEvent->hasStartDate()) { 246 if (anEvent->hasStartDate()) {
247 tmpStr = qDateTimeToISO(anEvent->dtStart(), 247 tmpStr = qDateTimeToISO(anEvent->dtStart(),
248 !anEvent->doesFloat()); 248 !anEvent->doesFloat());
249 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit()); 249 addPropValue(vtodo, VCDTstartProp, tmpStr.local8Bit());
250 } 250 }
251 251
252 // creation date 252 // creation date
253 tmpStr = qDateTimeToISO(anEvent->created()); 253 tmpStr = qDateTimeToISO(anEvent->created());
254 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit()); 254 addPropValue(vtodo, VCDCreatedProp, tmpStr.local8Bit());
255 255
256 // unique id 256 // unique id
257 addPropValue(vtodo, VCUniqueStringProp, 257 addPropValue(vtodo, VCUniqueStringProp,
258 anEvent->uid().local8Bit()); 258 anEvent->uid().local8Bit());
259 259
260 // revision 260 // revision
261 tmpStr.sprintf("%i", anEvent->revision()); 261 tmpStr.sprintf("%i", anEvent->revision());
262 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit()); 262 addPropValue(vtodo, VCSequenceProp, tmpStr.local8Bit());
263 263
264 // last modification date 264 // last modification date
265 tmpStr = qDateTimeToISO(anEvent->lastModified()); 265 tmpStr = qDateTimeToISO(anEvent->lastModified());
266 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit()); 266 addPropValue(vtodo, VCLastModifiedProp, tmpStr.local8Bit());
267 267
268 // organizer stuff 268 // organizer stuff
269 tmpStr = "MAILTO:" + anEvent->organizer(); 269 tmpStr = "MAILTO:" + anEvent->organizer();
270 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit()); 270 addPropValue(vtodo, ICOrganizerProp, tmpStr.local8Bit());
271 271
272 // attendees 272 // attendees
273 if (anEvent->attendeeCount() != 0) { 273 if (anEvent->attendeeCount() != 0) {
274 QPtrList<Attendee> al = anEvent->attendees(); 274 QPtrList<Attendee> al = anEvent->attendees();
275 QPtrListIterator<Attendee> ai(al); 275 QPtrListIterator<Attendee> ai(al);
276 Attendee *curAttendee; 276 Attendee *curAttendee;
277 277
278 for (; ai.current(); ++ai) { 278 for (; ai.current(); ++ai) {
279 curAttendee = ai.current(); 279 curAttendee = ai.current();
280 if (!curAttendee->email().isEmpty() && 280 if (!curAttendee->email().isEmpty() &&
281 !curAttendee->name().isEmpty()) 281 !curAttendee->name().isEmpty())
282 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 282 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
283 curAttendee->email() + ">"; 283 curAttendee->email() + ">";
284 else if (curAttendee->name().isEmpty()) 284 else if (curAttendee->name().isEmpty())
285 tmpStr = "MAILTO: " + curAttendee->email(); 285 tmpStr = "MAILTO: " + curAttendee->email();
286 else if (curAttendee->email().isEmpty()) 286 else if (curAttendee->email().isEmpty())
287 tmpStr = "MAILTO: " + curAttendee->name(); 287 tmpStr = "MAILTO: " + curAttendee->name();
288 else if (curAttendee->name().isEmpty() && 288 else if (curAttendee->name().isEmpty() &&
289 curAttendee->email().isEmpty()) 289 curAttendee->email().isEmpty())
290 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 290 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
291 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit()); 291 VObject *aProp = addPropValue(vtodo, VCAttendeeProp, tmpStr.local8Bit());
292 addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role())); 292 addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role()));
293 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); 293 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
294 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 294 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
295 } 295 }
296 } 296 }
297 297
298 // description BL: 298 // description BL:
299 if (!anEvent->description().isEmpty()) { 299 if (!anEvent->description().isEmpty()) {
300 VObject *d = addPropValue(vtodo, VCDescriptionProp, 300 VObject *d = addPropValue(vtodo, VCDescriptionProp,
301 anEvent->description().local8Bit()); 301 anEvent->description().local8Bit());
302 if (anEvent->description().find('\n') != -1) 302 if (anEvent->description().find('\n') != -1)
303 addProp(d, VCQuotedPrintableProp); 303 addProp(d, VCQuotedPrintableProp);
304 } 304 }
305 305
306 // summary 306 // summary
307 if (!anEvent->summary().isEmpty()) 307 if (!anEvent->summary().isEmpty())
308 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit()); 308 addPropValue(vtodo, VCSummaryProp, anEvent->summary().local8Bit());
309 309
310 if (!anEvent->location().isEmpty()) 310 if (!anEvent->location().isEmpty())
311 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit()); 311 addPropValue(vtodo, VCLocationProp, anEvent->location().local8Bit());
312 312
313 // completed 313 // completed
314 // status 314 // status
315 // backward compatibility, KOrganizer used to interpret only these two values 315 // backward compatibility, KOrganizer used to interpret only these two values
316 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" : 316 addPropValue(vtodo, VCStatusProp, anEvent->isCompleted() ? "COMPLETED" :
317 "NEEDS_ACTION"); 317 "NEEDS_ACTION");
318 // completion date 318 // completion date
319 if (anEvent->hasCompletedDate()) { 319 if (anEvent->hasCompletedDate()) {
320 tmpStr = qDateTimeToISO(anEvent->completed()); 320 tmpStr = qDateTimeToISO(anEvent->completed());
321 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit()); 321 addPropValue(vtodo, VCCompletedProp, tmpStr.local8Bit());
322 } 322 }
323 323
324 // priority 324 // priority
325 tmpStr.sprintf("%i",anEvent->priority()); 325 tmpStr.sprintf("%i",anEvent->priority());
326 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit()); 326 addPropValue(vtodo, VCPriorityProp, tmpStr.local8Bit());
327 327
328 // related event 328 // related event
329 if (anEvent->relatedToUid()) { 329 if (anEvent->relatedToUid()) {
330 addPropValue(vtodo, VCRelatedToProp, 330 addPropValue(vtodo, VCRelatedToProp,
331 anEvent->relatedToUid().local8Bit()); 331 anEvent->relatedToUid().local8Bit());
332 } 332 }
333 333
334 // categories 334 // categories
335 QStringList tmpStrList = anEvent->categories(); 335 QStringList tmpStrList = anEvent->categories();
336 tmpStr = ""; 336 tmpStr = "";
337 QString catStr; 337 QString catStr;
338 for ( QStringList::Iterator it = tmpStrList.begin(); 338 for ( QStringList::Iterator it = tmpStrList.begin();
339 it != tmpStrList.end(); 339 it != tmpStrList.end();
340 ++it ) { 340 ++it ) {
341 catStr = *it; 341 catStr = *it;
342 if (catStr[0] == ' ') 342 if (catStr[0] == ' ')
343 tmpStr += catStr.mid(1); 343 tmpStr += catStr.mid(1);
344 else 344 else
345 tmpStr += catStr; 345 tmpStr += catStr;
346 // this must be a ';' character as the vCalendar specification requires! 346 // this must be a ';' character as the vCalendar specification requires!
347 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 347 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
348 // read in. 348 // read in.
349 tmpStr += ";"; 349 tmpStr += ";";
350 } 350 }
351 if (!tmpStr.isEmpty()) { 351 if (!tmpStr.isEmpty()) {
352 tmpStr.truncate(tmpStr.length()-1); 352 tmpStr.truncate(tmpStr.length()-1);
353 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit()); 353 addPropValue(vtodo, VCCategoriesProp, tmpStr.local8Bit());
354 } 354 }
355 355
356 // alarm stuff 356 // alarm stuff
357 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl; 357 kdDebug(5800) << "vcalformat::eventToVTodo was called" << endl;
358 QPtrList<Alarm> alarms = anEvent->alarms(); 358 QPtrList<Alarm> alarms = anEvent->alarms();
359 Alarm* alarm; 359 Alarm* alarm;
360 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 360 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
361 if (alarm->enabled()) { 361 if (alarm->enabled()) {
362 VObject *a; 362 VObject *a;
363 tmpStr = qDateTimeToISO(alarm->time()); 363 tmpStr = qDateTimeToISO(alarm->time());
364 if (alarm->type() == Alarm::Audio) { 364 if (alarm->type() == Alarm::Audio) {
365 a = addProp(vtodo, VCAAlarmProp); 365 a = addProp(vtodo, VCAAlarmProp);
366 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 366 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
367 addPropValue(a, VCRepeatCountProp, "1"); 367 addPropValue(a, VCRepeatCountProp, "1");
368 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 368 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
369 } 369 }
370 else if (alarm->type() == Alarm::Procedure) { 370 else if (alarm->type() == Alarm::Procedure) {
371 a = addProp(vtodo, VCPAlarmProp); 371 a = addProp(vtodo, VCPAlarmProp);
372 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 372 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
373 addPropValue(a, VCRepeatCountProp, "1"); 373 addPropValue(a, VCRepeatCountProp, "1");
374 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 374 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
375 } else { 375 } else {
376 a = addProp(vtodo, VCDAlarmProp); 376 a = addProp(vtodo, VCDAlarmProp);
377 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 377 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
378 addPropValue(a, VCRepeatCountProp, "1"); 378 addPropValue(a, VCRepeatCountProp, "1");
379 addPropValue(a, VCDisplayStringProp, "beep!"); 379 addPropValue(a, VCDisplayStringProp, "beep!");
380 } 380 }
381 } 381 }
382 } 382 }
383 383
384 if (anEvent->pilotId()) { 384 if (anEvent->pilotId()) {
385 // pilot sync stuff 385 // pilot sync stuff
386 tmpStr.sprintf("%i",anEvent->pilotId()); 386 tmpStr.sprintf("%i",anEvent->pilotId());
387 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit()); 387 addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit());
388 tmpStr.sprintf("%i",anEvent->syncStatus()); 388 tmpStr.sprintf("%i",anEvent->syncStatus());
389 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit()); 389 addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit());
390 } 390 }
391 391
392 return vtodo; 392 return vtodo;
393} 393}
394 394
395VObject* VCalFormat::eventToVEvent(const Event *anEvent) 395VObject* VCalFormat::eventToVEvent(Event *anEvent)
396{ 396{
397 VObject *vevent; 397 VObject *vevent;
398 QString tmpStr; 398 QString tmpStr;
399 399
400 vevent = newVObject(VCEventProp); 400 vevent = newVObject(VCEventProp);
401 401
402 // start and end time 402 // start and end time
403 tmpStr = qDateTimeToISO(anEvent->dtStart(), 403 tmpStr = qDateTimeToISO(anEvent->dtStart(),
404 !anEvent->doesFloat()); 404 !anEvent->doesFloat());
405 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit()); 405 addPropValue(vevent, VCDTstartProp, tmpStr.local8Bit());
406 406
407 // events that have time associated but take up no time should 407 // events that have time associated but take up no time should
408 // not have both DTSTART and DTEND. 408 // not have both DTSTART and DTEND.
409 if (anEvent->dtStart() != anEvent->dtEnd()) { 409 if (anEvent->dtStart() != anEvent->dtEnd()) {
410 tmpStr = qDateTimeToISO(anEvent->dtEnd(), 410 tmpStr = qDateTimeToISO(anEvent->dtEnd(),
411 !anEvent->doesFloat()); 411 !anEvent->doesFloat());
412 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit()); 412 addPropValue(vevent, VCDTendProp, tmpStr.local8Bit());
413 } 413 }
414 414
415 // creation date 415 // creation date
416 tmpStr = qDateTimeToISO(anEvent->created()); 416 tmpStr = qDateTimeToISO(anEvent->created());
417 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit()); 417 addPropValue(vevent, VCDCreatedProp, tmpStr.local8Bit());
418 418
419 // unique id 419 // unique id
420 addPropValue(vevent, VCUniqueStringProp, 420 addPropValue(vevent, VCUniqueStringProp,
421 anEvent->uid().local8Bit()); 421 anEvent->uid().local8Bit());
422 422
423 // revision 423 // revision
424 tmpStr.sprintf("%i", anEvent->revision()); 424 tmpStr.sprintf("%i", anEvent->revision());
425 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit()); 425 addPropValue(vevent, VCSequenceProp, tmpStr.local8Bit());
426 426
427 // last modification date 427 // last modification date
428 tmpStr = qDateTimeToISO(anEvent->lastModified()); 428 tmpStr = qDateTimeToISO(anEvent->lastModified());
429 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit()); 429 addPropValue(vevent, VCLastModifiedProp, tmpStr.local8Bit());
430 430
431 // attendee and organizer stuff 431 // attendee and organizer stuff
432 tmpStr = "MAILTO:" + anEvent->organizer(); 432 tmpStr = "MAILTO:" + anEvent->organizer();
433 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit()); 433 addPropValue(vevent, ICOrganizerProp, tmpStr.local8Bit());
434 434
435 if (anEvent->attendeeCount() != 0) { 435 if (anEvent->attendeeCount() != 0) {
436 QPtrList<Attendee> al = anEvent->attendees(); 436 QPtrList<Attendee> al = anEvent->attendees();
437 QPtrListIterator<Attendee> ai(al); 437 QPtrListIterator<Attendee> ai(al);
438 Attendee *curAttendee; 438 Attendee *curAttendee;
439 439
440 // TODO: Put this functionality into Attendee class 440 // TODO: Put this functionality into Attendee class
441 for (; ai.current(); ++ai) { 441 for (; ai.current(); ++ai) {
442 curAttendee = ai.current(); 442 curAttendee = ai.current();
443 if (!curAttendee->email().isEmpty() && 443 if (!curAttendee->email().isEmpty() &&
444 !curAttendee->name().isEmpty()) 444 !curAttendee->name().isEmpty())
445 tmpStr = "MAILTO:" + curAttendee->name() + " <" + 445 tmpStr = "MAILTO:" + curAttendee->name() + " <" +
446 curAttendee->email() + ">"; 446 curAttendee->email() + ">";
447 else if (curAttendee->name().isEmpty()) 447 else if (curAttendee->name().isEmpty())
448 tmpStr = "MAILTO: " + curAttendee->email(); 448 tmpStr = "MAILTO: " + curAttendee->email();
449 else if (curAttendee->email().isEmpty()) 449 else if (curAttendee->email().isEmpty())
450 tmpStr = "MAILTO: " + curAttendee->name(); 450 tmpStr = "MAILTO: " + curAttendee->name();
451 else if (curAttendee->name().isEmpty() && 451 else if (curAttendee->name().isEmpty() &&
452 curAttendee->email().isEmpty()) 452 curAttendee->email().isEmpty())
453 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl; 453 kdDebug(5800) << "warning! this Event has an attendee w/o name or email!" << endl;
454 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit()); 454 VObject *aProp = addPropValue(vevent, VCAttendeeProp, tmpStr.local8Bit());
455 addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role())); 455 addPropValue(aProp, VCRoleProp, writeRole(curAttendee->role()));
456 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE"); 456 addPropValue(aProp, VCRSVPProp, curAttendee->RSVP() ? "TRUE" : "FALSE");
457 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status())); 457 addPropValue(aProp, VCStatusProp, writeStatus(curAttendee->status()));
458 } 458 }
459 } 459 }
460 460
461 // recurrence rule stuff 461 // recurrence rule stuff
462 if (anEvent->recurrence()->doesRecur()) { 462 if (anEvent->doesRecur()) {
463 // some more variables 463 // some more variables
464 QPtrList<Recurrence::rMonthPos> tmpPositions; 464 QPtrList<Recurrence::rMonthPos> tmpPositions;
465 QPtrList<int> tmpDays; 465 QPtrList<int> tmpDays;
466 int *tmpDay; 466 int *tmpDay;
467 Recurrence::rMonthPos *tmpPos; 467 Recurrence::rMonthPos *tmpPos;
468 QString tmpStr2; 468 QString tmpStr2;
469 int i; 469 int i;
470 470
471 switch(anEvent->recurrence()->doesRecur()) { 471 switch(anEvent->recurrence()->doesRecur()) {
472 case Recurrence::rDaily: 472 case Recurrence::rDaily:
473 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency()); 473 tmpStr.sprintf("D%i ",anEvent->recurrence()->frequency());
474// if (anEvent->rDuration > 0) 474// if (anEvent->rDuration > 0)
475 //tmpStr += "#"; 475 //tmpStr += "#";
476 break; 476 break;
477 case Recurrence::rWeekly: 477 case Recurrence::rWeekly:
478 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency()); 478 tmpStr.sprintf("W%i ",anEvent->recurrence()->frequency());
479 for (i = 0; i < 7; i++) { 479 for (i = 0; i < 7; i++) {
480 if (anEvent->recurrence()->days().testBit(i)) 480 if (anEvent->recurrence()->days().testBit(i))
481 tmpStr += dayFromNum(i); 481 tmpStr += dayFromNum(i);
482 } 482 }
483 break; 483 break;
484 case Recurrence::rMonthlyPos: 484 case Recurrence::rMonthlyPos:
485 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency()); 485 tmpStr.sprintf("MP%i ", anEvent->recurrence()->frequency());
486 // write out all rMonthPos's 486 // write out all rMonthPos's
487 tmpPositions = anEvent->recurrence()->monthPositions(); 487 tmpPositions = anEvent->recurrence()->monthPositions();
488 for (tmpPos = tmpPositions.first(); 488 for (tmpPos = tmpPositions.first();
489 tmpPos; 489 tmpPos;
490 tmpPos = tmpPositions.next()) { 490 tmpPos = tmpPositions.next()) {
491 491
492 tmpStr2.sprintf("%i", tmpPos->rPos); 492 tmpStr2.sprintf("%i", tmpPos->rPos);
493 if (tmpPos->negative) 493 if (tmpPos->negative)
494 tmpStr2 += "- "; 494 tmpStr2 += "- ";
495 else 495 else
496 tmpStr2 += "+ "; 496 tmpStr2 += "+ ";
497 tmpStr += tmpStr2; 497 tmpStr += tmpStr2;
498 for (i = 0; i < 7; i++) { 498 for (i = 0; i < 7; i++) {
499 if (tmpPos->rDays.testBit(i)) 499 if (tmpPos->rDays.testBit(i))
500 tmpStr += dayFromNum(i); 500 tmpStr += dayFromNum(i);
501 } 501 }
502 } // loop for all rMonthPos's 502 } // loop for all rMonthPos's
503 break; 503 break;
504 case Recurrence::rMonthlyDay: 504 case Recurrence::rMonthlyDay:
505 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency()); 505 tmpStr.sprintf("MD%i ", anEvent->recurrence()->frequency());
506 // write out all rMonthDays; 506 // write out all rMonthDays;
507 tmpDays = anEvent->recurrence()->monthDays(); 507 tmpDays = anEvent->recurrence()->monthDays();
508 for (tmpDay = tmpDays.first(); 508 for (tmpDay = tmpDays.first();
509 tmpDay; 509 tmpDay;
510 tmpDay = tmpDays.next()) { 510 tmpDay = tmpDays.next()) {
511 tmpStr2.sprintf("%i ", *tmpDay); 511 tmpStr2.sprintf("%i ", *tmpDay);
512 tmpStr += tmpStr2; 512 tmpStr += tmpStr2;
513 } 513 }
514 break; 514 break;
515 case Recurrence::rYearlyMonth: 515 case Recurrence::rYearlyMonth:
516 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency()); 516 tmpStr.sprintf("YM%i ", anEvent->recurrence()->frequency());
517 // write out all the rYearNums; 517 // write out all the rYearNums;
518 tmpDays = anEvent->recurrence()->yearNums(); 518 tmpDays = anEvent->recurrence()->yearNums();
519 for (tmpDay = tmpDays.first(); 519 for (tmpDay = tmpDays.first();
520 tmpDay; 520 tmpDay;
521 tmpDay = tmpDays.next()) { 521 tmpDay = tmpDays.next()) {
522 tmpStr2.sprintf("%i ", *tmpDay); 522 tmpStr2.sprintf("%i ", *tmpDay);
523 tmpStr += tmpStr2; 523 tmpStr += tmpStr2;
524 } 524 }
525 break; 525 break;
526 case Recurrence::rYearlyDay: 526 case Recurrence::rYearlyDay:
527 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency()); 527 tmpStr.sprintf("YD%i ", anEvent->recurrence()->frequency());
528 // write out all the rYearNums; 528 // write out all the rYearNums;
529 tmpDays = anEvent->recurrence()->yearNums(); 529 tmpDays = anEvent->recurrence()->yearNums();
530 for (tmpDay = tmpDays.first(); 530 for (tmpDay = tmpDays.first();
531 tmpDay; 531 tmpDay;
532 tmpDay = tmpDays.next()) { 532 tmpDay = tmpDays.next()) {
533 tmpStr2.sprintf("%i ", *tmpDay); 533 tmpStr2.sprintf("%i ", *tmpDay);
534 tmpStr += tmpStr2; 534 tmpStr += tmpStr2;
535 } 535 }
536 break; 536 break;
537 default: 537 default:
538 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl; 538 kdDebug(5800) << "ERROR, it should never get here in eventToVEvent!" << endl;
539 break; 539 break;
540 } // switch 540 } // switch
541 541
542 if (anEvent->recurrence()->duration() > 0) { 542 if (anEvent->recurrence()->duration() > 0) {
543 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration()); 543 tmpStr2.sprintf("#%i",anEvent->recurrence()->duration());
544 tmpStr += tmpStr2; 544 tmpStr += tmpStr2;
545 } else if (anEvent->recurrence()->duration() == -1) { 545 } else if (anEvent->recurrence()->duration() == -1) {
546 tmpStr += "#0"; // defined as repeat forever 546 tmpStr += "#0"; // defined as repeat forever
547 } else { 547 } else {
548 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE); 548 tmpStr += qDateTimeToISO(anEvent->recurrence()->endDate(), FALSE);
549 } 549 }
550 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit()); 550 addPropValue(vevent,VCRRuleProp, tmpStr.local8Bit());
551 551
552 } // event repeats 552 } // event repeats
553 553
554 // exceptions to recurrence 554 // exceptions to recurrence
555 DateList dateList = anEvent->exDates(); 555 DateList dateList = anEvent->exDates();
556 DateList::ConstIterator it; 556 DateList::ConstIterator it;
557 QString tmpStr2; 557 QString tmpStr2;
558 558
559 for (it = dateList.begin(); it != dateList.end(); ++it) { 559 for (it = dateList.begin(); it != dateList.end(); ++it) {
560 tmpStr = qDateToISO(*it) + ";"; 560 tmpStr = qDateToISO(*it) + ";";
561 tmpStr2 += tmpStr; 561 tmpStr2 += tmpStr;
562 } 562 }
563 if (!tmpStr2.isEmpty()) { 563 if (!tmpStr2.isEmpty()) {
564 tmpStr2.truncate(tmpStr2.length()-1); 564 tmpStr2.truncate(tmpStr2.length()-1);
565 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit()); 565 addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit());
566 } 566 }
567 567
568 // description 568 // description
569 if (!anEvent->description().isEmpty()) { 569 if (!anEvent->description().isEmpty()) {
570 VObject *d = addPropValue(vevent, VCDescriptionProp, 570 VObject *d = addPropValue(vevent, VCDescriptionProp,
571 anEvent->description().local8Bit()); 571 anEvent->description().local8Bit());
572 if (anEvent->description().find('\n') != -1) 572 if (anEvent->description().find('\n') != -1)
573 addProp(d, VCQuotedPrintableProp); 573 addProp(d, VCQuotedPrintableProp);
574 } 574 }
575 575
576 // summary 576 // summary
577 if (!anEvent->summary().isEmpty()) 577 if (!anEvent->summary().isEmpty())
578 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit()); 578 addPropValue(vevent, VCSummaryProp, anEvent->summary().local8Bit());
579 579
580 if (!anEvent->location().isEmpty()) 580 if (!anEvent->location().isEmpty())
581 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit()); 581 addPropValue(vevent, VCLocationProp, anEvent->location().local8Bit());
582 582
583 // status 583 // status
584// TODO: define Event status 584// TODO: define Event status
585// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit()); 585// addPropValue(vevent, VCStatusProp, anEvent->statusStr().local8Bit());
586 586
587 // secrecy 587 // secrecy
588 const char *text = 0; 588 const char *text = 0;
589 switch (anEvent->secrecy()) { 589 switch (anEvent->secrecy()) {
590 case Incidence::SecrecyPublic: 590 case Incidence::SecrecyPublic:
591 text = "PUBLIC"; 591 text = "PUBLIC";
592 break; 592 break;
593 case Incidence::SecrecyPrivate: 593 case Incidence::SecrecyPrivate:
594 text = "PRIVATE"; 594 text = "PRIVATE";
595 break; 595 break;
596 case Incidence::SecrecyConfidential: 596 case Incidence::SecrecyConfidential:
597 text = "CONFIDENTIAL"; 597 text = "CONFIDENTIAL";
598 break; 598 break;
599 } 599 }
600 if (text) { 600 if (text) {
601 addPropValue(vevent, VCClassProp, text); 601 addPropValue(vevent, VCClassProp, text);
602 } 602 }
603 603
604 // categories 604 // categories
605 QStringList tmpStrList = anEvent->categories(); 605 QStringList tmpStrList = anEvent->categories();
606 tmpStr = ""; 606 tmpStr = "";
607 QString catStr; 607 QString catStr;
608 for ( QStringList::Iterator it = tmpStrList.begin(); 608 for ( QStringList::Iterator it = tmpStrList.begin();
609 it != tmpStrList.end(); 609 it != tmpStrList.end();
610 ++it ) { 610 ++it ) {
611 catStr = *it; 611 catStr = *it;
612 if (catStr[0] == ' ') 612 if (catStr[0] == ' ')
613 tmpStr += catStr.mid(1); 613 tmpStr += catStr.mid(1);
614 else 614 else
615 tmpStr += catStr; 615 tmpStr += catStr;
616 // this must be a ';' character as the vCalendar specification requires! 616 // this must be a ';' character as the vCalendar specification requires!
617 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is 617 // vcc.y has been hacked to translate the ';' to a ',' when the vcal is
618 // read in. 618 // read in.
619 tmpStr += ";"; 619 tmpStr += ";";
620 } 620 }
621 if (!tmpStr.isEmpty()) { 621 if (!tmpStr.isEmpty()) {
622 tmpStr.truncate(tmpStr.length()-1); 622 tmpStr.truncate(tmpStr.length()-1);
623 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit()); 623 addPropValue(vevent, VCCategoriesProp, tmpStr.local8Bit());
624 } 624 }
625 625
626 // attachments 626 // attachments
627 // TODO: handle binary attachments! 627 // TODO: handle binary attachments!
628 QPtrList<Attachment> attachments = anEvent->attachments(); 628 QPtrList<Attachment> attachments = anEvent->attachments();
629 for ( Attachment *at = attachments.first(); at; at = attachments.next() ) 629 for ( Attachment *at = attachments.first(); at; at = attachments.next() )
630 addPropValue(vevent, VCAttachProp, at->uri().local8Bit()); 630 addPropValue(vevent, VCAttachProp, at->uri().local8Bit());
631 631
632 // resources 632 // resources
633 tmpStrList = anEvent->resources(); 633 tmpStrList = anEvent->resources();
634 tmpStr = tmpStrList.join(";"); 634 tmpStr = tmpStrList.join(";");
635 if (!tmpStr.isEmpty()) 635 if (!tmpStr.isEmpty())
636 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit()); 636 addPropValue(vevent, VCResourcesProp, tmpStr.local8Bit());
637 637
638 // alarm stuff 638 // alarm stuff
639 QPtrList<Alarm> alarms = anEvent->alarms(); 639 QPtrList<Alarm> alarms = anEvent->alarms();
640 Alarm* alarm; 640 Alarm* alarm;
641 for (alarm = alarms.first(); alarm; alarm = alarms.next()) { 641 for (alarm = alarms.first(); alarm; alarm = alarms.next()) {
642 if (alarm->enabled()) { 642 if (alarm->enabled()) {
643 VObject *a ; 643 VObject *a ;
644 tmpStr = qDateTimeToISO(alarm->time()); 644 tmpStr = qDateTimeToISO(alarm->time());
645 if (alarm->type() == Alarm::Audio) { 645 if (alarm->type() == Alarm::Audio) {
646 a = addProp(vevent, VCAAlarmProp); 646 a = addProp(vevent, VCAAlarmProp);
647 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 647 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
648 addPropValue(a, VCRepeatCountProp, "1"); 648 addPropValue(a, VCRepeatCountProp, "1");
649 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile())); 649 addPropValue(a, VCAudioContentProp, QFile::encodeName(alarm->audioFile()));
650 } 650 }
651 if (alarm->type() == Alarm::Procedure) { 651 if (alarm->type() == Alarm::Procedure) {
652 a = addProp(vevent, VCPAlarmProp); 652 a = addProp(vevent, VCPAlarmProp);
653 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 653 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
654 addPropValue(a, VCRepeatCountProp, "1"); 654 addPropValue(a, VCRepeatCountProp, "1");
655 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile())); 655 addPropValue(a, VCProcedureNameProp, QFile::encodeName(alarm->programFile()));
656 } else { 656 } else {
657 a = addProp(vevent, VCDAlarmProp); 657 a = addProp(vevent, VCDAlarmProp);
658 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit()); 658 addPropValue(a, VCRunTimeProp, tmpStr.local8Bit());
659 addPropValue(a, VCRepeatCountProp, "1"); 659 addPropValue(a, VCRepeatCountProp, "1");
660 addPropValue(a, VCDisplayStringProp, "beep!"); 660 addPropValue(a, VCDisplayStringProp, "beep!");
661 661
662 } 662 }
663 } 663 }
664 } 664 }
665 665
666 // priority 666 // priority
667 tmpStr.sprintf("%i",anEvent->priority()); 667 tmpStr.sprintf("%i",anEvent->priority());
668 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit()); 668 addPropValue(vevent, VCPriorityProp, tmpStr.local8Bit());
669 669
670 // transparency 670 // transparency
671 tmpStr.sprintf("%i",anEvent->transparency()); 671 tmpStr.sprintf("%i",anEvent->transparency());
672 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit()); 672 addPropValue(vevent, VCTranspProp, tmpStr.local8Bit());
673 673
674 // related event 674 // related event
675 if (anEvent->relatedToUid()) { 675 if (anEvent->relatedToUid()) {
676 addPropValue(vevent, VCRelatedToProp, 676 addPropValue(vevent, VCRelatedToProp,
677 anEvent->relatedToUid().local8Bit()); 677 anEvent->relatedToUid().local8Bit());
678 } 678 }
679 679
680 if (anEvent->pilotId()) { 680 if (anEvent->pilotId()) {
681 // pilot sync stuff 681 // pilot sync stuff
682 tmpStr.sprintf("%i",anEvent->pilotId()); 682 tmpStr.sprintf("%i",anEvent->pilotId());
683 addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit()); 683 addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit());
684 tmpStr.sprintf("%i",anEvent->syncStatus()); 684 tmpStr.sprintf("%i",anEvent->syncStatus());
685 addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit()); 685 addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit());
686 } 686 }
687 687
688 return vevent; 688 return vevent;
689} 689}
690 690
691Todo *VCalFormat::VTodoToEvent(VObject *vtodo) 691Todo *VCalFormat::VTodoToEvent(VObject *vtodo)
692{ 692{
693 VObject *vo; 693 VObject *vo;
694 VObjectIterator voi; 694 VObjectIterator voi;
695 char *s; 695 char *s;
696 696
697 Todo *anEvent = new Todo; 697 Todo *anEvent = new Todo;
698 698
699 // creation date 699 // creation date
700 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) { 700 if ((vo = isAPropertyOf(vtodo, VCDCreatedProp)) != 0) {
701 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 701 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
702 deleteStr(s); 702 deleteStr(s);
703 } 703 }
704 704
705 // unique id 705 // unique id
706 vo = isAPropertyOf(vtodo, VCUniqueStringProp); 706 vo = isAPropertyOf(vtodo, VCUniqueStringProp);
707 // while the UID property is preferred, it is not required. We'll use the 707 // while the UID property is preferred, it is not required. We'll use the
708 // default Event UID if none is given. 708 // default Event UID if none is given.
709 if (vo) { 709 if (vo) {
710 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); 710 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
711 deleteStr(s); 711 deleteStr(s);
712 } 712 }
713 713
714 // last modification date 714 // last modification date
715 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) { 715 if ((vo = isAPropertyOf(vtodo, VCLastModifiedProp)) != 0) {
716 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 716 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
717 deleteStr(s); 717 deleteStr(s);
718 } 718 }
719 else 719 else
720 anEvent->setLastModified(QDateTime(QDate::currentDate(), 720 anEvent->setLastModified(QDateTime(QDate::currentDate(),
721 QTime::currentTime())); 721 QTime::currentTime()));
722 722
723 // organizer 723 // organizer
724 // if our extension property for the event's ORGANIZER exists, add it. 724 // if our extension property for the event's ORGANIZER exists, add it.
725 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) { 725 if ((vo = isAPropertyOf(vtodo, ICOrganizerProp)) != 0) {
726 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); 726 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
727 deleteStr(s); 727 deleteStr(s);
728 } else { 728 } else {
729 anEvent->setOrganizer(mCalendar->getEmail()); 729 anEvent->setOrganizer(mCalendar->getEmail());
730 } 730 }
731 731
732 // attendees. 732 // attendees.
733 initPropIterator(&voi, vtodo); 733 initPropIterator(&voi, vtodo);
734 while (moreIteration(&voi)) { 734 while (moreIteration(&voi)) {
735 vo = nextVObject(&voi); 735 vo = nextVObject(&voi);
736 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { 736 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
737 Attendee *a; 737 Attendee *a;
738 VObject *vp; 738 VObject *vp;
739 s = fakeCString(vObjectUStringZValue(vo)); 739 s = fakeCString(vObjectUStringZValue(vo));
740 QString tmpStr = QString::fromLocal8Bit(s); 740 QString tmpStr = QString::fromLocal8Bit(s);
741 deleteStr(s); 741 deleteStr(s);
742 tmpStr = tmpStr.simplifyWhiteSpace(); 742 tmpStr = tmpStr.simplifyWhiteSpace();
743 int emailPos1, emailPos2; 743 int emailPos1, emailPos2;
744 if ((emailPos1 = tmpStr.find('<')) > 0) { 744 if ((emailPos1 = tmpStr.find('<')) > 0) {
745 // both email address and name 745 // both email address and name
746 emailPos2 = tmpStr.findRev('>'); 746 emailPos2 = tmpStr.findRev('>');
747 a = new Attendee(tmpStr.left(emailPos1 - 1), 747 a = new Attendee(tmpStr.left(emailPos1 - 1),
748 tmpStr.mid(emailPos1 + 1, 748 tmpStr.mid(emailPos1 + 1,
749 emailPos2 - (emailPos1 + 1))); 749 emailPos2 - (emailPos1 + 1)));
750 } else if (tmpStr.find('@') > 0) { 750 } else if (tmpStr.find('@') > 0) {
751 // just an email address 751 // just an email address
752 a = new Attendee(0, tmpStr); 752 a = new Attendee(0, tmpStr);
753 } else { 753 } else {
754 // just a name 754 // just a name
755 // QString email = tmpStr.replace( QRegExp(" "), "." ); 755 // QString email = tmpStr.replace( QRegExp(" "), "." );
756 a = new Attendee(tmpStr,0); 756 a = new Attendee(tmpStr,0);
757 } 757 }
758 // is there a Role property? 758 // is there a Role property?
759 if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0) 759 if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0)
760 a->setRole(readRole(vObjectStringZValue(vp))); 760 a->setRole(readRole(vObjectStringZValue(vp)));
761 // is there an RSVP property? 761 // is there an RSVP property?
762 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) 762 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
763 a->setRSVP(vObjectStringZValue(vp)); 763 a->setRSVP(vObjectStringZValue(vp));
764 // is there a status property? 764 // is there a status property?
765 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) 765 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
766 a->setStatus(readStatus(vObjectStringZValue(vp))); 766 a->setStatus(readStatus(vObjectStringZValue(vp)));
767 // add the attendee 767 // add the attendee
768 anEvent->addAttendee(a); 768 anEvent->addAttendee(a);
769 } 769 }
770 } 770 }
771 771
772 // description for todo 772 // description for todo
773 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) { 773 if ((vo = isAPropertyOf(vtodo, VCDescriptionProp)) != 0) {
774 s = fakeCString(vObjectUStringZValue(vo)); 774 s = fakeCString(vObjectUStringZValue(vo));
775 anEvent->setDescription(QString::fromLocal8Bit(s)); 775 anEvent->setDescription(QString::fromLocal8Bit(s));
776 deleteStr(s); 776 deleteStr(s);
777 } 777 }
778 778
779 // summary 779 // summary
780 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) { 780 if ((vo = isAPropertyOf(vtodo, VCSummaryProp))) {
781 s = fakeCString(vObjectUStringZValue(vo)); 781 s = fakeCString(vObjectUStringZValue(vo));
782 anEvent->setSummary(QString::fromLocal8Bit(s)); 782 anEvent->setSummary(QString::fromLocal8Bit(s));
783 deleteStr(s); 783 deleteStr(s);
784 } 784 }
785 if ((vo = isAPropertyOf(vtodo, VCLocationProp))) { 785 if ((vo = isAPropertyOf(vtodo, VCLocationProp))) {
786 s = fakeCString(vObjectUStringZValue(vo)); 786 s = fakeCString(vObjectUStringZValue(vo));
787 anEvent->setLocation(QString::fromLocal8Bit(s)); 787 anEvent->setLocation(QString::fromLocal8Bit(s));
788 deleteStr(s); 788 deleteStr(s);
789 } 789 }
790 790
791 791
792 // completed 792 // completed
793 // was: status 793 // was: status
794 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) { 794 if ((vo = isAPropertyOf(vtodo, VCStatusProp)) != 0) {
795 s = fakeCString(vObjectUStringZValue(vo)); 795 s = fakeCString(vObjectUStringZValue(vo));
796 if (strcmp(s,"COMPLETED") == 0) { 796 if (strcmp(s,"COMPLETED") == 0) {
797 anEvent->setCompleted(true); 797 anEvent->setCompleted(true);
798 } else { 798 } else {
799 anEvent->setCompleted(false); 799 anEvent->setCompleted(false);
800 } 800 }
801 deleteStr(s); 801 deleteStr(s);
802 } 802 }
803 else 803 else
804 anEvent->setCompleted(false); 804 anEvent->setCompleted(false);
805 805
806 // completion date 806 // completion date
807 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) { 807 if ((vo = isAPropertyOf(vtodo, VCCompletedProp)) != 0) {
808 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 808 anEvent->setCompleted(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
809 deleteStr(s); 809 deleteStr(s);
810 } 810 }
811 811
812 // priority 812 // priority
813 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) { 813 if ((vo = isAPropertyOf(vtodo, VCPriorityProp))) {
814 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 814 anEvent->setPriority(atoi(s = fakeCString(vObjectUStringZValue(vo))));
815 deleteStr(s); 815 deleteStr(s);
816 } 816 }
817 817
818 // due date 818 // due date
819 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) { 819 if ((vo = isAPropertyOf(vtodo, VCDueProp)) != 0) {
820 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 820 anEvent->setDtDue(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
821 deleteStr(s); 821 deleteStr(s);
822 anEvent->setHasDueDate(true); 822 anEvent->setHasDueDate(true);
823 } else { 823 } else {
824 anEvent->setHasDueDate(false); 824 anEvent->setHasDueDate(false);
825 } 825 }
826 826
827 // start time 827 // start time
828 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) { 828 if ((vo = isAPropertyOf(vtodo, VCDTstartProp)) != 0) {
829 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 829 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
830 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; 830 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
831 deleteStr(s); 831 deleteStr(s);
832 anEvent->setHasStartDate(true); 832 anEvent->setHasStartDate(true);
833 } else { 833 } else {
834 anEvent->setHasStartDate(false); 834 anEvent->setHasStartDate(false);
835 } 835 }
836 836
837 /* alarm stuff */ 837 /* alarm stuff */
838 //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl; 838 //kdDebug(5800) << "vcalformat::VTodoToEvent called" << endl;
839 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) { 839 if ((vo = isAPropertyOf(vtodo, VCDAlarmProp))) {
840 Alarm* alarm = anEvent->newAlarm(); 840 Alarm* alarm = anEvent->newAlarm();
841 VObject *a; 841 VObject *a;
842 if ((a = isAPropertyOf(vo, VCRunTimeProp))) { 842 if ((a = isAPropertyOf(vo, VCRunTimeProp))) {
843 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a)))); 843 alarm->setTime(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(a))));
844 deleteStr(s); 844 deleteStr(s);
845 } 845 }
846 alarm->setEnabled(true); 846 alarm->setEnabled(true);
847 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) { 847 if ((vo = isAPropertyOf(vtodo, VCPAlarmProp))) {
848 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) { 848 if ((a = isAPropertyOf(vo, VCProcedureNameProp))) {
849 s = fakeCString(vObjectUStringZValue(a)); 849 s = fakeCString(vObjectUStringZValue(a));
850 alarm->setProcedureAlarm(QFile::decodeName(s)); 850 alarm->setProcedureAlarm(QFile::decodeName(s));
851 deleteStr(s); 851 deleteStr(s);
852 } 852 }
853 } 853 }
854 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) { 854 if ((vo = isAPropertyOf(vtodo, VCAAlarmProp))) {
855 if ((a = isAPropertyOf(vo, VCAudioContentProp))) { 855 if ((a = isAPropertyOf(vo, VCAudioContentProp))) {
856 s = fakeCString(vObjectUStringZValue(a)); 856 s = fakeCString(vObjectUStringZValue(a));
857 alarm->setAudioAlarm(QFile::decodeName(s)); 857 alarm->setAudioAlarm(QFile::decodeName(s));
858 deleteStr(s); 858 deleteStr(s);
859 } 859 }
860 } 860 }
861 } 861 }
862 862
863 // related todo 863 // related todo
864 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) { 864 if ((vo = isAPropertyOf(vtodo, VCRelatedToProp)) != 0) {
865 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo))); 865 anEvent->setRelatedToUid(s = fakeCString(vObjectUStringZValue(vo)));
866 deleteStr(s); 866 deleteStr(s);
867 mTodosRelate.append(anEvent); 867 mTodosRelate.append(anEvent);
868 } 868 }
869 869
870 // categories 870 // categories
871 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) { 871 if ((vo = isAPropertyOf(vtodo, VCCategoriesProp)) != 0) {
872 s = fakeCString(vObjectUStringZValue(vo)); 872 s = fakeCString(vObjectUStringZValue(vo));
873 QString categories = QString::fromLocal8Bit(s); 873 QString categories = QString::fromLocal8Bit(s);
874 deleteStr(s); 874 deleteStr(s);
875 QStringList tmpStrList = QStringList::split( ';', categories ); 875 QStringList tmpStrList = QStringList::split( ';', categories );
876 anEvent->setCategories(tmpStrList); 876 anEvent->setCategories(tmpStrList);
877 } 877 }
878 878
879 /* PILOT SYNC STUFF */ 879 /* PILOT SYNC STUFF */
880 if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) { 880 if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) {
881 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 881 anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo))));
882 deleteStr(s); 882 deleteStr(s);
883 } 883 }
884 else 884 else
885 anEvent->setPilotId(0); 885 anEvent->setPilotId(0);
886 886
887 if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) { 887 if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) {
888 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 888 anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo))));
889 deleteStr(s); 889 deleteStr(s);
890 } 890 }
891 else 891 else
892 anEvent->setSyncStatus(Event::SYNCMOD); 892 anEvent->setSyncStatus(Event::SYNCMOD);
893 893
894 return anEvent; 894 return anEvent;
895} 895}
896 896
897Event* VCalFormat::VEventToEvent(VObject *vevent) 897Event* VCalFormat::VEventToEvent(VObject *vevent)
898{ 898{
899 VObject *vo; 899 VObject *vo;
900 VObjectIterator voi; 900 VObjectIterator voi;
901 char *s; 901 char *s;
902 902
903 Event *anEvent = new Event; 903 Event *anEvent = new Event;
904 904
905 // creation date 905 // creation date
906 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) { 906 if ((vo = isAPropertyOf(vevent, VCDCreatedProp)) != 0) {
907 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 907 anEvent->setCreated(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
908 deleteStr(s); 908 deleteStr(s);
909 } 909 }
910 910
911 // unique id 911 // unique id
912 vo = isAPropertyOf(vevent, VCUniqueStringProp); 912 vo = isAPropertyOf(vevent, VCUniqueStringProp);
913 // while the UID property is preferred, it is not required. We'll use the 913 // while the UID property is preferred, it is not required. We'll use the
914 // default Event UID if none is given. 914 // default Event UID if none is given.
915 if (vo) { 915 if (vo) {
916 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo))); 916 anEvent->setUid(s = fakeCString(vObjectUStringZValue(vo)));
917 deleteStr(s); 917 deleteStr(s);
918 } 918 }
919 919
920 // revision 920 // revision
921 // again NSCAL doesn't give us much to work with, so we improvise... 921 // again NSCAL doesn't give us much to work with, so we improvise...
922 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) { 922 if ((vo = isAPropertyOf(vevent, VCSequenceProp)) != 0) {
923 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo)))); 923 anEvent->setRevision(atoi(s = fakeCString(vObjectUStringZValue(vo))));
924 deleteStr(s); 924 deleteStr(s);
925 } 925 }
926 else 926 else
927 anEvent->setRevision(0); 927 anEvent->setRevision(0);
928 928
929 // last modification date 929 // last modification date
930 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) { 930 if ((vo = isAPropertyOf(vevent, VCLastModifiedProp)) != 0) {
931 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 931 anEvent->setLastModified(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
932 deleteStr(s); 932 deleteStr(s);
933 } 933 }
934 else 934 else
935 anEvent->setLastModified(QDateTime(QDate::currentDate(), 935 anEvent->setLastModified(QDateTime(QDate::currentDate(),
936 QTime::currentTime())); 936 QTime::currentTime()));
937 937
938 // organizer 938 // organizer
939 // if our extension property for the event's ORGANIZER exists, add it. 939 // if our extension property for the event's ORGANIZER exists, add it.
940 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) { 940 if ((vo = isAPropertyOf(vevent, ICOrganizerProp)) != 0) {
941 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo))); 941 anEvent->setOrganizer(s = fakeCString(vObjectUStringZValue(vo)));
942 deleteStr(s); 942 deleteStr(s);
943 } else { 943 } else {
944 anEvent->setOrganizer(mCalendar->getEmail()); 944 anEvent->setOrganizer(mCalendar->getEmail());
945 } 945 }
946 946
947 // deal with attendees. 947 // deal with attendees.
948 initPropIterator(&voi, vevent); 948 initPropIterator(&voi, vevent);
949 while (moreIteration(&voi)) { 949 while (moreIteration(&voi)) {
950 vo = nextVObject(&voi); 950 vo = nextVObject(&voi);
951 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) { 951 if (strcmp(vObjectName(vo), VCAttendeeProp) == 0) {
952 Attendee *a; 952 Attendee *a;
953 VObject *vp; 953 VObject *vp;
954 s = fakeCString(vObjectUStringZValue(vo)); 954 s = fakeCString(vObjectUStringZValue(vo));
955 QString tmpStr = QString::fromLocal8Bit(s); 955 QString tmpStr = QString::fromLocal8Bit(s);
956 deleteStr(s); 956 deleteStr(s);
957 tmpStr = tmpStr.simplifyWhiteSpace(); 957 tmpStr = tmpStr.simplifyWhiteSpace();
958 int emailPos1, emailPos2; 958 int emailPos1, emailPos2;
959 if ((emailPos1 = tmpStr.find('<')) > 0) { 959 if ((emailPos1 = tmpStr.find('<')) > 0) {
960 // both email address and name 960 // both email address and name
961 emailPos2 = tmpStr.findRev('>'); 961 emailPos2 = tmpStr.findRev('>');
962 a = new Attendee(tmpStr.left(emailPos1 - 1), 962 a = new Attendee(tmpStr.left(emailPos1 - 1),
963 tmpStr.mid(emailPos1 + 1, 963 tmpStr.mid(emailPos1 + 1,
964 emailPos2 - (emailPos1 + 1))); 964 emailPos2 - (emailPos1 + 1)));
965 } else if (tmpStr.find('@') > 0) { 965 } else if (tmpStr.find('@') > 0) {
966 // just an email address 966 // just an email address
967 a = new Attendee(0, tmpStr); 967 a = new Attendee(0, tmpStr);
968 } else { 968 } else {
969 // just a name 969 // just a name
970 //QString email = tmpStr.replace( QRegExp(" "), "." ); 970 //QString email = tmpStr.replace( QRegExp(" "), "." );
971 a = new Attendee(tmpStr,0); 971 a = new Attendee(tmpStr,0);
972 } 972 }
973 973
974 974
975 // is there a Role property? 975 // is there a Role property?
976 if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0) 976 if ((vp = isAPropertyOf(vo, VCRoleProp)) != 0)
977 a->setRole(readRole(vObjectStringZValue(vp))); 977 a->setRole(readRole(vObjectStringZValue(vp)));
978 978
979 // is there an RSVP property? 979 // is there an RSVP property?
980 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0) 980 if ((vp = isAPropertyOf(vo, VCRSVPProp)) != 0)
981 a->setRSVP(vObjectStringZValue(vp)); 981 a->setRSVP(vObjectStringZValue(vp));
982 // is there a status property? 982 // is there a status property?
983 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0) 983 if ((vp = isAPropertyOf(vo, VCStatusProp)) != 0)
984 a->setStatus(readStatus(vObjectStringZValue(vp))); 984 a->setStatus(readStatus(vObjectStringZValue(vp)));
985 // add the attendee 985 // add the attendee
986 anEvent->addAttendee(a); 986 anEvent->addAttendee(a);
987 } 987 }
988 } 988 }
989 989
990 // This isn't strictly true. An event that doesn't have a start time 990 // This isn't strictly true. An event that doesn't have a start time
991 // or an end time doesn't "float", it has an anchor in time but it doesn't 991 // or an end time doesn't "float", it has an anchor in time but it doesn't
992 // "take up" any time. 992 // "take up" any time.
993 /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) || 993 /*if ((isAPropertyOf(vevent, VCDTstartProp) == 0) ||
994 (isAPropertyOf(vevent, VCDTendProp) == 0)) { 994 (isAPropertyOf(vevent, VCDTendProp) == 0)) {
995 anEvent->setFloats(TRUE); 995 anEvent->setFloats(TRUE);
996 } else { 996 } else {
997 }*/ 997 }*/
998 998
999 anEvent->setFloats(FALSE); 999 anEvent->setFloats(FALSE);
1000 1000
1001 // start time 1001 // start time
1002 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) { 1002 if ((vo = isAPropertyOf(vevent, VCDTstartProp)) != 0) {
1003 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 1003 anEvent->setDtStart(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
1004 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl; 1004 // kdDebug(5800) << "s is " << // s << ", ISO is " << ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))).toString() << endl;
1005 deleteStr(s); 1005 deleteStr(s);
1006 if (anEvent->dtStart().time().isNull()) 1006 if (anEvent->dtStart().time().isNull())
1007 anEvent->setFloats(TRUE); 1007 anEvent->setFloats(TRUE);
1008 } 1008 }
1009 1009
1010 // stop time 1010 // stop time
1011 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) { 1011 if ((vo = isAPropertyOf(vevent, VCDTendProp)) != 0) {
1012 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo)))); 1012 anEvent->setDtEnd(ISOToQDateTime(s = fakeCString(vObjectUStringZValue(vo))));
1013 deleteStr(s); 1013 deleteStr(s);
1014 if (anEvent->dtEnd().time().isNull()) 1014 if (anEvent->dtEnd().time().isNull())
1015 anEvent->setFloats(TRUE); 1015 anEvent->setFloats(TRUE);
1016 } 1016 }
1017 1017
1018 // at this point, there should be at least a start or end time. 1018 // at this point, there should be at least a start or end time.
1019 // fix up for events that take up no time but have a time associated 1019 // fix up for events that take up no time but have a time associated
1020 if (!(vo = isAPropertyOf(vevent, VCDTstartProp))) 1020 if (!(vo = isAPropertyOf(vevent, VCDTstartProp)))
1021 anEvent->setDtStart(anEvent->dtEnd()); 1021 anEvent->setDtStart(anEvent->dtEnd());
1022 if (!(vo = isAPropertyOf(vevent, VCDTendProp))) 1022 if (!(vo = isAPropertyOf(vevent, VCDTendProp)))
1023 anEvent->setDtEnd(anEvent->dtStart()); 1023 anEvent->setDtEnd(anEvent->dtStart());
1024 1024
1025 /////////////////////////////////////////////////////////////////////////// 1025 ///////////////////////////////////////////////////////////////////////////
1026 1026
1027 // repeat stuff 1027 // repeat stuff
1028 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) { 1028 if ((vo = isAPropertyOf(vevent, VCRRuleProp)) != 0) {
1029 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo))); 1029 QString tmpStr = (s = fakeCString(vObjectUStringZValue(vo)));
1030 deleteStr(s); 1030 deleteStr(s);
1031 tmpStr.simplifyWhiteSpace(); 1031 tmpStr.simplifyWhiteSpace();
1032 tmpStr = tmpStr.upper(); 1032 tmpStr = tmpStr.upper();
1033 1033
1034 /********************************* DAILY ******************************/ 1034 /********************************* DAILY ******************************/
1035 if (tmpStr.left(1) == "D") { 1035 if (tmpStr.left(1) == "D") {
1036 int index = tmpStr.find(' '); 1036 int index = tmpStr.find(' ');
1037 int rFreq = tmpStr.mid(1, (index-1)).toInt(); 1037 int rFreq = tmpStr.mid(1, (index-1)).toInt();
1038 index = tmpStr.findRev(' ') + 1; // advance to last field 1038 index = tmpStr.findRev(' ') + 1; // advance to last field
1039 if (tmpStr.mid(index,1) == "#") index++; 1039 if (tmpStr.mid(index,1) == "#") index++;
1040 if (tmpStr.find('T', index) != -1) { 1040 if (tmpStr.find('T', index) != -1) {
1041 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1041 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1042 anEvent->recurrence()->setDaily(rFreq, rEndDate); 1042 anEvent->recurrence()->setDaily(rFreq, rEndDate);
1043 } else { 1043 } else {
1044 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1044 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1045 if (rDuration == 0) // VEvents set this to 0 forever, we use -1 1045 if (rDuration == 0) // VEvents set this to 0 forever, we use -1
1046 anEvent->recurrence()->setDaily(rFreq, -1); 1046 anEvent->recurrence()->setDaily(rFreq, -1);
1047 else 1047 else
1048 anEvent->recurrence()->setDaily(rFreq, rDuration); 1048 anEvent->recurrence()->setDaily(rFreq, rDuration);
1049 } 1049 }
1050 } 1050 }
1051 /********************************* WEEKLY ******************************/ 1051 /********************************* WEEKLY ******************************/
1052 else if (tmpStr.left(1) == "W") { 1052 else if (tmpStr.left(1) == "W") {
1053 int index = tmpStr.find(' '); 1053 int index = tmpStr.find(' ');
1054 int last = tmpStr.findRev(' ') + 1; 1054 int last = tmpStr.findRev(' ') + 1;
1055 int rFreq = tmpStr.mid(1, (index-1)).toInt(); 1055 int rFreq = tmpStr.mid(1, (index-1)).toInt();
1056 index += 1; // advance to beginning of stuff after freq 1056 index += 1; // advance to beginning of stuff after freq
1057 QBitArray qba(7); 1057 QBitArray qba(7);
1058 QString dayStr; 1058 QString dayStr;
1059 if( index == last ) { 1059 if( index == last ) {
1060 // e.g. W1 #0 1060 // e.g. W1 #0
1061 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1); 1061 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
1062 } 1062 }
1063 else { 1063 else {
1064 // e.g. W1 SU #0 1064 // e.g. W1 SU #0
1065 while (index < last) { 1065 while (index < last) {
1066 dayStr = tmpStr.mid(index, 3); 1066 dayStr = tmpStr.mid(index, 3);
1067 int dayNum = numFromDay(dayStr); 1067 int dayNum = numFromDay(dayStr);
1068 qba.setBit(dayNum); 1068 qba.setBit(dayNum);
1069 index += 3; // advance to next day, or possibly "#" 1069 index += 3; // advance to next day, or possibly "#"
1070 } 1070 }
1071 } 1071 }
1072 index = last; if (tmpStr.mid(index,1) == "#") index++; 1072 index = last; if (tmpStr.mid(index,1) == "#") index++;
1073 if (tmpStr.find('T', index) != -1) { 1073 if (tmpStr.find('T', index) != -1) {
1074 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1074 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1075 anEvent->recurrence()->setWeekly(rFreq, qba, rEndDate); 1075 anEvent->recurrence()->setWeekly(rFreq, qba, rEndDate);
1076 } else { 1076 } else {
1077 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1077 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1078 if (rDuration == 0) 1078 if (rDuration == 0)
1079 anEvent->recurrence()->setWeekly(rFreq, qba, -1); 1079 anEvent->recurrence()->setWeekly(rFreq, qba, -1);
1080 else 1080 else
1081 anEvent->recurrence()->setWeekly(rFreq, qba, rDuration); 1081 anEvent->recurrence()->setWeekly(rFreq, qba, rDuration);
1082 } 1082 }
1083 } 1083 }
1084 /**************************** MONTHLY-BY-POS ***************************/ 1084 /**************************** MONTHLY-BY-POS ***************************/
1085 else if (tmpStr.left(2) == "MP") { 1085 else if (tmpStr.left(2) == "MP") {
1086 int index = tmpStr.find(' '); 1086 int index = tmpStr.find(' ');
1087 int last = tmpStr.findRev(' ') + 1; 1087 int last = tmpStr.findRev(' ') + 1;
1088 int rFreq = tmpStr.mid(2, (index-1)).toInt(); 1088 int rFreq = tmpStr.mid(2, (index-1)).toInt();
1089 index += 1; // advance to beginning of stuff after freq 1089 index += 1; // advance to beginning of stuff after freq
1090 QBitArray qba(7); 1090 QBitArray qba(7);
1091 short tmpPos; 1091 short tmpPos;
1092 if( index == last ) { 1092 if( index == last ) {
1093 // e.g. MP1 #0 1093 // e.g. MP1 #0
1094 tmpPos = anEvent->dtStart().date().day()/7 + 1; 1094 tmpPos = anEvent->dtStart().date().day()/7 + 1;
1095 if( tmpPos == 5 ) 1095 if( tmpPos == 5 )
1096 tmpPos = -1; 1096 tmpPos = -1;
1097 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1); 1097 qba.setBit(anEvent->dtStart().date().dayOfWeek() - 1);
1098 anEvent->recurrence()->addMonthlyPos(tmpPos, qba); 1098 anEvent->recurrence()->addMonthlyPos(tmpPos, qba);
1099 } 1099 }
1100 else { 1100 else {
1101 // e.g. MP1 1+ SU #0 1101 // e.g. MP1 1+ SU #0
1102 while (index < last) { 1102 while (index < last) {
1103 tmpPos = tmpStr.mid(index,1).toShort(); 1103 tmpPos = tmpStr.mid(index,1).toShort();
1104 index += 1; 1104 index += 1;
1105 if (tmpStr.mid(index,1) == "-") 1105 if (tmpStr.mid(index,1) == "-")
1106 // convert tmpPos to negative 1106 // convert tmpPos to negative
1107 tmpPos = 0 - tmpPos; 1107 tmpPos = 0 - tmpPos;
1108 index += 2; // advance to day(s) 1108 index += 2; // advance to day(s)
1109 while (numFromDay(tmpStr.mid(index,3)) >= 0) { 1109 while (numFromDay(tmpStr.mid(index,3)) >= 0) {
1110 int dayNum = numFromDay(tmpStr.mid(index,3)); 1110 int dayNum = numFromDay(tmpStr.mid(index,3));
1111 qba.setBit(dayNum); 1111 qba.setBit(dayNum);
1112 index += 3; // advance to next day, or possibly pos or "#" 1112 index += 3; // advance to next day, or possibly pos or "#"
1113 } 1113 }
1114 anEvent->recurrence()->addMonthlyPos(tmpPos, qba); 1114 anEvent->recurrence()->addMonthlyPos(tmpPos, qba);
1115 qba.detach(); 1115 qba.detach();
1116 qba.fill(FALSE); // clear out 1116 qba.fill(FALSE); // clear out
1117 } // while != "#" 1117 } // while != "#"
1118 } 1118 }
1119 index = last; if (tmpStr.mid(index,1) == "#") index++; 1119 index = last; if (tmpStr.mid(index,1) == "#") index++;
1120 if (tmpStr.find('T', index) != -1) { 1120 if (tmpStr.find('T', index) != -1) {
1121 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length() - 1121 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length() -
1122 index))).date(); 1122 index))).date();
1123 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rEndDate); 1123 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rEndDate);
1124 } else { 1124 } else {
1125 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1125 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1126 if (rDuration == 0) 1126 if (rDuration == 0)
1127 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, -1); 1127 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, -1);
1128 else 1128 else
1129 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rDuration); 1129 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rDuration);
1130 } 1130 }
1131 } 1131 }
1132 1132
1133 /**************************** MONTHLY-BY-DAY ***************************/ 1133 /**************************** MONTHLY-BY-DAY ***************************/
1134 else if (tmpStr.left(2) == "MD") { 1134 else if (tmpStr.left(2) == "MD") {
1135 int index = tmpStr.find(' '); 1135 int index = tmpStr.find(' ');
1136 int last = tmpStr.findRev(' ') + 1; 1136 int last = tmpStr.findRev(' ') + 1;
1137 int rFreq = tmpStr.mid(2, (index-1)).toInt(); 1137 int rFreq = tmpStr.mid(2, (index-1)).toInt();
1138 index += 1; 1138 index += 1;
1139 short tmpDay; 1139 short tmpDay;
1140 if( index == last ) { 1140 if( index == last ) {
1141 // e.g. MD1 #0 1141 // e.g. MD1 #0
1142 tmpDay = anEvent->dtStart().date().day(); 1142 tmpDay = anEvent->dtStart().date().day();
1143 anEvent->recurrence()->addMonthlyDay(tmpDay); 1143 anEvent->recurrence()->addMonthlyDay(tmpDay);
1144 } 1144 }
1145 else { 1145 else {
1146 // e.g. MD1 3 #0 1146 // e.g. MD1 3 #0
1147 while (index < last) { 1147 while (index < last) {
1148 int index2 = tmpStr.find(' ', index); 1148 int index2 = tmpStr.find(' ', index);
1149 tmpDay = tmpStr.mid(index, (index2-index)).toShort(); 1149 tmpDay = tmpStr.mid(index, (index2-index)).toShort();
1150 index = index2-1; 1150 index = index2-1;
1151 if (tmpStr.mid(index, 1) == "-") 1151 if (tmpStr.mid(index, 1) == "-")
1152 tmpDay = 0 - tmpDay; 1152 tmpDay = 0 - tmpDay;
1153 index += 2; // advance the index; 1153 index += 2; // advance the index;
1154 anEvent->recurrence()->addMonthlyDay(tmpDay); 1154 anEvent->recurrence()->addMonthlyDay(tmpDay);
1155 } // while != # 1155 } // while != #
1156 } 1156 }
1157 index = last; if (tmpStr.mid(index,1) == "#") index++; 1157 index = last; if (tmpStr.mid(index,1) == "#") index++;
1158 if (tmpStr.find('T', index) != -1) { 1158 if (tmpStr.find('T', index) != -1) {
1159 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1159 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1160 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rEndDate); 1160 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rEndDate);
1161 } else { 1161 } else {
1162 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1162 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1163 if (rDuration == 0) 1163 if (rDuration == 0)
1164 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, -1); 1164 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, -1);
1165 else 1165 else
1166 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rDuration); 1166 anEvent->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rDuration);
1167 } 1167 }
1168 } 1168 }
1169 1169
1170 /*********************** YEARLY-BY-MONTH *******************************/ 1170 /*********************** YEARLY-BY-MONTH *******************************/
1171 else if (tmpStr.left(2) == "YM") { 1171 else if (tmpStr.left(2) == "YM") {
1172 // we have to set this such that recurrence accepts addYearlyNum(tmpDay); 1172 // we have to set this such that recurrence accepts addYearlyNum(tmpDay);
1173 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, 1, -1); 1173 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, 1, -1);
1174 int index = tmpStr.find(' '); 1174 int index = tmpStr.find(' ');
1175 int last = tmpStr.findRev(' ') + 1; 1175 int last = tmpStr.findRev(' ') + 1;
1176 int rFreq = tmpStr.mid(2, (index-1)).toInt(); 1176 int rFreq = tmpStr.mid(2, (index-1)).toInt();
1177 index += 1; 1177 index += 1;
1178 short tmpMonth; 1178 short tmpMonth;
1179 if( index == last ) { 1179 if( index == last ) {
1180 // e.g. YM1 #0 1180 // e.g. YM1 #0
1181 tmpMonth = anEvent->dtStart().date().month(); 1181 tmpMonth = anEvent->dtStart().date().month();
1182 anEvent->recurrence()->addYearlyNum(tmpMonth); 1182 anEvent->recurrence()->addYearlyNum(tmpMonth);
1183 } 1183 }
1184 else { 1184 else {
1185 // e.g. YM1 3 #0 1185 // e.g. YM1 3 #0
1186 while (index < last) { 1186 while (index < last) {
1187 int index2 = tmpStr.find(' ', index); 1187 int index2 = tmpStr.find(' ', index);
1188 tmpMonth = tmpStr.mid(index, (index2-index)).toShort(); 1188 tmpMonth = tmpStr.mid(index, (index2-index)).toShort();
1189 index = index2+1; 1189 index = index2+1;
1190 anEvent->recurrence()->addYearlyNum(tmpMonth); 1190 anEvent->recurrence()->addYearlyNum(tmpMonth);
1191 } // while != # 1191 } // while != #
1192 } 1192 }
1193 index = last; if (tmpStr.mid(index,1) == "#") index++; 1193 index = last; if (tmpStr.mid(index,1) == "#") index++;
1194 if (tmpStr.find('T', index) != -1) { 1194 if (tmpStr.find('T', index) != -1) {
1195 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date(); 1195 QDate rEndDate = (ISOToQDateTime(tmpStr.mid(index, tmpStr.length()-index))).date();
1196 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, rEndDate); 1196 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, rEndDate);
1197 } else { 1197 } else {
1198 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt(); 1198 int rDuration = tmpStr.mid(index, tmpStr.length()-index).toInt();
1199 if (rDuration == 0) 1199 if (rDuration == 0)
1200 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, -1); 1200 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, -1);
1201 else 1201 else
1202 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, rDuration); 1202 anEvent->recurrence()->setYearly(Recurrence::rYearlyMonth, rFreq, rDuration);
1203 } 1203 }
1204 } 1204 }
1205 1205
1206 /*********************** YEARLY-BY-DAY *********************************/ 1206 /*********************** YEARLY-BY-DAY *********************************/
1207 else if (tmpStr.left(2) == "YD") { 1207 else if (tmpStr.left(2) == "YD") {
1208 // we have to set this such that recurrence accepts addYearlyNum(tmpDay); 1208 // we have to set this such that recurrence accepts addYearlyNum(tmpDay);
1209 anEvent->recurrence()->setYearly(Recurrence::rYearlyDay, 1, -1); 1209 anEvent->recurrence()->setYearly(Recurrence::rYearlyDay, 1, -1);
1210 int index = tmpStr.find(' '); 1210 int index = tmpStr.find(' ');
1211 int last = tmpStr.findRev(' ') + 1; 1211 int last = tmpStr.findRev(' ') + 1;
1212 int rFreq = tmpStr.mid(2, (index-1)).toInt(); 1212 int rFreq = tmpStr.mid(2, (index-1)).toInt();
1213 index += 1; 1213 index += 1;
1214 short tmpDay; 1214 short tmpDay;
1215 if( index == last ) { 1215 if( index == last ) {
1216 // e.g. YD1 #0 1216 // e.g. YD1 #0
1217 tmpDay = anEvent->dtStart().date().dayOfYear(); 1217 tmpDay = anEvent->dtStart().date().dayOfYear();
1218 anEvent->recurrence()->addYearlyNum(tmpDay); 1218 anEvent->recurrence()->addYearlyNum(tmpDay);
1219 } 1219 }
1220 else { 1220 else {
1221 // e.g. YD1 123 #0 1221 // e.g. YD1 123 #0
1222 while (index < last) { 1222 while (index < last) {
1223 int index2 = tmpStr.find(' ', index); 1223 int index2 = tmpStr.find(' ', index);
1224 tmpDay = tmpStr.mid(index, (index2-index)).toShort(); 1224 tmpDay = tmpStr.mid(index, (index2-index)).toShort();
1225 index = index2+1; 1225 index = index2+1;
1226 anEvent->recurrence()->addYearlyNum(tmpDay); 1226 anEvent->recurrence()->addYearlyNum(tmpDay);
1227 } // while != # 1227 } // while != #
1228 } 1228 }
1229 index = last; if (tmpStr.mid(index,1) == "#") index++; 1229 index = last; if (tmpStr.mid(index,1) == "#") index++;
1230 if (tmpStr.find('T', index) != -1) { 1230 if (tmpStr.find('T', index) != -1) {
diff --git a/libkcal/vcalformat.h b/libkcal/vcalformat.h
index c7df017..6dae3d2 100644
--- a/libkcal/vcalformat.h
+++ b/libkcal/vcalformat.h
@@ -1,113 +1,113 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#ifndef _VCALFORMAT_H 22#ifndef _VCALFORMAT_H
23#define _VCALFORMAT_H 23#define _VCALFORMAT_H
24 24
25#include "calformat.h" 25#include "calformat.h"
26 26
27#define _VCAL_VERSION "1.0" 27#define _VCAL_VERSION "1.0"
28 28
29class VObject; 29class VObject;
30 30
31namespace KCal { 31namespace KCal {
32 32
33/** 33/**
34 This class implements the vCalendar format. It provides methods for 34 This class implements the vCalendar format. It provides methods for
35 loading/saving/converting vCalendar format data into the internal KOrganizer 35 loading/saving/converting vCalendar format data into the internal KOrganizer
36 representation as Calendar and Events. 36 representation as Calendar and Events.
37 37
38 @short vCalendar format implementation 38 @short vCalendar format implementation
39*/ 39*/
40class VCalFormat : public CalFormat { 40class VCalFormat : public CalFormat {
41 public: 41 public:
42 VCalFormat(); 42 VCalFormat();
43 virtual ~VCalFormat(); 43 virtual ~VCalFormat();
44 44
45 /** loads a calendar on disk in vCalendar format into the current calendar. 45 /** loads a calendar on disk in vCalendar format into the current calendar.
46 * any information already present is lost. Returns TRUE if successful, 46 * any information already present is lost. Returns TRUE if successful,
47 * else returns FALSE. 47 * else returns FALSE.
48 * @param fileName the name of the calendar on disk. 48 * @param fileName the name of the calendar on disk.
49 */ 49 */
50 bool load(Calendar *,const QString &fileName ); 50 bool load(Calendar *,const QString &fileName );
51 /** writes out the calendar to disk in vCalendar format. Returns true if 51 /** writes out the calendar to disk in vCalendar format. Returns true if
52 * successful and false on error. 52 * successful and false on error.
53 * @param fileName the name of the file 53 * @param fileName the name of the file
54 */ 54 */
55 bool save(Calendar *,const QString &fileName ); 55 bool save(Calendar *,const QString &fileName );
56 56
57 /** 57 /**
58 Parse string and populate calendar with that information. 58 Parse string and populate calendar with that information.
59 */ 59 */
60 bool fromString( Calendar *, const QString & ); 60 bool fromString( Calendar *, const QString & );
61 /** 61 /**
62 Return calendar information as string. 62 Return calendar information as string.
63 */ 63 */
64 void setLocalTime ( bool ); 64 void setLocalTime ( bool );
65 QString toString( Calendar * ); 65 QString toString( Calendar * );
66 QString eventToString( Event *, Calendar *calendar, bool useLocalTime = true ); 66 QString eventToString( Event *, Calendar *calendar, bool useLocalTime = true );
67 QString todoToString( Todo * ,Calendar *calendar, bool useLocalTime = true ); 67 QString todoToString( Todo * ,Calendar *calendar, bool useLocalTime = true );
68 68
69 protected: 69 protected:
70 /** translates a VObject of the TODO type into a Event */ 70 /** translates a VObject of the TODO type into a Event */
71 Todo *VTodoToEvent(VObject *vtodo); 71 Todo *VTodoToEvent(VObject *vtodo);
72 /** translates a VObject into a Event and returns a pointer to it. */ 72 /** translates a VObject into a Event and returns a pointer to it. */
73 Event *VEventToEvent(VObject *vevent); 73 Event *VEventToEvent(VObject *vevent);
74 /** translate a Event into a VTodo-type VObject and return pointer */ 74 /** translate a Event into a VTodo-type VObject and return pointer */
75 VObject *eventToVTodo(const Todo *anEvent); 75 VObject *eventToVTodo(const Todo *anEvent);
76 /** translate a Event into a VObject and returns a pointer to it. */ 76 /** translate a Event into a VObject and returns a pointer to it. */
77 VObject* eventToVEvent(const Event *anEvent); 77 VObject* eventToVEvent(Event *anEvent);
78 78
79 /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */ 79 /** takes a QDate and returns a string in the format YYYYMMDDTHHMMSS */
80 QString qDateToISO(const QDate &); 80 QString qDateToISO(const QDate &);
81 /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */ 81 /** takes a QDateTime and returns a string in format YYYYMMDDTHHMMSS */
82 QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE); 82 QString qDateTimeToISO(const QDateTime &, bool zulu=TRUE);
83 /** takes a string in the format YYYYMMDDTHHMMSS and returns a 83 /** takes a string in the format YYYYMMDDTHHMMSS and returns a
84 * valid QDateTime. */ 84 * valid QDateTime. */
85 QDateTime ISOToQDateTime(const QString & dtStr); 85 QDateTime ISOToQDateTime(const QString & dtStr);
86 /** takes a string in the format YYYYMMDD and returns a 86 /** takes a string in the format YYYYMMDD and returns a
87 * valid QDate. */ 87 * valid QDate. */
88 QDate ISOToQDate(const QString & dtStr); 88 QDate ISOToQDate(const QString & dtStr);
89 /** takes a vCalendar tree of VObjects, and puts all of them that have 89 /** takes a vCalendar tree of VObjects, and puts all of them that have
90 * the "event" property into the dictionary, todos in the todo-list, etc. */ 90 * the "event" property into the dictionary, todos in the todo-list, etc. */
91 void populate(VObject *vcal); 91 void populate(VObject *vcal);
92 92
93 /** takes a number 0 - 6 and returns the two letter string of that day, 93 /** takes a number 0 - 6 and returns the two letter string of that day,
94 * i.e. MO, TU, WE, etc. */ 94 * i.e. MO, TU, WE, etc. */
95 const char *dayFromNum(int day); 95 const char *dayFromNum(int day);
96 /** the reverse of the above function. */ 96 /** the reverse of the above function. */
97 int numFromDay(const QString &day); 97 int numFromDay(const QString &day);
98 Attendee::Role VCalFormat::readRole(const char *s) const; 98 Attendee::Role VCalFormat::readRole(const char *s) const;
99 QCString writeRole(Attendee::Role role) const; 99 QCString writeRole(Attendee::Role role) const;
100 Attendee::PartStat readStatus(const char *s) const; 100 Attendee::PartStat readStatus(const char *s) const;
101 QCString writeStatus(Attendee::PartStat status) const; 101 QCString writeStatus(Attendee::PartStat status) const;
102 102
103 private: 103 private:
104 Calendar *mCalendar; 104 Calendar *mCalendar;
105 bool useLocalTime; 105 bool useLocalTime;
106 106
107 QPtrList<Event> mEventsRelate; // events with relations 107 QPtrList<Event> mEventsRelate; // events with relations
108 QPtrList<Todo> mTodosRelate; // todos with relations 108 QPtrList<Todo> mTodosRelate; // todos with relations
109}; 109};
110 110
111} 111}
112 112
113#endif 113#endif