summaryrefslogtreecommitdiffabout
path: root/korganizer
authorzautrix <zautrix>2005-03-20 00:09:33 (UTC)
committer zautrix <zautrix>2005-03-20 00:09:33 (UTC)
commit0ef9fe870982bd005806d7f51898a740cd52fec8 (patch) (unidiff)
tree891d95449e3f23159c50d7a38f03006bedfb41be /korganizer
parent84c18843bbd1203878367572d3a6800a0586c7f1 (diff)
downloadkdepimpi-0ef9fe870982bd005806d7f51898a740cd52fec8.zip
kdepimpi-0ef9fe870982bd005806d7f51898a740cd52fec8.tar.gz
kdepimpi-0ef9fe870982bd005806d7f51898a740cd52fec8.tar.bz2
cooooooool
Diffstat (limited to 'korganizer') (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/kodaymatrix.cpp118
-rw-r--r--korganizer/kodaymatrix.h5
2 files changed, 111 insertions, 12 deletions
diff --git a/korganizer/kodaymatrix.cpp b/korganizer/kodaymatrix.cpp
index 17a8546..1cde616 100644
--- a/korganizer/kodaymatrix.cpp
+++ b/korganizer/kodaymatrix.cpp
@@ -1,505 +1,597 @@
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 30
30#include <kglobal.h> 31#include <kglobal.h>
31#include <kdebug.h> 32#include <kdebug.h>
32#include <klocale.h> 33#include <klocale.h>
33 34
34#include <libkcal/vcaldrag.h> 35#include <libkcal/vcaldrag.h>
35#include <libkcal/icaldrag.h> 36#include <libkcal/icaldrag.h>
36#include <libkcal/dndfactory.h> 37#include <libkcal/dndfactory.h>
37#include <libkcal/calendarresources.h> 38#include <libkcal/calendarresources.h>
38#include <libkcal/resourcecalendar.h> 39#include <libkcal/resourcecalendar.h>
39#include <kresources/resourceselectdialog.h> 40#include <kresources/resourceselectdialog.h>
40 41
41#include <kcalendarsystem.h> 42#include <kcalendarsystem.h>
42 43
43#ifndef KORG_NOPLUGINS 44#ifndef KORG_NOPLUGINS
44#include "kocore.h" 45#include "kocore.h"
45#endif 46#endif
46#include "koprefs.h" 47#include "koprefs.h"
47#include "koglobals.h" 48#include "koglobals.h"
48 49
49#include "kodaymatrix.h" 50#include "kodaymatrix.h"
50 51
51// ============================================================================ 52// ============================================================================
52// D Y N A M I C T I P 53// D Y N A M I C T I P
53// ============================================================================ 54// ============================================================================
54 55
55DynamicTip::DynamicTip( QWidget * parent ) 56DynamicTip::DynamicTip( QWidget * parent )
56 : QToolTip( parent ) 57 : QToolTip( parent )
57{ 58{
58 matrix = (KODayMatrix*)parent; 59 matrix = (KODayMatrix*)parent;
59} 60}
60 61
62class KODaymatrixWhatsThis :public QWhatsThis
63{
64public:
65 KODaymatrixWhatsThis( KODayMatrix* view ) : QWhatsThis( view ),_view (view) { };
66
67protected:
68 virtual QString text( const QPoint& p )
69 {
70 return _view->getWhatsThisText( p ) ;
71 }
72private:
73 KODayMatrix * _view;
74};
61 75
62void DynamicTip::maybeTip( const QPoint &pos ) 76void DynamicTip::maybeTip( const QPoint &pos )
63{ 77{
64 //calculate which cell of the matrix the mouse is in 78 //calculate which cell of the matrix the mouse is in
65 QRect sz = matrix->frameRect(); 79 QRect sz = matrix->frameRect();
66 int dheight = sz.height()*7 / 42; 80 int dheight = sz.height()*7 / 42;
67 int dwidth = sz.width() / 7; 81 int dwidth = sz.width() / 7;
68 int row = pos.y()/dheight; 82 int row = pos.y()/dheight;
69 int col = pos.x()/dwidth; 83 int col = pos.x()/dwidth;
70 84
71 QRect rct(col*dwidth, row*dheight, dwidth, dheight); 85 QRect rct(col*dwidth, row*dheight, dwidth, dheight);
72 86
73// kdDebug() << "DynamicTip::maybeTip matrix cell index [" << 87// kdDebug() << "DynamicTip::maybeTip matrix cell index [" <<
74// col << "][" << row << "] => " <<(col+row*7) << endl; 88// col << "][" << row << "] => " <<(col+row*7) << endl;
75 89
76 //show holiday names only 90 //show holiday names only
77 QString str = matrix->getHolidayLabel(col+row*7); 91 QString str = matrix->getHolidayLabel(col+row*7);
78 if (str.isEmpty()) return; 92 if (str.isEmpty()) return;
79 tip(rct, str); 93 tip(rct, str);
80} 94}
81 95
82 96
83// ============================================================================ 97// ============================================================================
84// K O D A Y M A T R I X 98// K O D A Y M A T R I X
85// ============================================================================ 99// ============================================================================
86 100
87const int KODayMatrix::NOSELECTION = -1000; 101const int KODayMatrix::NOSELECTION = -1000;
88const int KODayMatrix::NUMDAYS = 42; 102const int KODayMatrix::NUMDAYS = 42;
89 103
90KODayMatrix::KODayMatrix( QWidget *parent, const char *name ) 104KODayMatrix::KODayMatrix( QWidget *parent, const char *name )
91 : QFrame( parent, name ), mCalendar( 0 ) 105 : QFrame( parent, name ), mCalendar( 0 )
92 106
93#if 0 107#if 0
94KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) : 108KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) :
95 QFrame(parent, name) 109 QFrame(parent, name)
96#endif 110#endif
97{ 111{
98 112 new KODaymatrixWhatsThis(this);
99 mPendingUpdateBeforeRepaint = false; 113 mPendingUpdateBeforeRepaint = false;
100 114 mouseDown = false;
101 // initialize dynamic arrays 115 // initialize dynamic arrays
116 bDays.resize ( NUMDAYS );
102 days = new QDate[NUMDAYS]; 117 days = new QDate[NUMDAYS];
103 daylbls = new QString[NUMDAYS]; 118 daylbls = new QString[NUMDAYS];
104 events = new int[NUMDAYS]; 119 events = new int[NUMDAYS];
105 mToolTip = new DynamicTip(this); 120 mToolTip = new DynamicTip(this);
106 121
107 // set default values used for drawing the matrix 122 // set default values used for drawing the matrix
108 mDefaultBackColor = palette().active().base(); 123 mDefaultBackColor = palette().active().base();
109 mDefaultTextColor = palette().active().foreground(); 124 mDefaultTextColor = palette().active().foreground();
110 mDefaultTextColorShaded = getShadedColor(mDefaultTextColor); 125 mDefaultTextColorShaded = getShadedColor(mDefaultTextColor);
111 mHolidayColorShaded = getShadedColor(KOPrefs::instance()->mHolidayColor); 126 mHolidayColorShaded = getShadedColor(KOPrefs::instance()->mHolidayColor);
112 mSelectedDaysColor = QColor("white"); 127 mSelectedDaysColor = QColor("white");
113 mTodayMarginWidth = 2; 128 mTodayMarginWidth = 2;
114 mSelEnd = mSelStart = NOSELECTION; 129 mSelEnd = mSelStart = NOSELECTION;
115 130
116 setAcceptDrops(true); 131 setAcceptDrops(true);
117 //setFont( QFont("Arial", 10) ); 132 //setFont( QFont("Arial", 10) );
118 133
119 mUpdateTimer = new QTimer( this ); 134 mUpdateTimer = new QTimer( this );
120 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() )); 135 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() ));
121 mRepaintTimer = new QTimer( this ); 136 mRepaintTimer = new QTimer( this );
122 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() )); 137 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() ));
123 mDayChanged = false; 138 mDayChanged = false;
124 updateView(); 139 updateView();
125} 140}
141QString KODayMatrix::getWhatsThisText( QPoint p )
142{
143
144 int tmp = getDayIndexFrom(p.x(), p.y());
145 if ( tmp < 0 || tmp > NUMDAYS-1 || !mCalendar )
146 return QString();
147 QDate mDate = days[tmp];
148 QPtrList<Event> eventlist = mCalendar->events(mDate);
149 Event *event;
150 QStringList mToolTip;
151 for(event=eventlist.first();event != 0;event=eventlist.next()) {
152 QString mToolTipText;
153 QString text;
154 int multiday = 0;// 1 = start, 2 = midddle, 3 = end day
155 if (event->isMultiDay()) {
156 QString prefix = "<->";multiday = 2;
157 QString time;
158 if ( event->doesRecur() ) {
159 if ( event->recursOn( mDate) ) {
160 prefix ="->" ;multiday = 1;
161 }
162 else {
163 int days = event->dtStart().date().daysTo ( event->dtEnd().date() );
164 if ( event->recursOn( mDate.addDays( -days)) ) {
165 prefix ="<-" ;multiday = 3;
166 }
167 }
168 } else {
169 if (mDate == event->dtStart().date()) {
170 prefix ="->" ;multiday = 1;
171 } else if (mDate == event->dtEnd().date()) {
172 prefix ="<-" ;multiday = 3;
173 }
174 }
175 if ( !event->doesFloat() ) {
176 if ( mDate == event->dtStart().date () )
177 time = KGlobal::locale()->formatTime(event->dtStart().time())+" ";
178 else if ( mDate == event->dtEnd().date () )
179 time = KGlobal::locale()->formatTime(event->dtEnd().time())+" ";
180
181 }
182 text = time + event->summary();
183 mToolTipText += prefix + text;
184 } else {
185 if (event->doesFloat()) {
186 text = event->summary();
187 mToolTipText += text;
188 }
189 else {
190 text = KGlobal::locale()->formatTime(event->dtStart().time());
191 text += " " + event->summary();
192 mToolTipText += KGlobal::locale()->formatTime(event->dtStart().time()) +"-"+KGlobal::locale()->formatTime(event->dtEnd().time())+" " + event->summary();
193 }
194 }
195 mToolTip.append( mToolTipText );
196 }
197 mToolTip.sort();
198 return "<b>"+KGlobal::locale()->formatDate(days[tmp]) + "</b><br>" + mToolTip.join("<br>");
199}
126void KODayMatrix::setCalendar( Calendar *cal ) 200void KODayMatrix::setCalendar( Calendar *cal )
127{ 201{
128 mCalendar = cal; 202 mCalendar = cal;
129 203
130 setAcceptDrops( mCalendar ); 204 setAcceptDrops( mCalendar );
131 205
132 updateEvents(); 206 updateEvents();
133} 207}
134 208
135QColor KODayMatrix::getShadedColor(QColor color) 209QColor KODayMatrix::getShadedColor(QColor color)
136{ 210{
137 QColor shaded; 211 QColor shaded;
138 int h=0; 212 int h=0;
139 int s=0; 213 int s=0;
140 int v=0; 214 int v=0;
141 color.hsv(&h,&s,&v); 215 color.hsv(&h,&s,&v);
142 s = s/4; 216 s = s/4;
143 v = 192+v/4; 217 v = 192+v/4;
144 shaded.setHsv(h,s,v); 218 shaded.setHsv(h,s,v);
145 219
146 return shaded; 220 return shaded;
147} 221}
148 222
149KODayMatrix::~KODayMatrix() 223KODayMatrix::~KODayMatrix()
150{ 224{
151 delete [] days; 225 delete [] days;
152 delete [] daylbls; 226 delete [] daylbls;
153 delete [] events; 227 delete [] events;
154 delete mToolTip; 228 delete mToolTip;
155} 229}
156 230
157/* 231/*
158void KODayMatrix::setStartDate(QDate start) 232void KODayMatrix::setStartDate(QDate start)
159{ 233{
160 updateView(start); 234 updateView(start);
161} 235}
162*/ 236*/
163 237
164void KODayMatrix::addSelectedDaysTo(DateList& selDays) 238void KODayMatrix::addSelectedDaysTo(DateList& selDays)
165{ 239{
166 240
167 if (mSelStart == NOSELECTION) { 241 if (mSelStart == NOSELECTION) {
168 return; 242 return;
169 } 243 }
170 244
171 //cope with selection being out of matrix limits at top (< 0) 245 //cope with selection being out of matrix limits at top (< 0)
172 int i0 = mSelStart; 246 int i0 = mSelStart;
173 if (i0 < 0) { 247 if (i0 < 0) {
174 for (int i = i0; i < 0; i++) { 248 for (int i = i0; i < 0; i++) {
175 selDays.append(days[0].addDays(i)); 249 selDays.append(days[0].addDays(i));
176 } 250 }
177 i0 = 0; 251 i0 = 0;
178 } 252 }
179 253
180 //cope with selection being out of matrix limits at bottom (> NUMDAYS-1) 254 //cope with selection being out of matrix limits at bottom (> NUMDAYS-1)
181 if (mSelEnd > NUMDAYS-1) { 255 if (mSelEnd > NUMDAYS-1) {
182 for (int i = i0; i <= NUMDAYS-1; i++) { 256 for (int i = i0; i <= NUMDAYS-1; i++) {
183 selDays.append(days[i]); 257 selDays.append(days[i]);
184 } 258 }
185 for (int i = NUMDAYS; i < mSelEnd; i++) { 259 for (int i = NUMDAYS; i < mSelEnd; i++) {
186 selDays.append(days[0].addDays(i)); 260 selDays.append(days[0].addDays(i));
187 } 261 }
188 262
189 // apply normal routine to selection being entirely within matrix limits 263 // apply normal routine to selection being entirely within matrix limits
190 } else { 264 } else {
191 for (int i = i0; i <= mSelEnd; i++) { 265 for (int i = i0; i <= mSelEnd; i++) {
192 selDays.append(days[i]); 266 selDays.append(days[i]);
193 } 267 }
194 } 268 }
195} 269}
196 270
197void KODayMatrix::setSelectedDaysFrom(const QDate& start, const QDate& end) 271void KODayMatrix::setSelectedDaysFrom(const QDate& start, const QDate& end)
198{ 272{
199 mSelStart = startdate.daysTo(start); 273 mSelStart = startdate.daysTo(start);
200 mSelEnd = startdate.daysTo(end); 274 mSelEnd = startdate.daysTo(end);
201} 275}
202void KODayMatrix::clearSelection() 276void KODayMatrix::clearSelection()
203{ 277{
204 mSelEnd = mSelStart = NOSELECTION; 278 mSelEnd = mSelStart = NOSELECTION;
205} 279}
206 280
207 281
208void KODayMatrix::recalculateToday() 282void KODayMatrix::recalculateToday()
209{ 283{
210 today = -1; 284 today = -1;
211 for (int i=0; i<NUMDAYS; i++) { 285 for (int i=0; i<NUMDAYS; i++) {
212 events[i] = 0; 286 events[i] = 0;
213 days[i] = startdate.addDays(i); 287 days[i] = startdate.addDays(i);
214 daylbls[i] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] )); 288 daylbls[i] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] ));
215 289
216 // if today is in the currently displayed month, hilight today 290 // if today is in the currently displayed month, hilight today
217 if (days[i].year() == QDate::currentDate().year() && 291 if (days[i].year() == QDate::currentDate().year() &&
218 days[i].month() == QDate::currentDate().month() && 292 days[i].month() == QDate::currentDate().month() &&
219 days[i].day() == QDate::currentDate().day()) { 293 days[i].day() == QDate::currentDate().day()) {
220 today = i; 294 today = i;
221 } 295 }
222 } 296 }
223 // qDebug(QString("Today is visible at %1.").arg(today)); 297 // qDebug(QString("Today is visible at %1.").arg(today));
224} 298}
225 299
226void KODayMatrix::updateView() 300void KODayMatrix::updateView()
227{ 301{
228 updateView(startdate); 302 updateView(startdate);
229} 303}
230void KODayMatrix::repaintViewTimed() 304void KODayMatrix::repaintViewTimed()
231{ 305{
232 mRepaintTimer->stop(); 306 mRepaintTimer->stop();
233 repaint(false); 307 repaint(false);
234} 308}
235void KODayMatrix::updateViewTimed() 309void KODayMatrix::updateViewTimed()
236{ 310{
237 mUpdateTimer->stop(); 311 mUpdateTimer->stop();
238 if ( !mCalendar ) { 312 if ( !mCalendar ) {
239 qDebug("NOT CAL "); 313 qDebug("NOT CAL ");
240 return; 314 return;
241 } 315 }
242 //qDebug("KODayMatrix::updateViewTimed "); 316 //qDebug("KODayMatrix::updateViewTimed ");
243 for(int i = 0; i < NUMDAYS; i++) { 317 for(int i = 0; i < NUMDAYS; i++) {
244 // if events are set for the day then remember to draw it bold 318 // if events are set for the day then remember to draw it bold
245 QPtrList<Event> eventlist = mCalendar->events(days[i]); 319 QPtrList<Event> eventlist = mCalendar->events(days[i]);
246 Event *event; 320 Event *event;
247 int numEvents = eventlist.count(); 321 int numEvents = eventlist.count();
248 QString holiStr = ""; 322 QString holiStr = "";
323 bDays.clearBit(i);
249 for(event=eventlist.first();event != 0;event=eventlist.next()) { 324 for(event=eventlist.first();event != 0;event=eventlist.next()) {
250 ushort recurType = event->recurrence()->doesRecur(); 325 ushort recurType = event->recurrence()->doesRecur();
251 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) || 326 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) ||
252 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) { 327 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) {
253 numEvents--; 328 numEvents--;
254 } 329 }
255 if ( event->categories().contains( i18n("Holiday") ) || event->categories().contains( "Holiday" )) { 330 if ( event->categories().contains( i18n("Holiday") ) || event->categories().contains( "Holiday" )) {
256 if ( !holiStr.isEmpty() ) 331 if ( !holiStr.isEmpty() )
257 holiStr += "\n"; 332 holiStr += "\n";
258 holiStr += event->summary(); 333 holiStr += event->summary();
259 } 334 }
335 if ( event->categories().contains( i18n("Birthday") ) || event->categories().contains( "Birthday" )) {
336 if ( !holiStr.isEmpty() )
337 holiStr += "\n";
338 holiStr += event->summary();
339 bDays.setBit(i);
340 }
260 } 341 }
261 events[i] = numEvents; 342 events[i] = numEvents;
262 //if it is a holy day then draw it red. Sundays are consider holidays, too 343 //if it is a holy day then draw it red. Sundays are consider holidays, too
263 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) || 344 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) ||
264 !holiStr.isEmpty()) { 345 !holiStr.isEmpty()) {
265 mHolidays[i] = holiStr; 346 mHolidays[i] = holiStr;
266 } else { 347 } else {
267 mHolidays[i] = QString::null; 348 mHolidays[i] = QString::null;
268 } 349 }
269 } 350 }
270 if ( ! mPendingUpdateBeforeRepaint ) 351 if ( ! mPendingUpdateBeforeRepaint )
271 repaint(false); 352 repaint(false);
272} 353}
273void KODayMatrix::updateView(QDate actdate) 354void KODayMatrix::updateView(QDate actdate)
274{ 355{
275 356
276 if ( ! actdate.isValid() ) { 357 if ( ! actdate.isValid() ) {
277 //qDebug("date not valid "); 358 //qDebug("date not valid ");
278 return; 359 return;
279 } 360 }
280 mDayChanged = false; 361 mDayChanged = false;
281 //flag to indicate if the starting day of the matrix has changed by this call 362 //flag to indicate if the starting day of the matrix has changed by this call
282 //mDayChanged = false; 363 //mDayChanged = false;
283 // if a new startdate is to be set then apply Cornelius's calculation 364 // if a new startdate is to be set then apply Cornelius's calculation
284 // of the first day to be shown 365 // of the first day to be shown
285 if (actdate != startdate) { 366 if (actdate != startdate) {
286 // reset index of selection according to shift of starting date from startdate to actdate 367 // reset index of selection according to shift of starting date from startdate to actdate
287 if (mSelStart != NOSELECTION) { 368 if (mSelStart != NOSELECTION) {
288 int tmp = actdate.daysTo(startdate); 369 int tmp = actdate.daysTo(startdate);
289 //kdDebug() << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl; 370 //kdDebug() << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl;
290 // shift selection if new one would be visible at least partly ! 371 // shift selection if new one would be visible at least partly !
291 372
292 if (mSelStart+tmp < NUMDAYS && mSelEnd+tmp >= 0) { 373 if (mSelStart+tmp < NUMDAYS && mSelEnd+tmp >= 0) {
293 // nested if is required for next X display pushed from a different month - correction required 374 // nested if is required for next X display pushed from a different month - correction required
294 // otherwise, for month forward and backward, it must be avoided 375 // otherwise, for month forward and backward, it must be avoided
295 if( mSelStart > NUMDAYS || mSelStart < 0 ) 376 if( mSelStart > NUMDAYS || mSelStart < 0 )
296 mSelStart = mSelStart + tmp; 377 mSelStart = mSelStart + tmp;
297 if( mSelEnd > NUMDAYS || mSelEnd < 0 ) 378 if( mSelEnd > NUMDAYS || mSelEnd < 0 )
298 mSelEnd = mSelEnd + tmp; 379 mSelEnd = mSelEnd + tmp;
299 } 380 }
300 } 381 }
301 startdate = actdate; 382 startdate = actdate;
302 mDayChanged = true; 383 mDayChanged = true;
303 recalculateToday(); 384 recalculateToday();
304 } 385 }
305 //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() ); 386 //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() );
306 if ( !isVisible() ) { 387 if ( !isVisible() ) {
307 mPendingUpdateBeforeRepaint = true; 388 mPendingUpdateBeforeRepaint = true;
308 } else { 389 } else {
309#ifdef DESKTOP_VERSION 390#ifdef DESKTOP_VERSION
310 //mRepaintTimer->start( 250 ); 391 //mRepaintTimer->start( 150 );
311 mUpdateTimer->start( 250 ); 392 mUpdateTimer->start( 150 );
312#else 393#else
313 mRepaintTimer->start( 350 ); 394 mRepaintTimer->start( 350 );
314 mUpdateTimer->start( 2000 ); 395 mUpdateTimer->start( 1200 );
315#endif 396#endif
316 } 397 }
317} 398}
318void KODayMatrix::updateEvents() 399void KODayMatrix::updateEvents()
319{ 400{
320 if ( !mCalendar ) return; 401 if ( !mCalendar ) return;
321 402
322 for( int i = 0; i < NUMDAYS; i++ ) { 403 for( int i = 0; i < NUMDAYS; i++ ) {
323 // if events are set for the day then remember to draw it bold 404 // if events are set for the day then remember to draw it bold
324 QPtrList<Event> eventlist = mCalendar->events( days[ i ] ); 405 QPtrList<Event> eventlist = mCalendar->events( days[ i ] );
325 int numEvents = eventlist.count(); 406 int numEvents = eventlist.count();
326 Event *event; 407 Event *event;
327 for( event = eventlist.first(); event != 0;event=eventlist.next()) { 408 for( event = eventlist.first(); event != 0;event=eventlist.next()) {
328 ushort recurType = event->doesRecur(); 409 ushort recurType = event->doesRecur();
329 410
330 if ( ( recurType == Recurrence::rDaily && 411 if ( ( recurType == Recurrence::rDaily &&
331 !KOPrefs::instance()->mDailyRecur ) || 412 !KOPrefs::instance()->mDailyRecur ) ||
332 ( recurType == Recurrence::rWeekly && 413 ( recurType == Recurrence::rWeekly &&
333 !KOPrefs::instance()->mWeeklyRecur ) ) { 414 !KOPrefs::instance()->mWeeklyRecur ) ) {
334 numEvents--; 415 numEvents--;
335 } 416 }
336 } 417 }
337 events[ i ] = numEvents; 418 events[ i ] = numEvents;
338 } 419 }
339} 420}
340 421
341const QDate& KODayMatrix::getDate(int offset) 422const QDate& KODayMatrix::getDate(int offset)
342{ 423{
343 if (offset < 0 || offset > NUMDAYS-1) { 424 if (offset < 0 || offset > NUMDAYS-1) {
344 qDebug("Wrong offset2 "); 425 qDebug("Wrong offset2 ");
345 return days[0]; 426 return days[0];
346 } 427 }
347 return days[offset]; 428 return days[offset];
348} 429}
349 430
350QString KODayMatrix::getHolidayLabel(int offset) 431QString KODayMatrix::getHolidayLabel(int offset)
351{ 432{
352 if (offset < 0 || offset > NUMDAYS-1) { 433 if (offset < 0 || offset > NUMDAYS-1) {
353 qDebug("Wrong offset1 "); 434 qDebug("Wrong offset1 ");
354 return 0; 435 return 0;
355 } 436 }
356 return mHolidays[offset]; 437 return mHolidays[offset];
357} 438}
358 439
359int KODayMatrix::getDayIndexFrom(int x, int y) 440int KODayMatrix::getDayIndexFrom(int x, int y)
360{ 441{
361 return 7*(y/daysize.height()) + (KOGlobals::self()->reverseLayout() ? 442 return 7*(y/daysize.height()) + (KOGlobals::self()->reverseLayout() ?
362 6 - x/daysize.width() : x/daysize.width()); 443 6 - x/daysize.width() : x/daysize.width());
363} 444}
364 445
365// ---------------------------------------------------------------------------- 446// ----------------------------------------------------------------------------
366// M O U S E E V E N T H A N D L I N G 447// M O U S E E V E N T H A N D L I N G
367// ---------------------------------------------------------------------------- 448// ----------------------------------------------------------------------------
368 449
369void KODayMatrix::mousePressEvent (QMouseEvent* e) 450void KODayMatrix::mousePressEvent (QMouseEvent* e)
370{ 451{
452
453 if ( e->button() == LeftButton )
454 mouseDown = true;
371 mSelStart = getDayIndexFrom(e->x(), e->y()); 455 mSelStart = getDayIndexFrom(e->x(), e->y());
372 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1; 456 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1;
373 mSelInit = mSelStart; 457 mSelInit = mSelStart;
374} 458}
375 459
376void KODayMatrix::mouseReleaseEvent (QMouseEvent* e) 460void KODayMatrix::mouseReleaseEvent (QMouseEvent* e)
377{ 461{
378 462 if ( e->button() == LeftButton )
463 if ( ! mouseDown ) {
464 return;
465 }
466 else
467 mouseDown = false;
379 int tmp = getDayIndexFrom(e->x(), e->y()); 468 int tmp = getDayIndexFrom(e->x(), e->y());
380 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 469 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
381 470
382 if (mSelInit > tmp) { 471 if (mSelInit > tmp) {
383 mSelEnd = mSelInit; 472 mSelEnd = mSelInit;
384 if (tmp != mSelStart) { 473 if (tmp != mSelStart) {
385 mSelStart = tmp; 474 mSelStart = tmp;
386 repaint(false); 475 repaint(false);
387 } 476 }
388 } else { 477 } else {
389 mSelStart = mSelInit; 478 mSelStart = mSelInit;
390 479
391 //repaint only if selection has changed 480 //repaint only if selection has changed
392 if (tmp != mSelEnd) { 481 if (tmp != mSelEnd) {
393 mSelEnd = tmp; 482 mSelEnd = tmp;
394 repaint(false); 483 repaint(false);
395 } 484 }
396 } 485 }
397 486
398 DateList daylist; 487 DateList daylist;
399 if ( mSelStart < 0 ) 488 if ( mSelStart < 0 )
400 mSelStart = 0; 489 mSelStart = 0;
401 for (int i = mSelStart; i <= mSelEnd; i++) { 490 for (int i = mSelStart; i <= mSelEnd; i++) {
402 daylist.append(days[i]); 491 daylist.append(days[i]);
403 } 492 }
404 emit selected((const DateList)daylist); 493 emit selected((const DateList)daylist);
405 494
406} 495}
407 496
408void KODayMatrix::mouseMoveEvent (QMouseEvent* e) 497void KODayMatrix::mouseMoveEvent (QMouseEvent* e)
409{ 498{
499 if ( ! mouseDown ) {
500 return;
501 }
410 int tmp = getDayIndexFrom(e->x(), e->y()); 502 int tmp = getDayIndexFrom(e->x(), e->y());
411 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 503 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
412 504
413 if (mSelInit > tmp) { 505 if (mSelInit > tmp) {
414 mSelEnd = mSelInit; 506 mSelEnd = mSelInit;
415 if (tmp != mSelStart) { 507 if (tmp != mSelStart) {
416 mSelStart = tmp; 508 mSelStart = tmp;
417 repaint(false); 509 repaint(false);
418 } 510 }
419 } else { 511 } else {
420 mSelStart = mSelInit; 512 mSelStart = mSelInit;
421 513
422 //repaint only if selection has changed 514 //repaint only if selection has changed
423 if (tmp != mSelEnd) { 515 if (tmp != mSelEnd) {
424 mSelEnd = tmp; 516 mSelEnd = tmp;
425 repaint(false); 517 repaint(false);
426 } 518 }
427 } 519 }
428} 520}
429 521
430// ---------------------------------------------------------------------------- 522// ----------------------------------------------------------------------------
431// D R A G ' N D R O P H A N D L I N G 523// D R A G ' N D R O P H A N D L I N G
432// ---------------------------------------------------------------------------- 524// ----------------------------------------------------------------------------
433 525
434void KODayMatrix::dragEnterEvent(QDragEnterEvent *e) 526void KODayMatrix::dragEnterEvent(QDragEnterEvent *e)
435{ 527{
436#ifndef KORG_NODND 528#ifndef KORG_NODND
437 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 529 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
438 e->ignore(); 530 e->ignore();
439 return; 531 return;
440 } 532 }
441 533
442 // some visual feedback 534 // some visual feedback
443// oldPalette = palette(); 535// oldPalette = palette();
444// setPalette(my_HilitePalette); 536// setPalette(my_HilitePalette);
445// update(); 537// update();
446#endif 538#endif
447} 539}
448 540
449void KODayMatrix::dragMoveEvent(QDragMoveEvent *e) 541void KODayMatrix::dragMoveEvent(QDragMoveEvent *e)
450{ 542{
451#ifndef KORG_NODND 543#ifndef KORG_NODND
452 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 544 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
453 e->ignore(); 545 e->ignore();
454 return; 546 return;
455 } 547 }
456 548
457 e->accept(); 549 e->accept();
458#endif 550#endif
459} 551}
460 552
461void KODayMatrix::dragLeaveEvent(QDragLeaveEvent */*dl*/) 553void KODayMatrix::dragLeaveEvent(QDragLeaveEvent */*dl*/)
462{ 554{
463#ifndef KORG_NODND 555#ifndef KORG_NODND
464// setPalette(oldPalette); 556// setPalette(oldPalette);
465// update(); 557// update();
466#endif 558#endif
467} 559}
468 560
469void KODayMatrix::dropEvent(QDropEvent *e) 561void KODayMatrix::dropEvent(QDropEvent *e)
470{ 562{
471#ifndef KORG_NODND 563#ifndef KORG_NODND
472// kdDebug() << "KODayMatrix::dropEvent(e) begin" << endl; 564// kdDebug() << "KODayMatrix::dropEvent(e) begin" << endl;
473 565
474 if (!mCalendar || !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 566 if (!mCalendar || !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
475 e->ignore(); 567 e->ignore();
476 return; 568 return;
477 } 569 }
478 570
479 DndFactory factory( mCalendar ); 571 DndFactory factory( mCalendar );
480 Event *event = factory.createDrop(e); 572 Event *event = factory.createDrop(e);
481 573
482 if (event) { 574 if (event) {
483 e->acceptAction(); 575 e->acceptAction();
484 576
485 Event *existingEvent = mCalendar->event(event->uid()); 577 Event *existingEvent = mCalendar->event(event->uid());
486 578
487 if(existingEvent) { 579 if(existingEvent) {
488 // uniquify event 580 // uniquify event
489 event->recreate(); 581 event->recreate();
490/* 582/*
491 KMessageBox::sorry(this, 583 KMessageBox::sorry(this,
492 i18n("Event already exists in this calendar."), 584 i18n("Event already exists in this calendar."),
493 i18n("Drop Event")); 585 i18n("Drop Event"));
494 delete event; 586 delete event;
495 return; 587 return;
496*/ 588*/
497 } 589 }
498// kdDebug() << "Drop new Event" << endl; 590// kdDebug() << "Drop new Event" << endl;
499 // Adjust date 591 // Adjust date
500 QDateTime start = event->dtStart(); 592 QDateTime start = event->dtStart();
501 QDateTime end = event->dtEnd(); 593 QDateTime end = event->dtEnd();
502 int duration = start.daysTo(end); 594 int duration = start.daysTo(end);
503 int idx = getDayIndexFrom(e->pos().x(), e->pos().y()); 595 int idx = getDayIndexFrom(e->pos().x(), e->pos().y());
504 596
505 start.setDate(days[idx]); 597 start.setDate(days[idx]);
@@ -537,136 +629,140 @@ void KODayMatrix::paintEvent(QPaintEvent * pevent)
537 629
538 QRect sz = frameRect(); 630 QRect sz = frameRect();
539 int dheight = daysize.height(); 631 int dheight = daysize.height();
540 int dwidth = daysize.width(); 632 int dwidth = daysize.width();
541 int row,col; 633 int row,col;
542 int selw, selh; 634 int selw, selh;
543 bool isRTL = KOGlobals::self()->reverseLayout(); 635 bool isRTL = KOGlobals::self()->reverseLayout();
544 636
545 // draw background and topleft frame 637 // draw background and topleft frame
546 p.fillRect(pevent->rect(), mDefaultBackColor); 638 p.fillRect(pevent->rect(), mDefaultBackColor);
547 p.setPen(mDefaultTextColor); 639 p.setPen(mDefaultTextColor);
548 p.drawRect(0, 0, sz.width()+1, sz.height()+1); 640 p.drawRect(0, 0, sz.width()+1, sz.height()+1);
549 641
550 // draw selected days with highlighted background color 642 // draw selected days with highlighted background color
551 if (mSelStart != NOSELECTION) { 643 if (mSelStart != NOSELECTION) {
552 644
553 row = mSelStart/7; 645 row = mSelStart/7;
554 col = mSelStart -row*7; 646 col = mSelStart -row*7;
555 QColor selcol = KOPrefs::instance()->mHighlightColor; 647 QColor selcol = KOPrefs::instance()->mHighlightColor;
556 648
557 if (row == mSelEnd/7) { 649 if (row == mSelEnd/7) {
558 // Single row selection 650 // Single row selection
559 p.fillRect(isRTL ? (7 - (mSelEnd-mSelStart+1) - col)*dwidth : col*dwidth, 651 p.fillRect(isRTL ? (7 - (mSelEnd-mSelStart+1) - col)*dwidth : col*dwidth,
560 row*dheight, (mSelEnd-mSelStart+1)*dwidth, dheight, selcol); 652 row*dheight, (mSelEnd-mSelStart+1)*dwidth, dheight, selcol);
561 } else { 653 } else {
562 // draw first row to the right 654 // draw first row to the right
563 p.fillRect(isRTL ? 0 : col*dwidth, row*dheight, (7-col)*dwidth, 655 p.fillRect(isRTL ? 0 : col*dwidth, row*dheight, (7-col)*dwidth,
564 dheight, selcol); 656 dheight, selcol);
565 // draw full block till last line 657 // draw full block till last line
566 selh = mSelEnd/7-row; 658 selh = mSelEnd/7-row;
567 if (selh > 1) { 659 if (selh > 1) {
568 p.fillRect(0, (row+1)*dheight, 7*dwidth, (selh-1)*dheight,selcol); 660 p.fillRect(0, (row+1)*dheight, 7*dwidth, (selh-1)*dheight,selcol);
569 } 661 }
570 // draw last block from left to mSelEnd 662 // draw last block from left to mSelEnd
571 selw = mSelEnd-7*(mSelEnd/7)+1; 663 selw = mSelEnd-7*(mSelEnd/7)+1;
572 p.fillRect(isRTL ? (7-selw)*dwidth : 0, (row+selh)*dheight, 664 p.fillRect(isRTL ? (7-selw)*dwidth : 0, (row+selh)*dheight,
573 selw*dwidth, dheight, selcol); 665 selw*dwidth, dheight, selcol);
574 } 666 }
575 } 667 }
576 668
577 // iterate over all days in the matrix and draw the day label in appropriate colors 669 // iterate over all days in the matrix and draw the day label in appropriate colors
578 QColor actcol = mDefaultTextColorShaded; 670 QColor actcol = mDefaultTextColorShaded;
579 p.setPen(actcol); 671 p.setPen(actcol);
580 QPen tmppen; 672 QPen tmppen;
581 for(int i = 0; i < NUMDAYS; i++) { 673 for(int i = 0; i < NUMDAYS; i++) {
582 row = i/7; 674 row = i/7;
583 col = isRTL ? 6-(i-row*7) : i-row*7; 675 col = isRTL ? 6-(i-row*7) : i-row*7;
584 676
585 // if it is the first day of a month switch color from normal to shaded and vice versa 677 // if it is the first day of a month switch color from normal to shaded and vice versa
586 if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) { 678 if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) {
587 if (actcol == mDefaultTextColorShaded) { 679 if (actcol == mDefaultTextColorShaded) {
588 actcol = mDefaultTextColor; 680 actcol = mDefaultTextColor;
589 } else { 681 } else {
590 actcol = mDefaultTextColorShaded; 682 actcol = mDefaultTextColorShaded;
591 } 683 }
592 p.setPen(actcol); 684 p.setPen(actcol);
593 } 685 }
594 686
595 //Reset pen color after selected days block 687 //Reset pen color after selected days block
596 if (i == mSelEnd+1) { 688 if (i == mSelEnd+1) {
597 p.setPen(actcol); 689 p.setPen(actcol);
598 } 690 }
599 691
600 // if today then draw rectangle around day 692 // if today then draw rectangle around day
601 if (today == i) { 693 if (today == i) {
602 tmppen = p.pen(); 694 tmppen = p.pen();
603 QPen mTodayPen(p.pen()); 695 QPen mTodayPen(p.pen());
604 696
605 mTodayPen.setWidth(mTodayMarginWidth); 697 mTodayPen.setWidth(mTodayMarginWidth);
606 //draw red rectangle for holidays 698 //draw red rectangle for holidays
607 if (!mHolidays[i].isNull()) { 699 if (!mHolidays[i].isNull()) {
608 if (actcol == mDefaultTextColor) { 700 if (actcol == mDefaultTextColor) {
609 mTodayPen.setColor(KOPrefs::instance()->mHolidayColor); 701 mTodayPen.setColor(KOPrefs::instance()->mHolidayColor);
610 } else { 702 } else {
611 mTodayPen.setColor(mHolidayColorShaded); 703 mTodayPen.setColor(mHolidayColorShaded);
612 } 704 }
613 } 705 }
614 //draw gray rectangle for today if in selection 706 //draw gray rectangle for today if in selection
615 if (i >= mSelStart && i <= mSelEnd) { 707 if (i >= mSelStart && i <= mSelEnd) {
616 QColor grey("grey"); 708 QColor grey("grey");
617 mTodayPen.setColor(grey); 709 mTodayPen.setColor(grey);
618 } 710 }
619 p.setPen(mTodayPen); 711 p.setPen(mTodayPen);
620 p.drawRect(col*dwidth, row*dheight, dwidth, dheight); 712 p.drawRect(col*dwidth, row*dheight, dwidth, dheight);
621 p.setPen(tmppen); 713 p.setPen(tmppen);
622 } 714 }
623 715
624 // if any events are on that day then draw it using a bold font 716 // if any events are on that day then draw it using a bold font
625 if (events[i] > 0) { 717 if (events[i] > 0) {
626 QFont myFont = font(); 718 QFont myFont = font();
627 myFont.setBold(true); 719 myFont.setBold(true);
628 p.setFont(myFont); 720 p.setFont(myFont);
629 } 721 }
630 722
631 // if it is a holiday then use the default holiday color 723 // if it is a holiday then use the default holiday color
632 if (!mHolidays[i].isNull()) { 724 if (!mHolidays[i].isNull()) {
633 if (actcol == mDefaultTextColor) { 725 if ( bDays.testBit(i) ) {
634 p.setPen(KOPrefs::instance()->mHolidayColor); 726 p.setPen(Qt::green);
635 } else { 727 } else {
636 p.setPen(mHolidayColorShaded); 728 if (actcol == mDefaultTextColor) {
729 p.setPen(KOPrefs::instance()->mHolidayColor);
730 } else {
731 p.setPen(mHolidayColorShaded);
732 }
637 } 733 }
638 } 734 }
639 735
640 // draw selected days with special color 736 // draw selected days with special color
641 // DO NOT specially highlight holidays in selection ! 737 // DO NOT specially highlight holidays in selection !
642 if (i >= mSelStart && i <= mSelEnd) { 738 if (i >= mSelStart && i <= mSelEnd) {
643 p.setPen(mSelectedDaysColor); 739 ;//p.setPen(mSelectedDaysColor);
644 } 740 }
645 741
646 p.drawText(col*dwidth, row*dheight, dwidth, dheight, 742 p.drawText(col*dwidth, row*dheight, dwidth, dheight,
647 Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]); 743 Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]);
648 744
649 // reset color to actual color 745 // reset color to actual color
650 if (!mHolidays[i].isNull()) { 746 if (!mHolidays[i].isNull()) {
651 p.setPen(actcol); 747 p.setPen(actcol);
652 } 748 }
653 // reset bold font to plain font 749 // reset bold font to plain font
654 if (events[i] > 0) { 750 if (events[i] > 0) {
655 QFont myFont = font(); 751 QFont myFont = font();
656 myFont.setBold(false); 752 myFont.setBold(false);
657 p.setFont(myFont); 753 p.setFont(myFont);
658 } 754 }
659 } 755 }
660 bitBlt (this, 0, 0, &myPix, 0 ,0,width(), height() ,CopyROP); 756 bitBlt (this, 0, 0, &myPix, 0 ,0,width(), height() ,CopyROP);
661} 757}
662 758
663// ---------------------------------------------------------------------------- 759// ----------------------------------------------------------------------------
664// R E SI Z E E V E N T H A N D L I N G 760// R E SI Z E E V E N T H A N D L I N G
665// ---------------------------------------------------------------------------- 761// ----------------------------------------------------------------------------
666 762
667void KODayMatrix::resizeEvent(QResizeEvent *) 763void KODayMatrix::resizeEvent(QResizeEvent *)
668{ 764{
669 QRect sz = frameRect(); 765 QRect sz = frameRect();
670 daysize.setHeight(sz.height()*7 / NUMDAYS); 766 daysize.setHeight(sz.height()*7 / NUMDAYS);
671 daysize.setWidth(sz.width() / 7); 767 daysize.setWidth(sz.width() / 7);
672} 768}
diff --git a/korganizer/kodaymatrix.h b/korganizer/kodaymatrix.h
index ba4853f..c049942 100644
--- a/korganizer/kodaymatrix.h
+++ b/korganizer/kodaymatrix.h
@@ -1,318 +1,321 @@
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 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 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23#ifndef _KODAYMAT_H 23#ifndef _KODAYMAT_H
24#define _KODAYMAT_H 24#define _KODAYMAT_H
25 25
26#include <libkcal/calendar.h> 26#include <libkcal/calendar.h>
27 27
28#include <qstring.h> 28#include <qstring.h>
29#include <qframe.h> 29#include <qframe.h>
30#include <qcolor.h> 30#include <qcolor.h>
31#include <qpen.h> 31#include <qpen.h>
32#include <qdatetime.h> 32#include <qdatetime.h>
33#include <qtooltip.h> 33#include <qtooltip.h>
34#include <qpixmap.h> 34#include <qpixmap.h>
35 35#include <qbitarray.h>
36#include <qmap.h> 36#include <qmap.h>
37 37
38class QDragEnterEvent; 38class QDragEnterEvent;
39class QDragMoveEvent; 39class QDragMoveEvent;
40class QDragLeaveEvent; 40class QDragLeaveEvent;
41class QDropEvent; 41class QDropEvent;
42 42
43class KODayMatrix; 43class KODayMatrix;
44 44
45using namespace KCal; 45using namespace KCal;
46 46
47 47
48/** 48/**
49 * small helper class to dynamically show tooltips inside the day matrix. 49 * small helper class to dynamically show tooltips inside the day matrix.
50 * This class asks the day matrix object for a appropriate label which 50 * This class asks the day matrix object for a appropriate label which
51 * is in our special case the name of the holiday or null if this day is no holiday. 51 * is in our special case the name of the holiday or null if this day is no holiday.
52 */ 52 */
53class DynamicTip : public QToolTip 53class DynamicTip : public QToolTip
54{ 54{
55public: 55public:
56 56
57 /** 57 /**
58 * Constructor that expects a KODayMatrix object as parent. 58 * Constructor that expects a KODayMatrix object as parent.
59 * 59 *
60 * @param parent the parent KODayMatrix control. 60 * @param parent the parent KODayMatrix control.
61 */ 61 */
62 DynamicTip(QWidget* parent ); 62 DynamicTip(QWidget* parent );
63 63
64protected: 64protected:
65 65
66 /** 66 /**
67 * Qt's callback to ask the object to provide an approrpiate text for the 67 * Qt's callback to ask the object to provide an approrpiate text for the
68 * tooltip to be shown. 68 * tooltip to be shown.
69 * 69 *
70 * @param pos coordinates of the mouse. 70 * @param pos coordinates of the mouse.
71 */ 71 */
72 void maybeTip( const QPoint & pos); 72 void maybeTip( const QPoint & pos);
73 73
74private: 74private:
75 75
76 /** the parent control this tooltip is designed for. */ 76 /** the parent control this tooltip is designed for. */
77 KODayMatrix* matrix; 77 KODayMatrix* matrix;
78}; 78};
79 79
80/** 80/**
81 * replacement for kdpdatebuton.cpp that used 42 widgets for the day matrix to be displayed. 81 * replacement for kdpdatebuton.cpp that used 42 widgets for the day matrix to be displayed.
82 * Cornelius thought this was a waste of memory and a lot of overhead. 82 * Cornelius thought this was a waste of memory and a lot of overhead.
83 * In addition the selection was not very intuitive so I decided to rewrite it using a QFrame 83 * In addition the selection was not very intuitive so I decided to rewrite it using a QFrame
84 * that draws the labels and allows for dragging selection while maintaining nearly full 84 * that draws the labels and allows for dragging selection while maintaining nearly full
85 * compatibility in behaviour with its predecessor. 85 * compatibility in behaviour with its predecessor.
86 * 86 *
87 * The following functionality has been changed: 87 * The following functionality has been changed:
88 * 88 *
89 * o when shifting events in the agenda view from one day to another the day matrix is updated now 89 * o when shifting events in the agenda view from one day to another the day matrix is updated now
90 * o TODO ET dragging an event to the matrix will MOVE not COPY the event to the new date. 90 * o TODO ET dragging an event to the matrix will MOVE not COPY the event to the new date.
91 * o no support for Ctrl+click to create groups of dates 91 * o no support for Ctrl+click to create groups of dates
92 * (This has not really been supported in the predecessor. It was not very intuitive nor was it 92 * (This has not really been supported in the predecessor. It was not very intuitive nor was it
93 * user friendly.) 93 * user friendly.)
94 * This feature has been replaced with dragging a selection on the matrix. The matrix will 94 * This feature has been replaced with dragging a selection on the matrix. The matrix will
95 * automatically choose the appropriate selection (e.g. you are not any longer able to select 95 * automatically choose the appropriate selection (e.g. you are not any longer able to select
96 * two distinct groups of date selections as in the old class) 96 * two distinct groups of date selections as in the old class)
97 * o now that you can select more then a week it can happen that not all selected days are 97 * o now that you can select more then a week it can happen that not all selected days are
98 * displayed in the matrix. However this is preferred to the alternative which would mean to 98 * displayed in the matrix. However this is preferred to the alternative which would mean to
99 * adjust the selection and leave some days undisplayed while scrolling through the months 99 * adjust the selection and leave some days undisplayed while scrolling through the months
100 * 100 *
101 * @short day matrix widget of the KDateNavigator 101 * @short day matrix widget of the KDateNavigator
102 * 102 *
103 * @author Eitzenberger Thomas 103 * @author Eitzenberger Thomas
104 */ 104 */
105class KODayMatrix: public QFrame { 105class KODayMatrix: public QFrame {
106 106
107 Q_OBJECT 107 Q_OBJECT
108 108
109public: 109public:
110 110
111 /** constructor to create a day matrix widget. 111 /** constructor to create a day matrix widget.
112 * 112 *
113 * @param parent widget that is the parent of the day matrix. Normally this should 113 * @param parent widget that is the parent of the day matrix. Normally this should
114 * be a KDateNavigator 114 * be a KDateNavigator
115 * @param calendar instance of a calendar on which all calculations are based 115 * @param calendar instance of a calendar on which all calculations are based
116 * @param date start date of the matrix (is expected to be already fixed). It is 116 * @param date start date of the matrix (is expected to be already fixed). It is
117 * assumed that this date is the first week day to be shown in the matrix. 117 * assumed that this date is the first week day to be shown in the matrix.
118 * @param name name of the widget 118 * @param name name of the widget
119 */ 119 */
120 KODayMatrix( QWidget *parent, const char *name ); 120 KODayMatrix( QWidget *parent, const char *name );
121 //KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name ); 121 //KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name );
122 122
123 /** destructor that deallocates all dynamically allocated private members. 123 /** destructor that deallocates all dynamically allocated private members.
124 */ 124 */
125 ~KODayMatrix(); 125 ~KODayMatrix();
126 126
127 /** updates the day matrix to start with the given date. Does all the necessary 127 /** updates the day matrix to start with the given date. Does all the necessary
128 * checks for holidays or events on a day and stores them for display later on. 128 * checks for holidays or events on a day and stores them for display later on.
129 * Does NOT update the view visually. Call repaint() for this. 129 * Does NOT update the view visually. Call repaint() for this.
130 * 130 *
131 * @param actdate recalculates the day matrix to show NUMDAYS starting from this 131 * @param actdate recalculates the day matrix to show NUMDAYS starting from this
132 * date. 132 * date.
133 */ 133 */
134 void updateView(QDate actdate); 134 void updateView(QDate actdate);
135 void updateEvents(); 135 void updateEvents();
136 136
137 /** returns the QDate object associated with day indexed by the 137 /** returns the QDate object associated with day indexed by the
138 * supplied offset. 138 * supplied offset.
139 */ 139 */
140 const QDate& getDate(int offset); 140 const QDate& getDate(int offset);
141 void setCalendar( Calendar * ); 141 void setCalendar( Calendar * );
142 /** returns the official name of this holy day or 0 if there is no label 142 /** returns the official name of this holy day or 0 if there is no label
143 * for this day. 143 * for this day.
144 */ 144 */
145 QString getHolidayLabel(int offset); 145 QString getHolidayLabel(int offset);
146 146
147 /** adds all actual selected days from mSelStart to mSelEnd to the supplied 147 /** adds all actual selected days from mSelStart to mSelEnd to the supplied
148 * DateList. 148 * DateList.
149 */ 149 */
150 void addSelectedDaysTo(DateList&); 150 void addSelectedDaysTo(DateList&);
151 151
152 /** sets the actual to be displayed selection in the day matrix starting from 152 /** sets the actual to be displayed selection in the day matrix starting from
153 * start and ending with end. Theview must be manually updated by calling 153 * start and ending with end. Theview must be manually updated by calling
154 * repaint. (?) 154 * repaint. (?)
155 */ 155 */
156 void setSelectedDaysFrom(const QDate& start, const QDate& end); 156 void setSelectedDaysFrom(const QDate& start, const QDate& end);
157 void clearSelection(); 157 void clearSelection();
158 158
159 /** Is today visible in the view? Keep this in sync with 159 /** Is today visible in the view? Keep this in sync with
160 * the values today (below) can take. 160 * the values today (below) can take.
161 */ 161 */
162 bool isTodayVisible() const { return today>=0; } ; 162 bool isTodayVisible() const { return today>=0; } ;
163 163
164 /** If today is visible, then we can find out if today is 164 /** If today is visible, then we can find out if today is
165 * near the beginning or the end of the month. 165 * near the beginning or the end of the month.
166 * This is dependent on today remaining the index 166 * This is dependent on today remaining the index
167 * in the array of visible dates and going from 167 * in the array of visible dates and going from
168 * top left (0) to bottom right (41). 168 * top left (0) to bottom right (41).
169 */ 169 */
170 bool isBeginningOfMonth() const { return today<=8; } ; 170 bool isBeginningOfMonth() const { return today<=8; } ;
171 bool isEndOfMonth() const { return today>=27; } ; 171 bool isEndOfMonth() const { return today>=27; } ;
172 QString getWhatsThisText( QPoint ) ;
172 173
173public slots: 174public slots:
174 /** Recalculates all the flags of the days in the matrix like holidays or events 175 /** Recalculates all the flags of the days in the matrix like holidays or events
175 * on a day (Actually calls above method with the actual startdate). 176 * on a day (Actually calls above method with the actual startdate).
176 */ 177 */
177 void updateView(); 178 void updateView();
178 void updateViewTimed(); 179 void updateViewTimed();
179 void repaintViewTimed(); 180 void repaintViewTimed();
180 181
181 /** 182 /**
182 * Calculate which square in the matrix should be 183 * Calculate which square in the matrix should be
183 * hilighted to indicate it's today. 184 * hilighted to indicate it's today.
184 */ 185 */
185 void recalculateToday(); 186 void recalculateToday();
186 187
187/* 188/*
188 void setStartDate(QDate); 189 void setStartDate(QDate);
189*/ 190*/
190 191
191signals: 192signals:
192 193
193 /** emitted if the user selects a block of days with the mouse by dragging a rectangle 194 /** emitted if the user selects a block of days with the mouse by dragging a rectangle
194 * inside the matrix 195 * inside the matrix
195 * 196 *
196 * @param daylist list of days that have been selected by the user 197 * @param daylist list of days that have been selected by the user
197 */ 198 */
198 void selected( const KCal::DateList &daylist ); 199 void selected( const KCal::DateList &daylist );
199 200
200 /** emitted if the user has dropped an event inside the matrix 201 /** emitted if the user has dropped an event inside the matrix
201 * 202 *
202 * @param event the dropped calendar event 203 * @param event the dropped calendar event
203 */ 204 */
204 void eventDropped(Event *event); 205 void eventDropped(Event *event);
205 206
206protected: 207protected:
207 208
208 void paintEvent(QPaintEvent *ev); 209 void paintEvent(QPaintEvent *ev);
209 210
210 void mousePressEvent (QMouseEvent* e); 211 void mousePressEvent (QMouseEvent* e);
211 212
212 void mouseReleaseEvent (QMouseEvent* e); 213 void mouseReleaseEvent (QMouseEvent* e);
213 214
214 void mouseMoveEvent (QMouseEvent* e); 215 void mouseMoveEvent (QMouseEvent* e);
215 216
216 void dragEnterEvent(QDragEnterEvent *); 217 void dragEnterEvent(QDragEnterEvent *);
217 218
218 void dragMoveEvent(QDragMoveEvent *); 219 void dragMoveEvent(QDragMoveEvent *);
219 220
220 void dragLeaveEvent(QDragLeaveEvent *); 221 void dragLeaveEvent(QDragLeaveEvent *);
221 222
222 void dropEvent(QDropEvent *); 223 void dropEvent(QDropEvent *);
223 224
224 void resizeEvent(QResizeEvent *); 225 void resizeEvent(QResizeEvent *);
225 226
226private: 227private:
228 bool mouseDown;
229 QBitArray bDays;
227 QPixmap myPix; 230 QPixmap myPix;
228 QTimer* mUpdateTimer; 231 QTimer* mUpdateTimer;
229 QTimer* mRepaintTimer; 232 QTimer* mRepaintTimer;
230 bool mDayChanged; 233 bool mDayChanged;
231 bool mPendingUpdateBeforeRepaint; 234 bool mPendingUpdateBeforeRepaint;
232 235
233 /** returns the index of the day located at the matrix's widget (x,y) position. 236 /** returns the index of the day located at the matrix's widget (x,y) position.
234 * 237 *
235 * @param x horizontal coordinate 238 * @param x horizontal coordinate
236 * @param y vertical coordinate 239 * @param y vertical coordinate
237 */ 240 */
238 int getDayIndexFrom(int x, int y); 241 int getDayIndexFrom(int x, int y);
239 242
240 /** calculates a "shaded" color from the supplied color object. 243 /** calculates a "shaded" color from the supplied color object.
241 * (Copied from Cornelius's kdpdatebutton.cpp) 244 * (Copied from Cornelius's kdpdatebutton.cpp)
242 * 245 *
243 * @param color source based on which a shaded color should be calculated. 246 * @param color source based on which a shaded color should be calculated.
244 */ 247 */
245 QColor getShadedColor(QColor color); 248 QColor getShadedColor(QColor color);
246 249
247 /** number of days to be displayed. For now there is no support for any other number then 42. 250 /** number of days to be displayed. For now there is no support for any other number then 42.
248 so change it at your own risk :o) */ 251 so change it at your own risk :o) */
249 static const int NUMDAYS; 252 static const int NUMDAYS;
250 253
251 /** calendar instance to be queried for holidays, events, ... */ 254 /** calendar instance to be queried for holidays, events, ... */
252 Calendar *mCalendar; 255 Calendar *mCalendar;
253 256
254 /** starting date of the matrix */ 257 /** starting date of the matrix */
255 QDate startdate; 258 QDate startdate;
256 259
257 /** array of day labels to optimeize drawing performance. */ 260 /** array of day labels to optimeize drawing performance. */
258 QString *daylbls; 261 QString *daylbls;
259 262
260 /** array of days displayed to reduce memory consumption by 263 /** array of days displayed to reduce memory consumption by
261 subsequently calling QDate::addDays(). */ 264 subsequently calling QDate::addDays(). */
262 QDate *days; 265 QDate *days;
263 266
264 /** array of storing the number of events on a given day. 267 /** array of storing the number of events on a given day.
265 * used for drawing a bold font if there is at least one event on that day. 268 * used for drawing a bold font if there is at least one event on that day.
266 */ 269 */
267 int *events; 270 int *events;
268 271
269 /** stores holiday names of the days shown in the matrix. */ 272 /** stores holiday names of the days shown in the matrix. */
270 QMap<int,QString> mHolidays; 273 QMap<int,QString> mHolidays;
271 274
272 /** indey of today or -1 if today is not visible in the matrix. */ 275 /** indey of today or -1 if today is not visible in the matrix. */
273 int today; 276 int today;
274 277
275 /** index of day where dragged selection was initiated. 278 /** index of day where dragged selection was initiated.
276 used to detect "negative" timely selections */ 279 used to detect "negative" timely selections */
277 int mSelInit; 280 int mSelInit;
278 281
279 /** if mSelStart has this value it indicates that there is no 282 /** if mSelStart has this value it indicates that there is no
280 actual selection in the matrix. */ 283 actual selection in the matrix. */
281 static const int NOSELECTION; 284 static const int NOSELECTION;
282 285
283 /** index of first selected day. */ 286 /** index of first selected day. */
284 int mSelStart; 287 int mSelStart;
285 288
286 /** index of last selected day. */ 289 /** index of last selected day. */
287 int mSelEnd; 290 int mSelEnd;
288 291
289 /** dynamic tooltip to handle mouse dependent tips for each day in the matrix. */ 292 /** dynamic tooltip to handle mouse dependent tips for each day in the matrix. */
290 DynamicTip* mToolTip; 293 DynamicTip* mToolTip;
291 294
292 295
293 /** default background colour of the matrix. */ 296 /** default background colour of the matrix. */
294 QColor mDefaultBackColor; 297 QColor mDefaultBackColor;
295 298
296 /** default text color of the matrix. */ 299 /** default text color of the matrix. */
297 QColor mDefaultTextColor; 300 QColor mDefaultTextColor;
298 301
299 /** default text color for days not in the actual month. */ 302 /** default text color for days not in the actual month. */
300 QColor mDefaultTextColorShaded; 303 QColor mDefaultTextColorShaded;
301 304
302 /** default text color for holidays not in the actual month. */ 305 /** default text color for holidays not in the actual month. */
303 QColor mHolidayColorShaded; 306 QColor mHolidayColorShaded;
304 307
305 /** text color for selected days. */ 308 /** text color for selected days. */
306 QColor mSelectedDaysColor; 309 QColor mSelectedDaysColor;
307 310
308 /** default width of the frame drawn around today if it is visible in the matrix. */ 311 /** default width of the frame drawn around today if it is visible in the matrix. */
309 int mTodayMarginWidth; 312 int mTodayMarginWidth;
310 313
311 /** stores actual size of each day in the widget so that I dont need to ask this data 314 /** stores actual size of each day in the widget so that I dont need to ask this data
312 * on every repaint. 315 * on every repaint.
313 */ 316 */
314 QRect daysize; 317 QRect daysize;
315 318
316}; 319};
317 320
318#endif 321#endif