summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-01-30 14:15:42 (UTC)
committer zautrix <zautrix>2005-01-30 14:15:42 (UTC)
commit8d543aa1d1d1ed20001c8b18352d1d29c2979e48 (patch) (unidiff)
tree9ca05f4d3bc1de81bcf0446a2f7471d552089c87
parent1bcef8b3f53419e7155e0862ad61e3e419763d70 (diff)
downloadkdepimpi-8d543aa1d1d1ed20001c8b18352d1d29c2979e48.zip
kdepimpi-8d543aa1d1d1ed20001c8b18352d1d29c2979e48.tar.gz
kdepimpi-8d543aa1d1d1ed20001c8b18352d1d29c2979e48.tar.bz2
many fixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt14
-rw-r--r--korganizer/kdatenavigator.cpp4
-rw-r--r--korganizer/koagendaitem.cpp13
-rw-r--r--korganizer/kodaymatrix.cpp148
-rw-r--r--korganizer/kodaymatrix.h5
5 files changed, 119 insertions, 65 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 6c9daad..05aa8fe 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,145 +1,157 @@
1Info about the changes in new versions of KDE-Pim/Pi 1Info about the changes in new versions of KDE-Pim/Pi
2 2
3 3
4********** VERSION 2.0.1 ************ 4********** VERSION 2.0.1 ************
5 5
6Oooops ... I forgot to test on the Zaurus 5500 ... 6Oooops ... I forgot to test on the Zaurus 5500 ...
7 7
8Fixed many problems of new (english) strings (and german translations) 8Fixed many problems of new (english) strings (and german translations)
9introduced in the latest versions, where the text was not fitting on the 9introduced in the latest versions, where the text was not fitting on the
10240x320 display of the Zaurus 5500. 10240x320 display of the Zaurus 5500.
11 11
12Added a popup menu ( press pen and hold to get popup ) to the agenda view 12Added a popup menu ( press pen and hold to get popup ) to the agenda view
13with may useful items. 13with many useful items (add event/todo, show next week, two weeks, month, journal).
14 14
15Added items to the todolist popup menu for: 15Added items to the todolist popup menu for:
16Display all opened, all closed or all todos flat. 16Display all opened, all closed or all todos flat.
17The "flat" view makes is possible to sort all todos after ,e.g., prio or date. 17The "flat" view makes is possible to sort all todos after ,e.g., prio or date.
18Made the reparenting of todos on the desktop possible via Drag&Drop.
19Fixed several bugs in setting the completed datetime for todos.
20Added info about completed datetime of todos to the todo viewer.
21Now displaying a completed todo (with completed datetime set) in the agenda view
22at the time of the completion. Such that now it is possible to see in the agenda view
23when what todo was completed.
24Fixed behaviour of automatic setting completion of todos with sub-todos/parent todos.
25Now the behaviour is:
26Setting a parent to complete sets all (sub)childs to complete.
27Setting a parent to uncomplete does not change the childs.
28Setting a child to uncomplete sets all parent to uncomplete.
29Setting a child to complete does not change the parents.
18 30
19 31
20********** VERSION 2.0.0 ************ 32********** VERSION 2.0.0 ************
21 33
22Stable release 2.0.0! 34Stable release 2.0.0!
23 35
24KO/Pi: 36KO/Pi:
25Fixed problem in edit dialog recreation at startup. 37Fixed problem in edit dialog recreation at startup.
26Made "toggle view*" menu items enabled context sensitive. 38Made "toggle view*" menu items enabled context sensitive.
27Changed agenda size menu to items 1-10. 39Changed agenda size menu to items 1-10.
28Made it possible to change agenda size quickly by pressing mouse on timelabels in agenda view and move mouse up/down. 40Made it possible to change agenda size quickly by pressing mouse on timelabels in agenda view and move mouse up/down.
29Usebility enhancements in the KO/Pi menus. 41Usebility enhancements in the KO/Pi menus.
30Birthday import now adds year to summary. 42Birthday import now adds year to summary.
31What's Next view shows age in years for birthday. 43What's Next view shows age in years for birthday.
32 44
33OM/Pi: 45OM/Pi:
34Added three info lines to display subject, from and to of selected mails. 46Added three info lines to display subject, from and to of selected mails.
35 47
36KA/Pi: 48KA/Pi:
37Fixed jump bar behaviour on Zaurus. 49Fixed jump bar behaviour on Zaurus.
38Now KA/Pi search field supports searching for a range of starting characters. 50Now KA/Pi search field supports searching for a range of starting characters.
39E.g. to search for all contact beginning with b to n, type 51E.g. to search for all contact beginning with b to n, type
40b-n 52b-n
41in the search field. 53in the search field.
42 54
43********** VERSION 1.9.20 ************ 55********** VERSION 1.9.20 ************
44 56
45KO/Pi: 57KO/Pi:
46Added for the "dislplay one day" agenda mode 58Added for the "dislplay one day" agenda mode
47info in the caption and in the day lables: 59info in the caption and in the day lables:
48Now it is displayed, if the selected day is from "day before yesterday" 60Now it is displayed, if the selected day is from "day before yesterday"
49to "day after tomorrow". 61to "day after tomorrow".
50Made it possible to delete a Todo, which has sub-todos. 62Made it possible to delete a Todo, which has sub-todos.
51Fixed two small problems in the todo view. 63Fixed two small problems in the todo view.
52Added missing German translation for filter edit and print dialog. 64Added missing German translation for filter edit and print dialog.
53Made search dialog closeable by cancel key. 65Made search dialog closeable by cancel key.
54 66
55Made it possible to select in the date picker the (ligt grey ) 67Made it possible to select in the date picker the (ligt grey )
56dates of the prev./next month with the mouse. 68dates of the prev./next month with the mouse.
57 69
58OM/Pi: 70OM/Pi:
59"Delete mail" icon in main window now deletes all selected mails. 71"Delete mail" icon in main window now deletes all selected mails.
60Fixed the problem, that the state flag of imap mails was ignored. 72Fixed the problem, that the state flag of imap mails was ignored.
61Now mails with "FLAG_SEEN" on the imap server get no icon in the list view 73Now mails with "FLAG_SEEN" on the imap server get no icon in the list view
62to indecate that they are already seen. 74to indecate that they are already seen.
63Fixed the problem that the body of some mails was not displayed in the 75Fixed the problem that the body of some mails was not displayed in the
64mail viewer when fetching them from the imap server directly to read them. 76mail viewer when fetching them from the imap server directly to read them.
65Made it (configurable) possible to show the "To:" field in the list view. 77Made it (configurable) possible to show the "To:" field in the list view.
66Added to the mail viewer the option "View Source" to make it possible to see the raw mail data. 78Added to the mail viewer the option "View Source" to make it possible to see the raw mail data.
67Added a "Download Mail" button to the mail viewer to quickly download the viewed mail to the 79Added a "Download Mail" button to the mail viewer to quickly download the viewed mail to the
68local storage folder (specified in account settings) of the account of the mail. 80local storage folder (specified in account settings) of the account of the mail.
69Removed some memory leaks in OM/Pi. 81Removed some memory leaks in OM/Pi.
70 82
71 83
72********** VERSION 1.9.19 ************ 84********** VERSION 1.9.19 ************
73 85
74Added a lot of missing translations to KA/Pi, 86Added a lot of missing translations to KA/Pi,
75Added some missing translations to KO/Pi and OM/Pi. 87Added some missing translations to KO/Pi and OM/Pi.
76 88
77Fixed some minor problems in KA/Pi + KO/Pi. 89Fixed some minor problems in KA/Pi + KO/Pi.
78 90
79Fixed a crash when closing PwM/Pi. 91Fixed a crash when closing PwM/Pi.
80Added German translation for PwM/Pi. 92Added German translation for PwM/Pi.
81 93
82Made view change and Month View update faster in KO/Pi. 94Made view change and Month View update faster in KO/Pi.
83 95
84 96
85********** VERSION 1.9.18 ************ 97********** VERSION 1.9.18 ************
86 98
87FYI: The VERSION 1.9.17 was a testing release only. 99FYI: The VERSION 1.9.17 was a testing release only.
88Please read the changelog of VERSION 1.9.17 as well. 100Please read the changelog of VERSION 1.9.17 as well.
89 101
90Cleaned up the syncing config dialog. 102Cleaned up the syncing config dialog.
91Added sync config options for date range for events. 103Added sync config options for date range for events.
92Added sync config options for filters on incoming data. 104Added sync config options for filters on incoming data.
93Added sync config options for filters on outgoing data. 105Added sync config options for filters on outgoing data.
94Please read the updated SyncHowTo about the new filter settings. 106Please read the updated SyncHowTo about the new filter settings.
95These filter settings make it now possible to sync with shared 107These filter settings make it now possible to sync with shared
96calendars without writing back private or confidential data 108calendars without writing back private or confidential data
97(via the outgoing filters). 109(via the outgoing filters).
98To sync only with particular parts of a shared calendar, 110To sync only with particular parts of a shared calendar,
99the incoming filter settings can be used. 111the incoming filter settings can be used.
100An example can be found in the SyncHowTo. 112An example can be found in the SyncHowTo.
101Same for shared addressbooks. 113Same for shared addressbooks.
102 114
103Added a setting for the global kdepim data storage. 115Added a setting for the global kdepim data storage.
104Usually the data is stored in (yourhomedir/kdepim). 116Usually the data is stored in (yourhomedir/kdepim).
105Now you can set in the Global config dialog TAB, subTAB "Data storage path" 117Now you can set in the Global config dialog TAB, subTAB "Data storage path"
106a directory where all the kdepim data is stored. 118a directory where all the kdepim data is stored.
107That makes it easy to save all kdepim data on a SD card on the Z, for example. 119That makes it easy to save all kdepim data on a SD card on the Z, for example.
108 120
109KO/Pi: 121KO/Pi:
110The timeedit input has a pulldown list for times. 122The timeedit input has a pulldown list for times.
111If opened, this pulldown list should now has the right time highlighted. 123If opened, this pulldown list should now has the right time highlighted.
112Added the possibility to exclude events/todos/journals in a filter. 124Added the possibility to exclude events/todos/journals in a filter.
113You should exclude journals, if you do not want them to sync with a public calendar. 125You should exclude journals, if you do not want them to sync with a public calendar.
114 126
115KA/Pi: 127KA/Pi:
116Added the possibility to in/exclude public/private/confidential contacts to a filter. 128Added the possibility to in/exclude public/private/confidential contacts to a filter.
117If you have already defined filterrules in KA/Pi you have to adjust them all by setting the "include public/private/confidential" property manually. Sorry for that ... 129If you have already defined filterrules in KA/Pi you have to adjust them all by setting the "include public/private/confidential" property manually. Sorry for that ...
118Added printing of card view and details view on desktop. 130Added printing of card view and details view on desktop.
119Printing of list view is not working... 131Printing of list view is not working...
120Added button for removing pictures in contact editor. 132Added button for removing pictures in contact editor.
121Parsing data fix of KA/Pi version 1.9.17. 133Parsing data fix of KA/Pi version 1.9.17.
122Fixed the "parse name automatically" problem of KA/Pi version 1.9.17. 134Fixed the "parse name automatically" problem of KA/Pi version 1.9.17.
123Fixed some syncing merging problems. 135Fixed some syncing merging problems.
124 136
125 137
126********** VERSION 1.9.17 ************ 138********** VERSION 1.9.17 ************
127 139
128KO/Pi: 140KO/Pi:
129Fixed that tooltips were not updated after moving an item in agenda view. 141Fixed that tooltips were not updated after moving an item in agenda view.
130Fixed a bug in sorting start date for recurring events in list view. 142Fixed a bug in sorting start date for recurring events in list view.
131Changed the left button in todo viewer from "Agenda" to "Set completed". 143Changed the left button in todo viewer from "Agenda" to "Set completed".
132This makes it possible to change a todo in the What's Next View quickly to the completed state without leaving the What's Next View. 144This makes it possible to change a todo in the What's Next View quickly to the completed state without leaving the What's Next View.
133Added more info in the todo viewer: Startdate, parent/sub todos. 145Added more info in the todo viewer: Startdate, parent/sub todos.
134 146
135 147
136KA/Pi: 148KA/Pi:
137All fields search does now actually search all the (possible) fields, 149All fields search does now actually search all the (possible) fields,
138not only those listed in the contact list. 150not only those listed in the contact list.
139Made is possible to inline a picture in a vcard on the Z. 151Made is possible to inline a picture in a vcard on the Z.
140This was only possible on the desktop, now is it possible on the Z as well. 152This was only possible on the desktop, now is it possible on the Z as well.
141Fixed of missing save settings after filter configuration. 153Fixed of missing save settings after filter configuration.
142Made saving of addressbook much faster. 154Made saving of addressbook much faster.
143Fixed extension widget layout problem. 155Fixed extension widget layout problem.
144Fixed saving of default formatted name settings. 156Fixed saving of default formatted name settings.
145Fixed formatted name handling in edit dialog. 157Fixed formatted name handling in edit dialog.
diff --git a/korganizer/kdatenavigator.cpp b/korganizer/kdatenavigator.cpp
index b420351..f31e50a 100644
--- a/korganizer/kdatenavigator.cpp
+++ b/korganizer/kdatenavigator.cpp
@@ -100,268 +100,268 @@ KDateNavigator::KDateNavigator( QWidget *parent, Calendar *calendar,
100 weeknos[i]->hide(); 100 weeknos[i]->hide();
101 } 101 }
102 weeknos[i]->installEventFilter(this); 102 weeknos[i]->installEventFilter(this);
103 103
104 topLayout->addWidget(weeknos[i],i+2,0); 104 topLayout->addWidget(weeknos[i],i+2,0);
105 } 105 }
106 106
107 daymatrix = new KODayMatrix( this, mCalendar, dayone, 107 daymatrix = new KODayMatrix( this, mCalendar, dayone,
108 "KDateNavigator::DayMatrix"); 108 "KDateNavigator::DayMatrix");
109 daymatrix->setFrameStyle(QFrame::Panel|QFrame::Sunken); 109 daymatrix->setFrameStyle(QFrame::Panel|QFrame::Sunken);
110 daymatrix->setLineWidth(1); 110 daymatrix->setLineWidth(1);
111 111
112 connect( daymatrix, SIGNAL( selected( const KCal::DateList & ) ), 112 connect( daymatrix, SIGNAL( selected( const KCal::DateList & ) ),
113 SIGNAL( datesSelected( const KCal::DateList & ) ) ); 113 SIGNAL( datesSelected( const KCal::DateList & ) ) );
114 114
115 connect( daymatrix, SIGNAL( eventDropped( Event * ) ), 115 connect( daymatrix, SIGNAL( eventDropped( Event * ) ),
116 SIGNAL( eventDropped( Event * ) ) ); 116 SIGNAL( eventDropped( Event * ) ) );
117 117
118 topLayout->addMultiCellWidget(daymatrix,2,7,1,7); 118 topLayout->addMultiCellWidget(daymatrix,2,7,1,7);
119 119
120 // read settings from configuration file. 120 // read settings from configuration file.
121 updateConfig(); 121 updateConfig();
122 enableRollover(FollowMonth); 122 enableRollover(FollowMonth);
123 setFixedSize ( sizeHint() ); 123 setFixedSize ( sizeHint() );
124} 124}
125 125
126void KDateNavigator::enableRollover(RolloverType r) 126void KDateNavigator::enableRollover(RolloverType r)
127{ 127{
128 switch(r) 128 switch(r)
129 { 129 {
130 case None : 130 case None :
131 if (updateTimer) 131 if (updateTimer)
132 { 132 {
133 updateTimer->stop(); 133 updateTimer->stop();
134 delete updateTimer; 134 delete updateTimer;
135 updateTimer=0L; 135 updateTimer=0L;
136 } 136 }
137 break; 137 break;
138 case FollowDay : 138 case FollowDay :
139 case FollowMonth : 139 case FollowMonth :
140 if (!updateTimer) 140 if (!updateTimer)
141 { 141 {
142 updateTimer = new QTimer(this); 142 updateTimer = new QTimer(this);
143 QObject::connect(updateTimer,SIGNAL(timeout()), 143 QObject::connect(updateTimer,SIGNAL(timeout()),
144 this,SLOT(possiblyPastMidnight())); 144 this,SLOT(possiblyPastMidnight()));
145 } 145 }
146 updateTimer->start(0,true); 146 updateTimer->start(0,true);
147 lastDayChecked = QDate::currentDate(); 147 lastDayChecked = QDate::currentDate();
148 } 148 }
149 updateRollover=r; 149 updateRollover=r;
150} 150}
151 151
152 152
153KDateNavigator::~KDateNavigator() 153KDateNavigator::~KDateNavigator()
154{ 154{
155} 155}
156 156
157 157
158void KDateNavigator::passedMidnight() 158void KDateNavigator::passedMidnight()
159{ 159{
160 QDate today = QDate::currentDate(); 160 QDate today = QDate::currentDate();
161 bool emitMonth = false; 161 bool emitMonth = false;
162 162
163 if (today.month() != lastDayChecked.month()) 163 if (today.month() != lastDayChecked.month())
164 { 164 {
165 if (updateRollover==FollowMonth && 165 if (updateRollover==FollowMonth &&
166 daymatrix->isEndOfMonth()) { 166 daymatrix->isEndOfMonth()) {
167 goNextMonth(); 167 goNextMonth();
168 emitMonth=true; 168 emitMonth=true;
169 } 169 }
170 } 170 }
171 daymatrix->recalculateToday(); 171 daymatrix->recalculateToday();
172 daymatrix->repaint(); 172 daymatrix->repaint();
173 emit dayPassed(today); 173 emit dayPassed(today);
174 if (emitMonth) { emit monthPassed(today); } 174 if (emitMonth) { emit monthPassed(today); }
175} 175}
176 176
177/* slot */ void KDateNavigator::possiblyPastMidnight() 177/* slot */ void KDateNavigator::possiblyPastMidnight()
178{ 178{
179 if (lastDayChecked!=QDate::currentDate()) 179 if (lastDayChecked!=QDate::currentDate())
180 { 180 {
181 passedMidnight(); 181 passedMidnight();
182 lastDayChecked=QDate::currentDate(); 182 lastDayChecked=QDate::currentDate();
183 } 183 }
184 // Set the timer to go off 1 second after midnight 184 // Set the timer to go off 1 second after midnight
185 // or after 8 minutes, whichever comes first. 185 // or after 8 minutes, whichever comes first.
186 if (updateTimer) 186 if (updateTimer)
187 { 187 {
188 QTime now = QTime::currentTime(); 188 QTime now = QTime::currentTime();
189 QTime midnight = QTime(23,59,59); 189 QTime midnight = QTime(23,59,59);
190 int msecsWait = QMIN(480000,now.msecsTo(midnight)+2000); 190 int msecsWait = QMIN(480000,now.msecsTo(midnight)+2000);
191 191
192 // qDebug(QString("Waiting %1 msec from %2 to %3.").arg(msecsWait)) 192 // qDebug(QString("Waiting %1 msec from %2 to %3.").arg(msecsWait))
193 //.arg(now.toString()).arg(midnight.toString())); 193 //.arg(now.toString()).arg(midnight.toString()));
194 194
195 updateTimer->stop(); 195 updateTimer->stop();
196 updateTimer->start(msecsWait,true); 196 updateTimer->start(msecsWait,true);
197 } 197 }
198} 198}
199 199
200void KDateNavigator::updateDates() 200void KDateNavigator::updateDates()
201{ 201{
202 // Find the first day of the week of the current month. 202 // Find the first day of the week of the current month.
203 //int d1 = KOGlobals::self()->calendarSystem()->day( m_MthYr ); 203 //int d1 = KOGlobals::self()->calendarSystem()->day( m_MthYr );
204 QDate dayone( m_MthYr.year(), m_MthYr.month(), m_MthYr.day() ); 204 QDate dayone( m_MthYr.year(), m_MthYr.month(), m_MthYr.day() );
205 int d2 = KOGlobals::self()->calendarSystem()->day( dayone ); 205 int d2 = KOGlobals::self()->calendarSystem()->day( dayone );
206 //int di = d1 - d2 + 1; 206 //int di = d1 - d2 + 1;
207 dayone = dayone.addDays( -d2 + 1 ); 207 dayone = dayone.addDays( -d2 + 1 );
208 208
209 int m_fstDayOfWkCalsys = KOGlobals::self()->calendarSystem()->dayOfWeek( dayone ); 209 int m_fstDayOfWkCalsys = KOGlobals::self()->calendarSystem()->dayOfWeek( dayone );
210 210
211 // If month begins on Monday and Monday is first day of week, 211 // If month begins on Monday and Monday is first day of week,
212 // month should begin on second line. Sunday doesn't have this problem. 212 // month should begin on second line. Sunday doesn't have this problem.
213 int nextLine = ( ( m_fstDayOfWkCalsys == 1) && 213 int nextLine = ( ( m_fstDayOfWkCalsys == 1) &&
214 ( KGlobal::locale()->weekStartsMonday() == 1 ) ) ? 7 : 0; 214 ( KGlobal::locale()->weekStartsMonday() == 1 ) ) ? 7 : 0;
215 215
216 // update the matrix dates 216 // update the matrix dates
217 int index = (KGlobal::locale()->weekStartsMonday() ? 1 : 0) - m_fstDayOfWkCalsys - nextLine; 217 int index = (KGlobal::locale()->weekStartsMonday() ? 1 : 0) - m_fstDayOfWkCalsys - nextLine;
218 218
219 219
220 daymatrix->updateView(dayone.addDays(index)); 220 daymatrix->updateView(dayone.addDays(index));
221//each updateDates is followed by an updateView -> repaint is issued there ! 221//each updateDates is followed by an updateView -> repaint is issued there !
222// daymatrix->repaint(); 222// daymatrix->repaint();
223} 223}
224 224
225void KDateNavigator::updateDayMatrix() 225void KDateNavigator::updateDayMatrix()
226{ 226{
227 daymatrix->updateView(); 227 daymatrix->updateView();
228 daymatrix->repaint(); 228 //daymatrix->repaint();
229} 229}
230 230
231 231
232void KDateNavigator::updateView() 232void KDateNavigator::updateView()
233{ 233{
234 234
235 setUpdatesEnabled( false ); 235 setUpdatesEnabled( false );
236 236
237 int i; 237 int i;
238 238
239// kdDebug() << "updateView() -> daymatrix->updateView()" << endl; 239// kdDebug() << "updateView() -> daymatrix->updateView()" << endl;
240 daymatrix->updateView(); 240 daymatrix->updateView();
241 241
242 // set the week numbers. 242 // set the week numbers.
243 for(i = 0; i < 6; i++) { 243 for(i = 0; i < 6; i++) {
244 QString weeknum; 244 QString weeknum;
245 // remember, according to ISO 8601, the first week of the year is the 245 // remember, according to ISO 8601, the first week of the year is the
246 // first week that contains a thursday. Thus we must subtract off 4, 246 // first week that contains a thursday. Thus we must subtract off 4,
247 // not just 1. 247 // not just 1.
248 248
249 //ET int dayOfYear = buttons[(i + 1) * 7 - 4]->date().dayOfYear(); 249 //ET int dayOfYear = buttons[(i + 1) * 7 - 4]->date().dayOfYear();
250 int dayOfYear = KOGlobals::self()->calendarSystem()->dayOfYear((daymatrix->getDate((i+1)*7-4))); 250 int dayOfYear = KOGlobals::self()->calendarSystem()->dayOfYear((daymatrix->getDate((i+1)*7-4)));
251 251
252 int add = 0; 252 int add = 0;
253 if ( ! KGlobal::locale()->weekStartsMonday() ) 253 if ( ! KGlobal::locale()->weekStartsMonday() )
254 ++add; 254 ++add;
255 if (dayOfYear % 7 != 0) 255 if (dayOfYear % 7 != 0)
256 weeknum.setNum(dayOfYear / 7 + 1+add); 256 weeknum.setNum(dayOfYear / 7 + 1+add);
257 else 257 else
258 weeknum.setNum(dayOfYear / 7 +add); 258 weeknum.setNum(dayOfYear / 7 +add);
259 weeknos[i]->setText(weeknum); 259 weeknos[i]->setText(weeknum);
260 } 260 }
261 261
262 setUpdatesEnabled( true ); 262 setUpdatesEnabled( true );
263// kdDebug() << "updateView() -> repaint()" << endl; 263// kdDebug() << "updateView() -> repaint()" << endl;
264 repaint(); 264 repaint();
265 daymatrix->repaint(); 265 // daymatrix->repaint();
266} 266}
267 267
268void KDateNavigator::updateConfig() 268void KDateNavigator::updateConfig()
269{ 269{
270 int day; 270 int day;
271 for(int i=0; i<7; i++) { 271 for(int i=0; i<7; i++) {
272 // take the first letter of the day name to be the abbreviation 272 // take the first letter of the day name to be the abbreviation
273 if (KGlobal::locale()->weekStartsMonday()) { 273 if (KGlobal::locale()->weekStartsMonday()) {
274 day = i+1; 274 day = i+1;
275 } else { 275 } else {
276 if (i==0) day = 7; 276 if (i==0) day = 7;
277 else day = i; 277 else day = i;
278 } 278 }
279 QString dayName = KOGlobals::self()->calendarSystem()->weekDayName( day, 279 QString dayName = KOGlobals::self()->calendarSystem()->weekDayName( day,
280 true ); 280 true );
281 if ( KOPrefs::instance()->mCompactDialogs ) dayName = dayName.left( 1 ); 281 if ( KOPrefs::instance()->mCompactDialogs ) dayName = dayName.left( 1 );
282 headings[i]->setText( dayName ); 282 headings[i]->setText( dayName );
283 } 283 }
284 updateDates(); 284 updateDates();
285 updateView(); 285 updateView();
286} 286}
287 287
288void KDateNavigator::setShowWeekNums(bool enabled) 288void KDateNavigator::setShowWeekNums(bool enabled)
289{ 289{
290 m_bShowWeekNums = enabled; 290 m_bShowWeekNums = enabled;
291 for(int i=0; i<6; i++) { 291 for(int i=0; i<6; i++) {
292 if(enabled) 292 if(enabled)
293 weeknos[i]->show(); 293 weeknos[i]->show();
294 else 294 else
295 weeknos[i]->hide(); 295 weeknos[i]->hide();
296 } 296 }
297 resize(size()); 297 resize(size());
298} 298}
299 299
300void KDateNavigator::selectDates(const DateList& dateList) 300void KDateNavigator::selectDates(const DateList& dateList)
301{ 301{
302 302
303 if (dateList.count() > 0) { 303 if (dateList.count() > 0) {
304 mNavigatorBar->selectDates( dateList ); 304 mNavigatorBar->selectDates( dateList );
305 mSelectedDates = dateList; 305 mSelectedDates = dateList;
306 306
307 // set our record of the month and year that this datetbl is 307 // set our record of the month and year that this datetbl is
308 // displaying. 308 // displaying.
309 m_MthYr = mSelectedDates.first(); 309 m_MthYr = mSelectedDates.first();
310 310
311 311
312 // set our record of the first day of the week of the current 312 // set our record of the first day of the week of the current
313 // month. This needs to be done before calling dayToIndex, since it 313 // month. This needs to be done before calling dayToIndex, since it
314 // relies on this information being up to date. 314 // relies on this information being up to date.
315 QDate dayone(m_MthYr.year(), m_MthYr.month(), 1); 315 QDate dayone(m_MthYr.year(), m_MthYr.month(), 1);
316 m_fstDayOfWk = dayone.dayOfWeek(); 316 m_fstDayOfWk = dayone.dayOfWeek();
317 317
318 updateDates(); 318 updateDates();
319 319
320 daymatrix->setSelectedDaysFrom(*(dateList.begin()), *(--dateList.end())); 320 daymatrix->setSelectedDaysFrom(*(dateList.begin()), *(--dateList.end()));
321 321
322 updateView(); 322 updateView();
323 } 323 }
324} 324}
325 325
326int KDateNavigator::dayNum(int row, int col) 326int KDateNavigator::dayNum(int row, int col)
327{ 327{
328 return 7 * (row - 1) + (col + 1) - m_fstDayOfWk; 328 return 7 * (row - 1) + (col + 1) - m_fstDayOfWk;
329} 329}
330 330
331int KDateNavigator::dayToIndex(int dayNum) 331int KDateNavigator::dayToIndex(int dayNum)
332{ 332{
333 int row, col; 333 int row, col;
334 334
335 row = (dayNum+m_fstDayOfWk-1-(KGlobal::locale()->weekStartsMonday() ? 1 : 0)) / 7; 335 row = (dayNum+m_fstDayOfWk-1-(KGlobal::locale()->weekStartsMonday() ? 1 : 0)) / 7;
336 if (KGlobal::locale()->weekStartsMonday() && (m_fstDayOfWk == 1)) 336 if (KGlobal::locale()->weekStartsMonday() && (m_fstDayOfWk == 1))
337 row++; 337 row++;
338 col = (dayNum+m_fstDayOfWk-1-(KGlobal::locale()->weekStartsMonday() ? 1 : 0)) % 7; 338 col = (dayNum+m_fstDayOfWk-1-(KGlobal::locale()->weekStartsMonday() ? 1 : 0)) % 7;
339 return row * 7 + col; 339 return row * 7 + col;
340} 340}
341 341
342void KDateNavigator::wheelEvent (QWheelEvent *e) 342void KDateNavigator::wheelEvent (QWheelEvent *e)
343{ 343{
344 if(e->delta()>0) emit goPrevious(); 344 if(e->delta()>0) emit goPrevious();
345 else emit goNext(); 345 else emit goNext();
346 346
347 e->accept(); 347 e->accept();
348} 348}
349 349
350bool KDateNavigator::eventFilter (QObject *o,QEvent *e) 350bool KDateNavigator::eventFilter (QObject *o,QEvent *e)
351{ 351{
352 if (e->type() == QEvent::MouseButtonPress) { 352 if (e->type() == QEvent::MouseButtonPress) {
353 int i; 353 int i;
354 for(i=0;i<6;++i) { 354 for(i=0;i<6;++i) {
355 if (o == weeknos[i]) { 355 if (o == weeknos[i]) {
356 QDate weekstart = daymatrix->getDate(i*7); 356 QDate weekstart = daymatrix->getDate(i*7);
357 emit weekClicked(weekstart); 357 emit weekClicked(weekstart);
358 break; 358 break;
359 } 359 }
360 } 360 }
361 return true; 361 return true;
362 } else { 362 } else {
363 return false; 363 return false;
364 } 364 }
365} 365}
366 366
367//#include "kdatenavigator.moc" 367//#include "kdatenavigator.moc"
diff --git a/korganizer/koagendaitem.cpp b/korganizer/koagendaitem.cpp
index 39355b4..ee9f39a 100644
--- a/korganizer/koagendaitem.cpp
+++ b/korganizer/koagendaitem.cpp
@@ -344,263 +344,262 @@ void KOAgendaItem::paintMe( bool selected, QPainter* paint )
344 } else { 344 } else {
345 x += 2; yy += 1;w -= 4; h-= 4; 345 x += 2; yy += 1;w -= 4; h-= 4;
346 if ( nfh < 6.01 ) { 346 if ( nfh < 6.01 ) {
347 yy -= 2; 347 yy -= 2;
348 h += 4; 348 h += 4;
349 } 349 }
350 else 350 else
351 if ( nfh < h -2 ) 351 if ( nfh < h -2 )
352 ++yy; 352 ++yy;
353 } 353 }
354 int align; 354 int align;
355#ifndef DESKTOP_VERSION 355#ifndef DESKTOP_VERSION
356 align = ( AlignLeft|WordBreak|AlignTop); 356 align = ( AlignLeft|WordBreak|AlignTop);
357#else 357#else
358 align = ( AlignLeft|BreakAnywhere|WordBreak|AlignTop); 358 align = ( AlignLeft|BreakAnywhere|WordBreak|AlignTop);
359#endif 359#endif
360 if ( addIcon ) { 360 if ( addIcon ) {
361 if ( ! horLayout ) { 361 if ( ! horLayout ) {
362 x += AGENDA_ICON_SIZE+3; 362 x += AGENDA_ICON_SIZE+3;
363 w -= (AGENDA_ICON_SIZE+3); 363 w -= (AGENDA_ICON_SIZE+3);
364 } 364 }
365 else { 365 else {
366 yy+= AGENDA_ICON_SIZE+2; 366 yy+= AGENDA_ICON_SIZE+2;
367 h -=(AGENDA_ICON_SIZE+3); 367 h -=(AGENDA_ICON_SIZE+3);
368 } 368 }
369 } 369 }
370 int colsum = mBackgroundColor.red() + mBackgroundColor.green() + mBackgroundColor.blue(); 370 int colsum = mBackgroundColor.red() + mBackgroundColor.green() + mBackgroundColor.blue();
371 if ( colsum < 250 ) 371 if ( colsum < 250 )
372 paint->setPen ( white); 372 paint->setPen ( white);
373 if ( x < 0 ) { 373 if ( x < 0 ) {
374 w = w+x-3; 374 w = w+x-3;
375 x = 3; 375 x = 3;
376 if ( w > parentWidget()->width() ){ 376 if ( w > parentWidget()->width() ){
377 w = parentWidget()->width() - 6; 377 w = parentWidget()->width() - 6;
378#ifndef DESKTOP_VERSION 378#ifndef DESKTOP_VERSION
379 align = ( AlignCenter|WordBreak); 379 align = ( AlignCenter|WordBreak);
380#else 380#else
381 align = ( AlignCenter|BreakAnywhere|WordBreak); 381 align = ( AlignCenter|BreakAnywhere|WordBreak);
382#endif 382#endif
383 383
384 } 384 }
385 } 385 }
386 QRect dr; 386 QRect dr;
387 paint->drawText ( x, yy, w, h, align, mDisplayedText, -1, &dr ); 387 paint->drawText ( x, yy, w, h, align, mDisplayedText, -1, &dr );
388 if ( mIncidence->cancelled() ){ 388 if ( mIncidence->cancelled() ){
389 if ( ! small ) { 389 if ( ! small ) {
390 QFontMetrics fm ( paint->font() ); 390 QFontMetrics fm ( paint->font() );
391 paint->drawLine(dr.left(), yy+fm.height()/2, dr.right()-2, yy+fm.height()/2); 391 paint->drawLine(dr.left(), yy+fm.height()/2, dr.right()-2, yy+fm.height()/2);
392 } 392 }
393 393
394 } 394 }
395 pa.end(); 395 pa.end();
396 396
397} 397}
398void KOAgendaItem::resizePixmap( int w , int h ) 398void KOAgendaItem::resizePixmap( int w , int h )
399{ 399{
400 paintPix()->resize( w, h ); 400 paintPix()->resize( w, h );
401 paintPixSel()->resize( w, h ); 401 paintPixSel()->resize( w, h );
402 402
403} 403}
404QPixmap * KOAgendaItem::paintPix() 404QPixmap * KOAgendaItem::paintPix()
405{ 405{
406 static QPixmap* mPaintPix = 0; 406 static QPixmap* mPaintPix = 0;
407 if ( ! mPaintPix ) 407 if ( ! mPaintPix )
408 mPaintPix = new QPixmap(1,1); 408 mPaintPix = new QPixmap(1,1);
409 return mPaintPix ; 409 return mPaintPix ;
410} 410}
411QPixmap * KOAgendaItem::paintPixAllday() 411QPixmap * KOAgendaItem::paintPixAllday()
412{ 412{
413 static QPixmap* mPaintPixA = 0; 413 static QPixmap* mPaintPixA = 0;
414 if ( ! mPaintPixA ) 414 if ( ! mPaintPixA )
415 mPaintPixA = new QPixmap(1,1); 415 mPaintPixA = new QPixmap(1,1);
416 return mPaintPixA ; 416 return mPaintPixA ;
417} 417}
418QPixmap * KOAgendaItem::paintPixSel() 418QPixmap * KOAgendaItem::paintPixSel()
419{ 419{
420 static QPixmap* mPaintPixSel = 0; 420 static QPixmap* mPaintPixSel = 0;
421 if ( ! mPaintPixSel ) 421 if ( ! mPaintPixSel )
422 mPaintPixSel = new QPixmap(1,1); 422 mPaintPixSel = new QPixmap(1,1);
423 return mPaintPixSel ; 423 return mPaintPixSel ;
424} 424}
425void KOAgendaItem::paintEvent ( QPaintEvent *e ) 425void KOAgendaItem::paintEvent ( QPaintEvent *e )
426{ 426{
427 427
428 if ( globalFlagBlockAgendaItemPaint ) 428 if ( globalFlagBlockAgendaItemPaint )
429 return; 429 return;
430 if ( globalFlagBlockAgenda > 0 && globalFlagBlockAgenda < 5 ) 430 if ( globalFlagBlockAgenda > 0 && globalFlagBlockAgenda < 5 )
431 return; 431 return;
432 int yy; 432 int yy;
433 if ( mAllDay ) 433 if ( mAllDay )
434 yy = y(); 434 yy = y();
435 else 435 else
436 yy = mCellYTop * ( height() / cellHeight() ); 436 yy = mCellYTop * ( height() / cellHeight() );
437 int xx = x(); 437 int xx = x();
438 if ( xPaintCoord != xx || yPaintCoord != yy || 438 if ( xPaintCoord != xx || yPaintCoord != yy ||
439 wPaintCoord != width() || hPaintCoord != height()) { 439 wPaintCoord != width() || hPaintCoord != height()) {
440 xPaintCoord= xx; 440 xPaintCoord= xx;
441 yPaintCoord = yy; 441 yPaintCoord = yy;
442 wPaintCoord = width(); 442 wPaintCoord = width();
443 hPaintCoord = height(); 443 hPaintCoord = height();
444 globalFlagBlockAgendaItemUpdate = 0; 444 globalFlagBlockAgendaItemUpdate = 0;
445 paintMe( mSelected ); 445 paintMe( mSelected );
446 //qDebug("calling paintMe "); 446 //qDebug("calling paintMe ");
447 globalFlagBlockAgendaItemUpdate = 1; 447 globalFlagBlockAgendaItemUpdate = 1;
448 } 448 }
449 int rx, ry, rw, rh; 449 int rx, ry, rw, rh;
450 rx = e->rect().x(); 450 rx = e->rect().x();
451 ry = e->rect().y(); 451 ry = e->rect().y();
452 rw = e->rect().width(); 452 rw = e->rect().width();
453 rh = e->rect().height(); 453 rh = e->rect().height();
454 //qDebug(" paintevent %s %d %d %d %d", mIncidence->summary().latin1(), x(), yy, width(), height()); 454 //qDebug(" paintevent %s %d %d %d %d", mIncidence->summary().latin1(), x(), yy, width(), height());
455 455
456 QPixmap* paintFrom ; 456 QPixmap* paintFrom ;
457 if ( mSelected ) { 457 if ( mSelected ) {
458 paintFrom = paintPixSel(); 458 paintFrom = paintPixSel();
459 } else { 459 } else {
460 if ( mAllDay ) 460 if ( mAllDay )
461 paintFrom = paintPixAllday(); 461 paintFrom = paintPixAllday();
462 else 462 else
463 paintFrom = paintPix(); 463 paintFrom = paintPix();
464 } 464 }
465 bitBlt (this, rx, ry, paintFrom, x()+rx ,yPaintCoord+ry, rw, rh ,CopyROP); 465 bitBlt (this, rx, ry, paintFrom, x()+rx ,yPaintCoord+ry, rw, rh ,CopyROP);
466} 466}
467void KOAgendaItem::computeText() 467void KOAgendaItem::computeText()
468{ 468{
469 469
470 mDisplayedText = mIncidence->summary(); 470 mDisplayedText = mIncidence->summary();
471 if ( (mIncidence->type() == "Todo") ) { 471 if ( (mIncidence->type() == "Todo") ) {
472 if ( static_cast<Todo*>(mIncidence)->dtDue().date() < QDate::currentDate() ) 472 if ( static_cast<Todo*>(mIncidence)->hasDueDate() ) {
473 mDisplayedText += i18n(" (") +KGlobal::locale()->formatDate((static_cast<Todo*>(mIncidence))->dtDue().date(), true)+")"; 473 if ( static_cast<Todo*>(mIncidence)->dtDue().date() < QDate::currentDate() )
474 else if ( !(mIncidence->doesFloat())) 474 mDisplayedText += i18n(" (") +KGlobal::locale()->formatDate((static_cast<Todo*>(mIncidence))->dtDue().date(), true)+")";
475 mDisplayedText += i18n(" (") +KGlobal::locale()->formatTime((static_cast<Todo*>(mIncidence))->dtDue().time())+")"; 475 else if ( !(mIncidence->doesFloat()))
476 476 mDisplayedText += i18n(" (") +KGlobal::locale()->formatTime((static_cast<Todo*>(mIncidence))->dtDue().time())+")";
477 477 }
478
479 } else { 478 } else {
480 if ( !(mIncidence->doesFloat()) && KOPrefs::instance()->mShowTimeInAgenda) 479 if ( !(mIncidence->doesFloat()) && KOPrefs::instance()->mShowTimeInAgenda)
481 mDisplayedText += ": " +KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtStart().time()) + "-" + KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtEnd().time()) ; 480 mDisplayedText += ": " +KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtStart().time()) + "-" + KGlobal::locale()->formatTime((static_cast<Event*>(mIncidence))->dtEnd().time()) ;
482 481
483 if ( mAllDay ) { 482 if ( mAllDay ) {
484 if ( mIncidence->dtStart().date().addDays(3) < mIncidence->dtEnd().date() ) { 483 if ( mIncidence->dtStart().date().addDays(3) < mIncidence->dtEnd().date() ) {
485 mDisplayedText += ": " +KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtStart().date(), true) + " - " + KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtEnd().date(), true) ; 484 mDisplayedText += ": " +KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtStart().date(), true) + " - " + KGlobal::locale()->formatDate((static_cast<Event*>(mIncidence))->dtEnd().date(), true) ;
486 } 485 }
487 } 486 }
488 487
489 } 488 }
490 489
491 if ( !mIncidence->location().isEmpty() ) { 490 if ( !mIncidence->location().isEmpty() ) {
492 if ( mAllDay ) 491 if ( mAllDay )
493 mDisplayedText += " ("; 492 mDisplayedText += " (";
494 else 493 else
495 mDisplayedText += "\n("; 494 mDisplayedText += "\n(";
496 mDisplayedText += mIncidence->location() +")"; 495 mDisplayedText += mIncidence->location() +")";
497 } 496 }
498 497
499 QString tipText = mIncidence->summary(); 498 QString tipText = mIncidence->summary();
500 QWhatsThis::add(this,KIncidenceFormatter::instance()->getFormattedText( mIncidence )); 499 QWhatsThis::add(this,KIncidenceFormatter::instance()->getFormattedText( mIncidence ));
501 if ( !mIncidence->doesFloat() ) { 500 if ( !mIncidence->doesFloat() ) {
502 if ( mIncidence->type() == "Event" ) { 501 if ( mIncidence->type() == "Event" ) {
503 if ( (static_cast<Event*>(mIncidence))->isMultiDay() ) { 502 if ( (static_cast<Event*>(mIncidence))->isMultiDay() ) {
504 tipText += "\n"+i18n("From: ")+mIncidence->dtStartStr(); 503 tipText += "\n"+i18n("From: ")+mIncidence->dtStartStr();
505 tipText += "\n"+i18n("To: ")+(static_cast<Event*>(mIncidence))->dtEndStr(); 504 tipText += "\n"+i18n("To: ")+(static_cast<Event*>(mIncidence))->dtEndStr();
506 } 505 }
507 else { 506 else {
508 tipText += "\n"+i18n("Time: ")+mIncidence->dtStartTimeStr(); 507 tipText += "\n"+i18n("Time: ")+mIncidence->dtStartTimeStr();
509 tipText += " - "+(static_cast<Event*>(mIncidence))->dtEndTimeStr(); 508 tipText += " - "+(static_cast<Event*>(mIncidence))->dtEndTimeStr();
510 } 509 }
511 } 510 }
512 else if ( mIncidence->type() == "Todo" ) { 511 else if ( mIncidence->type() == "Todo" ) {
513 if (mIncidence->hasStartDate()) 512 if (mIncidence->hasStartDate())
514 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartStr(); 513 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartStr();
515 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueStr(); 514 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueStr();
516 } 515 }
517 } else if ( mIncidence->type() == "Todo" ) { 516 } else if ( mIncidence->type() == "Todo" ) {
518 if (mIncidence->hasStartDate()) 517 if (mIncidence->hasStartDate())
519 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartDateStr(); 518 tipText += "\n"+i18n("Start: ")+ (static_cast<Todo*>(mIncidence))->dtStartDateStr();
520 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueDateStr(); 519 tipText += "\n"+i18n("Due: ")+ (static_cast<Todo*>(mIncidence))->dtDueDateStr();
521 } 520 }
522 521
523 if (!mIncidence->location().isEmpty()) { 522 if (!mIncidence->location().isEmpty()) {
524 tipText += "\n"+i18n("Location: ")+mIncidence->location(); 523 tipText += "\n"+i18n("Location: ")+mIncidence->location();
525 } 524 }
526 QToolTip::add(this,tipText,toolTipGroup(),""); 525 QToolTip::add(this,tipText,toolTipGroup(),"");
527 526
528} 527}
529void KOAgendaItem::updateItem() 528void KOAgendaItem::updateItem()
530{ 529{
531 computeText(); 530 computeText();
532 531
533 //qDebug("KOAgendaItem:: updateItem() %s %d %d ",incidence()->summary().latin1(), x(), y()); 532 //qDebug("KOAgendaItem:: updateItem() %s %d %d ",incidence()->summary().latin1(), x(), y());
534 paintMe( mSelected ); 533 paintMe( mSelected );
535 repaint( false); 534 repaint( false);
536} 535}
537 536
538void KOAgendaItem::resizeEvent ( QResizeEvent *ev ) 537void KOAgendaItem::resizeEvent ( QResizeEvent *ev )
539{ 538{
540 //qDebug("KOAgendaItem::resizeEvent %s ", mIncidence->summary().latin1()); 539 //qDebug("KOAgendaItem::resizeEvent %s ", mIncidence->summary().latin1());
541 paintMe( mSelected ); 540 paintMe( mSelected );
542 repaint( false ); 541 repaint( false );
543} 542}
544 543
545/* 544/*
546 Return height of item in units of agenda cells 545 Return height of item in units of agenda cells
547*/ 546*/
548int KOAgendaItem::cellHeight() 547int KOAgendaItem::cellHeight()
549{ 548{
550 int ret = mCellYBottom - mCellYTop + 1; 549 int ret = mCellYBottom - mCellYTop + 1;
551 if ( ret <= 0 ) { 550 if ( ret <= 0 ) {
552 ret = 1; 551 ret = 1;
553 mCellYBottom = 0; 552 mCellYBottom = 0;
554 mCellYTop = 0; 553 mCellYTop = 0;
555 } 554 }
556 return ret; 555 return ret;
557} 556}
558 557
559/* 558/*
560 Return height of item in units of agenda cells 559 Return height of item in units of agenda cells
561*/ 560*/
562int KOAgendaItem::cellWidth() 561int KOAgendaItem::cellWidth()
563{ 562{
564 return mCellXWidth - mCellX + 1; 563 return mCellXWidth - mCellX + 1;
565} 564}
566 565
567void KOAgendaItem::setItemDate(QDate qd) 566void KOAgendaItem::setItemDate(QDate qd)
568{ 567{
569 mDate = qd; 568 mDate = qd;
570} 569}
571 570
572void KOAgendaItem::setCellXY(int X, int YTop, int YBottom) 571void KOAgendaItem::setCellXY(int X, int YTop, int YBottom)
573{ 572{
574 mCellX = X; 573 mCellX = X;
575 mCellYTop = YTop; 574 mCellYTop = YTop;
576 mCellYBottom = YBottom; 575 mCellYBottom = YBottom;
577} 576}
578 577
579void KOAgendaItem::setCellXWidth(int xwidth) 578void KOAgendaItem::setCellXWidth(int xwidth)
580{ 579{
581 mCellXWidth = xwidth; 580 mCellXWidth = xwidth;
582} 581}
583 582
584void KOAgendaItem::setCellX(int XLeft, int XRight) 583void KOAgendaItem::setCellX(int XLeft, int XRight)
585{ 584{
586 mCellX = XLeft; 585 mCellX = XLeft;
587 mCellXWidth = XRight; 586 mCellXWidth = XRight;
588} 587}
589 588
590void KOAgendaItem::setCellY(int YTop, int YBottom) 589void KOAgendaItem::setCellY(int YTop, int YBottom)
591{ 590{
592 mCellYTop = YTop; 591 mCellYTop = YTop;
593 mCellYBottom = YBottom; 592 mCellYBottom = YBottom;
594} 593}
595 594
596void KOAgendaItem::setSubCell(int subCell) 595void KOAgendaItem::setSubCell(int subCell)
597{ 596{
598 mSubCell = subCell; 597 mSubCell = subCell;
599} 598}
600 599
601void KOAgendaItem::setSubCells(int subCells) 600void KOAgendaItem::setSubCells(int subCells)
602{ 601{
603 mSubCells = subCells; 602 mSubCells = subCells;
604} 603}
605 604
606void KOAgendaItem::setMultiItem(KOAgendaItem *first,KOAgendaItem *next, 605void KOAgendaItem::setMultiItem(KOAgendaItem *first,KOAgendaItem *next,
diff --git a/korganizer/kodaymatrix.cpp b/korganizer/kodaymatrix.cpp
index fc00828..060b4c4 100644
--- a/korganizer/kodaymatrix.cpp
+++ b/korganizer/kodaymatrix.cpp
@@ -1,414 +1,452 @@
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 code for Qt in the source distribution. 22 without including the source code for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qevent.h> 25#include <qevent.h>
26#include <qpainter.h> 26#include <qpainter.h>
27#include <qptrlist.h> 27#include <qptrlist.h>
28 28
29#include <kglobal.h> 29#include <kglobal.h>
30#include <kdebug.h> 30#include <kdebug.h>
31#include <klocale.h> 31#include <klocale.h>
32 32
33#include <libkcal/vcaldrag.h> 33#include <libkcal/vcaldrag.h>
34#include <libkcal/icaldrag.h> 34#include <libkcal/icaldrag.h>
35#include <libkcal/dndfactory.h> 35#include <libkcal/dndfactory.h>
36#include <libkcal/calendarresources.h> 36#include <libkcal/calendarresources.h>
37#include <libkcal/resourcecalendar.h> 37#include <libkcal/resourcecalendar.h>
38#include <kresources/resourceselectdialog.h> 38#include <kresources/resourceselectdialog.h>
39 39
40#include <kcalendarsystem.h> 40#include <kcalendarsystem.h>
41 41
42#ifndef KORG_NOPLUGINS 42#ifndef KORG_NOPLUGINS
43#include "kocore.h" 43#include "kocore.h"
44#endif 44#endif
45#include "koprefs.h" 45#include "koprefs.h"
46#include "koglobals.h" 46#include "koglobals.h"
47 47
48#include "kodaymatrix.h" 48#include "kodaymatrix.h"
49 49
50// ============================================================================ 50// ============================================================================
51// D Y N A M I C T I P 51// D Y N A M I C T I P
52// ============================================================================ 52// ============================================================================
53 53
54DynamicTip::DynamicTip( QWidget * parent ) 54DynamicTip::DynamicTip( QWidget * parent )
55 : QToolTip( parent ) 55 : QToolTip( parent )
56{ 56{
57 matrix = (KODayMatrix*)parent; 57 matrix = (KODayMatrix*)parent;
58} 58}
59 59
60 60
61void DynamicTip::maybeTip( const QPoint &pos ) 61void DynamicTip::maybeTip( const QPoint &pos )
62{ 62{
63 //calculate which cell of the matrix the mouse is in 63 //calculate which cell of the matrix the mouse is in
64 QRect sz = matrix->frameRect(); 64 QRect sz = matrix->frameRect();
65 int dheight = sz.height()*7 / 42; 65 int dheight = sz.height()*7 / 42;
66 int dwidth = sz.width() / 7; 66 int dwidth = sz.width() / 7;
67 int row = pos.y()/dheight; 67 int row = pos.y()/dheight;
68 int col = pos.x()/dwidth; 68 int col = pos.x()/dwidth;
69 69
70 QRect rct(col*dwidth, row*dheight, dwidth, dheight); 70 QRect rct(col*dwidth, row*dheight, dwidth, dheight);
71 71
72// kdDebug() << "DynamicTip::maybeTip matrix cell index [" << 72// kdDebug() << "DynamicTip::maybeTip matrix cell index [" <<
73// col << "][" << row << "] => " <<(col+row*7) << endl; 73// col << "][" << row << "] => " <<(col+row*7) << endl;
74 74
75 //show holiday names only 75 //show holiday names only
76 QString str = matrix->getHolidayLabel(col+row*7); 76 QString str = matrix->getHolidayLabel(col+row*7);
77 if (str.isEmpty()) return; 77 if (str.isEmpty()) return;
78 tip(rct, str); 78 tip(rct, str);
79} 79}
80 80
81 81
82// ============================================================================ 82// ============================================================================
83// K O D A Y M A T R I X 83// K O D A Y M A T R I X
84// ============================================================================ 84// ============================================================================
85 85
86const int KODayMatrix::NOSELECTION = -1000; 86const int KODayMatrix::NOSELECTION = -1000;
87const int KODayMatrix::NUMDAYS = 42; 87const int KODayMatrix::NUMDAYS = 42;
88 88
89KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) : 89KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) :
90 QFrame(parent, name) 90 QFrame(parent, name)
91{ 91{
92 mCalendar = calendar; 92 mCalendar = calendar;
93 93
94 // initialize dynamic arrays 94 // initialize dynamic arrays
95 days = new QDate[NUMDAYS]; 95 days = new QDate[NUMDAYS];
96 daylbls = new QString[NUMDAYS]; 96 daylbls = new QString[NUMDAYS];
97 events = new int[NUMDAYS]; 97 events = new int[NUMDAYS];
98 mToolTip = new DynamicTip(this); 98 mToolTip = new DynamicTip(this);
99 99
100 // set default values used for drawing the matrix 100 // set default values used for drawing the matrix
101 mDefaultBackColor = palette().active().base(); 101 mDefaultBackColor = palette().active().base();
102 mDefaultTextColor = palette().active().foreground(); 102 mDefaultTextColor = palette().active().foreground();
103 mDefaultTextColorShaded = getShadedColor(mDefaultTextColor); 103 mDefaultTextColorShaded = getShadedColor(mDefaultTextColor);
104 mHolidayColorShaded = getShadedColor(KOPrefs::instance()->mHolidayColor); 104 mHolidayColorShaded = getShadedColor(KOPrefs::instance()->mHolidayColor);
105 mSelectedDaysColor = QColor("white"); 105 mSelectedDaysColor = QColor("white");
106 mTodayMarginWidth = 2; 106 mTodayMarginWidth = 2;
107 mSelEnd = mSelStart = NOSELECTION; 107 mSelEnd = mSelStart = NOSELECTION;
108 108
109 setAcceptDrops(true); 109 setAcceptDrops(true);
110 //setFont( QFont("Arial", 10) ); 110 //setFont( QFont("Arial", 10) );
111 updateView(date); 111
112 mUpdateTimer = new QTimer( this );
113 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() ));
114 mRepaintTimer = new QTimer( this );
115 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() ));
116 mDayChanged = false;
117 updateView();
112} 118}
113 119
114QColor KODayMatrix::getShadedColor(QColor color) 120QColor KODayMatrix::getShadedColor(QColor color)
115{ 121{
116 QColor shaded; 122 QColor shaded;
117 int h=0; 123 int h=0;
118 int s=0; 124 int s=0;
119 int v=0; 125 int v=0;
120 color.hsv(&h,&s,&v); 126 color.hsv(&h,&s,&v);
121 s = s/4; 127 s = s/4;
122 v = 192+v/4; 128 v = 192+v/4;
123 shaded.setHsv(h,s,v); 129 shaded.setHsv(h,s,v);
124 130
125 return shaded; 131 return shaded;
126} 132}
127 133
128KODayMatrix::~KODayMatrix() 134KODayMatrix::~KODayMatrix()
129{ 135{
130 delete [] days; 136 delete [] days;
131 delete [] daylbls; 137 delete [] daylbls;
132 delete [] events; 138 delete [] events;
133 delete mToolTip; 139 delete mToolTip;
134} 140}
135 141
136/* 142/*
137void KODayMatrix::setStartDate(QDate start) 143void KODayMatrix::setStartDate(QDate start)
138{ 144{
139 updateView(start); 145 updateView(start);
140} 146}
141*/ 147*/
142 148
143void KODayMatrix::addSelectedDaysTo(DateList& selDays) 149void KODayMatrix::addSelectedDaysTo(DateList& selDays)
144{ 150{
145 kdDebug() << "KODayMatrix::addSelectedDaysTo() - " << "mSelStart:" << mSelStart << endl; 151 kdDebug() << "KODayMatrix::addSelectedDaysTo() - " << "mSelStart:" << mSelStart << endl;
146 152
147 if (mSelStart == NOSELECTION) { 153 if (mSelStart == NOSELECTION) {
148 return; 154 return;
149 } 155 }
150 156
151 //cope with selection being out of matrix limits at top (< 0) 157 //cope with selection being out of matrix limits at top (< 0)
152 int i0 = mSelStart; 158 int i0 = mSelStart;
153 if (i0 < 0) { 159 if (i0 < 0) {
154 for (int i = i0; i < 0; i++) { 160 for (int i = i0; i < 0; i++) {
155 selDays.append(days[0].addDays(i)); 161 selDays.append(days[0].addDays(i));
156 } 162 }
157 i0 = 0; 163 i0 = 0;
158 } 164 }
159 165
160 //cope with selection being out of matrix limits at bottom (> NUMDAYS-1) 166 //cope with selection being out of matrix limits at bottom (> NUMDAYS-1)
161 if (mSelEnd > NUMDAYS-1) { 167 if (mSelEnd > NUMDAYS-1) {
162 for (int i = i0; i <= NUMDAYS-1; i++) { 168 for (int i = i0; i <= NUMDAYS-1; i++) {
163 selDays.append(days[i]); 169 selDays.append(days[i]);
164 } 170 }
165 for (int i = NUMDAYS; i < mSelEnd; i++) { 171 for (int i = NUMDAYS; i < mSelEnd; i++) {
166 selDays.append(days[0].addDays(i)); 172 selDays.append(days[0].addDays(i));
167 } 173 }
168 174
169 // apply normal routine to selection being entirely within matrix limits 175 // apply normal routine to selection being entirely within matrix limits
170 } else { 176 } else {
171 for (int i = i0; i <= mSelEnd; i++) { 177 for (int i = i0; i <= mSelEnd; i++) {
172 selDays.append(days[i]); 178 selDays.append(days[i]);
173 } 179 }
174 } 180 }
175} 181}
176 182
177void KODayMatrix::setSelectedDaysFrom(const QDate& start, const QDate& end) 183void KODayMatrix::setSelectedDaysFrom(const QDate& start, const QDate& end)
178{ 184{
179 mSelStart = startdate.daysTo(start); 185 mSelStart = startdate.daysTo(start);
180 mSelEnd = startdate.daysTo(end); 186 mSelEnd = startdate.daysTo(end);
181} 187}
182 188
183 189
184void KODayMatrix::recalculateToday() 190void KODayMatrix::recalculateToday()
185{ 191{
186 today = -1; 192 today = -1;
187 for (int i=0; i<NUMDAYS; i++) { 193 for (int i=0; i<NUMDAYS; i++) {
188 days[i] = startdate.addDays(i); 194 days[i] = startdate.addDays(i);
189 daylbls[i] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] )); 195 daylbls[i] = QString::number( KOGlobals::self()->calendarSystem()->day( days[i] ));
190 196
191 // if today is in the currently displayed month, hilight today 197 // if today is in the currently displayed month, hilight today
192 if (days[i].year() == QDate::currentDate().year() && 198 if (days[i].year() == QDate::currentDate().year() &&
193 days[i].month() == QDate::currentDate().month() && 199 days[i].month() == QDate::currentDate().month() &&
194 days[i].day() == QDate::currentDate().day()) { 200 days[i].day() == QDate::currentDate().day()) {
195 today = i; 201 today = i;
196 } 202 }
197 } 203 }
198 // qDebug(QString("Today is visible at %1.").arg(today)); 204 // qDebug(QString("Today is visible at %1.").arg(today));
199} 205}
200 206
201void KODayMatrix::updateView() 207void KODayMatrix::updateView()
202{ 208{
203 updateView(startdate); 209 updateView(startdate);
204} 210}
205 211void KODayMatrix::repaintViewTimed()
206void KODayMatrix::updateView(QDate actdate) 212{
213 qDebug("KODayMatrix::repaintViewTimed ");
214 mRepaintTimer->stop();
215 repaint(false);
216}
217void KODayMatrix::updateViewTimed()
207{ 218{
208
209// kdDebug() << "KODayMatrix::updateView() " << actdate.toString() << endl;
210
211 //flag to indicate if the starting day of the matrix has changed by this call
212 bool daychanged = false;
213 // if a new startdate is to be set then apply Cornelius's calculation
214 // of the first day to be shown
215 if (actdate != startdate) {
216 // reset index of selection according to shift of starting date from startdate to actdate
217 if (mSelStart != NOSELECTION) {
218 int tmp = actdate.daysTo(startdate);
219 //kdDebug() << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl;
220 // shift selection if new one would be visible at least partly !
221
222 if (mSelStart+tmp < NUMDAYS && mSelEnd+tmp >= 0) {
223 // nested if is required for next X display pushed from a different month - correction required
224 // otherwise, for month forward and backward, it must be avoided
225 if( mSelStart > NUMDAYS || mSelStart < 0 )
226 mSelStart = mSelStart + tmp;
227 if( mSelEnd > NUMDAYS || mSelEnd < 0 )
228 mSelEnd = mSelEnd + tmp;
229 }
230 }
231 219
232 startdate = actdate; 220 mUpdateTimer->stop();
233 daychanged = true; 221 //QDate actdate = mPendingNewDate;
234 }
235 222
236 if (daychanged) { 223 static int iii = 0;
237 recalculateToday(); 224 qDebug("KODayMatrix::updateView(QDate actdate) %d", ++iii );
238 } 225
226 if (mDayChanged) {
227 recalculateToday();
228 mDayChanged = false;
229 }
239 230
240 for(int i = 0; i < NUMDAYS; i++) { 231 for(int i = 0; i < NUMDAYS; i++) {
241 232
242 // if events are set for the day then remember to draw it bold 233 // if events are set for the day then remember to draw it bold
243 QPtrList<Event> eventlist = mCalendar->events(days[i]); 234 QPtrList<Event> eventlist = mCalendar->events(days[i]);
244 Event *event; 235 Event *event;
245 int numEvents = eventlist.count(); 236 int numEvents = eventlist.count();
246 237
247 for(event=eventlist.first();event != 0;event=eventlist.next()) { 238 for(event=eventlist.first();event != 0;event=eventlist.next()) {
248 ushort recurType = event->recurrence()->doesRecur(); 239 ushort recurType = event->recurrence()->doesRecur();
249 240
250 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) || 241 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) ||
251 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) { 242 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) {
252 numEvents--; 243 numEvents--;
253 } 244 }
254 } 245 }
255 events[i] = numEvents; 246 events[i] = numEvents;
256 247
257 //if it is a holy day then draw it red. Sundays are consider holidays, too 248 //if it is a holy day then draw it red. Sundays are consider holidays, too
258#ifndef KORG_NOPLUGINS 249#ifndef KORG_NOPLUGINS
259 QString holiStr = KOCore::self()->holiday(days[i]); 250 QString holiStr = KOCore::self()->holiday(days[i]);
260#else 251#else
261 QString holiStr = QString::null; 252 QString holiStr = QString::null;
262#endif 253#endif
263 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) || 254 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) ||
264 !holiStr.isEmpty()) { 255 !holiStr.isEmpty()) {
265 if (holiStr.isNull()) holiStr = ""; 256 if (holiStr.isNull()) holiStr = "";
266 mHolidays[i] = holiStr; 257 mHolidays[i] = holiStr;
267 258
259 } else {
260 mHolidays[i] = QString::null;
261 }
262 }
263 repaint(false);
264 }
265void KODayMatrix::updateView(QDate actdate)
266{
267
268 //flag to indicate if the starting day of the matrix has changed by this call
269 //mDayChanged = false;
270 // if a new startdate is to be set then apply Cornelius's calculation
271 // of the first day to be shown
272 if (actdate != startdate) {
273 // reset index of selection according to shift of starting date from startdate to actdate
274 if (mSelStart != NOSELECTION) {
275 int tmp = actdate.daysTo(startdate);
276 //kdDebug() << "Shift of Selection1: " << mSelStart << " - " << mSelEnd << " -> " << tmp << "(" << offset << ")" << endl;
277 // shift selection if new one would be visible at least partly !
278
279 if (mSelStart+tmp < NUMDAYS && mSelEnd+tmp >= 0) {
280 // nested if is required for next X display pushed from a different month - correction required
281 // otherwise, for month forward and backward, it must be avoided
282 if( mSelStart > NUMDAYS || mSelStart < 0 )
283 mSelStart = mSelStart + tmp;
284 if( mSelEnd > NUMDAYS || mSelEnd < 0 )
285 mSelEnd = mSelEnd + tmp;
286 }
287 }
288
289 startdate = actdate;
290 mDayChanged = true;
291 }
292 qDebug("restart Timer %d", mDayChanged );
293 static int iii = 0;
294 if ( iii < 5 ) {
295 ++iii;
296 updateViewTimed();
268 } else { 297 } else {
269 mHolidays[i] = QString::null; 298 if ( !isVisible() ) {
299 mUpdateTimer->start( 2000 );
300 } else {
301 if ( mDayChanged ) {
302 mUpdateTimer->start( 250 );
303 } else {
304 mRepaintTimer->start( 250 );
305 mUpdateTimer->start( 2000 );
306 }
307 }
270 } 308 }
271 } 309
272} 310}
273 311
274const QDate& KODayMatrix::getDate(int offset) 312const QDate& KODayMatrix::getDate(int offset)
275{ 313{
276 if (offset < 0 || offset > NUMDAYS-1) { 314 if (offset < 0 || offset > NUMDAYS-1) {
277 kdDebug() << "Wrong offset (" << offset << ") in KODayMatrix::getDate(int)" << endl; 315 qDebug("Wrong offset2 ");
278 return days[0]; 316 return days[0];
279 } 317 }
280 return days[offset]; 318 return days[offset];
281} 319}
282 320
283QString KODayMatrix::getHolidayLabel(int offset) 321QString KODayMatrix::getHolidayLabel(int offset)
284{ 322{
285 if (offset < 0 || offset > NUMDAYS-1) { 323 if (offset < 0 || offset > NUMDAYS-1) {
286 kdDebug() << "Wrong offset (" << offset << ") in KODayMatrix::getHolidayLabel(int)" << endl; 324 qDebug("Wrong offset1 ");
287 return 0; 325 return 0;
288 } 326 }
289 return mHolidays[offset]; 327 return mHolidays[offset];
290} 328}
291 329
292int KODayMatrix::getDayIndexFrom(int x, int y) 330int KODayMatrix::getDayIndexFrom(int x, int y)
293{ 331{
294 return 7*(y/daysize.height()) + (KOGlobals::self()->reverseLayout() ? 332 return 7*(y/daysize.height()) + (KOGlobals::self()->reverseLayout() ?
295 6 - x/daysize.width() : x/daysize.width()); 333 6 - x/daysize.width() : x/daysize.width());
296} 334}
297 335
298// ---------------------------------------------------------------------------- 336// ----------------------------------------------------------------------------
299// M O U S E E V E N T H A N D L I N G 337// M O U S E E V E N T H A N D L I N G
300// ---------------------------------------------------------------------------- 338// ----------------------------------------------------------------------------
301 339
302void KODayMatrix::mousePressEvent (QMouseEvent* e) 340void KODayMatrix::mousePressEvent (QMouseEvent* e)
303{ 341{
304 mSelStart = getDayIndexFrom(e->x(), e->y()); 342 mSelStart = getDayIndexFrom(e->x(), e->y());
305 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1; 343 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1;
306 mSelInit = mSelStart; 344 mSelInit = mSelStart;
307} 345}
308 346
309void KODayMatrix::mouseReleaseEvent (QMouseEvent* e) 347void KODayMatrix::mouseReleaseEvent (QMouseEvent* e)
310{ 348{
311 349
312 int tmp = getDayIndexFrom(e->x(), e->y()); 350 int tmp = getDayIndexFrom(e->x(), e->y());
313 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 351 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
314 352
315 if (mSelInit > tmp) { 353 if (mSelInit > tmp) {
316 mSelEnd = mSelInit; 354 mSelEnd = mSelInit;
317 if (tmp != mSelStart) { 355 if (tmp != mSelStart) {
318 mSelStart = tmp; 356 mSelStart = tmp;
319 repaint(); 357 repaint();
320 } 358 }
321 } else { 359 } else {
322 mSelStart = mSelInit; 360 mSelStart = mSelInit;
323 361
324 //repaint only if selection has changed 362 //repaint only if selection has changed
325 if (tmp != mSelEnd) { 363 if (tmp != mSelEnd) {
326 mSelEnd = tmp; 364 mSelEnd = tmp;
327 repaint(); 365 repaint();
328 } 366 }
329 } 367 }
330 368
331 DateList daylist; 369 DateList daylist;
332 if ( mSelStart < 0 ) 370 if ( mSelStart < 0 )
333 mSelStart = 0; 371 mSelStart = 0;
334 for (int i = mSelStart; i <= mSelEnd; i++) { 372 for (int i = mSelStart; i <= mSelEnd; i++) {
335 daylist.append(days[i]); 373 daylist.append(days[i]);
336 } 374 }
337 emit selected((const DateList)daylist); 375 emit selected((const DateList)daylist);
338 376
339} 377}
340 378
341void KODayMatrix::mouseMoveEvent (QMouseEvent* e) 379void KODayMatrix::mouseMoveEvent (QMouseEvent* e)
342{ 380{
343 int tmp = getDayIndexFrom(e->x(), e->y()); 381 int tmp = getDayIndexFrom(e->x(), e->y());
344 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 382 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
345 383
346 if (mSelInit > tmp) { 384 if (mSelInit > tmp) {
347 mSelEnd = mSelInit; 385 mSelEnd = mSelInit;
348 if (tmp != mSelStart) { 386 if (tmp != mSelStart) {
349 mSelStart = tmp; 387 mSelStart = tmp;
350 repaint(); 388 repaint();
351 } 389 }
352 } else { 390 } else {
353 mSelStart = mSelInit; 391 mSelStart = mSelInit;
354 392
355 //repaint only if selection has changed 393 //repaint only if selection has changed
356 if (tmp != mSelEnd) { 394 if (tmp != mSelEnd) {
357 mSelEnd = tmp; 395 mSelEnd = tmp;
358 repaint(); 396 repaint();
359 } 397 }
360 } 398 }
361} 399}
362 400
363// ---------------------------------------------------------------------------- 401// ----------------------------------------------------------------------------
364// D R A G ' N D R O P H A N D L I N G 402// D R A G ' N D R O P H A N D L I N G
365// ---------------------------------------------------------------------------- 403// ----------------------------------------------------------------------------
366 404
367void KODayMatrix::dragEnterEvent(QDragEnterEvent *e) 405void KODayMatrix::dragEnterEvent(QDragEnterEvent *e)
368{ 406{
369#ifndef KORG_NODND 407#ifndef KORG_NODND
370 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 408 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
371 e->ignore(); 409 e->ignore();
372 return; 410 return;
373 } 411 }
374 412
375 // some visual feedback 413 // some visual feedback
376// oldPalette = palette(); 414// oldPalette = palette();
377// setPalette(my_HilitePalette); 415// setPalette(my_HilitePalette);
378// update(); 416// update();
379#endif 417#endif
380} 418}
381 419
382void KODayMatrix::dragMoveEvent(QDragMoveEvent *e) 420void KODayMatrix::dragMoveEvent(QDragMoveEvent *e)
383{ 421{
384#ifndef KORG_NODND 422#ifndef KORG_NODND
385 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 423 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
386 e->ignore(); 424 e->ignore();
387 return; 425 return;
388 } 426 }
389 427
390 e->accept(); 428 e->accept();
391#endif 429#endif
392} 430}
393 431
394void KODayMatrix::dragLeaveEvent(QDragLeaveEvent */*dl*/) 432void KODayMatrix::dragLeaveEvent(QDragLeaveEvent */*dl*/)
395{ 433{
396#ifndef KORG_NODND 434#ifndef KORG_NODND
397// setPalette(oldPalette); 435// setPalette(oldPalette);
398// update(); 436// update();
399#endif 437#endif
400} 438}
401 439
402void KODayMatrix::dropEvent(QDropEvent *e) 440void KODayMatrix::dropEvent(QDropEvent *e)
403{ 441{
404#ifndef KORG_NODND 442#ifndef KORG_NODND
405// kdDebug() << "KODayMatrix::dropEvent(e) begin" << endl; 443// kdDebug() << "KODayMatrix::dropEvent(e) begin" << endl;
406 444
407 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) { 445 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) ) {
408 e->ignore(); 446 e->ignore();
409 return; 447 return;
410 } 448 }
411 449
412 DndFactory factory( mCalendar ); 450 DndFactory factory( mCalendar );
413 Event *event = factory.createDrop(e); 451 Event *event = factory.createDrop(e);
414 452
diff --git a/korganizer/kodaymatrix.h b/korganizer/kodaymatrix.h
index b4eb2a8..0e9640a 100644
--- a/korganizer/kodaymatrix.h
+++ b/korganizer/kodaymatrix.h
@@ -47,262 +47,267 @@ using namespace KCal;
47/** 47/**
48 * small helper class to dynamically show tooltips inside the day matrix. 48 * small helper class to dynamically show tooltips inside the day matrix.
49 * This class asks the day matrix object for a appropriate label which 49 * This class asks the day matrix object for a appropriate label which
50 * is in our special case the name of the holiday or null if this day is no holiday. 50 * is in our special case the name of the holiday or null if this day is no holiday.
51 */ 51 */
52class DynamicTip : public QToolTip 52class DynamicTip : public QToolTip
53{ 53{
54public: 54public:
55 55
56 /** 56 /**
57 * Constructor that expects a KODayMatrix object as parent. 57 * Constructor that expects a KODayMatrix object as parent.
58 * 58 *
59 * @param parent the parent KODayMatrix control. 59 * @param parent the parent KODayMatrix control.
60 */ 60 */
61 DynamicTip(QWidget* parent ); 61 DynamicTip(QWidget* parent );
62 62
63protected: 63protected:
64 64
65 /** 65 /**
66 * Qt's callback to ask the object to provide an approrpiate text for the 66 * Qt's callback to ask the object to provide an approrpiate text for the
67 * tooltip to be shown. 67 * tooltip to be shown.
68 * 68 *
69 * @param pos coordinates of the mouse. 69 * @param pos coordinates of the mouse.
70 */ 70 */
71 void maybeTip( const QPoint & pos); 71 void maybeTip( const QPoint & pos);
72 72
73private: 73private:
74 74
75 /** the parent control this tooltip is designed for. */ 75 /** the parent control this tooltip is designed for. */
76 KODayMatrix* matrix; 76 KODayMatrix* matrix;
77}; 77};
78 78
79/** 79/**
80 * replacement for kdpdatebuton.cpp that used 42 widgets for the day matrix to be displayed. 80 * replacement for kdpdatebuton.cpp that used 42 widgets for the day matrix to be displayed.
81 * Cornelius thought this was a waste of memory and a lot of overhead. 81 * Cornelius thought this was a waste of memory and a lot of overhead.
82 * In addition the selection was not very intuitive so I decided to rewrite it using a QFrame 82 * In addition the selection was not very intuitive so I decided to rewrite it using a QFrame
83 * that draws the labels and allows for dragging selection while maintaining nearly full 83 * that draws the labels and allows for dragging selection while maintaining nearly full
84 * compatibility in behaviour with its predecessor. 84 * compatibility in behaviour with its predecessor.
85 * 85 *
86 * The following functionality has been changed: 86 * The following functionality has been changed:
87 * 87 *
88 * o when shifting events in the agenda view from one day to another the day matrix is updated now 88 * o when shifting events in the agenda view from one day to another the day matrix is updated now
89 * o TODO ET dragging an event to the matrix will MOVE not COPY the event to the new date. 89 * o TODO ET dragging an event to the matrix will MOVE not COPY the event to the new date.
90 * o no support for Ctrl+click to create groups of dates 90 * o no support for Ctrl+click to create groups of dates
91 * (This has not really been supported in the predecessor. It was not very intuitive nor was it 91 * (This has not really been supported in the predecessor. It was not very intuitive nor was it
92 * user friendly.) 92 * user friendly.)
93 * This feature has been replaced with dragging a selection on the matrix. The matrix will 93 * This feature has been replaced with dragging a selection on the matrix. The matrix will
94 * automatically choose the appropriate selection (e.g. you are not any longer able to select 94 * automatically choose the appropriate selection (e.g. you are not any longer able to select
95 * two distinct groups of date selections as in the old class) 95 * two distinct groups of date selections as in the old class)
96 * o now that you can select more then a week it can happen that not all selected days are 96 * o now that you can select more then a week it can happen that not all selected days are
97 * displayed in the matrix. However this is preferred to the alternative which would mean to 97 * displayed in the matrix. However this is preferred to the alternative which would mean to
98 * adjust the selection and leave some days undisplayed while scrolling through the months 98 * adjust the selection and leave some days undisplayed while scrolling through the months
99 * 99 *
100 * @short day matrix widget of the KDateNavigator 100 * @short day matrix widget of the KDateNavigator
101 * 101 *
102 * @author Eitzenberger Thomas 102 * @author Eitzenberger Thomas
103 */ 103 */
104class KODayMatrix: public QFrame { 104class KODayMatrix: public QFrame {
105 105
106 Q_OBJECT 106 Q_OBJECT
107 107
108public: 108public:
109 109
110 /** constructor to create a day matrix widget. 110 /** constructor to create a day matrix widget.
111 * 111 *
112 * @param parent widget that is the parent of the day matrix. Normally this should 112 * @param parent widget that is the parent of the day matrix. Normally this should
113 * be a KDateNavigator 113 * be a KDateNavigator
114 * @param calendar instance of a calendar on which all calculations are based 114 * @param calendar instance of a calendar on which all calculations are based
115 * @param date start date of the matrix (is expected to be already fixed). It is 115 * @param date start date of the matrix (is expected to be already fixed). It is
116 * assumed that this date is the first week day to be shown in the matrix. 116 * assumed that this date is the first week day to be shown in the matrix.
117 * @param name name of the widget 117 * @param name name of the widget
118 */ 118 */
119 KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name ); 119 KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name );
120 120
121 /** destructor that deallocates all dynamically allocated private members. 121 /** destructor that deallocates all dynamically allocated private members.
122 */ 122 */
123 ~KODayMatrix(); 123 ~KODayMatrix();
124 124
125 /** updates the day matrix to start with the given date. Does all the necessary 125 /** updates the day matrix to start with the given date. Does all the necessary
126 * checks for holidays or events on a day and stores them for display later on. 126 * checks for holidays or events on a day and stores them for display later on.
127 * Does NOT update the view visually. Call repaint() for this. 127 * Does NOT update the view visually. Call repaint() for this.
128 * 128 *
129 * @param actdate recalculates the day matrix to show NUMDAYS starting from this 129 * @param actdate recalculates the day matrix to show NUMDAYS starting from this
130 * date. 130 * date.
131 */ 131 */
132 void updateView(QDate actdate); 132 void updateView(QDate actdate);
133 133
134 /** returns the QDate object associated with day indexed by the 134 /** returns the QDate object associated with day indexed by the
135 * supplied offset. 135 * supplied offset.
136 */ 136 */
137 const QDate& getDate(int offset); 137 const QDate& getDate(int offset);
138 138
139 /** returns the official name of this holy day or 0 if there is no label 139 /** returns the official name of this holy day or 0 if there is no label
140 * for this day. 140 * for this day.
141 */ 141 */
142 QString getHolidayLabel(int offset); 142 QString getHolidayLabel(int offset);
143 143
144 /** adds all actual selected days from mSelStart to mSelEnd to the supplied 144 /** adds all actual selected days from mSelStart to mSelEnd to the supplied
145 * DateList. 145 * DateList.
146 */ 146 */
147 void addSelectedDaysTo(DateList&); 147 void addSelectedDaysTo(DateList&);
148 148
149 /** sets the actual to be displayed selection in the day matrix starting from 149 /** sets the actual to be displayed selection in the day matrix starting from
150 * start and ending with end. Theview must be manually updated by calling 150 * start and ending with end. Theview must be manually updated by calling
151 * repaint. (?) 151 * repaint. (?)
152 */ 152 */
153 void setSelectedDaysFrom(const QDate& start, const QDate& end); 153 void setSelectedDaysFrom(const QDate& start, const QDate& end);
154 154
155 155
156 /** Is today visible in the view? Keep this in sync with 156 /** Is today visible in the view? Keep this in sync with
157 * the values today (below) can take. 157 * the values today (below) can take.
158 */ 158 */
159 bool isTodayVisible() const { return today>=0; } ; 159 bool isTodayVisible() const { return today>=0; } ;
160 160
161 /** If today is visible, then we can find out if today is 161 /** If today is visible, then we can find out if today is
162 * near the beginning or the end of the month. 162 * near the beginning or the end of the month.
163 * This is dependent on today remaining the index 163 * This is dependent on today remaining the index
164 * in the array of visible dates and going from 164 * in the array of visible dates and going from
165 * top left (0) to bottom right (41). 165 * top left (0) to bottom right (41).
166 */ 166 */
167 bool isBeginningOfMonth() const { return today<=8; } ; 167 bool isBeginningOfMonth() const { return today<=8; } ;
168 bool isEndOfMonth() const { return today>=27; } ; 168 bool isEndOfMonth() const { return today>=27; } ;
169 169
170public slots: 170public slots:
171 /** Recalculates all the flags of the days in the matrix like holidays or events 171 /** Recalculates all the flags of the days in the matrix like holidays or events
172 * on a day (Actually calls above method with the actual startdate). 172 * on a day (Actually calls above method with the actual startdate).
173 */ 173 */
174 void updateView(); 174 void updateView();
175 void updateViewTimed();
176 void repaintViewTimed();
175 177
176 /** 178 /**
177 * Calculate which square in the matrix should be 179 * Calculate which square in the matrix should be
178 * hilighted to indicate it's today. 180 * hilighted to indicate it's today.
179 */ 181 */
180 void recalculateToday(); 182 void recalculateToday();
181 183
182/* 184/*
183 void setStartDate(QDate); 185 void setStartDate(QDate);
184*/ 186*/
185 187
186signals: 188signals:
187 189
188 /** emitted if the user selects a block of days with the mouse by dragging a rectangle 190 /** emitted if the user selects a block of days with the mouse by dragging a rectangle
189 * inside the matrix 191 * inside the matrix
190 * 192 *
191 * @param daylist list of days that have been selected by the user 193 * @param daylist list of days that have been selected by the user
192 */ 194 */
193 void selected( const KCal::DateList &daylist ); 195 void selected( const KCal::DateList &daylist );
194 196
195 /** emitted if the user has dropped an event inside the matrix 197 /** emitted if the user has dropped an event inside the matrix
196 * 198 *
197 * @param event the dropped calendar event 199 * @param event the dropped calendar event
198 */ 200 */
199 void eventDropped(Event *event); 201 void eventDropped(Event *event);
200 202
201protected: 203protected:
202 204
203 void paintEvent(QPaintEvent *ev); 205 void paintEvent(QPaintEvent *ev);
204 206
205 void mousePressEvent (QMouseEvent* e); 207 void mousePressEvent (QMouseEvent* e);
206 208
207 void mouseReleaseEvent (QMouseEvent* e); 209 void mouseReleaseEvent (QMouseEvent* e);
208 210
209 void mouseMoveEvent (QMouseEvent* e); 211 void mouseMoveEvent (QMouseEvent* e);
210 212
211 void dragEnterEvent(QDragEnterEvent *); 213 void dragEnterEvent(QDragEnterEvent *);
212 214
213 void dragMoveEvent(QDragMoveEvent *); 215 void dragMoveEvent(QDragMoveEvent *);
214 216
215 void dragLeaveEvent(QDragLeaveEvent *); 217 void dragLeaveEvent(QDragLeaveEvent *);
216 218
217 void dropEvent(QDropEvent *); 219 void dropEvent(QDropEvent *);
218 220
219 void resizeEvent(QResizeEvent *); 221 void resizeEvent(QResizeEvent *);
220 222
221private: 223private:
224 QTimer* mUpdateTimer;
225 QTimer* mRepaintTimer;
226 bool mDayChanged;
222 227
223 /** returns the index of the day located at the matrix's widget (x,y) position. 228 /** returns the index of the day located at the matrix's widget (x,y) position.
224 * 229 *
225 * @param x horizontal coordinate 230 * @param x horizontal coordinate
226 * @param y vertical coordinate 231 * @param y vertical coordinate
227 */ 232 */
228 int getDayIndexFrom(int x, int y); 233 int getDayIndexFrom(int x, int y);
229 234
230 /** calculates a "shaded" color from the supplied color object. 235 /** calculates a "shaded" color from the supplied color object.
231 * (Copied from Cornelius's kdpdatebutton.cpp) 236 * (Copied from Cornelius's kdpdatebutton.cpp)
232 * 237 *
233 * @param color source based on which a shaded color should be calculated. 238 * @param color source based on which a shaded color should be calculated.
234 */ 239 */
235 QColor getShadedColor(QColor color); 240 QColor getShadedColor(QColor color);
236 241
237 /** number of days to be displayed. For now there is no support for any other number then 42. 242 /** number of days to be displayed. For now there is no support for any other number then 42.
238 so change it at your own risk :o) */ 243 so change it at your own risk :o) */
239 static const int NUMDAYS; 244 static const int NUMDAYS;
240 245
241 /** calendar instance to be queried for holidays, events, ... */ 246 /** calendar instance to be queried for holidays, events, ... */
242 Calendar *mCalendar; 247 Calendar *mCalendar;
243 248
244 /** starting date of the matrix */ 249 /** starting date of the matrix */
245 QDate startdate; 250 QDate startdate;
246 251
247 /** array of day labels to optimeize drawing performance. */ 252 /** array of day labels to optimeize drawing performance. */
248 QString *daylbls; 253 QString *daylbls;
249 254
250 /** array of days displayed to reduce memory consumption by 255 /** array of days displayed to reduce memory consumption by
251 subsequently calling QDate::addDays(). */ 256 subsequently calling QDate::addDays(). */
252 QDate *days; 257 QDate *days;
253 258
254 /** array of storing the number of events on a given day. 259 /** array of storing the number of events on a given day.
255 * used for drawing a bold font if there is at least one event on that day. 260 * used for drawing a bold font if there is at least one event on that day.
256 */ 261 */
257 int *events; 262 int *events;
258 263
259 /** stores holiday names of the days shown in the matrix. */ 264 /** stores holiday names of the days shown in the matrix. */
260 QMap<int,QString> mHolidays; 265 QMap<int,QString> mHolidays;
261 266
262 /** indey of today or -1 if today is not visible in the matrix. */ 267 /** indey of today or -1 if today is not visible in the matrix. */
263 int today; 268 int today;
264 269
265 /** index of day where dragged selection was initiated. 270 /** index of day where dragged selection was initiated.
266 used to detect "negative" timely selections */ 271 used to detect "negative" timely selections */
267 int mSelInit; 272 int mSelInit;
268 273
269 /** if mSelStart has this value it indicates that there is no 274 /** if mSelStart has this value it indicates that there is no
270 actual selection in the matrix. */ 275 actual selection in the matrix. */
271 static const int NOSELECTION; 276 static const int NOSELECTION;
272 277
273 /** index of first selected day. */ 278 /** index of first selected day. */
274 int mSelStart; 279 int mSelStart;
275 280
276 /** index of last selected day. */ 281 /** index of last selected day. */
277 int mSelEnd; 282 int mSelEnd;
278 283
279 /** dynamic tooltip to handle mouse dependent tips for each day in the matrix. */ 284 /** dynamic tooltip to handle mouse dependent tips for each day in the matrix. */
280 DynamicTip* mToolTip; 285 DynamicTip* mToolTip;
281 286
282 287
283 /** default background colour of the matrix. */ 288 /** default background colour of the matrix. */
284 QColor mDefaultBackColor; 289 QColor mDefaultBackColor;
285 290
286 /** default text color of the matrix. */ 291 /** default text color of the matrix. */
287 QColor mDefaultTextColor; 292 QColor mDefaultTextColor;
288 293
289 /** default text color for days not in the actual month. */ 294 /** default text color for days not in the actual month. */
290 QColor mDefaultTextColorShaded; 295 QColor mDefaultTextColorShaded;
291 296
292 /** default text color for holidays not in the actual month. */ 297 /** default text color for holidays not in the actual month. */
293 QColor mHolidayColorShaded; 298 QColor mHolidayColorShaded;
294 299
295 /** text color for selected days. */ 300 /** text color for selected days. */
296 QColor mSelectedDaysColor; 301 QColor mSelectedDaysColor;
297 302
298 /** default width of the frame drawn around today if it is visible in the matrix. */ 303 /** default width of the frame drawn around today if it is visible in the matrix. */
299 int mTodayMarginWidth; 304 int mTodayMarginWidth;
300 305
301 /** stores actual size of each day in the widget so that I dont need to ask this data 306 /** stores actual size of each day in the widget so that I dont need to ask this data
302 * on every repaint. 307 * on every repaint.
303 */ 308 */
304 QRect daysize; 309 QRect daysize;
305 310
306}; 311};
307 312
308#endif 313#endif