summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/datebookmonth.cpp25
1 files changed, 18 insertions, 7 deletions
diff --git a/library/datebookmonth.cpp b/library/datebookmonth.cpp
index 421559e..013ab66 100644
--- a/library/datebookmonth.cpp
+++ b/library/datebookmonth.cpp
@@ -1,762 +1,773 @@
1/********************************************************************** 1/**********************************************************************
2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. 2** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
3** 3**
4** This file is part of the Qtopia Environment. 4** This file is part of the Qtopia Environment.
5** 5**
6** This file may be distributed and/or modified under the terms of the 6** This file may be distributed and/or modified under the terms of the
7** GNU General Public License version 2 as published by the Free Software 7** GNU General Public License version 2 as published by the Free Software
8** Foundation and appearing in the file LICENSE.GPL included in the 8** Foundation and appearing in the file LICENSE.GPL included in the
9** packaging of this file. 9** packaging of this file.
10** 10**
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#include "config.h" 20#include "config.h"
21#include "datebookmonth.h" 21#include "datebookmonth.h"
22#include "datebookdb.h" 22#include "datebookdb.h"
23#include "resource.h" 23#include "resource.h"
24#include <qpe/qpeapplication.h> 24#include <qpe/qpeapplication.h>
25 25
26#include <qtoolbutton.h> 26#include <qtoolbutton.h>
27#include <qspinbox.h> 27#include <qspinbox.h>
28#include <qcombobox.h> 28#include <qcombobox.h>
29#include <qvaluestack.h> 29#include <qvaluestack.h>
30#include <qwhatsthis.h> 30#include <qwhatsthis.h>
31 31
32 32
33DateBookMonthHeader::DateBookMonthHeader( QWidget *parent, const char *name ) 33DateBookMonthHeader::DateBookMonthHeader( QWidget *parent, const char *name )
34 : QHBox( parent, name ) 34 : QHBox( parent, name )
35{ 35{
36 setBackgroundMode( PaletteButton ); 36 setBackgroundMode( PaletteButton );
37 37
38 begin = new QToolButton( this ); 38 begin = new QToolButton( this );
39 begin->setFocusPolicy(NoFocus); 39 begin->setFocusPolicy(NoFocus);
40 begin->setPixmap( Resource::loadPixmap( "start" ) ); 40 begin->setPixmap( Resource::loadPixmap( "start" ) );
41 begin->setAutoRaise( TRUE ); 41 begin->setAutoRaise( TRUE );
42 begin->setFixedSize( begin->sizeHint() ); 42 begin->setFixedSize( begin->sizeHint() );
43 QWhatsThis::add( begin, tr("Show January in the selected year") ); 43 QWhatsThis::add( begin, tr("Show January in the selected year") );
44 44
45 back = new QToolButton( this ); 45 back = new QToolButton( this );
46 back->setFocusPolicy(NoFocus); 46 back->setFocusPolicy(NoFocus);
47 back->setPixmap( Resource::loadPixmap( "back" ) ); 47 back->setPixmap( Resource::loadPixmap( "back" ) );
48 back->setAutoRaise( TRUE ); 48 back->setAutoRaise( TRUE );
49 back->setFixedSize( back->sizeHint() ); 49 back->setFixedSize( back->sizeHint() );
50 QWhatsThis::add( back, tr("Show the previous month") ); 50 QWhatsThis::add( back, tr("Show the previous month") );
51 51
52 month = new QComboBox( FALSE, this ); 52 month = new QComboBox( FALSE, this );
53 for ( int i = 0; i < 12; ++i ) 53 for ( int i = 0; i < 12; ++i )
54 month->insertItem( Calendar::nameOfMonth( i + 1 ) ); 54 month->insertItem( Calendar::nameOfMonth( i + 1 ) );
55 55
56 year = new QSpinBox( 1752, 8000, 1, this ); 56 year = new QSpinBox( 1752, 8000, 1, this );
57 57
58 next = new QToolButton( this ); 58 next = new QToolButton( this );
59 next->setFocusPolicy(NoFocus); 59 next->setFocusPolicy(NoFocus);
60 next->setPixmap( Resource::loadPixmap( "forward" ) ); 60 next->setPixmap( Resource::loadPixmap( "forward" ) );
61 next->setAutoRaise( TRUE ); 61 next->setAutoRaise( TRUE );
62 next->setFixedSize( next->sizeHint() ); 62 next->setFixedSize( next->sizeHint() );
63 QWhatsThis::add( next, tr("Show the next month") ); 63 QWhatsThis::add( next, tr("Show the next month") );
64 64
65 end = new QToolButton( this ); 65 end = new QToolButton( this );
66 end->setFocusPolicy(NoFocus); 66 end->setFocusPolicy(NoFocus);
67 end->setPixmap( Resource::loadPixmap( "finish" ) ); 67 end->setPixmap( Resource::loadPixmap( "finish" ) );
68 end->setAutoRaise( TRUE ); 68 end->setAutoRaise( TRUE );
69 end->setFixedSize( end->sizeHint() ); 69 end->setFixedSize( end->sizeHint() );
70 QWhatsThis::add( end, tr("Show December in the selected year") ); 70 QWhatsThis::add( end, tr("Show December in the selected year") );
71 71
72 connect( month, SIGNAL( activated(int) ), 72 connect( month, SIGNAL( activated(int) ),
73 this, SLOT( updateDate() ) ); 73 this, SLOT( updateDate() ) );
74 connect( year, SIGNAL( valueChanged(int) ), 74 connect( year, SIGNAL( valueChanged(int) ),
75 this, SLOT( updateDate() ) ); 75 this, SLOT( updateDate() ) );
76 connect( begin, SIGNAL( clicked() ), 76 connect( begin, SIGNAL( clicked() ),
77 this, SLOT( firstMonth() ) ); 77 this, SLOT( firstMonth() ) );
78 connect( end, SIGNAL( clicked() ), 78 connect( end, SIGNAL( clicked() ),
79 this, SLOT( lastMonth() ) ); 79 this, SLOT( lastMonth() ) );
80 connect( back, SIGNAL( clicked() ), 80 connect( back, SIGNAL( clicked() ),
81 this, SLOT( monthBack() ) ); 81 this, SLOT( monthBack() ) );
82 connect( next, SIGNAL( clicked() ), 82 connect( next, SIGNAL( clicked() ),
83 this, SLOT( monthForward() ) ); 83 this, SLOT( monthForward() ) );
84 back->setAutoRepeat( TRUE ); 84 back->setAutoRepeat( TRUE );
85 next->setAutoRepeat( TRUE ); 85 next->setAutoRepeat( TRUE );
86} 86}
87 87
88 88
89DateBookMonthHeader::~DateBookMonthHeader() 89DateBookMonthHeader::~DateBookMonthHeader()
90{ 90{
91 91
92} 92}
93 93
94void DateBookMonthHeader::updateDate() 94void DateBookMonthHeader::updateDate()
95{ 95{
96 emit dateChanged( year->value(), month->currentItem() + 1 ); 96 emit dateChanged( year->value(), month->currentItem() + 1 );
97} 97}
98 98
99void DateBookMonthHeader::firstMonth() 99void DateBookMonthHeader::firstMonth()
100{ 100{
101 emit dateChanged( year->value(), 1 ); 101 emit dateChanged( year->value(), 1 );
102 month->setCurrentItem( 0 ); 102 month->setCurrentItem( 0 );
103} 103}
104 104
105void DateBookMonthHeader::lastMonth() 105void DateBookMonthHeader::lastMonth()
106{ 106{
107 emit dateChanged( year->value(), 12 ); 107 emit dateChanged( year->value(), 12 );
108 month->setCurrentItem( 11 ); 108 month->setCurrentItem( 11 );
109} 109}
110 110
111void DateBookMonthHeader::monthBack() 111void DateBookMonthHeader::monthBack()
112{ 112{
113 if ( month->currentItem() > 0 ) { 113 if ( month->currentItem() > 0 ) {
114 emit dateChanged( year->value(), month->currentItem() ); 114 emit dateChanged( year->value(), month->currentItem() );
115 month->setCurrentItem( month->currentItem() - 1 ); 115 month->setCurrentItem( month->currentItem() - 1 );
116 } else { 116 } else {
117 emit dateChanged( year->value() - 1, 12 ); 117 emit dateChanged( year->value() - 1, 12 );
118 // we have a signal set to a changed value in year so we only need to change 118 // we have a signal set to a changed value in year so we only need to change
119 // year to get the result... 119 // year to get the result...
120 month->setCurrentItem( 11 ); 120 month->setCurrentItem( 11 );
121 year->setValue( year->value() - 1 ); 121 year->setValue( year->value() - 1 );
122 } 122 }
123} 123}
124 124
125void DateBookMonthHeader::monthForward() 125void DateBookMonthHeader::monthForward()
126{ 126{
127 if ( month->currentItem() < 11 ) { 127 if ( month->currentItem() < 11 ) {
128 emit dateChanged( year->value(), month->currentItem() + 2 ); 128 emit dateChanged( year->value(), month->currentItem() + 2 );
129 month->setCurrentItem( month->currentItem() + 1 ); 129 month->setCurrentItem( month->currentItem() + 1 );
130 } else { 130 } else {
131 // we have a signal set to a changed value in year so we only need to change 131 // we have a signal set to a changed value in year so we only need to change
132 // year to get the result... 132 // year to get the result...
133 month->setCurrentItem( 0 ); 133 month->setCurrentItem( 0 );
134 year->setValue( year->value() + 1 ); 134 year->setValue( year->value() + 1 );
135 } 135 }
136} 136}
137 137
138void DateBookMonthHeader::setDate( int y, int m ) 138void DateBookMonthHeader::setDate( int y, int m )
139{ 139{
140 year->setValue( y ); 140 year->setValue( y );
141 month->setCurrentItem( m - 1 ); 141 month->setCurrentItem( m - 1 );
142} 142}
143 143
144//--------------------------------------------------------------------------- 144//---------------------------------------------------------------------------
145 145
146class DateBookMonthTablePrivate 146class DateBookMonthTablePrivate
147{ 147{
148public: 148public:
149 DateBookMonthTablePrivate() {}; 149 DateBookMonthTablePrivate() {};
150 ~DateBookMonthTablePrivate() { mMonthEvents.clear(); }; 150 ~DateBookMonthTablePrivate() { mMonthEvents.clear(); };
151 151
152 QValueList<EffectiveEvent> mMonthEvents; 152 QValueList<EffectiveEvent> mMonthEvents;
153 bool onMonday; 153 bool onMonday;
154}; 154};
155 155
156DateBookMonthTable::DateBookMonthTable( QWidget *parent, const char *name, 156DateBookMonthTable::DateBookMonthTable( QWidget *parent, const char *name,
157 DateBookDB *newDb ) 157 DateBookDB *newDb )
158 : QTable( 6, 7, parent, name ), 158 : QTable( 6, 7, parent, name ),
159 db( newDb ) 159 db( newDb )
160{ 160{
161 d = new DateBookMonthTablePrivate(); 161 d = new DateBookMonthTablePrivate();
162 selYear = -1; 162 selYear = -1;
163 selMonth = -1; 163 selMonth = -1;
164 selDay = -1; 164 selDay = -1;
165 165
166 /* init these as well make valgrind happy and be consistent with Qtopia1.6 -zecke */ 166 /* init these as well make valgrind happy and be consistent with Qtopia1.6 -zecke */
167 year = -1; 167 year = -1;
168 month = -1; 168 month = -1;
169 day = -1; 169 day = -1;
170 170
171 Config cfg( "qpe" ); 171 Config cfg( "qpe" );
172 cfg.setGroup( "Time" ); 172 cfg.setGroup( "Time" );
173 d->onMonday = cfg.readBoolEntry( "MONDAY" ); 173 d->onMonday = cfg.readBoolEntry( "MONDAY" );
174 174
175 horizontalHeader()->setResizeEnabled( FALSE ); 175 horizontalHeader()->setResizeEnabled( FALSE );
176 // we have to do this here... or suffer the consequences later... 176 // we have to do this here... or suffer the consequences later...
177 for ( int i = 0; i < 7; i++ ){ 177 for ( int i = 0; i < 7; i++ ){
178 horizontalHeader()->resizeSection( i, 30 ); 178 horizontalHeader()->resizeSection( i, 30 );
179 setColumnStretchable( i, TRUE ); 179 setColumnStretchable( i, TRUE );
180 } 180 }
181 setupLabels(); 181 setupLabels();
182 182
183 verticalHeader()->hide(); 183 verticalHeader()->hide();
184 setLeftMargin( 0 ); 184 setLeftMargin( 0 );
185 for ( int i = 0; i < 6; ++i ) 185 for ( int i = 0; i < 6; ++i )
186 setRowStretchable( i, TRUE ); 186 setRowStretchable( i, TRUE );
187 187
188 setSelectionMode( NoSelection ); 188 setSelectionMode( NoSelection );
189 189
190 connect( this, SIGNAL( clicked(int,int,int,const QPoint&) ), 190 connect( this, SIGNAL( clicked(int,int,int,const QPoint&) ),
191 this, SLOT( dayClicked(int,int) ) ); 191 this, SLOT( dayClicked(int,int) ) );
192 connect( this, SIGNAL( currentChanged(int,int) ), 192 connect( this, SIGNAL( currentChanged(int,int) ),
193 this, SLOT( dragDay(int,int) ) ); 193 this, SLOT( dragDay(int,int) ) );
194 setVScrollBarMode( AlwaysOff ); 194 setVScrollBarMode( AlwaysOff );
195 setHScrollBarMode( AlwaysOff ); 195 setHScrollBarMode( AlwaysOff );
196} 196}
197 197
198DateBookMonthTable::~DateBookMonthTable() 198DateBookMonthTable::~DateBookMonthTable()
199{ 199{
200 monthsEvents.clear(); 200 monthsEvents.clear();
201 delete d; 201 delete d;
202} 202}
203 203
204void DateBookMonthTable::setDate(int y, int m, int d) 204void DateBookMonthTable::setDate(int y, int m, int d)
205{ 205{
206 if (month == m && year == y) { 206 if (month == m && year == y) {
207 if ( selYear == -1 ) 207 if ( selYear == -1 )
208 year = selYear; 208 year = selYear;
209 if ( selMonth == -1 ) 209 if ( selMonth == -1 )
210 month = selMonth; 210 month = selMonth;
211 int r1, c1, r2, c2; 211 int r1, c1, r2, c2;
212 findDay(selDay, r1, c1); 212 findDay(selDay, r1, c1);
213 selDay = day = d; 213 selDay = day = d;
214 findDay(selDay, r2, c2); 214 findDay(selDay, r2, c2);
215 setCurrentCell( r2, c2 ); 215 setCurrentCell( r2, c2 );
216 //updateCell(r1,c1); 216 //updateCell(r1,c1);
217 //updateCell(r2,c2); 217 //updateCell(r2,c2);
218 } else { 218 } else {
219 selYear = year = y; 219 selYear = year = y;
220 selMonth = month = m; 220 selMonth = month = m;
221 selDay = day = d; 221 selDay = day = d;
222 setupTable(); 222 setupTable();
223 } 223 }
224} 224}
225 225
226void DateBookMonthTable::redraw() 226void DateBookMonthTable::redraw()
227{ 227{
228 setupLabels(); 228 setupLabels();
229 setupTable(); 229 setupTable();
230} 230}
231 231
232void DateBookMonthTable::setWeekStart( bool onMonday ) 232void DateBookMonthTable::setWeekStart( bool onMonday )
233{ 233{
234 d->onMonday = onMonday; 234 d->onMonday = onMonday;
235 setupLabels(); 235 setupLabels();
236 setupTable(); 236 setupTable();
237} 237}
238 238
239void DateBookMonthTable::setupTable() 239void DateBookMonthTable::setupTable()
240{ 240{
241 QValueList<Calendar::Day> days = Calendar::daysOfMonth( year, month, d->onMonday ); 241 QValueList<Calendar::Day> days = Calendar::daysOfMonth( year, month, d->onMonday );
242 QValueList<Calendar::Day>::Iterator it = days.begin(); 242 QValueList<Calendar::Day>::Iterator it = days.begin();
243 int row = 0, col = 0; 243 int row = 0, col = 0;
244 int crow = 0; 244 int crow = 0;
245 int ccol = 0; 245 int ccol = 0;
246 for ( ; it != days.end(); ++it ) { 246 for ( ; it != days.end(); ++it ) {
247 DayItemMonth *i = (DayItemMonth *)item( row, col ); 247 DayItemMonth *i = (DayItemMonth *)item( row, col );
248 if ( !i ) { 248 if ( !i ) {
249 i = new DayItemMonth( this, QTableItem::Never, "" ); 249 i = new DayItemMonth( this, QTableItem::Never, "" );
250 setItem( row, col, i ); 250 setItem( row, col, i );
251 } 251 }
252 Calendar::Day calDay = *it; 252 Calendar::Day calDay = *it;
253 i->clearEffEvents(); 253 i->clearEffEvents();
254 i->setDay( calDay.date ); 254 i->setDay( calDay.date );
255 i->setType( calDay.type ); 255 i->setType( calDay.type );
256 if ( i->day() == day && calDay.type == Calendar::Day::ThisMonth ) { 256 if ( i->day() == day && calDay.type == Calendar::Day::ThisMonth ) {
257 crow = row; 257 crow = row;
258 ccol = col; 258 ccol = col;
259 } 259 }
260 260
261 updateCell( row, col ); 261 updateCell( row, col );
262 262
263 if ( col == 6 ) { 263 if ( col == 6 ) {
264 ++row; 264 ++row;
265 col = 0; 265 col = 0;
266 } else { 266 } else {
267 ++col; 267 ++col;
268 } 268 }
269 } 269 }
270 setCurrentCell( crow, ccol ); 270 setCurrentCell( crow, ccol );
271 getEvents(); 271 getEvents();
272} 272}
273 273
274void DateBookMonthTable::findDay( int day, int &row, int &col ) 274void DateBookMonthTable::findDay( int day, int &row, int &col )
275{ 275{
276 QDate dtBegin( year, month, 1 ); 276 QDate dtBegin( year, month, 1 );
277 int skips = dtBegin.dayOfWeek(); 277 int skips = dtBegin.dayOfWeek();
278 int effective_day = day + skips - 1; // row/columns begin at 0 278 int effective_day = day + skips - 1; // row/columns begin at 0
279 // make an extra adjustment if we start on Mondays. 279 // make an extra adjustment if we start on Mondays.
280 if ( d->onMonday ) 280 if ( d->onMonday )
281 effective_day--; 281 effective_day--;
282 row = effective_day / 7; 282 row = effective_day / 7;
283 col = effective_day % 7; 283 col = effective_day % 7;
284} 284}
285 285
286void DateBookMonthTable::dayClicked( int row, int col ) 286void DateBookMonthTable::dayClicked( int row, int col )
287{ 287{
288 changeDaySelection( row, col ); 288 changeDaySelection( row, col );
289 emit dateClicked( selYear, selMonth, selDay ); 289 emit dateClicked( selYear, selMonth, selDay );
290} 290}
291 291
292void DateBookMonthTable::dragDay( int row, int col ) 292void DateBookMonthTable::dragDay( int row, int col )
293{ 293{
294 changeDaySelection( row, col ); 294 changeDaySelection( row, col );
295} 295}
296 296
297void DateBookMonthTable::changeDaySelection( int row, int col ) 297void DateBookMonthTable::changeDaySelection( int row, int col )
298{ 298{
299 DayItemMonth *i = (DayItemMonth*)item( row, col ); 299 DayItemMonth *i = (DayItemMonth*)item( row, col );
300 if ( !i ) 300 if ( !i )
301 return; 301 return;
302 switch ( i->type() ) { 302 switch ( i->type() ) {
303 case Calendar::Day::ThisMonth: 303 case Calendar::Day::ThisMonth:
304 selMonth = month; 304 selMonth = month;
305 break; 305 break;
306 case Calendar::Day::PrevMonth: 306 case Calendar::Day::PrevMonth:
307 selMonth = month-1; 307 selMonth = month-1;
308 break; 308 break;
309 default: 309 default:
310 selMonth = month+1; 310 selMonth = month+1;
311 } 311 }
312 312
313 selYear = year; 313 selYear = year;
314 if ( selMonth <= 0 ) { 314 if ( selMonth <= 0 ) {
315 selMonth = 12; 315 selMonth = 12;
316 selYear--; 316 selYear--;
317 } else if ( selMonth > 12 ) { 317 } else if ( selMonth > 12 ) {
318 selMonth = 1; 318 selMonth = 1;
319 selYear++; 319 selYear++;
320 } 320 }
321 selDay = i->day(); 321 selDay = i->day();
322} 322}
323 323
324 324
325void DateBookMonthTable::viewportMouseReleaseEvent( QMouseEvent * ) 325void DateBookMonthTable::viewportMouseReleaseEvent( QMouseEvent * )
326{ 326{
327 dayClicked( currentRow(), currentColumn() ); 327 dayClicked( currentRow(), currentColumn() );
328} 328}
329 329
330void DateBookMonthTable::getEvents() 330void DateBookMonthTable::getEvents()
331{ 331{
332 if ( !db ) 332 if ( !db )
333 return; 333 return;
334 334
335 QDate dtStart( year, month, 1 ); 335 QDate dtStart( year, month, 1 );
336 d->mMonthEvents = db->getEffectiveEvents( dtStart, 336 d->mMonthEvents = db->getEffectiveEvents( dtStart,
337 QDate( year, month, 337 QDate( year, month,
338 dtStart.daysInMonth() ) ); 338 dtStart.daysInMonth() ) );
339 QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin(); 339 QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin();
340 // now that the events are sorted, basically go through the list, make 340 // now that the events are sorted, basically go through the list, make
341 // a small list for every day and set it for each item... 341 // a small list for every day and set it for each item...
342 // clear all the items... 342 // clear all the items...
343 while ( it != d->mMonthEvents.end() ) { 343 while ( it != d->mMonthEvents.end() ) {
344 QValueList<EffectiveEvent> dayEvent; 344 QValueList<EffectiveEvent> dayEvent;
345 EffectiveEvent e = *it; 345 EffectiveEvent e = *it;
346 ++it; 346 ++it;
347 dayEvent.append( e ); 347 dayEvent.append( e );
348 while ( it != d->mMonthEvents.end() 348 while ( it != d->mMonthEvents.end()
349 && e.date() == (*it).date() ) { 349 && e.date() == (*it).date() ) {
350 dayEvent.append( *it ); 350 dayEvent.append( *it );
351 ++it; 351 ++it;
352 } 352 }
353 int row, col; 353 int row, col;
354 findDay( e.date().day(), row, col ); 354 findDay( e.date().day(), row, col );
355 DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) ); 355 DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) );
356 w->setEvents( dayEvent ); 356 w->setEvents( dayEvent );
357 updateCell( row, col ); 357 updateCell( row, col );
358 dayEvent.clear(); 358 dayEvent.clear();
359 } 359 }
360} 360}
361 361
362 362
363void DateBookMonthTable::setupLabels() 363void DateBookMonthTable::setupLabels()
364{ 364{
365 for ( int i = 0; i < 7; ++i ) { 365 for ( int i = 0; i < 7; ++i ) {
366 // horizontalHeader()->resizeSection( i, 30 ); 366 // horizontalHeader()->resizeSection( i, 30 );
367 // setColumnStretchable( i, TRUE ); 367 // setColumnStretchable( i, TRUE );
368 if ( d->onMonday ) 368 if ( d->onMonday )
369 horizontalHeader()->setLabel( i, Calendar::nameOfDay( i + 1 ) ); 369 horizontalHeader()->setLabel( i, Calendar::nameOfDay( i + 1 ) );
370 else { 370 else {
371 if ( i == 0 ) 371 if ( i == 0 )
372 horizontalHeader()->setLabel( i, Calendar::nameOfDay( 7 ) ); 372 horizontalHeader()->setLabel( i, Calendar::nameOfDay( 7 ) );
373 else 373 else
374 horizontalHeader()->setLabel( i, Calendar::nameOfDay( i ) ); 374 horizontalHeader()->setLabel( i, Calendar::nameOfDay( i ) );
375 } 375 }
376 } 376 }
377} 377}
378 378
379 379
380//--------------------------------------------------------------------------- 380//---------------------------------------------------------------------------
381 381
382DateBookMonth::DateBookMonth( QWidget *parent, const char *name, bool ac, 382DateBookMonth::DateBookMonth( QWidget *parent, const char *name, bool ac,
383 DateBookDB *data ) 383 DateBookDB *data )
384 : QVBox( parent, name ), 384 : QVBox( parent, name ),
385 autoClose( ac ) 385 autoClose( ac )
386{ 386{
387 setFocusPolicy(StrongFocus); 387 setFocusPolicy(StrongFocus);
388 year = QDate::currentDate().year(); 388 year = QDate::currentDate().year();
389 month = QDate::currentDate().month(); 389 month = QDate::currentDate().month();
390 day = QDate::currentDate().day(); 390 day = QDate::currentDate().day();
391 header = new DateBookMonthHeader( this, "DateBookMonthHeader" ); 391 header = new DateBookMonthHeader( this, "DateBookMonthHeader" );
392 table = new DateBookMonthTable( this, "DateBookMonthTable", data ); 392 table = new DateBookMonthTable( this, "DateBookMonthTable", data );
393 header->setDate( year, month ); 393 header->setDate( year, month );
394 table->setDate( year, month, QDate::currentDate().day() ); 394 table->setDate( year, month, QDate::currentDate().day() );
395 header->setFocusPolicy(NoFocus); 395 header->setFocusPolicy(NoFocus);
396 table->setFocusPolicy(NoFocus); 396 table->setFocusPolicy(NoFocus);
397 connect( header, SIGNAL( dateChanged(int,int) ), 397 connect( header, SIGNAL( dateChanged(int,int) ),
398 this, SLOT( setDate(int,int) ) ); 398 this, SLOT( setDate(int,int) ) );
399 connect( table, SIGNAL( dateClicked(int,int,int) ), 399 connect( table, SIGNAL( dateClicked(int,int,int) ),
400 this, SLOT( finalDate(int,int,int) ) ); 400 this, SLOT( finalDate(int,int,int) ) );
401 connect( qApp, SIGNAL(weekChanged(bool)), this, 401 connect( qApp, SIGNAL(weekChanged(bool)), this,
402 SLOT(slotWeekChange(bool)) ); 402 SLOT(slotWeekChange(bool)) );
403 table->setFocus(); 403 table->setFocus();
404} 404}
405 405
406DateBookMonth::~DateBookMonth() 406DateBookMonth::~DateBookMonth()
407{ 407{
408 408
409} 409}
410 410
411void DateBookMonth::setDate( int y, int m ) 411void DateBookMonth::setDate( int y, int m )
412{ 412{
413 /* only change the date if this is a different date, 413 /* only change the date if this is a different date,
414 * other wise we may mistakenly overide the day */ 414 * other wise we may mistakenly overide the day */
415 if ( (y != year) || (m != month) ) { 415 if ( (y != year) || (m != month) ) {
416 year = y; 416 year = y;
417 month = m; 417 month = m;
418 QDate nd( y, m, 1 ); 418 QDate nd( y, m, 1 );
419 if ( nd.daysInMonth() < day ) 419 if ( nd.daysInMonth() < day )
420 day = nd.daysInMonth(); 420 day = nd.daysInMonth();
421 table->setDate( year, month, day ); 421 table->setDate( year, month, day );
422 } 422 }
423} 423}
424 424
425void DateBookMonth::setDate( int y, int m, int d ) 425void DateBookMonth::setDate( int y, int m, int d )
426{ 426{
427 header->setDate( y, m); 427 header->setDate( y, m);
428 table->setDate( y, m, d); 428 table->setDate( y, m, d);
429 year = y; 429 year = y;
430 month = m; 430 month = m;
431 day = d; 431 day = d;
432} 432}
433 433
434/* called when we wish to close or pass back the date */ 434/* called when we wish to close or pass back the date */
435void DateBookMonth::finalDate(int y, int m, int d) 435void DateBookMonth::finalDate(int y, int m, int d)
436{ 436{
437 setDate( y, m, d ); 437 setDate( y, m, d );
438 438
439 emit dateClicked(y, m, d); 439 emit dateClicked(y, m, d);
440 // emit dateClicked(QDate(y, m, d).toString()); 440 // emit dateClicked(QDate(y, m, d).toString());
441 441
442 if ( autoClose && parentWidget() ) 442 if ( autoClose && parentWidget() )
443 parentWidget()->close(); 443 parentWidget()->close();
444} 444}
445 445
446void DateBookMonth::setDate( QDate d) 446void DateBookMonth::setDate( QDate d)
447{ 447{
448 setDate(d.year(), d.month(), d.day()); 448 setDate(d.year(), d.month(), d.day());
449} 449}
450 450
451void DateBookMonth::redraw() 451void DateBookMonth::redraw()
452{ 452{
453 table->setDate( year, month, day ); 453 table->setDate( year, month, day );
454 table->redraw(); 454 table->redraw();
455} 455}
456 456
457QDate DateBookMonth::selectedDate() const 457QDate DateBookMonth::selectedDate() const
458{ 458{
459 if ( !table ) 459 if ( !table )
460 return QDate::currentDate(); 460 return QDate::currentDate();
461 int y, m, d; 461 int y, m, d;
462 table->getDate( y, m, d ); 462 table->getDate( y, m, d );
463 return QDate( y, m, d ); 463 return QDate( y, m, d );
464} 464}
465 465
466void DateBookMonth::slotWeekChange( bool startOnMonday ) 466void DateBookMonth::slotWeekChange( bool startOnMonday )
467{ 467{
468 table->setWeekStart( startOnMonday ); 468 table->setWeekStart( startOnMonday );
469} 469}
470 470
471void DateBookMonth::keyPressEvent( QKeyEvent *e ) 471void DateBookMonth::keyPressEvent( QKeyEvent *e )
472{ 472{
473 switch(e->key()) { 473 switch(e->key()) {
474 case Key_Up: 474 case Key_Up:
475 setDate(QDate(year, month, day).addDays(-7)); 475 setDate(QDate(year, month, day).addDays(-7));
476 break; 476 break;
477 case Key_Down: 477 case Key_Down:
478 setDate(QDate(year, month, day).addDays(7)); 478 setDate(QDate(year, month, day).addDays(7));
479 break; 479 break;
480 case Key_Left: 480 case Key_Left:
481 setDate(QDate(year, month, day).addDays(-1)); 481 setDate(QDate(year, month, day).addDays(-1));
482 break; 482 break;
483 case Key_Right: 483 case Key_Right:
484 setDate(QDate(year, month, day).addDays(1)); 484 setDate(QDate(year, month, day).addDays(1));
485 break; 485 break;
486 case Key_Space: 486 case Key_Space:
487 qWarning("space"); 487 qWarning("space");
488 emit dateClicked(year, month, day); 488 emit dateClicked(year, month, day);
489 if ( autoClose && parentWidget() ) 489 if ( autoClose && parentWidget() )
490 parentWidget()->close(); 490 parentWidget()->close();
491 break; 491 break;
492 default: 492 default:
493 qWarning("ignore"); 493 qWarning("ignore");
494 e->ignore(); 494 e->ignore();
495 break; 495 break;
496 } 496 }
497} 497}
498 498
499//--------------------------------------------------------------------------- 499//---------------------------------------------------------------------------
500class DayItemMonthPrivate 500class DayItemMonthPrivate
501{ 501{
502public: 502public:
503 DayItemMonthPrivate() {}; 503 DayItemMonthPrivate() {};
504 ~DayItemMonthPrivate() { mDayEvents.clear(); }; 504 ~DayItemMonthPrivate() { mDayEvents.clear(); };
505 QValueList<EffectiveEvent> mDayEvents; 505 QValueList<EffectiveEvent> mDayEvents;
506}; 506};
507 507
508DayItemMonth::DayItemMonth( QTable *table, EditType et, const QString &t ) 508DayItemMonth::DayItemMonth( QTable *table, EditType et, const QString &t )
509 : QTableItem( table, et, t ) 509 : QTableItem( table, et, t )
510{ 510{
511 d = new DayItemMonthPrivate(); 511 d = new DayItemMonthPrivate();
512} 512}
513 513
514DayItemMonth::~DayItemMonth() 514DayItemMonth::~DayItemMonth()
515{ 515{
516 daysEvents.clear(); 516 daysEvents.clear();
517 delete d; 517 delete d;
518} 518}
519 519
520void DayItemMonth::setEvents( const QValueList<EffectiveEvent> &effEv ) 520void DayItemMonth::setEvents( const QValueList<EffectiveEvent> &effEv )
521{ 521{
522 d->mDayEvents = effEv; 522 d->mDayEvents = effEv;
523} 523}
524 524
525void DayItemMonth::clearEffEvents() 525void DayItemMonth::clearEffEvents()
526{ 526{
527 d->mDayEvents.clear(); 527 d->mDayEvents.clear();
528} 528}
529 529
530void DayItemMonth::paint( QPainter *p, const QColorGroup &cg, 530void DayItemMonth::paint( QPainter *p, const QColorGroup &cg,
531 const QRect &cr, bool selected ) 531 const QRect &cr, bool selected )
532{ 532{
533 p->save(); 533 p->save();
534 534
535 QColorGroup g( cg ); 535 QColorGroup g( cg );
536 g.setBrush( QColorGroup::Base, back ); 536 g.setBrush( QColorGroup::Base, back );
537 g.setColor( QColorGroup::Text, forg ); 537 g.setColor( QColorGroup::Text, forg );
538 if ( selected ) 538 if ( selected )
539 p->setPen( g.highlightedText() ); 539 p->setPen( g.highlightedText() );
540 else 540 else
541 p->setPen( g.text() ); 541 p->setPen( g.text() );
542 542
543 QValueStack<int> normalLine; 543 QValueStack<int> normalLine;
544 QValueStack<int> repeatLine; 544 QValueStack<int> repeatLine;
545 QValueStack<int> travelLine; 545 QValueStack<int> travelLine;
546 546
547 bool normalAllDay = FALSE; 547 bool normalAllDay = FALSE;
548 bool repeatAllDay = FALSE; 548 bool repeatAllDay = FALSE;
549 bool travelAllDay = FALSE; 549 bool travelAllDay = FALSE;
550 bool holidayAllDay = FALSE;
550 551
551 QValueListIterator<EffectiveEvent> itDays = d->mDayEvents.begin(); 552 QValueListIterator<EffectiveEvent> itDays = d->mDayEvents.begin();
552 553
553 for ( ; itDays != d->mDayEvents.end(); ++itDays ) { 554 for ( ; itDays != d->mDayEvents.end(); ++itDays ) {
554 int w = cr.width(); 555 int w = cr.width();
555 Event ev = (*itDays).event(); 556 Event ev = (*itDays).event();
556 557
557 int f = (*itDays).start().hour(); // assume Effective event 558 int f = (*itDays).start().hour(); // assume Effective event
558 int t = (*itDays).end().hour(); // is truncated. 559 int t = (*itDays).end().hour(); // is truncated.
559 560
560 if (ev.isAllDay()) { 561 if (ev.isAllDay()) {
561 if (!ev.hasRepeat()) 562 if (!ev.hasRepeat()) {
562 normalAllDay = TRUE; 563 normalAllDay = TRUE;
563 else 564 if (!ev.isValidUid()) {
564 repeatAllDay = TRUE; 565 holidayAllDay = TRUE;
566 }
567 } else {
568 repeatAllDay = TRUE;
569 }
565 } else { 570 } else {
566 int sLine, eLine; 571 int sLine, eLine;
567 if (f == 0) 572 if (f == 0)
568 sLine = 0; 573 sLine = 0;
569 else if (f < 8 ) 574 else if (f < 8 )
570 sLine = 1; 575 sLine = 1;
571 else if (f >= 17) 576 else if (f >= 17)
572 sLine = w - 4; 577 sLine = w - 4;
573 else { 578 else {
574 sLine = (f - 8) * (w - 8); 579 sLine = (f - 8) * (w - 8);
575 if (sLine) 580 if (sLine)
576 sLine /= 8; 581 sLine /= 8;
577 sLine += 4; 582 sLine += 4;
578 } 583 }
579 if (t == 23) 584 if (t == 23)
580 eLine = w; 585 eLine = w;
581 else if (t < 8) 586 else if (t < 8)
582 eLine = 4; 587 eLine = 4;
583 else if (t >= 17) 588 else if (t >= 17)
584 eLine = w - 1; 589 eLine = w - 1;
585 else { 590 else {
586 eLine = (t - 8) * (w - 8); 591 eLine = (t - 8) * (w - 8);
587 if (eLine) 592 if (eLine)
588 eLine /= 8; 593 eLine /= 8;
589 eLine += 4; 594 eLine += 4;
590 } 595 }
591 if (!ev.hasRepeat()) { 596 if (!ev.hasRepeat()) {
592 normalLine.push(sLine); 597 normalLine.push(sLine);
593 normalLine.push(eLine); 598 normalLine.push(eLine);
594 } else { 599 } else {
595 repeatLine.push(sLine); 600 repeatLine.push(sLine);
596 repeatLine.push(eLine); 601 repeatLine.push(eLine);
597 } 602 }
598 } 603 }
599 } 604 }
600 605
601 // draw the background 606 // draw the background
602 if (normalAllDay || repeatAllDay || travelAllDay) { 607 if (normalAllDay || repeatAllDay || travelAllDay || holidayAllDay) {
603 p->save(); 608 p->save();
604 609
605 if (normalAllDay) 610 if (normalAllDay)
606 if (repeatAllDay) { 611 if (repeatAllDay) {
607 p->fillRect( 0, 0, cr.width(), cr.height() / 2, 612 p->fillRect( 0, 0, cr.width(), cr.height() / 2,
608 colorNormalLight ); 613 colorNormalLight );
609 p->fillRect( 0, cr.height() / 2, cr.width(), cr.height() / 2, 614 p->fillRect( 0, cr.height() / 2, cr.width(), cr.height() / 2,
610 colorRepeatLight ); 615 colorRepeatLight );
611 } else 616 } else {
617 if (!holidayAllDay) {
612 p->fillRect( 0, 0, cr.width(), cr.height(), 618 p->fillRect( 0, 0, cr.width(), cr.height(),
613 colorNormalLight ); 619 colorNormalLight );
614 else if (repeatAllDay) 620 } else {
621 p->fillRect( 0, 0, cr.width(), cr.height(),
622 QColor(0,220,0) );
623 }
624 } else if (repeatAllDay) {
615 p->fillRect( 0, 0, cr.width(), cr.height(), 625 p->fillRect( 0, 0, cr.width(), cr.height(),
616 colorRepeatLight ); 626 colorRepeatLight );
627 }
617 } else { 628 } else {
618 p->fillRect( 0, 0, cr.width(), 629 p->fillRect( 0, 0, cr.width(),
619 cr.height(), selected 630 cr.height(), selected
620 ? g.brush( QColorGroup::Highlight ) 631 ? g.brush( QColorGroup::Highlight )
621 : g.brush( QColorGroup::Base ) ); 632 : g.brush( QColorGroup::Base ) );
622 } 633 }
623 634
624 // The lines 635 // The lines
625 // now for the lines. 636 // now for the lines.
626 int h = 5; 637 int h = 5;
627 int y = cr.height() / 2 - h; 638 int y = cr.height() / 2 - h;
628 639
629 while(normalLine.count() >= 2) { 640 while(normalLine.count() >= 2) {
630 int x2 = normalLine.pop(); 641 int x2 = normalLine.pop();
631 int x1 = normalLine.pop(); 642 int x1 = normalLine.pop();
632 if (x2 < x1 + 2) 643 if (x2 < x1 + 2)
633 x2 = x1 + 2; 644 x2 = x1 + 2;
634 p->fillRect(x1, y, x2 - x1, h, colorNormal); 645 p->fillRect(x1, y, x2 - x1, h, colorNormal);
635 } 646 }
636 647
637 y += h; 648 y += h;
638 649
639 while(repeatLine.count() >= 2) { 650 while(repeatLine.count() >= 2) {
640 int x2 = repeatLine.pop(); 651 int x2 = repeatLine.pop();
641 int x1 = repeatLine.pop(); 652 int x1 = repeatLine.pop();
642 if (x2 < x1 + 2) 653 if (x2 < x1 + 2)
643 x2 = x1 + 2; 654 x2 = x1 + 2;
644 p->fillRect(x1, y, x2 - x1, h, colorRepeat); 655 p->fillRect(x1, y, x2 - x1, h, colorRepeat);
645 } 656 }
646 657
647 658
648 // Finally, draw the number. 659 // Finally, draw the number.
649 QFont f = p->font(); 660 QFont f = p->font();
650 f.setPointSize( ( f.pointSize() / 3 ) * 2 ); 661 f.setPointSize( ( f.pointSize() / 3 ) * 2 );
651 p->setFont( f ); 662 p->setFont( f );
652 QFontMetrics fm( f ); 663 QFontMetrics fm( f );
653 p->drawText( 1, 1 + fm.ascent(), QString::number( day() ) ); 664 p->drawText( 1, 1 + fm.ascent(), QString::number( day() ) );
654 665
655 p->restore(); 666 p->restore();
656} 667}
657 668
658 669
659 670
660void DayItemMonth::setType( Calendar::Day::Type t ) 671void DayItemMonth::setType( Calendar::Day::Type t )
661{ 672{
662 switch ( t ) { 673 switch ( t ) {
663 case Calendar::Day::PrevMonth: 674 case Calendar::Day::PrevMonth:
664 case Calendar::Day::NextMonth: 675 case Calendar::Day::NextMonth:
665 back = QBrush( QColor( 224, 224, 224 ) ); 676 back = QBrush( QColor( 224, 224, 224 ) );
666 forg = black; 677 forg = black;
667 break; 678 break;
668 case Calendar::Day::ThisMonth: 679 case Calendar::Day::ThisMonth:
669 back = QBrush( white ); 680 back = QBrush( white );
670 forg = black; 681 forg = black;
671 break; 682 break;
672 } 683 }
673 typ = t; 684 typ = t;
674} 685}
675 686
676 687
677 688
678DateButton::DateButton( bool longDate, QWidget *parent, const char * name ) 689DateButton::DateButton( bool longDate, QWidget *parent, const char * name )
679 :QPushButton( parent, name ) 690 :QPushButton( parent, name )
680{ 691{
681 longFormat = longDate; 692 longFormat = longDate;
682 df = DateFormat('/', DateFormat::MonthDayYear, DateFormat::MonthDayYear); 693 df = DateFormat('/', DateFormat::MonthDayYear, DateFormat::MonthDayYear);
683 setDate( QDate::currentDate() ); 694 setDate( QDate::currentDate() );
684 695
685 connect(this,SIGNAL(pressed()),this,SLOT(pickDate())); 696 connect(this,SIGNAL(pressed()),this,SLOT(pickDate()));
686 697
687 698
688} 699}
689 700
690 701
691void DateButton::pickDate() 702void DateButton::pickDate()
692{ 703{
693 static QPopupMenu *m1 = 0; 704 static QPopupMenu *m1 = 0;
694 static DateBookMonth *picker = 0; 705 static DateBookMonth *picker = 0;
695 if ( !m1 ) { 706 if ( !m1 ) {
696 m1 = new QPopupMenu( this ); 707 m1 = new QPopupMenu( this );
697 picker = new DateBookMonth( m1, 0, TRUE ); 708 picker = new DateBookMonth( m1, 0, TRUE );
698 m1->insertItem( picker ); 709 m1->insertItem( picker );
699 connect( picker, SIGNAL( dateClicked(int,int,int) ), 710 connect( picker, SIGNAL( dateClicked(int,int,int) ),
700 this, SLOT( setDate(int,int,int) ) ); 711 this, SLOT( setDate(int,int,int) ) );
701 connect( picker, SIGNAL( dateClicked(int,int,int) ), 712 connect( picker, SIGNAL( dateClicked(int,int,int) ),
702 this, SIGNAL( dateSelected(int,int,int) ) ); 713 this, SIGNAL( dateSelected(int,int,int) ) );
703 connect( m1, SIGNAL( aboutToHide() ), 714 connect( m1, SIGNAL( aboutToHide() ),
704 this, SLOT( gotHide() ) ); 715 this, SLOT( gotHide() ) );
705 } 716 }
706 picker->slotWeekChange( weekStartsMonday ); 717 picker->slotWeekChange( weekStartsMonday );
707 picker->setDate( currDate.year(), currDate.month(), currDate.day() ); 718 picker->setDate( currDate.year(), currDate.month(), currDate.day() );
708 m1->popup(mapToGlobal(QPoint(0,height()))); 719 m1->popup(mapToGlobal(QPoint(0,height())));
709 picker->setFocus(); 720 picker->setFocus();
710} 721}
711 722
712 723
713void DateButton::gotHide() 724void DateButton::gotHide()
714{ 725{
715 // we have to redo the button... 726 // we have to redo the button...
716 setDown( false ); 727 setDown( false );
717} 728}
718 729
719 730
720// void dateSelected( int year, int month, int day ); 731// void dateSelected( int year, int month, int day );
721 732
722void DateButton::setWeekStartsMonday( int b ) 733void DateButton::setWeekStartsMonday( int b )
723{ 734{
724 weekStartsMonday = b; 735 weekStartsMonday = b;
725} 736}
726 737
727void DateButton::setDate( int y, int m, int d ) 738void DateButton::setDate( int y, int m, int d )
728{ 739{
729 setDate( QDate( y,m,d) ); 740 setDate( QDate( y,m,d) );
730} 741}
731 742
732void DateButton::setDate( QDate d ) 743void DateButton::setDate( QDate d )
733{ 744{
734 currDate = d; 745 currDate = d;
735 setText( longFormat ? TimeString::longDateString( d, df ) : 746 setText( longFormat ? TimeString::longDateString( d, df ) :
736 TimeString::shortDate( d, df ) ); 747 TimeString::shortDate( d, df ) );
737 748
738} 749}
739 750
740void DateButton::setDateFormat( DateFormat f ) 751void DateButton::setDateFormat( DateFormat f )
741{ 752{
742 df = f; 753 df = f;
743 setDate( currDate ); 754 setDate( currDate );
744} 755}
745 756
746bool DateButton::customWhatsThis() const 757bool DateButton::customWhatsThis() const
747{ 758{
748 return TRUE; 759 return TRUE;
749} 760}
750 761
751 762
752// this class is only here for Sharp ROM compatibility 763// this class is only here for Sharp ROM compatibility
753// I have reverse engineered this class and it seems to 764// I have reverse engineered this class and it seems to
754// work (only qtmail seems to use it) - sandman 765// work (only qtmail seems to use it) - sandman
755// DO NOT USE IT IN NEW CODE !! 766// DO NOT USE IT IN NEW CODE !!
756 767
757DateBookMonthPopup::DateBookMonthPopup ( QWidget *w ) 768DateBookMonthPopup::DateBookMonthPopup ( QWidget *w )
758 : QPopupMenu ( w ) 769 : QPopupMenu ( w )
759{ 770{
760 m_dbm = new DateBookMonth( this, 0, TRUE ); 771 m_dbm = new DateBookMonth( this, 0, TRUE );
761 insertItem( m_dbm ); 772 insertItem( m_dbm );
762} 773}