korganizer Library API Documentation

kodaymatrix.cpp

00001 /*
00002     This file is part of KOrganizer.
00003 
00004     Copyright (c) 2001 Eitzenberger Thomas <thomas.eitzenberger@siemens.at>
00005     Parts of the source code have been copied from kdpdatebutton.cpp
00006 
00007     Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
00008 
00009     This program is free software; you can redistribute it and/or modify
00010     it under the terms of the GNU General Public License as published by
00011     the Free Software Foundation; either version 2 of the License, or
00012     (at your option) any later version.
00013 
00014     This program is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00017     GNU General Public License for more details.
00018 
00019     You should have received a copy of the GNU General Public License
00020     along with this program; if not, write to the Free Software
00021     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00022 
00023     As a special exception, permission is given to link this program
00024     with any edition of Qt, and distribute the resulting executable,
00025     without including the source code for Qt in the source distribution.
00026 */
00027 
00028 #include <qevent.h>
00029 #include <qpainter.h>
00030 #include <qptrlist.h>
00031 
00032 #include <kglobal.h>
00033 #include <kdebug.h>
00034 #include <klocale.h>
00035 #include <kiconloader.h>
00036 
00037 #include <libkcal/vcaldrag.h>
00038 #include <libkcal/icaldrag.h>
00039 #include <libkcal/dndfactory.h>
00040 #include <libkcal/calendarresources.h>
00041 #include <libkcal/resourcecalendar.h>
00042 
00043 #include <kcalendarsystem.h>
00044 
00045 #ifndef KORG_NOPLUGINS
00046 #include "kocore.h"
00047 #endif
00048 #include "koprefs.h"
00049 #include "koglobals.h"
00050 #include "kodialogmanager.h"
00051 
00052 #include "kodaymatrix.h"
00053 #include "kodaymatrix.moc"
00054 
00055 #ifndef NODND
00056 #include <qcursor.h>
00057 #include <kpopupmenu.h>
00058 #include <X11/Xlib.h>
00059 #undef KeyPress
00060 #undef None
00061 #endif
00062 
00063 // ============================================================================
00064 //  D Y N A M I C   T I P
00065 // ============================================================================
00066 
00067 DynamicTip::DynamicTip( QWidget * parent )
00068     : QToolTip( parent )
00069 {
00070   mMatrix = static_cast<KODayMatrix *>( parent );
00071 }
00072 
00073 
00074 void DynamicTip::maybeTip( const QPoint &pos )
00075 {
00076   //calculate which cell of the matrix the mouse is in
00077   QRect sz = mMatrix->frameRect();
00078   int dheight = sz.height() * 7 / 42;
00079   int dwidth = sz.width() / 7;
00080   int row = pos.y() / dheight;
00081   int col = pos.x() / dwidth;
00082 
00083   QRect rct( col * dwidth, row * dheight, dwidth, dheight );
00084 
00085 //  kdDebug(5850) << "DynamicTip::maybeTip matrix cell index [" <<
00086 //                col << "][" << row << "] => " <<(col+row*7) << endl;
00087 
00088   //show holiday names only
00089   QString str = mMatrix->getHolidayLabel( col + row * 7 );
00090   if ( str.isEmpty() ) return;
00091   tip( rct, str );
00092 }
00093 
00094 
00095 // ============================================================================
00096 //  K O D A Y M A T R I X
00097 // ============================================================================
00098 
00099 const int KODayMatrix::NOSELECTION = -1000;
00100 const int KODayMatrix::NUMDAYS = 42;
00101 
00102 KODayMatrix::KODayMatrix( QWidget *parent, QDate date, const char *name )
00103   : QFrame( parent, name ), mCalendar( 0 )
00104 {
00105   // initialize dynamic arrays
00106   days = new QDate[ NUMDAYS ];
00107   daylbls = new QString[ NUMDAYS ];
00108   mEvents = new int[ NUMDAYS ];
00109   mToolTip = new DynamicTip( this );
00110 
00111   // set default values used for drawing the matrix
00112   mDefaultBackColor = palette().active().base();
00113   mDefaultTextColor = palette().active().foreground();
00114   mDefaultTextColorShaded = getShadedColor( mDefaultTextColor );
00115   mHolidayColorShaded = getShadedColor( KOPrefs::instance()->mHolidayColor );
00116   mSelectedDaysColor = QColor( "white" );
00117   mTodayMarginWidth = 2;
00118   mSelEnd = mSelStart = NOSELECTION;
00119 
00120   updateView( date );
00121 }
00122 
00123 void KODayMatrix::setCalendar( Calendar *cal )
00124 {
00125   mCalendar = cal;
00126 
00127   setAcceptDrops( mCalendar );
00128 
00129   updateEvents();
00130 }
00131 
00132 QColor KODayMatrix::getShadedColor( QColor color )
00133 {
00134   QColor shaded;
00135   int h = 0;
00136   int s = 0;
00137   int v = 0;
00138   color.hsv( &h, &s, &v );
00139   s = s / 4;
00140   v = 192 + v / 4;
00141   shaded.setHsv( h, s, v );
00142 
00143   return shaded;
00144 }
00145 
00146 KODayMatrix::~KODayMatrix()
00147 {
00148   delete [] days;
00149   delete [] daylbls;
00150   delete [] mEvents;
00151   delete mToolTip;
00152 }
00153 
00154 /*
00155 void KODayMatrix::setStartDate(QDate start)
00156 {
00157   updateView(start);
00158 }
00159 */
00160 
00161 void KODayMatrix::addSelectedDaysTo( DateList &selDays )
00162 {
00163   kdDebug(5850) << "KODayMatrix::addSelectedDaysTo() - " << "mSelStart:" << mSelStart << endl;
00164 
00165   if ( mSelStart == NOSELECTION ) {
00166     return;
00167   }
00168 
00169   //cope with selection being out of matrix limits at top (< 0)
00170   int i0 = mSelStart;
00171   if ( i0 < 0 ) {
00172     for ( int i = i0; i < 0; i++ ) {
00173       selDays.append( days[ 0 ].addDays( i ) );
00174     }
00175     i0 = 0;
00176   }
00177 
00178   //cope with selection being out of matrix limits at bottom (> NUMDAYS-1)
00179   if ( mSelEnd > NUMDAYS-1 ) {
00180     for ( int i = i0; i <= NUMDAYS - 1; i++ ) {
00181       selDays.append( days[ i ] );
00182     }
00183     for ( int i = NUMDAYS; i < mSelEnd; i++ ) {
00184       selDays.append( days[ 0 ].addDays( i ) );
00185     }
00186   } else {
00187     // apply normal routine to selection being entirely within matrix limits
00188     for ( int i = i0; i <= mSelEnd; i++ ) {
00189       selDays.append( days[ i ] );
00190     }
00191   }
00192 }
00193 
00194 void KODayMatrix::setSelectedDaysFrom( const QDate &start, const QDate &end )
00195 {
00196   mSelStart = startdate.daysTo( start );
00197   mSelEnd = startdate.daysTo( end );
00198 }
00199 
00200 
00201 void KODayMatrix::recalculateToday()
00202 {
00203   today = -1;
00204   for ( int i = 0; i < NUMDAYS; i++ ) {
00205     days[ i ] = startdate.addDays( i );
00206     daylbls[ i ] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] ));
00207 
00208     // if today is in the currently displayed month, hilight today
00209     if ( days[ i ].year() == QDate::currentDate().year() &&
00210          days[ i ].month() == QDate::currentDate().month() &&
00211          days[ i ].day() == QDate::currentDate().day() ) {
00212       today = i;
00213     }
00214   }
00215   // qDebug(QString("Today is visible at %1.").arg(today));
00216 }
00217 
00218 /* slot */ void KODayMatrix::updateView()
00219 {
00220   updateView( startdate );
00221 }
00222 
00223 void KODayMatrix::updateView( QDate actdate )
00224 {
00225 //  kdDebug(5850) << "KODayMatrix::updateView() " << actdate.toString() << endl;
00226 
00227   //flag to indicate if the starting day of the matrix has changed by this call
00228   bool daychanged = false;
00229 
00230   // if a new startdate is to be set then apply Cornelius's calculation
00231   // of the first day to be shown
00232   if ( actdate != startdate ) {
00233     // reset index of selection according to shift of starting date from startdate to actdate
00234     if ( mSelStart != NOSELECTION ) {
00235       int tmp = actdate.daysTo( startdate );
00236       //kdDebug(5850) << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl;
00237       // shift selection if new one would be visible at least partly !
00238 
00239       if ( mSelStart + tmp < NUMDAYS && mSelEnd + tmp >= 0 ) {
00240         // nested if is required for next X display pushed from a different month - correction required
00241         // otherwise, for month forward and backward, it must be avoided
00242         if( mSelStart > NUMDAYS || mSelStart < 0 )
00243           mSelStart = mSelStart + tmp;
00244         if( mSelEnd > NUMDAYS || mSelEnd < 0 )
00245           mSelEnd = mSelEnd + tmp;
00246       }
00247     }
00248 
00249     startdate = actdate;
00250     daychanged = true;
00251   }
00252 
00253   if ( daychanged ) {
00254     recalculateToday();
00255   }
00256 
00257   updateEvents();
00258   for( int i = 0; i < NUMDAYS; i++ ) {
00259     //if it is a holy day then draw it red. Sundays are consider holidays, too
00260 #ifndef KORG_NOPLUGINS
00261     QString holiStr = KOCore::self()->holiday( days[ i ] );
00262 #else
00263     QString holiStr = QString::null;
00264 #endif
00265     if ( ( KOGlobals::self()->calendarSystem()->dayOfWeek( days[ i ] ) ==
00266            KOGlobals::self()->calendarSystem()->weekDayOfPray() ) ||
00267          !holiStr.isEmpty() ) {
00268       if ( holiStr.isNull() ) holiStr = "";
00269       mHolidays[ i ] = holiStr;
00270     } else {
00271       mHolidays[ i ] = QString::null;
00272     }
00273   }
00274 }
00275 
00276 void KODayMatrix::updateEvents()
00277 {
00278   if ( !mCalendar ) return;
00279 
00280   for( int i = 0; i < NUMDAYS; i++ ) {
00281     // if events are set for the day then remember to draw it bold
00282     Event::List eventlist = mCalendar->events( days[ i ] );
00283     int numEvents = eventlist.count();
00284     Event::List::ConstIterator it;
00285     for( it = eventlist.begin(); it != eventlist.end(); ++it ) {
00286       Event *event = *it;
00287       ushort recurType = event->doesRecur();
00288 
00289       if ( ( recurType == Recurrence::rDaily &&
00290              !KOPrefs::instance()->mDailyRecur ) ||
00291            ( recurType == Recurrence::rWeekly &&
00292              !KOPrefs::instance()->mWeeklyRecur ) ) {
00293         numEvents--;
00294       }
00295     }
00296     mEvents[ i ] = numEvents;
00297   }
00298 }
00299 
00300 const QDate& KODayMatrix::getDate( int offset )
00301 {
00302   if ( offset < 0 || offset > NUMDAYS - 1 ) {
00303     kdDebug(5850) << "Wrong offset (" << offset << ") in KODayMatrix::getDate(int)" << endl;
00304     return days[ 0 ];
00305   }
00306   return days[ offset ];
00307 }
00308 
00309 QString KODayMatrix::getHolidayLabel( int offset )
00310 {
00311   if ( offset < 0 || offset > NUMDAYS - 1 ) {
00312     kdDebug(5850) << "Wrong offset (" << offset << ") in KODayMatrix::getHolidayLabel(int)" << endl;
00313     return 0;
00314   }
00315   return mHolidays[ offset ];
00316 }
00317 
00318 int KODayMatrix::getDayIndexFrom( int x, int y )
00319 {
00320   return 7 * ( y / daysize.height() ) +
00321          ( KOGlobals::self()->reverseLayout() ?
00322            6 - x / daysize.width() : x / daysize.width() );
00323 }
00324 
00325 // ----------------------------------------------------------------------------
00326 //  M O U S E   E V E N T   H A N D L I N G
00327 // ----------------------------------------------------------------------------
00328 
00329 void KODayMatrix::mousePressEvent( QMouseEvent *e )
00330 {
00331   mSelStart = getDayIndexFrom(e->x(), e->y());
00332   if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1;
00333   mSelInit = mSelStart;
00334 }
00335 
00336 void KODayMatrix::mouseReleaseEvent( QMouseEvent *e )
00337 {
00338   int tmp = getDayIndexFrom(e->x(), e->y());
00339   if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
00340 
00341   if (mSelInit > tmp) {
00342     mSelEnd = mSelInit;
00343     if (tmp != mSelStart) {
00344       mSelStart = tmp;
00345       repaint();
00346     }
00347   } else {
00348     mSelStart = mSelInit;
00349 
00350     //repaint only if selection has changed
00351     if (tmp != mSelEnd) {
00352       mSelEnd = tmp;
00353       repaint();
00354     }
00355   }
00356 
00357   DateList daylist;
00358   if ( mSelStart < 0 ) mSelStart = 0;
00359   for (int i = mSelStart; i <= mSelEnd; i++) {
00360     daylist.append(days[i]);
00361   }
00362   emit selected((const DateList)daylist);
00363 }
00364 
00365 void KODayMatrix::mouseMoveEvent( QMouseEvent *e )
00366 {
00367   int tmp = getDayIndexFrom(e->x(), e->y());
00368   if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
00369 
00370   if (mSelInit > tmp) {
00371     mSelEnd = mSelInit;
00372     if (tmp != mSelStart) {
00373       mSelStart = tmp;
00374       repaint();
00375     }
00376   } else {
00377     mSelStart = mSelInit;
00378 
00379     //repaint only if selection has changed
00380     if (tmp != mSelEnd) {
00381       mSelEnd = tmp;
00382       repaint();
00383     }
00384   }
00385 }
00386 
00387 // ----------------------------------------------------------------------------
00388 //  D R A G ' N   D R O P   H A N D L I N G
00389 // ----------------------------------------------------------------------------
00390 
00391 //-----------------------------------------------------------------------------
00392 // Drag and Drop handling -- based on the Troll Tech dirview example
00393 
00394 enum {
00395   DRAG_COPY = 0,
00396   DRAG_MOVE = 1,
00397   DRAG_CANCEL = 2
00398 };
00399 
00400 void KODayMatrix::dragEnterEvent( QDragEnterEvent *e )
00401 {
00402 #ifndef KORG_NODND
00403   if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
00404     e->ignore();
00405     return;
00406   }
00407 
00408   // some visual feedback
00409 //  oldPalette = palette();
00410 //  setPalette(my_HilitePalette);
00411 //  update();
00412 #endif
00413 }
00414 
00415 void KODayMatrix::dragMoveEvent( QDragMoveEvent *e )
00416 {
00417 #ifndef KORG_NODND
00418   if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
00419     e->ignore();
00420     return;
00421   }
00422 
00423   e->accept();
00424 #endif
00425 }
00426 
00427 void KODayMatrix::dragLeaveEvent( QDragLeaveEvent * /*dl*/ )
00428 {
00429 #ifndef KORG_NODND
00430 //  setPalette(oldPalette);
00431 //  update();
00432 #endif
00433 }
00434 
00435 void KODayMatrix::dropEvent( QDropEvent *e )
00436 {
00437 #ifndef KORG_NODND
00438   kdDebug(5850) << "KODayMatrix::dropEvent(e) begin" << endl;
00439 
00440   if ( !mCalendar ||
00441        ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) ) {
00442     e->ignore();
00443     return;
00444   }
00445 
00446   DndFactory factory( mCalendar );
00447   Event *event = factory.createDrop( e );
00448   Todo *todo = factory.createDropTodo( e );
00449   if ( !event && !todo ) {
00450     e->ignore();
00451     return;
00452   }
00453 
00454   Todo *existingTodo = 0, *oldTodo = 0;
00455   Event *existingEvent = 0, *oldEvent = 0;
00456 
00457   // Find the incidence in the calendar, then we don't need the drag object any more
00458   if ( event ) existingEvent = mCalendar->event( event->uid() );
00459   if ( todo ) existingTodo = mCalendar->todo( todo->uid() );
00460 
00461   int action = DRAG_CANCEL;
00462 
00463   int root_x, root_y, win_x, win_y;
00464   uint keybstate;
00465   Window rootw, childw;
00466   XQueryPointer( qt_xdisplay(), qt_xrootwin(), &rootw, &childw,
00467                  &root_x, &root_y, &win_x, &win_y, &keybstate );
00468 
00469   if ( keybstate & ControlMask ) {
00470     action = DRAG_COPY;
00471   } else if ( keybstate & ShiftMask ) {
00472     action = DRAG_MOVE;
00473   } else {
00474     KPopupMenu *menu = new KPopupMenu( this );
00475     if ( existingEvent || existingTodo ) {
00476       menu->insertItem( i18n("Move"), DRAG_MOVE, 0 );
00477       if (existingEvent)
00478         menu->insertItem( KOGlobals::self()->smallIcon("editcopy"), i18n("Copy"), DRAG_COPY, 1 );
00479     } else {
00480       menu->insertItem( i18n("Add"), DRAG_MOVE, 0 );
00481     }
00482     menu->insertSeparator();
00483     menu->insertItem( KOGlobals::self()->smallIcon("cancel"), i18n("Cancel"), DRAG_CANCEL, 3 );
00484     action = menu->exec( QCursor::pos(), 0 );
00485   }
00486 
00487   // When copying, clear the UID:
00488   if ( action == DRAG_COPY ) {
00489     if ( todo ) todo->recreate();
00490     if ( event ) event->recreate();
00491   } else {
00492     if ( existingEvent ) oldEvent = existingEvent->clone();
00493     if ( event ) delete event;
00494     event = existingEvent;
00495     if ( existingTodo ) oldTodo = existingTodo->clone();
00496     if ( todo ) delete todo;
00497     todo = existingTodo;
00498   }
00499 
00500   if ( action == DRAG_COPY  || action == DRAG_MOVE ) {
00501     e->accept();
00502     if ( event ) {
00503       // Adjust date
00504       QDateTime start = event->dtStart();
00505       QDateTime end = event->dtEnd();
00506       int duration = start.daysTo( end );
00507       int idx = getDayIndexFrom( e->pos().x(), e->pos().y() );
00508 
00509       start.setDate( days[idx] );
00510       end.setDate( days[idx].addDays( duration ) );
00511 
00512       event->setDtStart( start );
00513       event->setDtEnd( end );
00514       // When moving, we don't need to insert  the item!
00515       if ( action != DRAG_MOVE ) {
00516         if ( !mCalendar->addEvent( event ) ) {
00517           KODialogManager::errorSaveEvent( this );
00518           return;
00519         }
00520       }
00521 
00522       if ( oldEvent ) {
00523         emit eventDroppedMove( oldEvent, event );
00524       } else {
00525         emit eventDropped( event );
00526       }
00527     }
00528     if ( todo ) {
00529       // Adjust date
00530       QDateTime due = todo->dtDue();
00531       int idx = getDayIndexFrom( e->pos().x(), e->pos().y() );
00532       due.setDate( days[idx] );
00533 
00534       todo->setDtDue( due );
00535       todo->setHasDueDate( true );
00536 
00537       // When moving, we don't need to insert  the item!
00538       if ( action != DRAG_MOVE ) {
00539         if ( !mCalendar->addTodo( todo ) ) {
00540           KODialogManager::errorSaveTodo( this );
00541         }
00542       }
00543 
00544       if ( oldTodo ) {
00545         emit todoDroppedMove( oldTodo, todo );
00546       } else {
00547         emit todoDropped( todo );
00548       }
00549     }
00550   } else {
00551     if ( todo ) delete todo;
00552     if ( event ) delete event;
00553     e->ignore();
00554   }
00555 #endif
00556 }
00557 
00558 // ----------------------------------------------------------------------------
00559 //  P A I N T   E V E N T   H A N D L I N G
00560 // ----------------------------------------------------------------------------
00561 
00562 void KODayMatrix::paintEvent( QPaintEvent *pevent )
00563 {
00564 //kdDebug(5850) << "KODayMatrix::paintEvent() BEGIN" << endl;
00565 
00566   QPainter p(this);
00567 
00568   QRect sz = frameRect();
00569   int dheight = daysize.height();
00570   int dwidth = daysize.width();
00571   int row,col;
00572   int selw, selh;
00573   bool isRTL = KOGlobals::self()->reverseLayout();
00574 
00575   // draw background and topleft frame
00576   p.fillRect(pevent->rect(), mDefaultBackColor);
00577   p.setPen(mDefaultTextColor);
00578   p.drawRect(0, 0, sz.width()+1, sz.height()+1);
00579   // don't paint over borders
00580   p.translate(1,1);
00581 
00582   // draw selected days with highlighted background color
00583   if (mSelStart != NOSELECTION) {
00584 
00585     row = mSelStart/7;
00586     col = mSelStart -row*7;
00587     QColor selcol = KOPrefs::instance()->mHighlightColor;
00588 
00589     if (row == mSelEnd/7) {
00590       // Single row selection
00591       p.fillRect(isRTL ? (7 - (mSelEnd-mSelStart+1) - col)*dwidth : col*dwidth,
00592                   row*dheight, (mSelEnd-mSelStart+1)*dwidth, dheight, selcol);
00593     } else {
00594       // draw first row to the right
00595       p.fillRect(isRTL ? 0 : col*dwidth, row*dheight, (7-col)*dwidth,
00596                  dheight, selcol);
00597       // draw full block till last line
00598       selh = mSelEnd/7-row;
00599       if (selh > 1) {
00600         p.fillRect(0, (row+1)*dheight, 7*dwidth, (selh-1)*dheight,selcol);
00601       }
00602       // draw last block from left to mSelEnd
00603       selw = mSelEnd-7*(mSelEnd/7)+1;
00604       p.fillRect(isRTL ? (7-selw)*dwidth : 0, (row+selh)*dheight,
00605                  selw*dwidth, dheight, selcol);
00606     }
00607   }
00608 
00609   // iterate over all days in the matrix and draw the day label in appropriate colors
00610   QColor actcol = mDefaultTextColorShaded;
00611   p.setPen(actcol);
00612   QPen tmppen;
00613   for(int i = 0; i < NUMDAYS; i++) {
00614     row = i/7;
00615     col = isRTL ? 6-(i-row*7) : i-row*7;
00616 
00617     // if it is the first day of a month switch color from normal to shaded and vice versa
00618     if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) {
00619       if (actcol == mDefaultTextColorShaded) {
00620         actcol = mDefaultTextColor;
00621       } else {
00622         actcol = mDefaultTextColorShaded;
00623       }
00624       p.setPen(actcol);
00625     }
00626 
00627     //Reset pen color after selected days block
00628     if (i == mSelEnd+1) {
00629       p.setPen(actcol);
00630     }
00631 
00632     // if today then draw rectangle around day
00633     if (today == i) {
00634       tmppen = p.pen();
00635       QPen mTodayPen(p.pen());
00636 
00637       mTodayPen.setWidth(mTodayMarginWidth);
00638       //draw red rectangle for holidays
00639       if (!mHolidays[i].isNull()) {
00640         if (actcol == mDefaultTextColor) {
00641           mTodayPen.setColor(KOPrefs::instance()->mHolidayColor);
00642         } else {
00643           mTodayPen.setColor(mHolidayColorShaded);
00644         }
00645       }
00646       //draw gray rectangle for today if in selection
00647       if (i >= mSelStart && i <= mSelEnd) {
00648         QColor grey("grey");
00649         mTodayPen.setColor(grey);
00650       }
00651       p.setPen(mTodayPen);
00652       p.drawRect(col*dwidth, row*dheight, dwidth, dheight);
00653       p.setPen(tmppen);
00654     }
00655 
00656     // if any events are on that day then draw it using a bold font
00657     if (mEvents[i] > 0) {
00658       QFont myFont = font();
00659       myFont.setBold(true);
00660       p.setFont(myFont);
00661     }
00662 
00663     // if it is a holiday then use the default holiday color
00664     if (!mHolidays[i].isNull()) {
00665       if (actcol == mDefaultTextColor) {
00666         p.setPen(KOPrefs::instance()->mHolidayColor);
00667       } else {
00668         p.setPen(mHolidayColorShaded);
00669       }
00670     }
00671 
00672     // draw selected days with special color
00673     // DO NOT specially highlight holidays in selection !
00674     if (i >= mSelStart && i <= mSelEnd) {
00675       p.setPen(mSelectedDaysColor);
00676     }
00677 
00678     p.drawText(col*dwidth, row*dheight, dwidth, dheight,
00679               Qt::AlignHCenter | Qt::AlignVCenter,  daylbls[i]);
00680 
00681     // reset color to actual color
00682     if (!mHolidays[i].isNull()) {
00683       p.setPen(actcol);
00684     }
00685     // reset bold font to plain font
00686     if (mEvents[i] > 0) {
00687       QFont myFont = font();
00688       myFont.setBold(false);
00689       p.setFont(myFont);
00690     }
00691   }
00692 }
00693 
00694 // ----------------------------------------------------------------------------
00695 //  R E SI Z E   E V E N T   H A N D L I N G
00696 // ----------------------------------------------------------------------------
00697 
00698 void KODayMatrix::resizeEvent( QResizeEvent * )
00699 {
00700   QRect sz = frameRect();
00701   daysize.setHeight( sz.height() * 7 / NUMDAYS );
00702   daysize.setWidth( sz.width() / 7 );
00703 }
KDE Logo
This file is part of the documentation for korganizer Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:38:28 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003