summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-07-10 20:11:56 (UTC)
committer zautrix <zautrix>2005-07-10 20:11:56 (UTC)
commitf06311e58cb5887fd673eb1c2c48acf7cd987ad9 (patch) (unidiff)
tree301c74302cdddaa3716d79117023228005ebd265
parentcb784d21ad22ab72a4e3231974f67816185675fd (diff)
downloadkdepimpi-f06311e58cb5887fd673eb1c2c48acf7cd987ad9.zip
kdepimpi-f06311e58cb5887fd673eb1c2c48acf7cd987ad9.tar.gz
kdepimpi-f06311e58cb5887fd673eb1c2c48acf7cd987ad9.tar.bz2
smarter faster conflict search
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt1
-rw-r--r--korganizer/calendarview.cpp72
-rw-r--r--libkcal/event.cpp20
-rw-r--r--libkcal/event.h1
4 files changed, 71 insertions, 23 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index 1f06f1e..c0d63e5 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,273 +1,274 @@
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********** VERSION 2.1.16 ************ 3********** VERSION 2.1.16 ************
4 4
5Fixed a problem with the menu bar in KO/Pi and using the "Menu" hardware key on the Zaurus. 5Fixed a problem with the menu bar in KO/Pi and using the "Menu" hardware key on the Zaurus.
6Added columns for datetime in todo view: Last modified, created and last modified subtodo 6Added columns for datetime in todo view: Last modified, created and last modified subtodo
7Fixed a bug in agenda view displaying recurring multiday events which are longer than two days. 7Fixed a bug in agenda view displaying recurring multiday events which are longer than two days.
8Made conflict detection up to 4 times faster.
8 9
9********** VERSION 2.1.15 ************ 10********** VERSION 2.1.15 ************
10 11
11Fixed two layout problems on the Z: 12Fixed two layout problems on the Z:
12Made the with of the newly added buttons on the Quick-Todo smaller. 13Made the with of the newly added buttons on the Quick-Todo smaller.
13Made listweek layout in 2 columns on the Z760 in portait screen and full menubar visible. 14Made listweek layout in 2 columns on the Z760 in portait screen and full menubar visible.
14 15
15 16
16********** VERSION 2.1.14 ************ 17********** VERSION 2.1.14 ************
17 18
18Added some buttons to the KO/Pi Quick-todo line to make it possible to quickly access some todo view layout settings like display all flat/open/close and hide/show running/done. 19Added some buttons to the KO/Pi Quick-todo line to make it possible to quickly access some todo view layout settings like display all flat/open/close and hide/show running/done.
19Added a button to add a subtodo quickly. 20Added a button to add a subtodo quickly.
20 21
21Added a possibility to search for conflicting events. (In the Action menu. Keyboard shortcut "q", shift+q or ctrl +q ). 22Added a possibility to search for conflicting events. (In the Action menu. Keyboard shortcut "q", shift+q or ctrl +q ).
22Added an option to change the layout of the list week to column mode. 23Added an option to change the layout of the list week to column mode.
23 24
24Fixed some usability problems in pi-sync mode by adding some progress information about file transfer. 25Fixed some usability problems in pi-sync mode by adding some progress information about file transfer.
25 26
26Fixed pi-sync problems with the new multi calendar feature. 27Fixed pi-sync problems with the new multi calendar feature.
27Now pi-sync behaviour should be: 28Now pi-sync behaviour should be:
281) Local sends file request ( as usual ) 291) Local sends file request ( as usual )
292) Remote sends file which contains data of all enabled ( the calendar where the "eye" column is checked ) calendars. 302) Remote sends file which contains data of all enabled ( the calendar where the "eye" column is checked ) calendars.
303) Local syncs with data, adds new entries to default calendar and sends file back ( as usual ). 313) Local syncs with data, adds new entries to default calendar and sends file back ( as usual ).
31 If the data which local receives contains entries which are on disabled calendars on local this entries are updated and not added as duplicates to the default calendar. 32 If the data which local receives contains entries which are on disabled calendars on local this entries are updated and not added as duplicates to the default calendar.
324) Remote updates the data and adds new entries to default calendar. Readonly entries are not changed on remote. 334) Remote updates the data and adds new entries to default calendar. Readonly entries are not changed on remote.
33 If the data which remote receives contains entries which are on disabled calendars on remote this entries are updated and not added as duplicates to the default calendar. 34 If the data which remote receives contains entries which are on disabled calendars on remote this entries are updated and not added as duplicates to the default calendar.
34 35
35Summary: 36Summary:
36No new item ( new created after the last sync ) in a disabled calendar is propagated to the sync partner. Readonly items are synced and added/changed on the sync partner if it is not readonly on the sync partner. 37No new item ( new created after the last sync ) in a disabled calendar is propagated to the sync partner. Readonly items are synced and added/changed on the sync partner if it is not readonly on the sync partner.
37If you have different calendars on remote and local and some of them disabled you may get some "strange" bahaviour. 38If you have different calendars on remote and local and some of them disabled you may get some "strange" bahaviour.
38Well, the syncing has become quite complicated ... you should have no problems if you enable all calendars. 39Well, the syncing has become quite complicated ... you should have no problems if you enable all calendars.
39 40
40********** VERSION 2.1.13 ************ 41********** VERSION 2.1.13 ************
41 42
42Fixed a problem in KA/Pi search. 43Fixed a problem in KA/Pi search.
43Fixed some minor problems in KO/Pi. 44Fixed some minor problems in KO/Pi.
44Added calendar selection possibility to the todo view popup and to the event/todo/journal editor. 45Added calendar selection possibility to the todo view popup and to the event/todo/journal editor.
45 46
46Fixed memory usage problems in KA/Pi: 47Fixed memory usage problems in KA/Pi:
47When loading data KA/Pi did load the file data twice. 48When loading data KA/Pi did load the file data twice.
48Example: 49Example:
49 A 600k file did consume 1200k memory during loading process. 50 A 600k file did consume 1200k memory during loading process.
50 This is fixed, it does now consume only 600k during loading process. 51 This is fixed, it does now consume only 600k during loading process.
51When saving data KA/Pi did consume a lot of memory for the data parsing during the save process. 52When saving data KA/Pi did consume a lot of memory for the data parsing during the save process.
52This is fixed. 53This is fixed.
53Example: 54Example:
54 Before saving a 600k file KA/Pi did consume 21.7 Meg of Ram. 55 Before saving a 600k file KA/Pi did consume 21.7 Meg of Ram.
55 When saving KA/Pi did consume 28.6 Meg of Ram. That causes a crash on the Zaurus because there was no memeory left in the system. 56 When saving KA/Pi did consume 28.6 Meg of Ram. That causes a crash on the Zaurus because there was no memeory left in the system.
56 Now KA/Pi is consuming on saving the same data 22.0 Meg of Ram during the save process. 57 Now KA/Pi is consuming on saving the same data 22.0 Meg of Ram during the save process.
57Note: The memory usage of KA/Pi after the data is loaded/saved has not changed. 58Note: The memory usage of KA/Pi after the data is loaded/saved has not changed.
58The saving of data may be a bit slower now. 59The saving of data may be a bit slower now.
59 60
60Fixed memory usage problems in KO/Pi: 61Fixed memory usage problems in KO/Pi:
61When KO/Pi did save the data to file, it did not release the used buffers after saving. 62When KO/Pi did save the data to file, it did not release the used buffers after saving.
62The used buffer was released after saving the next time, but there was new buffer space allocated again on that save operation. 63The used buffer was released after saving the next time, but there was new buffer space allocated again on that save operation.
63This is fixed. 64This is fixed.
64Example: 65Example:
65 When saving a 400k file KO/Pi do now use 400k less memory now. 66 When saving a 400k file KO/Pi do now use 400k less memory now.
66 67
67Optimized memory usage in KO/Pi Agenda view: 68Optimized memory usage in KO/Pi Agenda view:
68KO/Pi is storing some paint information in extra buffers for faster repainting of the agenda view. 69KO/Pi is storing some paint information in extra buffers for faster repainting of the agenda view.
69These buffers were not made smaller (i.e. downsized) because of performance reasons. 70These buffers were not made smaller (i.e. downsized) because of performance reasons.
70The handling of these buffers are now much smarter: 71The handling of these buffers are now much smarter:
71Two (of six) buffers are removed completely. 72Two (of six) buffers are removed completely.
72The remaing four buffers are now downsized after not using the agenda view for 45 seconds. 73The remaing four buffers are now downsized after not using the agenda view for 45 seconds.
73Such that the memory usage of KO/Pi is smaller now in general ( because 2 buffers are removed) and is much smaller when not using the agenda view. That is very important when using fastload for KO/Pi. 74Such that the memory usage of KO/Pi is smaller now in general ( because 2 buffers are removed) and is much smaller when not using the agenda view. That is very important when using fastload for KO/Pi.
74 75
75Worst case example ( for a maximum size agenda content): 76Worst case example ( for a maximum size agenda content):
76 When resizing the agenda content to a large scale, KO/Pi did use 17Meg of mem ( and did not use less memory until it was stopped). Now KO/Pi is using on the same operation only 14.3 Meg of mem and after 45 seconds not using the agenda view it uses only 9.4 Meg of mem. 77 When resizing the agenda content to a large scale, KO/Pi did use 17Meg of mem ( and did not use less memory until it was stopped). Now KO/Pi is using on the same operation only 14.3 Meg of mem and after 45 seconds not using the agenda view it uses only 9.4 Meg of mem.
77 78
78When switching to an unused Agenda view now KO/Pi is upizing the buffers again. This takes less than a second. Such that switching to Agenda view (after not using it for more than 45 seconds) is now a bit slower. 79When switching to an unused Agenda view now KO/Pi is upizing the buffers again. This takes less than a second. Such that switching to Agenda view (after not using it for more than 45 seconds) is now a bit slower.
79 80
80Summary: 81Summary:
81Many memory wasting problems of KA/Pi and KO/Pi fixed such that it is better to use on the Zaurus. 82Many memory wasting problems of KA/Pi and KO/Pi fixed such that it is better to use on the Zaurus.
82 83
83********** VERSION 2.1.12 ************ 84********** VERSION 2.1.12 ************
84 85
85KO/Pi: 86KO/Pi:
86Many small usability fixes, e.g. rearranged the popup menus such that they are better to use on the Zaurus. 87Many small usability fixes, e.g. rearranged the popup menus such that they are better to use on the Zaurus.
87Fixed a problem with the month view when file was saved but KO/Pi was not the active window. 88Fixed a problem with the month view when file was saved but KO/Pi was not the active window.
88Fixed some problems in the resource config dialog (e.g. added a warning if you set all calendars to read-only). 89Fixed some problems in the resource config dialog (e.g. added a warning if you set all calendars to read-only).
89Fixed some other small problems. 90Fixed some other small problems.
90 91
91********** VERSION 2.1.11 ************ 92********** VERSION 2.1.11 ************
92 93
93KO/Pi: 94KO/Pi:
94Because we can have many calendars now in KO/Pi we can have more than one journal entry per day. 95Because we can have many calendars now in KO/Pi we can have more than one journal entry per day.
95Added features to handle (and add ) more than one journal entry per day. 96Added features to handle (and add ) more than one journal entry per day.
96Added option for a journal title. 97Added option for a journal title.
97 98
98Added info about the calendar, the item belongs to, to the event/todo/journal viewer. 99Added info about the calendar, the item belongs to, to the event/todo/journal viewer.
99Fixed a problem of the alarm of completed recurring todos. 100Fixed a problem of the alarm of completed recurring todos.
100Added to the event/todo editor to set quickly the category of an item. 101Added to the event/todo editor to set quickly the category of an item.
101 102
102 103
103Fixed some problems when calling KO/Pi or KA/Pi from the alarm applet. 104Fixed some problems when calling KO/Pi or KA/Pi from the alarm applet.
104 105
105Added KA/Pi multi sync to the multi sync called from the alarm applet. 106Added KA/Pi multi sync to the multi sync called from the alarm applet.
106 107
107********** VERSION 2.1.10 ************ 108********** VERSION 2.1.10 ************
108 109
109KO/Pi: 110KO/Pi:
110Importing Birthdays will now create another file resource "Birthdays" and import the birthday data from KA/Pi into that file. 111Importing Birthdays will now create another file resource "Birthdays" and import the birthday data from KA/Pi into that file.
111When a multidayevent is selected in monthview all occurences of this event in the monthview are now hightlighted. 112When a multidayevent is selected in monthview all occurences of this event in the monthview are now hightlighted.
112Fixed a bug in searching for a small timerange, i.e. one day. 113Fixed a bug in searching for a small timerange, i.e. one day.
113 114
114KA/Pi: 115KA/Pi:
115Fixed two problems in csv export. 116Fixed two problems in csv export.
116Fixed problems when calling the contact selection dialog from KO/Pi or OM/Pi. 117Fixed problems when calling the contact selection dialog from KO/Pi or OM/Pi.
117 118
118********** VERSION 2.1.9 ************ 119********** VERSION 2.1.9 ************
119 120
120KO/Pi: 121KO/Pi:
121Fixed some problems of the new search options in the search dialog. 122Fixed some problems of the new search options in the search dialog.
122Fixed some problems in the new resource config options. 123Fixed some problems in the new resource config options.
123Changed the recurrence edit of events and todos such that the recurrence edit page now is notified about a change of the start date on the first page. 124Changed the recurrence edit of events and todos such that the recurrence edit page now is notified about a change of the start date on the first page.
124Fixed a problem creating new events in the agenda view if at the day/time is already an agenda item shown: 125Fixed a problem creating new events in the agenda view if at the day/time is already an agenda item shown:
125Now you can click on the bottom/top of an allday agenda item or on the left/right side of an agenda item to get the "new todo/new event" popup. 126Now you can click on the bottom/top of an allday agenda item or on the left/right side of an agenda item to get the "new todo/new event" popup.
126 127
127Fixed a problem in recurrence range in syncing with DTM. 128Fixed a problem in recurrence range in syncing with DTM.
128 129
129KA/Pi: 130KA/Pi:
130Made it posiible to show in the contact overview the details of all data available for that contact( e.g. office, spouse, children, nickname ...) 131Made it posiible to show in the contact overview the details of all data available for that contact( e.g. office, spouse, children, nickname ...)
131 132
132PwM/Pi: 133PwM/Pi:
133Added "sec" to the timeout config settings to make it clear the timeout values are seconds. 134Added "sec" to the timeout config settings to make it clear the timeout values are seconds.
134 135
135********** VERSION 2.1.8 ************ 136********** VERSION 2.1.8 ************
136 137
137KO/Pi: 138KO/Pi:
138Added info about the completion state of a todo in the ListView/Searchdialog. 139Added info about the completion state of a todo in the ListView/Searchdialog.
139If in TodoView is selected "do not show compledted todos" then completed todos are not shown in the ListView as well. 140If in TodoView is selected "do not show compledted todos" then completed todos are not shown in the ListView as well.
140Fixed some updating problems when changing the filter. 141Fixed some updating problems when changing the filter.
141 142
142KA/Pi: 143KA/Pi:
143In the addressee selection dialog now the formatted name is shown, if not empty. 144In the addressee selection dialog now the formatted name is shown, if not empty.
144Added a column "category" to the addressee selection dialog to make it possible to sort addressees after category. 145Added a column "category" to the addressee selection dialog to make it possible to sort addressees after category.
145Now in the addressee selection dialog a selected contact is remove with a single click from the selected list. 146Now in the addressee selection dialog a selected contact is remove with a single click from the selected list.
146 147
147Fixed in the file selector on the Zaurus the problem that symbolic links to files/dirs were ignored. 148Fixed in the file selector on the Zaurus the problem that symbolic links to files/dirs were ignored.
148Fixed the sorting for size in the file selector on the Z. 149Fixed the sorting for size in the file selector on the Z.
149 150
150Changed the color selection dialog on the Zaurus to a more user friendly version. 151Changed the color selection dialog on the Zaurus to a more user friendly version.
151 152
152********** VERSION 2.1.7 ************ 153********** VERSION 2.1.7 ************
153 154
154KO/Pi: 155KO/Pi:
155Fixed several problems in the new Resource handling. 156Fixed several problems in the new Resource handling.
156Added more options to the search dialog. 157Added more options to the search dialog.
157Fixed a problem in the Month view. 158Fixed a problem in the Month view.
158Added more options to the dialog when setting a todo to stopped. 159Added more options to the dialog when setting a todo to stopped.
159 160
160Fixed two small problems in KO/Pi Alarm applet. 161Fixed two small problems in KO/Pi Alarm applet.
161 162
162********** VERSION 2.1.6 ************ 163********** VERSION 2.1.6 ************
163 164
164This release is for testing only. 165This release is for testing only.
165 166
166KO/Pi: 167KO/Pi:
167Added to the list view (the list view is used in search dialog as well) the possibility to print it. 168Added to the list view (the list view is used in search dialog as well) the possibility to print it.
168Added to the list view the possibility to hide entries, if you do not want to print all entries of the list view. 169Added to the list view the possibility to hide entries, if you do not want to print all entries of the list view.
169Added to the list view the possibility to add all subtodos of selected todos to an export/beam. 170Added to the list view the possibility to add all subtodos of selected todos to an export/beam.
170Added to the search dialog the possibility to make an additive search such that you can get a better list for export/printout. 171Added to the search dialog the possibility to make an additive search such that you can get a better list for export/printout.
171Added to the search dialog the possibility to hide the checkboxes such that there is more space for the list view on the Zaurus. 172Added to the search dialog the possibility to hide the checkboxes such that there is more space for the list view on the Zaurus.
172Fixed a problem in the AlarmTimer Applet: Now utf8 messages are displayed properly. 173Fixed a problem in the AlarmTimer Applet: Now utf8 messages are displayed properly.
173 174
174Added support for multiple calendar files in KO/Pi. Only local ical (*.ics) files are supported as calendars. 175Added support for multiple calendar files in KO/Pi. Only local ical (*.ics) files are supported as calendars.
175In the sync profile config it is still missing to specify a particular calendar to sync with this profile. That setting will be added later. 176In the sync profile config it is still missing to specify a particular calendar to sync with this profile. That setting will be added later.
176Now on every sync the set of calendars is synced which are enabled in the resource view. 177Now on every sync the set of calendars is synced which are enabled in the resource view.
177 178
178A calendar is enabled in the resource view if the "eye" column is checked. 179A calendar is enabled in the resource view if the "eye" column is checked.
179You can set a calendar to be the default for new items( "+" column ). 180You can set a calendar to be the default for new items( "+" column ).
180You can tell KO/Pi to ignore all alarm of a calendar ( "bell" column ) and you can set it readonly. 181You can tell KO/Pi to ignore all alarm of a calendar ( "bell" column ) and you can set it readonly.
181To find out how to add a new calendar and how to remove a calendar is left as an exercise to the reader ... 182To find out how to add a new calendar and how to remove a calendar is left as an exercise to the reader ...
182 183
183 184
184********** VERSION 2.1.5 ************ 185********** VERSION 2.1.5 ************
185 186
186This is the new stable version. 187This is the new stable version.
187Bugfix: 188Bugfix:
188Fixed a problem with agenda popup on the desktop in KO/Pi. 189Fixed a problem with agenda popup on the desktop in KO/Pi.
189Fixed a crash when reloading file, e.g. after a passive pi-sync synchronization. 190Fixed a crash when reloading file, e.g. after a passive pi-sync synchronization.
190Added config option to not display completed todos in agenda view. 191Added config option to not display completed todos in agenda view.
191Addressee view is now using the formatted name, if defined. 192Addressee view is now using the formatted name, if defined.
192That makes it possible to display "lastname, firstname" in that view now. 193That makes it possible to display "lastname, firstname" in that view now.
193To set the formatted name for all contacts, please use menu: 194To set the formatted name for all contacts, please use menu:
194Edit->Change->Set formatted name. 195Edit->Change->Set formatted name.
195Fixed the bug in KA/Pi that is was not possible to add images to a contact on Windows. 196Fixed the bug in KA/Pi that is was not possible to add images to a contact on Windows.
196 197
197********** VERSION 2.1.4 ************ 198********** VERSION 2.1.4 ************
198 199
199Fixed two more bugs in the KA/Pi CSV import dialog: 200Fixed two more bugs in the KA/Pi CSV import dialog:
200Made it possible to read multi-line fields and import it to the "Note" field. 201Made it possible to read multi-line fields and import it to the "Note" field.
201Fixed a problem in mapping custom fields, whatever a custem field is... 202Fixed a problem in mapping custom fields, whatever a custem field is...
202 203
203********** VERSION 2.1.3 ************ 204********** VERSION 2.1.3 ************
204 205
205Changed the menu structure of the alarm applet: 206Changed the menu structure of the alarm applet:
206Moved "Simulate" to " Play Beeps" submenu and re-added "Todo List". 207Moved "Simulate" to " Play Beeps" submenu and re-added "Todo List".
207 208
208Fixed several problems in the KA/Pi CSV import dialog: 209Fixed several problems in the KA/Pi CSV import dialog:
209Added "Category", made codec configureable and made it possible to map many fields to the "Note" field. 210Added "Category", made codec configureable and made it possible to map many fields to the "Note" field.
210 211
211 212
212********** VERSION 2.1.2 ************ 213********** VERSION 2.1.2 ************
213 214
214Fixed a problem closing the alarm dialog on Zaurus with "OK" button. 215Fixed a problem closing the alarm dialog on Zaurus with "OK" button.
215 216
216Fixed a problem when importing data from Outlook with mutiple categories set. 217Fixed a problem when importing data from Outlook with mutiple categories set.
217 218
218Changed display of days in datenavigator: 219Changed display of days in datenavigator:
219Birthdays are now blue, not dark green. 220Birthdays are now blue, not dark green.
220When todo view is shown, no birtdays are shown and days with due todos are shown blue. 221When todo view is shown, no birtdays are shown and days with due todos are shown blue.
221When journal view is shown, only holidays are shown and days with journals are blue. 222When journal view is shown, only holidays are shown and days with journals are blue.
222 223
223Added Backup options to global config: 224Added Backup options to global config:
224You can create now x-daily backups for KO/Pi, KA/Pi (for file resources only, file resource is the standard type) and PwM/Pi ( all files you will open ). 225You can create now x-daily backups for KO/Pi, KA/Pi (for file resources only, file resource is the standard type) and PwM/Pi ( all files you will open ).
225It is recommended to use another HDD/Memory card for the backup directory. If (very useful on the Zaurus) the specified backup directory does not exist you are asked if you want to try again to create a backup. That makes it possible to insert your memory card in the Zaurus and then trying again. 226It is recommended to use another HDD/Memory card for the backup directory. If (very useful on the Zaurus) the specified backup directory does not exist you are asked if you want to try again to create a backup. That makes it possible to insert your memory card in the Zaurus and then trying again.
226The backup is created when the application wants to save for the first time on a backup-day. You can specify the amount of backups and the day interval of backups. 227The backup is created when the application wants to save for the first time on a backup-day. You can specify the amount of backups and the day interval of backups.
227 228
228********** VERSION 2.1.1 ************ 229********** VERSION 2.1.1 ************
229 230
230Stable release 2.1.1! 231Stable release 2.1.1!
231 232
232KO/Pi: 233KO/Pi:
233Fixed one problem in the layout of the edit dialogs on the Zaurus with 640x480 display. 234Fixed one problem in the layout of the edit dialogs on the Zaurus with 640x480 display.
234 235
235********** VERSION 2.1.0 ************ 236********** VERSION 2.1.0 ************
236 237
237Stable release 2.1.0! 238Stable release 2.1.0!
238 239
239Summary of changes/fixes compared to version 2.0.6: 240Summary of changes/fixes compared to version 2.0.6:
240 241
241Many bugs of version 2.0.6 fixed. 242Many bugs of version 2.0.6 fixed.
242Most of them were small bugs, but some of them were important. 243Most of them were small bugs, but some of them were important.
243It is recommended to use version 2.1.0 and not version 2.0.6. 244It is recommended to use version 2.1.0 and not version 2.0.6.
244 245
245Important changes: 246Important changes:
246 247
247Added recurring todos to KO/Pi. 248Added recurring todos to KO/Pi.
248 249
249Added global application font settings (for all KDE-Pim/Pi apps) to the general settings. 250Added global application font settings (for all KDE-Pim/Pi apps) to the general settings.
250 251
251Made Passwordmanager PwM/Pi more userfriendly: Rearranged some toolbar icons, optimized setting of focus, fixed layout problems and more. 252Made Passwordmanager PwM/Pi more userfriendly: Rearranged some toolbar icons, optimized setting of focus, fixed layout problems and more.
252 253
253Datenavigator can now display many months. Very useful on the desktop. 254Datenavigator can now display many months. Very useful on the desktop.
254 255
255KO/Pi alarm applet changed: Made buttons in alarm dialog much bigger and other usebility enhancements. 256KO/Pi alarm applet changed: Made buttons in alarm dialog much bigger and other usebility enhancements.
256 257
257Made alarm sound working on Linux desktop. 258Made alarm sound working on Linux desktop.
258 259
259Made KO/Pi and KA/Pi running from a memory stick. Please read storage HowTo for details. 260Made KO/Pi and KA/Pi running from a memory stick. Please read storage HowTo for details.
260 261
261Added timetracking feature in KO/Pi todo view. Please read timetraker HowTo for details. 262Added timetracking feature in KO/Pi todo view. Please read timetraker HowTo for details.
262 263
263Many other usebility enhancements. 264Many other usebility enhancements.
264Special thanks to Ben for his suggestions! 265Special thanks to Ben for his suggestions!
265 266
266You can find the complete changelog 267You can find the complete changelog
267from version 1.7.7 to 2.1.0 268from version 1.7.7 to 2.1.0
268in the source package or on 269in the source package or on
269 270
270http://www.pi-sync.net/html/changelog.html 271http://www.pi-sync.net/html/changelog.html
271 272
272 273
273 274
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index a9e402e..427d71b 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -150,1093 +150,1110 @@ MissedAlarmTextBrowser::MissedAlarmTextBrowser(QWidget *parent, QPtrList<Inciden
150#ifdef DESKTOP_VERSION 150#ifdef DESKTOP_VERSION
151 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h2>"; 151 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h2>";
152#else 152#else
153 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h3>"; 153 mText += "<tr bgcolor=\"#5699CD\"><td align=\"center\"><h3>";
154#endif 154#endif
155 // mText += "<img src=\""; 155 // mText += "<img src=\"";
156 // mText += ipath; 156 // mText += ipath;
157 // mText += "\">"; 157 // mText += "\">";
158 //mEventDate = QDate::currentDate(); 158 //mEventDate = QDate::currentDate();
159#ifdef DESKTOP_VERSION 159#ifdef DESKTOP_VERSION
160 mText += "<font color=\"#FFFFFF\"> <em>" + i18n("You missed the alarms for the following events or todos:")+"</em></font></h2>"; 160 mText += "<font color=\"#FFFFFF\"> <em>" + i18n("You missed the alarms for the following events or todos:")+"</em></font></h2>";
161#else 161#else
162 mText += "<font color=\"#FFFFFF\"> <em>" + i18n("You missed the alarms for the following events or todos:")+"</em></font></h3>"; 162 mText += "<font color=\"#FFFFFF\"> <em>" + i18n("You missed the alarms for the following events or todos:")+"</em></font></h3>";
163#endif 163#endif
164 //mText += "</td></tr>\n<tr bgcolor=\"#FF997D\"><td>"; 164 //mText += "</td></tr>\n<tr bgcolor=\"#FF997D\"><td>";
165 165
166 Incidence * inc = getNextInc( start ); 166 Incidence * inc = getNextInc( start );
167 int time = 0; 167 int time = 0;
168 //mText += "<table>"; 168 //mText += "<table>";
169 while ( inc ) { 169 while ( inc ) {
170 QDateTime dt ; 170 QDateTime dt ;
171 QString tempText = "<a "; 171 QString tempText = "<a ";
172 bool ok; 172 bool ok;
173 dt = inc->getNextOccurence( start, &ok ); 173 dt = inc->getNextOccurence( start, &ok );
174 if ( !ok ) continue; 174 if ( !ok ) continue;
175 if ( inc->typeID() == eventID ) { 175 if ( inc->typeID() == eventID ) {
176 tempText += "href=\"event:"; 176 tempText += "href=\"event:";
177 } else if ( inc->typeID() == todoID ) { 177 } else if ( inc->typeID() == todoID ) {
178 tempText += "href=\"todo:"; 178 tempText += "href=\"todo:";
179 } 179 }
180 tempText += inc->uid() + "\">"; 180 tempText += inc->uid() + "\">";
181 if ( inc->typeID() == todoID ) 181 if ( inc->typeID() == todoID )
182 tempText += i18n("Todo: "); 182 tempText += i18n("Todo: ");
183 if ( inc->summary().length() > 0 ) 183 if ( inc->summary().length() > 0 )
184 tempText += inc->summary(); 184 tempText += inc->summary();
185 else 185 else
186 tempText += i18n("-no summary-"); 186 tempText += i18n("-no summary-");
187 QString timestr; 187 QString timestr;
188 if (!inc->doesFloat()) 188 if (!inc->doesFloat())
189 timestr = KGlobal::locale()->formatDateTime( dt, KOPrefs::instance()->mShortDateInViewer) +": "; 189 timestr = KGlobal::locale()->formatDateTime( dt, KOPrefs::instance()->mShortDateInViewer) +": ";
190 else 190 else
191 timestr = KGlobal::locale()->formatDate( dt.date() , KOPrefs::instance()->mShortDateInViewer) +": "; 191 timestr = KGlobal::locale()->formatDate( dt.date() , KOPrefs::instance()->mShortDateInViewer) +": ";
192 if ( dt.date() < QDate::currentDate() && time == 0 ) { 192 if ( dt.date() < QDate::currentDate() && time == 0 ) {
193 mText += "</td></tr>\n<tr bgcolor=\"#FF997D\"><td>"; 193 mText += "</td></tr>\n<tr bgcolor=\"#FF997D\"><td>";
194 mText += "<table>"; 194 mText += "<table>";
195 time = 1; 195 time = 1;
196 } 196 }
197 if ( dt.date() == QDate::currentDate() && time <= 1 ) { 197 if ( dt.date() == QDate::currentDate() && time <= 1 ) {
198 if ( time > 0 ) 198 if ( time > 0 )
199 mText +="</table>"; 199 mText +="</table>";
200 mText += "</td></tr>\n<tr bgcolor=\"#FFDC64\"><td>"; 200 mText += "</td></tr>\n<tr bgcolor=\"#FFDC64\"><td>";
201 mText += "<table>"; 201 mText += "<table>";
202 time = 2; 202 time = 2;
203 203
204 } 204 }
205 if ( dt.date() > QDate::currentDate() && time <= 2 ) { 205 if ( dt.date() > QDate::currentDate() && time <= 2 ) {
206 if ( time > 0 ) 206 if ( time > 0 )
207 mText +="</table>"; 207 mText +="</table>";
208 mText += "</td></tr>\n<tr bgcolor=\"#6AFF6A\"><td>"; 208 mText += "</td></tr>\n<tr bgcolor=\"#6AFF6A\"><td>";
209 mText += "<table>"; 209 mText += "<table>";
210 time = 3; 210 time = 3;
211 } 211 }
212 mText +="<tr><td><b>"; 212 mText +="<tr><td><b>";
213 mText += timestr; 213 mText += timestr;
214 mText += "</b></td><td>"; 214 mText += "</b></td><td>";
215 mText += tempText; 215 mText += tempText;
216 mText += "</td></tr>\n"; 216 mText += "</td></tr>\n";
217 inc = getNextInc( start ); 217 inc = getNextInc( start );
218 } 218 }
219 mText +="</table>"; 219 mText +="</table>";
220 setText( mText ); 220 setText( mText );
221} 221}
222 222
223MissedAlarmTextBrowser::~MissedAlarmTextBrowser() 223MissedAlarmTextBrowser::~MissedAlarmTextBrowser()
224{ 224{
225 //qDebug("delete MissedAlarmTextBrowser::~MissedAlarmTextBrowser() "); 225 //qDebug("delete MissedAlarmTextBrowser::~MissedAlarmTextBrowser() ");
226} 226}
227Incidence * MissedAlarmTextBrowser::getNextInc( QDateTime start ) 227Incidence * MissedAlarmTextBrowser::getNextInc( QDateTime start )
228{ 228{
229 QDateTime dt ; 229 QDateTime dt ;
230 Incidence * retInc; 230 Incidence * retInc;
231 Incidence * inc = mAlarms.first(); 231 Incidence * inc = mAlarms.first();
232 if ( inc == 0 ) 232 if ( inc == 0 )
233 return 0; 233 return 0;
234 bool ok; 234 bool ok;
235 dt = inc->getNextOccurence( start, &ok ); 235 dt = inc->getNextOccurence( start, &ok );
236 if ( ! ok ) return 0; 236 if ( ! ok ) return 0;
237 QDateTime dtn ; 237 QDateTime dtn ;
238 retInc = inc; 238 retInc = inc;
239 inc = mAlarms.next(); 239 inc = mAlarms.next();
240 while ( inc ) { 240 while ( inc ) {
241 dtn = inc->getNextOccurence( start, &ok ); 241 dtn = inc->getNextOccurence( start, &ok );
242 if ( ! ok ) return 0; 242 if ( ! ok ) return 0;
243 if ( dtn < dt ) { 243 if ( dtn < dt ) {
244 dt = dtn; 244 dt = dtn;
245 retInc = inc; 245 retInc = inc;
246 } 246 }
247 inc = mAlarms.next(); 247 inc = mAlarms.next();
248 } 248 }
249 mAlarms.remove( retInc ); 249 mAlarms.remove( retInc );
250 return retInc; 250 return retInc;
251 251
252} 252}
253void MissedAlarmTextBrowser::setSource(const QString & n) 253void MissedAlarmTextBrowser::setSource(const QString & n)
254{ 254{
255 if (n.startsWith("event:")) { 255 if (n.startsWith("event:")) {
256#ifdef DESKTOP_VERSION 256#ifdef DESKTOP_VERSION
257 emit showIncidence(n.mid(8)); 257 emit showIncidence(n.mid(8));
258#else 258#else
259 emit showIncidence(n.mid(6)); 259 emit showIncidence(n.mid(6));
260#endif 260#endif
261 return; 261 return;
262 } else if (n.startsWith("todo:")) { 262 } else if (n.startsWith("todo:")) {
263#ifdef DESKTOP_VERSION 263#ifdef DESKTOP_VERSION
264 emit showIncidence(n.mid(7)); 264 emit showIncidence(n.mid(7));
265#else 265#else
266 emit showIncidence(n.mid(5)); 266 emit showIncidence(n.mid(5));
267#endif 267#endif
268 return; 268 return;
269 } 269 }
270} 270}
271 271
272 272
273class KOBeamPrefs : public QDialog 273class KOBeamPrefs : public QDialog
274{ 274{
275 public: 275 public:
276 KOBeamPrefs( QWidget *parent=0, const char *name=0 ) : 276 KOBeamPrefs( QWidget *parent=0, const char *name=0 ) :
277 QDialog( parent, name, true ) 277 QDialog( parent, name, true )
278 { 278 {
279 setCaption( i18n("Beam Options") ); 279 setCaption( i18n("Beam Options") );
280 QVBoxLayout* lay = new QVBoxLayout( this ); 280 QVBoxLayout* lay = new QVBoxLayout( this );
281 lay->setSpacing( 3 ); 281 lay->setSpacing( 3 );
282 lay->setMargin( 3 ); 282 lay->setMargin( 3 );
283 QButtonGroup* format = new QButtonGroup( 1, Horizontal, i18n("File format"), this ); 283 QButtonGroup* format = new QButtonGroup( 1, Horizontal, i18n("File format"), this );
284 lay->addWidget( format ); 284 lay->addWidget( format );
285 format->setExclusive ( true ) ; 285 format->setExclusive ( true ) ;
286 QButtonGroup* time = new QButtonGroup(1, Horizontal, i18n("Time format"), this ); 286 QButtonGroup* time = new QButtonGroup(1, Horizontal, i18n("Time format"), this );
287 lay->addWidget( time ); time->setExclusive ( true ) ; 287 lay->addWidget( time ); time->setExclusive ( true ) ;
288 vcal = new QRadioButton(" vCalendar ", format ); 288 vcal = new QRadioButton(" vCalendar ", format );
289 ical = new QRadioButton(" iCalendar ", format ); 289 ical = new QRadioButton(" iCalendar ", format );
290 vcal->setChecked( true ); 290 vcal->setChecked( true );
291 tz = new QRadioButton(i18n(" With timezone "), time ); 291 tz = new QRadioButton(i18n(" With timezone "), time );
292 local = new QRadioButton(i18n(" Local time "), time ); 292 local = new QRadioButton(i18n(" Local time "), time );
293 tz->setChecked( true ); 293 tz->setChecked( true );
294 QPushButton * ok = new QPushButton( i18n("Beam via IR!"), this ); 294 QPushButton * ok = new QPushButton( i18n("Beam via IR!"), this );
295 lay->addWidget( ok ); 295 lay->addWidget( ok );
296 QPushButton * cancel = new QPushButton( i18n("Cancel"), this ); 296 QPushButton * cancel = new QPushButton( i18n("Cancel"), this );
297 lay->addWidget( cancel ); 297 lay->addWidget( cancel );
298 connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) ); 298 connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) );
299 connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) ); 299 connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) );
300 resize( 200, 200 ); 300 resize( 200, 200 );
301 } 301 }
302 302
303 bool beamVcal() { return vcal->isChecked(); } 303 bool beamVcal() { return vcal->isChecked(); }
304 bool beamLocal() { return local->isChecked(); } 304 bool beamLocal() { return local->isChecked(); }
305private: 305private:
306 QRadioButton* vcal, *ical, *local, *tz; 306 QRadioButton* vcal, *ical, *local, *tz;
307}; 307};
308class KOCatPrefs : public QDialog 308class KOCatPrefs : public QDialog
309{ 309{
310 public: 310 public:
311 KOCatPrefs( QWidget *parent=0, const char *name=0 ) : 311 KOCatPrefs( QWidget *parent=0, const char *name=0 ) :
312 QDialog( parent, name, true ) 312 QDialog( parent, name, true )
313 { 313 {
314 setCaption( i18n("Manage new Categories") ); 314 setCaption( i18n("Manage new Categories") );
315 QVBoxLayout* lay = new QVBoxLayout( this ); 315 QVBoxLayout* lay = new QVBoxLayout( this );
316 lay->setSpacing( 3 ); 316 lay->setSpacing( 3 );
317 lay->setMargin( 3 ); 317 lay->setMargin( 3 );
318 QLabel * lab = new QLabel( i18n("After importing/loading/syncing there may be new categories in events or todos which are not added automatically to the category list. Please choose what to do <b>now</b>:"), this ); 318 QLabel * lab = new QLabel( i18n("After importing/loading/syncing there may be new categories in events or todos which are not added automatically to the category list. Please choose what to do <b>now</b>:"), this );
319 lay->addWidget( lab ); 319 lay->addWidget( lab );
320 QButtonGroup* format = new QButtonGroup( 1, Horizontal, i18n("New categories not in list:"), this ); 320 QButtonGroup* format = new QButtonGroup( 1, Horizontal, i18n("New categories not in list:"), this );
321 lay->addWidget( format ); 321 lay->addWidget( format );
322 format->setExclusive ( true ) ; 322 format->setExclusive ( true ) ;
323 addCatBut = new QRadioButton(i18n("Add to category list"), format ); 323 addCatBut = new QRadioButton(i18n("Add to category list"), format );
324 new QRadioButton(i18n("Remove from Events/Todos"), format ); 324 new QRadioButton(i18n("Remove from Events/Todos"), format );
325 addCatBut->setChecked( true ); 325 addCatBut->setChecked( true );
326 QPushButton * ok = new QPushButton( i18n("Change category list now!"), this ); 326 QPushButton * ok = new QPushButton( i18n("Change category list now!"), this );
327 lay->addWidget( ok ); 327 lay->addWidget( ok );
328 QPushButton * cancel = new QPushButton( i18n("Cancel"), this ); 328 QPushButton * cancel = new QPushButton( i18n("Cancel"), this );
329 lay->addWidget( cancel ); 329 lay->addWidget( cancel );
330 connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) ); 330 connect ( ok,SIGNAL(clicked() ),this , SLOT ( accept() ) );
331 connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) ); 331 connect (cancel, SIGNAL(clicked() ), this, SLOT ( reject()) );
332 resize( 200, 200 ); 332 resize( 200, 200 );
333 } 333 }
334 334
335 bool addCat() { return addCatBut->isChecked(); } 335 bool addCat() { return addCatBut->isChecked(); }
336private: 336private:
337 QRadioButton* addCatBut; 337 QRadioButton* addCatBut;
338}; 338};
339 339
340 340
341 341
342CalendarView::CalendarView( CalendarResources *calendar, 342CalendarView::CalendarView( CalendarResources *calendar,
343 QWidget *parent, const char *name ) 343 QWidget *parent, const char *name )
344 : CalendarViewBase( parent, name ), 344 : CalendarViewBase( parent, name ),
345 mCalendar( calendar ), 345 mCalendar( calendar ),
346 mResourceManager( calendar->resourceManager() ) 346 mResourceManager( calendar->resourceManager() )
347{ 347{
348 348
349 mEventEditor = 0; 349 mEventEditor = 0;
350 mTodoEditor = 0; 350 mTodoEditor = 0;
351 351
352 init(); 352 init();
353} 353}
354 354
355CalendarView::CalendarView( Calendar *calendar, 355CalendarView::CalendarView( Calendar *calendar,
356 QWidget *parent, const char *name ) 356 QWidget *parent, const char *name )
357 : CalendarViewBase( parent, name ), 357 : CalendarViewBase( parent, name ),
358 mCalendar( calendar ), 358 mCalendar( calendar ),
359 mResourceManager( 0 ) 359 mResourceManager( 0 )
360{ 360{
361 361
362 mEventEditor = 0; 362 mEventEditor = 0;
363 mTodoEditor = 0; 363 mTodoEditor = 0;
364 init(); 364 init();
365} 365}
366 366
367void CalendarView::init() 367void CalendarView::init()
368{ 368{
369 mNextAlarmDateTime = QDateTime::currentDateTime(); 369 mNextAlarmDateTime = QDateTime::currentDateTime();
370 setFocusPolicy (NoFocus ); 370 setFocusPolicy (NoFocus );
371 mViewerCallerIsSearchDialog = false; 371 mViewerCallerIsSearchDialog = false;
372 mBlockShowDates = false; 372 mBlockShowDates = false;
373 373
374 mDatePickerMode = 0; 374 mDatePickerMode = 0;
375 mCurrentSyncDevice = ""; 375 mCurrentSyncDevice = "";
376 mViewManager = new KOViewManager( this ); 376 mViewManager = new KOViewManager( this );
377 mDialogManager = new KODialogManager( this ); 377 mDialogManager = new KODialogManager( this );
378 mEventViewerDialog = 0; 378 mEventViewerDialog = 0;
379 mModified = false; 379 mModified = false;
380 mReadOnly = false; 380 mReadOnly = false;
381 mSelectedIncidence = 0; 381 mSelectedIncidence = 0;
382 mCalPrinter = 0; 382 mCalPrinter = 0;
383 mFilters.setAutoDelete(true); 383 mFilters.setAutoDelete(true);
384 384
385 mCalendar->registerObserver( this ); 385 mCalendar->registerObserver( this );
386 // TODO: Make sure that view is updated, when calendar is changed. 386 // TODO: Make sure that view is updated, when calendar is changed.
387 387
388 mStorage = new FileStorage( mCalendar ); 388 mStorage = new FileStorage( mCalendar );
389 mNavigator = new DateNavigator( this, "datevav", mViewManager ); 389 mNavigator = new DateNavigator( this, "datevav", mViewManager );
390 390
391 QBoxLayout *topLayout = (QBoxLayout*)layout(); 391 QBoxLayout *topLayout = (QBoxLayout*)layout();
392#ifndef KORG_NOSPLITTER 392#ifndef KORG_NOSPLITTER
393 // create the main layout frames. 393 // create the main layout frames.
394 mPanner = new QSplitter(QSplitter::Horizontal,this,"CalendarView::Panner"); 394 mPanner = new QSplitter(QSplitter::Horizontal,this,"CalendarView::Panner");
395 topLayout->addWidget(mPanner); 395 topLayout->addWidget(mPanner);
396 396
397 mLeftSplitter = new QSplitter(QSplitter::Vertical,mPanner, 397 mLeftSplitter = new QSplitter(QSplitter::Vertical,mPanner,
398 "CalendarView::LeftFrame"); 398 "CalendarView::LeftFrame");
399 mPanner->setResizeMode(mLeftSplitter,QSplitter::KeepSize); 399 mPanner->setResizeMode(mLeftSplitter,QSplitter::KeepSize);
400 400
401 mDateNavigator = new DateNavigatorContainer( mLeftSplitter, 401 mDateNavigator = new DateNavigatorContainer( mLeftSplitter,
402 "CalendarView::DateNavigator" ); 402 "CalendarView::DateNavigator" );
403 403
404 mLeftSplitter->setResizeMode(mDateNavigator,QSplitter::KeepSize); 404 mLeftSplitter->setResizeMode(mDateNavigator,QSplitter::KeepSize);
405 mTodoList = new KOTodoView(mCalendar, mLeftSplitter, "todolist_small2"); 405 mTodoList = new KOTodoView(mCalendar, mLeftSplitter, "todolist_small2");
406 mTodoList->setNavigator( mNavigator ); 406 mTodoList->setNavigator( mNavigator );
407 mFilterView = new KOFilterView(&mFilters,mLeftSplitter,"CalendarView::FilterView"); 407 mFilterView = new KOFilterView(&mFilters,mLeftSplitter,"CalendarView::FilterView");
408 408
409#ifdef KORG_NORESOURCEVIEW 409#ifdef KORG_NORESOURCEVIEW
410 mResourceView = 0; 410 mResourceView = 0;
411#else 411#else
412 if ( mResourceManager ) { 412 if ( mResourceManager ) {
413 mResourceView = new ResourceView( mResourceManager, mLeftSplitter ); 413 mResourceView = new ResourceView( mResourceManager, mLeftSplitter );
414 mResourceView->updateView(); 414 mResourceView->updateView();
415 connect( mResourceView, SIGNAL( resourcesChanged() ), 415 connect( mResourceView, SIGNAL( resourcesChanged() ),
416 SLOT( updateView() ) ); 416 SLOT( updateView() ) );
417 } else { 417 } else {
418 mResourceView = 0; 418 mResourceView = 0;
419 } 419 }
420#endif 420#endif
421 QWidget *rightBox = new QWidget( mPanner ); 421 QWidget *rightBox = new QWidget( mPanner );
422 QBoxLayout *rightLayout = new QVBoxLayout( rightBox ); 422 QBoxLayout *rightLayout = new QVBoxLayout( rightBox );
423 423
424 mRightFrame = new QWidgetStack( rightBox ); 424 mRightFrame = new QWidgetStack( rightBox );
425 rightLayout->addWidget( mRightFrame, 1 ); 425 rightLayout->addWidget( mRightFrame, 1 );
426 426
427 mLeftFrame = mLeftSplitter; 427 mLeftFrame = mLeftSplitter;
428#else 428#else
429 //QWidget *mainBox = new QWidget( this ); 429 //QWidget *mainBox = new QWidget( this );
430 //QWidget *leftFrame = new QWidget( mainBox ); 430 //QWidget *leftFrame = new QWidget( mainBox );
431 //QBoxLayout * mainBoxLayout; 431 //QBoxLayout * mainBoxLayout;
432 if ( KOPrefs::instance()->mVerticalScreen ) { 432 if ( KOPrefs::instance()->mVerticalScreen ) {
433 //mainBoxLayout = new QVBoxLayout(mainBox); 433 //mainBoxLayout = new QVBoxLayout(mainBox);
434 //leftFrameLayout = new QHBoxLayout(leftFrame ); 434 //leftFrameLayout = new QHBoxLayout(leftFrame );
435 mMainFrame = new KDGanttMinimizeSplitter( Qt::Vertical, this ); 435 mMainFrame = new KDGanttMinimizeSplitter( Qt::Vertical, this );
436 mMainFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Up ); 436 mMainFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Up );
437 mLeftFrame = new KDGanttMinimizeSplitter( Qt::Horizontal, mMainFrame);; 437 mLeftFrame = new KDGanttMinimizeSplitter( Qt::Horizontal, mMainFrame);;
438 mLeftFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Right ); 438 mLeftFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Right );
439 } else { 439 } else {
440 //mainBoxLayout = new QHBoxLayout(mainBox); 440 //mainBoxLayout = new QHBoxLayout(mainBox);
441 //leftFrameLayout = new QVBoxLayout(leftFrame ); 441 //leftFrameLayout = new QVBoxLayout(leftFrame );
442 mMainFrame = new KDGanttMinimizeSplitter( Qt::Horizontal, this); 442 mMainFrame = new KDGanttMinimizeSplitter( Qt::Horizontal, this);
443 mMainFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Left); 443 mMainFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Left);
444 mLeftFrame = new KDGanttMinimizeSplitter( Qt::Vertical, mMainFrame); 444 mLeftFrame = new KDGanttMinimizeSplitter( Qt::Vertical, mMainFrame);
445 mLeftFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Up ); 445 mLeftFrame->setMinimizeDirection ( KDGanttMinimizeSplitter::Up );
446 } 446 }
447 mMainFrame->setSizePolicy( QSizePolicy (QSizePolicy::Expanding,QSizePolicy::Expanding) ); 447 mMainFrame->setSizePolicy( QSizePolicy (QSizePolicy::Expanding,QSizePolicy::Expanding) );
448 //QBoxLayout * leftFrameLayout; 448 //QBoxLayout * leftFrameLayout;
449 topLayout->addWidget( mMainFrame ); 449 topLayout->addWidget( mMainFrame );
450#ifdef DESKTOP_VERSION 450#ifdef DESKTOP_VERSION
451 mDateScrollBar = new QScrollBar ( 1, 365, 1,30, 200,QScrollBar::Horizontal, this ); 451 mDateScrollBar = new QScrollBar ( 1, 365, 1,30, 200,QScrollBar::Horizontal, this );
452 topLayout->addWidget( mDateScrollBar ); 452 topLayout->addWidget( mDateScrollBar );
453 connect( mDateScrollBar, SIGNAL( valueChanged ( int ) ),this, SLOT( scrollBarValue( int )) ); 453 connect( mDateScrollBar, SIGNAL( valueChanged ( int ) ),this, SLOT( scrollBarValue( int )) );
454 if ( QApplication::desktop()->width() < 800 ) 454 if ( QApplication::desktop()->width() < 800 )
455 mDateScrollBar->hide(); 455 mDateScrollBar->hide();
456#endif 456#endif
457 //mainBoxLayout->addWidget (mLeftFrame); 457 //mainBoxLayout->addWidget (mLeftFrame);
458 mDateNavigator = new DateNavigatorContainer( mLeftFrame, 458 mDateNavigator = new DateNavigatorContainer( mLeftFrame,
459 "CalendarView::DateNavigator" ); 459 "CalendarView::DateNavigator" );
460#if 0 460#if 0
461 // FIXME 461 // FIXME
462 mDateNavigator = new KDateNavigator(mLeftFrame, mCalendar, TRUE, 462 mDateNavigator = new KDateNavigator(mLeftFrame, mCalendar, TRUE,
463 "CalendarView::DateNavigator", QDate::currentDate()); 463 "CalendarView::DateNavigator", QDate::currentDate());
464#endif 464#endif
465 // mDateNavigator->blockSignals( true ); 465 // mDateNavigator->blockSignals( true );
466 //leftFrameLayout->addWidget( mDateNavigator ); 466 //leftFrameLayout->addWidget( mDateNavigator );
467 mTodoList = new KOTodoView(mCalendar, mLeftFrame, "todolistsmall"); 467 mTodoList = new KOTodoView(mCalendar, mLeftFrame, "todolistsmall");
468 mFilterView = new KOFilterView(&mFilters,mLeftFrame,"CalendarView::FilterView"); 468 mFilterView = new KOFilterView(&mFilters,mLeftFrame,"CalendarView::FilterView");
469 mCalEditView = new KOCalEditView(mLeftFrame,"CalendarView::CaleditView"); 469 mCalEditView = new KOCalEditView(mLeftFrame,"CalendarView::CaleditView");
470 connect( mCalEditView, SIGNAL( calendarEnabled (int,bool) ),mCalendar, SLOT( setCalendarEnabled(int,bool)) ); 470 connect( mCalEditView, SIGNAL( calendarEnabled (int,bool) ),mCalendar, SLOT( setCalendarEnabled(int,bool)) );
471 connect( mCalEditView, SIGNAL( alarmEnabled(int,bool) ),mCalendar, SLOT( setAlarmEnabled(int,bool)) ); 471 connect( mCalEditView, SIGNAL( alarmEnabled(int,bool) ),mCalendar, SLOT( setAlarmEnabled(int,bool)) );
472 connect( mCalEditView, SIGNAL( calendarReadonly(int,bool) ),this, SLOT( setCalReadOnly(int,bool)) ); 472 connect( mCalEditView, SIGNAL( calendarReadonly(int,bool) ),this, SLOT( setCalReadOnly(int,bool)) );
473 connect( mCalEditView, SIGNAL( setCalendarDefault(int) ),mCalendar, SLOT( setDefaultCalendar(int)) ); 473 connect( mCalEditView, SIGNAL( setCalendarDefault(int) ),mCalendar, SLOT( setDefaultCalendar(int)) );
474 connect( mCalEditView, SIGNAL( setCalendarDefault(int) ),mViewManager, SLOT( setDefaultCalendar(int)) ); 474 connect( mCalEditView, SIGNAL( setCalendarDefault(int) ),mViewManager, SLOT( setDefaultCalendar(int)) );
475 connect( mCalEditView, SIGNAL( removeCalendar(int) ),mCalendar, SLOT( setCalendarRemove(int)) ); 475 connect( mCalEditView, SIGNAL( removeCalendar(int) ),mCalendar, SLOT( setCalendarRemove(int)) );
476 connect( mCalEditView, SIGNAL( calendarAdded(int) ),this, SLOT( addCalendarId(int)) ); 476 connect( mCalEditView, SIGNAL( calendarAdded(int) ),this, SLOT( addCalendarId(int)) );
477 connect( mCalEditView, SIGNAL( needsUpdate() ),this, SLOT( updateView()) ); 477 connect( mCalEditView, SIGNAL( needsUpdate() ),this, SLOT( updateView()) );
478 connect( mCalEditView, SIGNAL( checkCalendar() ),this, SLOT( checkFiles() )); 478 connect( mCalEditView, SIGNAL( checkCalendar() ),this, SLOT( checkFiles() ));
479 connect( mCalEditView, SIGNAL( needsUpdate() ),this, SLOT( updateUnmanagedViews()) ); 479 connect( mCalEditView, SIGNAL( needsUpdate() ),this, SLOT( updateUnmanagedViews()) );
480 480
481 mTodoList->setNavigator( mNavigator ); 481 mTodoList->setNavigator( mNavigator );
482#if 0 482#if 0
483 if ( QApplication::desktop()->width() < 480 ) { 483 if ( QApplication::desktop()->width() < 480 ) {
484 leftFrameLayout->addWidget(mFilterView); 484 leftFrameLayout->addWidget(mFilterView);
485 leftFrameLayout->addWidget(mTodoList, 2 ); 485 leftFrameLayout->addWidget(mTodoList, 2 );
486 486
487 } else { 487 } else {
488 leftFrameLayout->addWidget(mTodoList,2 ); 488 leftFrameLayout->addWidget(mTodoList,2 );
489 leftFrameLayout->addWidget(mFilterView ); 489 leftFrameLayout->addWidget(mFilterView );
490 } 490 }
491#endif 491#endif
492 mFilterView->hide(); 492 mFilterView->hide();
493 mCalEditView->hide(); 493 mCalEditView->hide();
494 QWidget *rightBox = new QWidget( mMainFrame ); 494 QWidget *rightBox = new QWidget( mMainFrame );
495 //mainBoxLayout->addWidget ( rightBox, 10 ); 495 //mainBoxLayout->addWidget ( rightBox, 10 );
496 QBoxLayout *rightLayout = new QVBoxLayout( rightBox ); 496 QBoxLayout *rightLayout = new QVBoxLayout( rightBox );
497 mRightFrame = new QWidgetStack( rightBox ); 497 mRightFrame = new QWidgetStack( rightBox );
498 rightLayout->addWidget( mRightFrame, 10 ); 498 rightLayout->addWidget( mRightFrame, 10 );
499 499
500 //mLeftFrame = (QWidget *)leftFrame; 500 //mLeftFrame = (QWidget *)leftFrame;
501 if ( KOPrefs::instance()->mVerticalScreen ) { 501 if ( KOPrefs::instance()->mVerticalScreen ) {
502 //mDateNavigator->setFixedHeight( mDateNavigator->sizeHint().height() ); 502 //mDateNavigator->setFixedHeight( mDateNavigator->sizeHint().height() );
503 //mDateNavigator->setMinimumWidth( mDateNavigator->sizeHint().width() ); 503 //mDateNavigator->setMinimumWidth( mDateNavigator->sizeHint().width() );
504 //mTodoList->setFixedHeight( mDateNavigator->sizeHint().height() ); 504 //mTodoList->setFixedHeight( mDateNavigator->sizeHint().height() );
505 //leftFrame->setFixedHeight( mDateNavigator->sizeHint().height() ); 505 //leftFrame->setFixedHeight( mDateNavigator->sizeHint().height() );
506 } else { 506 } else {
507 //mDateNavigator->setFixedWidth( mDateNavigator->sizeHint().width() ); 507 //mDateNavigator->setFixedWidth( mDateNavigator->sizeHint().width() );
508 //mTodoList->setFixedWidth( mDateNavigator->sizeHint().width() ); 508 //mTodoList->setFixedWidth( mDateNavigator->sizeHint().width() );
509 //leftFrame->setFixedWidth( mDateNavigator->sizeHint().width() ); 509 //leftFrame->setFixedWidth( mDateNavigator->sizeHint().width() );
510 } 510 }
511 if ( !KOPrefs::instance()->mShowDateNavigator) 511 if ( !KOPrefs::instance()->mShowDateNavigator)
512 mDateNavigator->hide(); 512 mDateNavigator->hide();
513 //qDebug("Calendarview Size %d %d ", width(), height()); 513 //qDebug("Calendarview Size %d %d ", width(), height());
514#endif 514#endif
515 515
516 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 516 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
517 SLOT( showDates( const KCal::DateList & ) ) ); 517 SLOT( showDates( const KCal::DateList & ) ) );
518 518
519 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 519 connect( mNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
520 mDateNavigator, SLOT( selectDates( const KCal::DateList & ) ) ); 520 mDateNavigator, SLOT( selectDates( const KCal::DateList & ) ) );
521 521
522 522
523 523
524 connect( mDateNavigator, SIGNAL( showMonth( const QDate & ) ), 524 connect( mDateNavigator, SIGNAL( showMonth( const QDate & ) ),
525 mViewManager, SLOT( showMonth( const QDate & ) ) ); 525 mViewManager, SLOT( showMonth( const QDate & ) ) );
526 526
527 connect( mDateNavigator, SIGNAL( weekClicked( const QDate & ) ), 527 connect( mDateNavigator, SIGNAL( weekClicked( const QDate & ) ),
528 mNavigator, SLOT( selectWeek( const QDate & ) ) ); 528 mNavigator, SLOT( selectWeek( const QDate & ) ) );
529 529
530 connect( mDateNavigator, SIGNAL( goPrevYear() ), 530 connect( mDateNavigator, SIGNAL( goPrevYear() ),
531 mNavigator, SLOT( selectPreviousYear() ) ); 531 mNavigator, SLOT( selectPreviousYear() ) );
532 connect( mDateNavigator, SIGNAL( goNextYear() ), 532 connect( mDateNavigator, SIGNAL( goNextYear() ),
533 mNavigator, SLOT( selectNextYear() ) ); 533 mNavigator, SLOT( selectNextYear() ) );
534 connect( mDateNavigator, SIGNAL( goPrevMonth() ), 534 connect( mDateNavigator, SIGNAL( goPrevMonth() ),
535 mNavigator, SLOT( selectPreviousMonth() ) ); 535 mNavigator, SLOT( selectPreviousMonth() ) );
536 connect( mDateNavigator, SIGNAL( goNextMonth() ), 536 connect( mDateNavigator, SIGNAL( goNextMonth() ),
537 mNavigator, SLOT( selectNextMonth() ) ); 537 mNavigator, SLOT( selectNextMonth() ) );
538 538
539 connect( mDateNavigator, SIGNAL( goPrevious() ), 539 connect( mDateNavigator, SIGNAL( goPrevious() ),
540 mNavigator, SLOT( selectPrevious() ) ); 540 mNavigator, SLOT( selectPrevious() ) );
541 connect( mDateNavigator, SIGNAL( goNext() ), 541 connect( mDateNavigator, SIGNAL( goNext() ),
542 mNavigator, SLOT( selectNext() ) ); 542 mNavigator, SLOT( selectNext() ) );
543 connect( mDateNavigator, SIGNAL( monthSelected ( int ) ), 543 connect( mDateNavigator, SIGNAL( monthSelected ( int ) ),
544 mNavigator, SLOT( slotMonthSelect( int ) ) ); 544 mNavigator, SLOT( slotMonthSelect( int ) ) );
545 545
546 connect( mDateNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ), 546 connect( mDateNavigator, SIGNAL( datesSelected( const KCal::DateList & ) ),
547 mNavigator, SLOT( selectDates( const KCal::DateList & ) ) ); 547 mNavigator, SLOT( selectDates( const KCal::DateList & ) ) );
548#if 0 548#if 0
549 connect( mDateNavigator, SIGNAL( incidenceDropped( Incidence * ) ), 549 connect( mDateNavigator, SIGNAL( incidenceDropped( Incidence * ) ),
550 SLOT( incidenceAdded( Incidence *) ) ); 550 SLOT( incidenceAdded( Incidence *) ) );
551#endif 551#endif
552 // connect(mDateNavigator,SIGNAL(dayPassed(QDate)),SLOT(updateView())); 552 // connect(mDateNavigator,SIGNAL(dayPassed(QDate)),SLOT(updateView()));
553 553
554 connect( this, SIGNAL( configChanged() ), 554 connect( this, SIGNAL( configChanged() ),
555 mDateNavigator, SLOT( updateConfig() ) ); 555 mDateNavigator, SLOT( updateConfig() ) );
556 556
557 connect( mTodoList, SIGNAL( newTodoSignal() ), 557 connect( mTodoList, SIGNAL( newTodoSignal() ),
558 SLOT( newTodo() ) ); 558 SLOT( newTodo() ) );
559 connect( mTodoList, SIGNAL( newSubTodoSignal( Todo *) ), 559 connect( mTodoList, SIGNAL( newSubTodoSignal( Todo *) ),
560 SLOT( newSubTodo( Todo * ) ) ); 560 SLOT( newSubTodo( Todo * ) ) );
561 connect( mTodoList, SIGNAL( editTodoSignal( Todo * ) ), 561 connect( mTodoList, SIGNAL( editTodoSignal( Todo * ) ),
562 SLOT( editTodo( Todo * ) ) ); 562 SLOT( editTodo( Todo * ) ) );
563 connect( mTodoList, SIGNAL( showTodoSignal( Todo * ) ), 563 connect( mTodoList, SIGNAL( showTodoSignal( Todo * ) ),
564 SLOT( showTodo( Todo *) ) ); 564 SLOT( showTodo( Todo *) ) );
565 connect( mTodoList, SIGNAL( deleteTodoSignal( Todo *) ), 565 connect( mTodoList, SIGNAL( deleteTodoSignal( Todo *) ),
566 SLOT( deleteTodo( Todo *) ) ); 566 SLOT( deleteTodo( Todo *) ) );
567 connect( this, SIGNAL( configChanged()), mTodoList, SLOT( updateConfig() ) ); 567 connect( this, SIGNAL( configChanged()), mTodoList, SLOT( updateConfig() ) );
568 connect( mTodoList, SIGNAL( purgeCompletedSignal() ), 568 connect( mTodoList, SIGNAL( purgeCompletedSignal() ),
569 SLOT( purgeCompleted() ) ); 569 SLOT( purgeCompleted() ) );
570 connect( mTodoList, SIGNAL( todoModifiedSignal( Todo *, int ) ), 570 connect( mTodoList, SIGNAL( todoModifiedSignal( Todo *, int ) ),
571 SIGNAL( todoModified( Todo *, int ) ) ); 571 SIGNAL( todoModified( Todo *, int ) ) );
572 572
573 connect( mTodoList, SIGNAL( cloneTodoSignal( Incidence * ) ), 573 connect( mTodoList, SIGNAL( cloneTodoSignal( Incidence * ) ),
574 this, SLOT ( cloneIncidence( Incidence * ) ) ); 574 this, SLOT ( cloneIncidence( Incidence * ) ) );
575 connect( mTodoList, SIGNAL( cancelTodoSignal( Incidence * ) ), 575 connect( mTodoList, SIGNAL( cancelTodoSignal( Incidence * ) ),
576 this, SLOT (cancelIncidence( Incidence * ) ) ); 576 this, SLOT (cancelIncidence( Incidence * ) ) );
577 577
578 connect( mTodoList, SIGNAL( moveTodoSignal( Incidence * ) ), 578 connect( mTodoList, SIGNAL( moveTodoSignal( Incidence * ) ),
579 this, SLOT ( moveIncidence( Incidence * ) ) ); 579 this, SLOT ( moveIncidence( Incidence * ) ) );
580 connect( mTodoList, SIGNAL( beamTodoSignal( Incidence * ) ), 580 connect( mTodoList, SIGNAL( beamTodoSignal( Incidence * ) ),
581 this, SLOT ( beamIncidence( Incidence * ) ) ); 581 this, SLOT ( beamIncidence( Incidence * ) ) );
582 582
583 connect( mTodoList, SIGNAL( unparentTodoSignal( Todo * ) ), 583 connect( mTodoList, SIGNAL( unparentTodoSignal( Todo * ) ),
584 this, SLOT ( todo_unsub( Todo * ) ) ); 584 this, SLOT ( todo_unsub( Todo * ) ) );
585 585
586 connect( mTodoList, SIGNAL( reparentTodoSignal( Todo *,Todo * ) ), 586 connect( mTodoList, SIGNAL( reparentTodoSignal( Todo *,Todo * ) ),
587 this, SLOT ( todo_resub( Todo *,Todo * ) ) ); 587 this, SLOT ( todo_resub( Todo *,Todo * ) ) );
588 connect( this, SIGNAL( todoModified( Todo *, int )), mTodoList, 588 connect( this, SIGNAL( todoModified( Todo *, int )), mTodoList,
589 SLOT( updateTodo( Todo *, int ) ) ); 589 SLOT( updateTodo( Todo *, int ) ) );
590 connect( this, SIGNAL( todoModified( Todo *, int )), this, 590 connect( this, SIGNAL( todoModified( Todo *, int )), this,
591 SLOT( changeTodoDisplay( Todo *, int ) ) ); 591 SLOT( changeTodoDisplay( Todo *, int ) ) );
592 592
593 593
594 connect( mFilterView, SIGNAL( filterChanged() ), SLOT( updateFilter() ) ); 594 connect( mFilterView, SIGNAL( filterChanged() ), SLOT( updateFilter() ) );
595 connect( mFilterView, SIGNAL( editFilters() ), SLOT( editFilters() ) ); 595 connect( mFilterView, SIGNAL( editFilters() ), SLOT( editFilters() ) );
596 connect( mCalendar, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addAlarm(const QDateTime &, const QString & ) ) ); 596 connect( mCalendar, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addAlarm(const QDateTime &, const QString & ) ) );
597 connect( mCalendar, SIGNAL( removeAlarm(const QDateTime &, const QString & ) ), SLOT( removeAlarm(const QDateTime &, const QString & ) ) ); 597 connect( mCalendar, SIGNAL( removeAlarm(const QDateTime &, const QString & ) ), SLOT( removeAlarm(const QDateTime &, const QString & ) ) );
598 598
599 599
600 600
601 601
602 602
603 connect(QApplication::clipboard(),SIGNAL(dataChanged()), 603 connect(QApplication::clipboard(),SIGNAL(dataChanged()),
604 SLOT(checkClipboard())); 604 SLOT(checkClipboard()));
605 connect( mTodoList,SIGNAL( incidenceSelected( Incidence * ) ), 605 connect( mTodoList,SIGNAL( incidenceSelected( Incidence * ) ),
606 SLOT( processTodoListSelection( Incidence * ) ) ); 606 SLOT( processTodoListSelection( Incidence * ) ) );
607 connect(mTodoList,SIGNAL(isModified(bool)),SLOT(setModified(bool))); 607 connect(mTodoList,SIGNAL(isModified(bool)),SLOT(setModified(bool)));
608 608
609 // kdDebug() << "CalendarView::CalendarView() done" << endl; 609 // kdDebug() << "CalendarView::CalendarView() done" << endl;
610 610
611 mDateFrame = new QVBox(0,0,WType_Popup); 611 mDateFrame = new QVBox(0,0,WType_Popup);
612 //mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised); 612 //mDateFrame->setFrameStyle(QFrame::PopupPanel | QFrame::Raised);
613 mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised ); 613 mDateFrame->setFrameStyle( QFrame::WinPanel |QFrame::Raised );
614 mDateFrame->setLineWidth(3); 614 mDateFrame->setLineWidth(3);
615 mDateFrame->hide(); 615 mDateFrame->hide();
616 mDateFrame->setCaption( i18n( "Pick a date to display")); 616 mDateFrame->setCaption( i18n( "Pick a date to display"));
617 mDatePicker = new KDatePicker ( mDateFrame , QDate::currentDate() ); 617 mDatePicker = new KDatePicker ( mDateFrame , QDate::currentDate() );
618 618
619 connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(slotSelectPickerDate(QDate))); 619 connect(mDatePicker,SIGNAL(dateSelected(QDate)),SLOT(slotSelectPickerDate(QDate)));
620 620
621 mEventEditor = mDialogManager->getEventEditor(); 621 mEventEditor = mDialogManager->getEventEditor();
622 mTodoEditor = mDialogManager->getTodoEditor(); 622 mTodoEditor = mDialogManager->getTodoEditor();
623 623
624 mFlagEditDescription = false; 624 mFlagEditDescription = false;
625 625
626 mSuspendTimer = new QTimer( this ); 626 mSuspendTimer = new QTimer( this );
627 mAlarmTimer = new QTimer( this ); 627 mAlarmTimer = new QTimer( this );
628 mRecheckAlarmTimer = new QTimer( this ); 628 mRecheckAlarmTimer = new QTimer( this );
629 connect( mRecheckAlarmTimer, SIGNAL( timeout () ), SLOT( recheckTimerAlarm() ) ); 629 connect( mRecheckAlarmTimer, SIGNAL( timeout () ), SLOT( recheckTimerAlarm() ) );
630 connect( mSuspendTimer, SIGNAL( timeout () ), SLOT( suspendAlarm() ) ); 630 connect( mSuspendTimer, SIGNAL( timeout () ), SLOT( suspendAlarm() ) );
631 connect( mAlarmTimer, SIGNAL( timeout () ), SLOT( timerAlarm() ) ); 631 connect( mAlarmTimer, SIGNAL( timeout () ), SLOT( timerAlarm() ) );
632 mAlarmDialog = new AlarmDialog( this ); 632 mAlarmDialog = new AlarmDialog( this );
633 connect( mAlarmDialog, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addSuspendAlarm(const QDateTime &, const QString & ) ) ); 633 connect( mAlarmDialog, SIGNAL( addAlarm(const QDateTime &, const QString & ) ), SLOT( addSuspendAlarm(const QDateTime &, const QString & ) ) );
634 mAlarmDialog->setServerNotification( false ); 634 mAlarmDialog->setServerNotification( false );
635 mAlarmDialog->setSuspendTime( KOPrefs::instance()->mAlarmSuspendTime ); 635 mAlarmDialog->setSuspendTime( KOPrefs::instance()->mAlarmSuspendTime );
636 636
637 637
638#ifndef DESKTOP_VERSION 638#ifndef DESKTOP_VERSION
639//US listen for arriving address resultsets 639//US listen for arriving address resultsets
640 connect(ExternalAppHandler::instance(), SIGNAL(receivedBirthdayListEvent(const QString&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&)), 640 connect(ExternalAppHandler::instance(), SIGNAL(receivedBirthdayListEvent(const QString&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&)),
641 this, SLOT(insertBirthdays(const QString&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&))); 641 this, SLOT(insertBirthdays(const QString&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&, const QStringList&)));
642#endif 642#endif
643 mDateNavigator->setCalendar( mCalendar ); 643 mDateNavigator->setCalendar( mCalendar );
644} 644}
645 645
646 646
647CalendarView::~CalendarView() 647CalendarView::~CalendarView()
648{ 648{
649 // kdDebug() << "~CalendarView()" << endl; 649 // kdDebug() << "~CalendarView()" << endl;
650 //qDebug("CalendarView::~CalendarView() "); 650 //qDebug("CalendarView::~CalendarView() ");
651 delete mDialogManager; 651 delete mDialogManager;
652 delete mViewManager; 652 delete mViewManager;
653 delete mStorage; 653 delete mStorage;
654 delete mDateFrame ; 654 delete mDateFrame ;
655 delete mEventViewerDialog; 655 delete mEventViewerDialog;
656 //kdDebug() << "~CalendarView() done" << endl; 656 //kdDebug() << "~CalendarView() done" << endl;
657} 657}
658 658
659 659
660void CalendarView::nextConflict( bool all, bool allday ) 660void CalendarView::nextConflict( bool all, bool allday )
661{ 661{
662 662 static bool block = false;
663 if ( block ) return;
664 block = true;
663 QPtrList<Event> testlist = mCalendar->events(); 665 QPtrList<Event> testlist = mCalendar->events();
664 Event * test = testlist.first(); 666 Event * test = testlist.first();
665 while ( test ) { 667 while ( test ) {
666 test->setTagged( false ); 668 test->setTagged( false );
667 test = testlist.next(); 669 test = testlist.next();
668 } 670 }
669 QTime st ( 0,0,0); 671 QTime st ( 0,0,0);
670 if ( mViewManager->currentView() == mViewManager->agendaView() ) 672 if ( mViewManager->currentView() == mViewManager->agendaView() )
671 st = mViewManager->agendaView()->agenda()->getEndTime(); 673 st = mViewManager->agendaView()->agenda()->getEndTime();
672 //qDebug("time %s ", st.toString().latin1()); 674 //qDebug("time %s ", st.toString().latin1());
673 QDateTime startDT = QDateTime (mNavigator->selectedDates().first(),st); 675 QDateTime startDT = QDateTime (mNavigator->selectedDates().first(),st);
674 QDateTime conflict; 676 QDateTime conflict;
675 QDateTime retVal; 677 QDateTime retVal;
676 bool found = false; 678 bool found = false;
677 Event * cE = 0; 679 Event * cE = 0;
678 Event * cE2 = 0; 680 Event * cE2 = 0;
679 QPtrList<Event> testlist2 = testlist; 681 QPtrList<Event> testlist2 = testlist;
680 test = testlist.first(); 682 test = testlist.first();
681 bool skip = false; 683 bool skip = false;
682 topLevelWidget()->setCaption( i18n("Checking conflicts ... please wait") ); 684 topLevelWidget()->setCaption( i18n("Checking conflicts ... please wait") );
685 //QTime tm;
686 //tm.start();
683 while ( test ) { 687 while ( test ) {
684 qApp->processEvents(); 688 qApp->processEvents();
685 skip = false; 689 skip = false;
686 if ( !all ) skip = ( allday != test->doesFloat() ); 690 if ( !all ) skip = ( allday != test->doesFloat() );
687 if ( !skip ) { 691 if ( !skip ) {
692 if ( found )
693 skip = !test->matchTime( &startDT, &conflict );
694 else
695 skip = !test->matchTime( &startDT, 0 );
696 }
697 if ( !skip ) {
688 Event * test2 = testlist2.first(); 698 Event * test2 = testlist2.first();
689 while ( test2 ) { 699 while ( test2 ) {
690 skip = false; 700 skip = test2->isTagged();
691 if ( !all ) skip = ( allday != test2->doesFloat() ); 701 if ( !skip && !all ) skip = ( allday != test2->doesFloat() );
702 if ( !skip ) {
703 if ( found )
704 skip = !test2->matchTime( &startDT, &conflict );
705 else
706 skip = !test2->matchTime( &startDT, 0 );
707 }
692 if ( !skip ) { 708 if ( !skip ) {
693 if ( !test2->isTagged() ) { 709 if ( test->isOverlapping ( test2, &retVal, &startDT ) ) {
694 if ( test->isOverlapping ( test2, &retVal, &startDT ) ) { 710 //qDebug("overlap ");
695 //qDebug("overlap "); 711 if ( ! found ) {
696 if ( ! found ) { 712 if ( retVal >= startDT ) {
697 if ( retVal >= startDT ) { 713 conflict = retVal;
698 conflict = retVal; 714 cE = test;
699 cE = test; 715 cE2 = test2;
700 cE2 = test2; 716 found = true;
701 found = true; 717 }
702 } 718 } else {
703 } else { 719 if ( retVal >= startDT && retVal < conflict ) {
704 if ( retVal >= startDT && retVal < conflict ) { 720 conflict = retVal;
705 conflict = retVal; 721 cE = test;
706 cE = test; 722 cE2 = test2;
707 cE2 = test2;
708 }
709 } 723 }
710 } 724 }
711 } 725 }
712 } 726 }
713 test2 = testlist2.next(); 727 test2 = testlist2.next();
714 } 728 }
715 } 729 }
716 test->setTagged( true ); 730 test->setTagged( true );
717 test = testlist.next(); 731 test = testlist.next();
718 } 732 }
733 //qDebug("Search time : %d", tm.elapsed());
719 if ( found ) { 734 if ( found ) {
720 if ( mViewManager->currentView() != mViewManager->agendaView() || mNavigator->selectedDates().count() > 1 ) 735 if ( mViewManager->currentView() != mViewManager->agendaView() || mNavigator->selectedDates().count() > 1 )
721 mViewManager->showDayView(); 736 mViewManager->showDayView();
722 mNavigator->slotDaySelect( conflict.date() ); 737 mNavigator->slotDaySelect( conflict.date() );
723 int hour = conflict.time().hour(); 738 int hour = conflict.time().hour();
724 mViewManager->agendaView()->setStartHour( hour ); 739 mViewManager->agendaView()->setStartHour( hour );
725 topLevelWidget()->setCaption( i18n("Conflict %1 <-> %2"). arg( cE->summary().left( 20 ) ).arg( cE2->summary().left( 20 ) ) ); 740 topLevelWidget()->setCaption( i18n("Conflict %1 <-> %2"). arg( cE->summary().left( 20 ) ).arg( cE2->summary().left( 20 ) ) );
741 block = false;
726 return; 742 return;
727 } 743 }
728 744
729 topLevelWidget()->setCaption( i18n("No conflict found") ); 745 topLevelWidget()->setCaption( i18n("No conflict found") );
730 qDebug("No conflict found "); 746 qDebug("No conflict found ");
747 block = false;
731 return; 748 return;
732} 749}
733 750
734void CalendarView::conflictAll() 751void CalendarView::conflictAll()
735{ 752{
736 nextConflict ( true, true ); 753 nextConflict ( true, true );
737} 754}
738void CalendarView::conflictAllday() 755void CalendarView::conflictAllday()
739{ 756{
740 nextConflict ( false, true ); 757 nextConflict ( false, true );
741} 758}
742void CalendarView::conflictNotAll() 759void CalendarView::conflictNotAll()
743{ 760{
744 nextConflict ( false, false ); 761 nextConflict ( false, false );
745} 762}
746 763
747void CalendarView::setCalReadOnly( int id, bool readO ) 764void CalendarView::setCalReadOnly( int id, bool readO )
748{ 765{
749 if ( readO ) { 766 if ( readO ) {
750 emit save(); 767 emit save();
751 } 768 }
752 mCalendar->setReadOnly( id, readO ); 769 mCalendar->setReadOnly( id, readO );
753} 770}
754void CalendarView::setScrollBarStep(int val ) 771void CalendarView::setScrollBarStep(int val )
755{ 772{
756#ifdef DESKTOP_VERSION 773#ifdef DESKTOP_VERSION
757 mDateScrollBar->setLineStep ( val ); 774 mDateScrollBar->setLineStep ( val );
758#endif 775#endif
759} 776}
760void CalendarView::scrollBarValue(int val ) 777void CalendarView::scrollBarValue(int val )
761{ 778{
762#ifdef DESKTOP_VERSION 779#ifdef DESKTOP_VERSION
763 if ( QApplication::desktop()->width() < 800 ) return; 780 if ( QApplication::desktop()->width() < 800 ) return;
764 static bool block = false; 781 static bool block = false;
765 if ( block ) return; 782 if ( block ) return;
766 block = true; 783 block = true;
767 int count = mNavigator->selectedDates().count(); 784 int count = mNavigator->selectedDates().count();
768 int day = mNavigator->selectedDates().first().dayOfYear(); 785 int day = mNavigator->selectedDates().first().dayOfYear();
769 int stepdays = val; 786 int stepdays = val;
770 if ( mDateScrollBar->lineStep () <= count ) { 787 if ( mDateScrollBar->lineStep () <= count ) {
771 //val = val/mDateScrollBar->lineStep ()*mDateScrollBar->lineStep(); 788 //val = val/mDateScrollBar->lineStep ()*mDateScrollBar->lineStep();
772 //qDebug("VAL %d ",val ); 789 //qDebug("VAL %d ",val );
773 stepdays = (val-day)/mDateScrollBar->lineStep ()*mDateScrollBar->lineStep(); 790 stepdays = (val-day)/mDateScrollBar->lineStep ()*mDateScrollBar->lineStep();
774 stepdays = day+stepdays; 791 stepdays = day+stepdays;
775 if ( stepdays < 0 ) stepdays = 0; 792 if ( stepdays < 0 ) stepdays = 0;
776 } 793 }
777 if ( stepdays == day ) { 794 if ( stepdays == day ) {
778 block = false; 795 block = false;
779 return; 796 return;
780 } 797 }
781 int year = mNavigator->selectedDates().first().year(); 798 int year = mNavigator->selectedDates().first().year();
782 QDate d ( year,1,1 ); 799 QDate d ( year,1,1 );
783 mNavigator->selectDates( d.addDays( stepdays-1) , count ); 800 mNavigator->selectDates( d.addDays( stepdays-1) , count );
784 block = false; 801 block = false;
785#endif 802#endif
786 803
787} 804}
788void CalendarView::updateView(const QDate &start, const QDate &end) 805void CalendarView::updateView(const QDate &start, const QDate &end)
789{ 806{
790#ifdef DESKTOP_VERSION 807#ifdef DESKTOP_VERSION
791 if ( ! mDateScrollBar->draggingSlider () ) { 808 if ( ! mDateScrollBar->draggingSlider () ) {
792 int dof = start.dayOfYear(); 809 int dof = start.dayOfYear();
793 //qDebug("dof %d day %d val %d ", dof, start.dayOfYear(),mDateScrollBar->value() ); 810 //qDebug("dof %d day %d val %d ", dof, start.dayOfYear(),mDateScrollBar->value() );
794 if ( dof != mDateScrollBar->value() ) { 811 if ( dof != mDateScrollBar->value() ) {
795 mDateScrollBar->blockSignals( true ); 812 mDateScrollBar->blockSignals( true );
796 mDateScrollBar->setValue( start.dayOfYear()); 813 mDateScrollBar->setValue( start.dayOfYear());
797 mDateScrollBar->blockSignals( false ); 814 mDateScrollBar->blockSignals( false );
798 } 815 }
799 } 816 }
800#endif 817#endif
801 mTodoList->updateView(); 818 mTodoList->updateView();
802 mViewManager->updateView(start, end); 819 mViewManager->updateView(start, end);
803 //mDateNavigator->updateView(); 820 //mDateNavigator->updateView();
804} 821}
805 822
806 823
807 824
808void CalendarView::checkFiles() 825void CalendarView::checkFiles()
809{ 826{
810 QString message; 827 QString message;
811 QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars; 828 QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars;
812 KopiCalendarFile * cal = calendars.first(); 829 KopiCalendarFile * cal = calendars.first();
813 while ( cal ) { 830 while ( cal ) {
814 if ( cal->mErrorOnLoad ) { 831 if ( cal->mErrorOnLoad ) {
815 message += cal->mName +"\n"+KGlobal::formatMessage ( "(" +i18n( "Filepath: ")+ cal->mFileName+")" ,0 )+"\n"; 832 message += cal->mName +"\n"+KGlobal::formatMessage ( "(" +i18n( "Filepath: ")+ cal->mFileName+")" ,0 )+"\n";
816 } 833 }
817 cal = calendars.next(); 834 cal = calendars.next();
818 } 835 }
819 if ( !message.isEmpty() ) { 836 if ( !message.isEmpty() ) {
820 message = KGlobal::formatMessage( i18n("Calendar(s) not loaded:"),0 )+"\n" + message +KGlobal::formatMessage(i18n("You can try to reload the calendar in the Resource View!"),0); 837 message = KGlobal::formatMessage( i18n("Calendar(s) not loaded:"),0 )+"\n" + message +KGlobal::formatMessage(i18n("You can try to reload the calendar in the Resource View!"),0);
821 KMessageBox::error(this,message, i18n("Loding of calendar(s) failed")); 838 KMessageBox::error(this,message, i18n("Loding of calendar(s) failed"));
822 } 839 }
823 QTimer::singleShot( 2000, this, SLOT ( checkAlarms() )); 840 QTimer::singleShot( 2000, this, SLOT ( checkAlarms() ));
824} 841}
825void CalendarView::checkAlarms() 842void CalendarView::checkAlarms()
826{ 843{
827 844
828 845
829 KConfig *config = KOGlobals::config(); 846 KConfig *config = KOGlobals::config();
830 config->setGroup( "AppRun" ); 847 config->setGroup( "AppRun" );
831 QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) ); 848 QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) );
832 int daysto = dt.daysTo( QDate::currentDate() ); 849 int daysto = dt.daysTo( QDate::currentDate() );
833 int days = config->readNumEntry( "LatestProgramStopDays" , daysto); 850 int days = config->readNumEntry( "LatestProgramStopDays" , daysto);
834 dt = dt.addDays( days ); 851 dt = dt.addDays( days );
835 int secto = dt.secsTo( QDateTime::currentDateTime() ); 852 int secto = dt.secsTo( QDateTime::currentDateTime() );
836 int secs = config->readNumEntry( "LatestProgramStopSecs" , secto) - 30; 853 int secs = config->readNumEntry( "LatestProgramStopSecs" , secto) - 30;
837 //qDebug("KO: Reading program stop %d ", secs); 854 //qDebug("KO: Reading program stop %d ", secs);
838 //secs -= ( 3600 * 24*3 ); // debug only 855 //secs -= ( 3600 * 24*3 ); // debug only
839 QDateTime latest = dt.addSecs ( secs ); 856 QDateTime latest = dt.addSecs ( secs );
840 qDebug("KO: Last termination on %s ", latest.toString().latin1()); 857 qDebug("KO: Last termination on %s ", latest.toString().latin1());
841 //qDebug("KO: Current Time %s ",QDateTime::currentDateTime().toString().latin1() ); 858 //qDebug("KO: Current Time %s ",QDateTime::currentDateTime().toString().latin1() );
842 QPtrList<Incidence> el = mCalendar->rawIncidences(); 859 QPtrList<Incidence> el = mCalendar->rawIncidences();
843 QPtrList<Incidence> al; 860 QPtrList<Incidence> al;
844 Incidence* inL = el.first(); 861 Incidence* inL = el.first();
845 QDateTime cur = QDateTime::currentDateTime().addSecs(-59); 862 QDateTime cur = QDateTime::currentDateTime().addSecs(-59);
846 qDebug("KO: Checking alarm until %s ", cur.toString().latin1()); 863 qDebug("KO: Checking alarm until %s ", cur.toString().latin1());
847 while ( inL ) { 864 while ( inL ) {
848 bool ok = false; 865 bool ok = false;
849 int offset = 0; 866 int offset = 0;
850 QDateTime next = inL->getNextAlarmDateTime(& ok, &offset, latest ) ; 867 QDateTime next = inL->getNextAlarmDateTime(& ok, &offset, latest ) ;
851 if ( ok ) { 868 if ( ok ) {
852 //qDebug("OK %s",next.toString().latin1()); 869 //qDebug("OK %s",next.toString().latin1());
853 if ( next < cur ) { 870 if ( next < cur ) {
854 al.append( inL ); 871 al.append( inL );
855 //qDebug("found missed alarm: %s ", inL->summary().latin1() ); 872 //qDebug("found missed alarm: %s ", inL->summary().latin1() );
856 } 873 }
857 } 874 }
858 inL = el.next(); 875 inL = el.next();
859 } 876 }
860 if ( al.count() ) { 877 if ( al.count() ) {
861 QDialog* dia = new QDialog( this, "huhu", false, WDestructiveClose | WStyle_StaysOnTop ); 878 QDialog* dia = new QDialog( this, "huhu", false, WDestructiveClose | WStyle_StaysOnTop );
862 dia->setCaption( i18n("KO/Pi: Missing alarms!") ); 879 dia->setCaption( i18n("KO/Pi: Missing alarms!") );
863 QVBoxLayout* lay = new QVBoxLayout( dia ); 880 QVBoxLayout* lay = new QVBoxLayout( dia );
864 lay->setSpacing( 0 ); 881 lay->setSpacing( 0 );
865 lay->setMargin( 0 ); 882 lay->setMargin( 0 );
866 MissedAlarmTextBrowser* matb = new MissedAlarmTextBrowser ( dia, al, latest ); 883 MissedAlarmTextBrowser* matb = new MissedAlarmTextBrowser ( dia, al, latest );
867 connect( matb, SIGNAL( showIncidence( QString ) ),SLOT( showIncidence( QString ) )); 884 connect( matb, SIGNAL( showIncidence( QString ) ),SLOT( showIncidence( QString ) ));
868 lay->addWidget( matb ); 885 lay->addWidget( matb );
869 if ( QApplication::desktop()->width() == 480 || QApplication::desktop()->width() == 640 ) { 886 if ( QApplication::desktop()->width() == 480 || QApplication::desktop()->width() == 640 ) {
870 int wid = 210; 887 int wid = 210;
871 int x = QApplication::desktop()->width() - wid - 7; 888 int x = QApplication::desktop()->width() - wid - 7;
872 int y = QApplication::desktop()->height() - wid - 70; 889 int y = QApplication::desktop()->height() - wid - 70;
873 dia->setGeometry ( x,y,wid,wid); 890 dia->setGeometry ( x,y,wid,wid);
874 } else { 891 } else {
875 int si = 220; 892 int si = 220;
876 if ( QApplication::desktop()->width() > 470 ) 893 if ( QApplication::desktop()->width() > 470 )
877 si = 400; 894 si = 400;
878 dia->resize(si,si/2); 895 dia->resize(si,si/2);
879 } 896 }
880 dia->setBackgroundColor( QColor( 255, 255, 255 ) ); 897 dia->setBackgroundColor( QColor( 255, 255, 255 ) );
881 dia->show(); 898 dia->show();
882 899
883 } 900 }
884} 901}
885void CalendarView::showDay( QDate d ) 902void CalendarView::showDay( QDate d )
886{ 903{
887 dateNavigator()->blockSignals( true ); 904 dateNavigator()->blockSignals( true );
888 dateNavigator()->selectDate( d ); 905 dateNavigator()->selectDate( d );
889 dateNavigator()->blockSignals( false ); 906 dateNavigator()->blockSignals( false );
890 mViewManager->showDayView(); 907 mViewManager->showDayView();
891 //dateNavigator()->selectDate( d ); 908 //dateNavigator()->selectDate( d );
892} 909}
893void CalendarView::timerAlarm() 910void CalendarView::timerAlarm()
894{ 911{
895 //qDebug("CalendarView::timerAlarm() "); 912 //qDebug("CalendarView::timerAlarm() ");
896 computeAlarm(mAlarmNotification ); 913 computeAlarm(mAlarmNotification );
897} 914}
898 915
899void CalendarView::suspendAlarm() 916void CalendarView::suspendAlarm()
900{ 917{
901 //qDebug(" CalendarView::suspendAlarm() "); 918 //qDebug(" CalendarView::suspendAlarm() ");
902 computeAlarm(mSuspendAlarmNotification ); 919 computeAlarm(mSuspendAlarmNotification );
903 920
904} 921}
905 922
906void CalendarView::startAlarm( QString mess , QString filename) 923void CalendarView::startAlarm( QString mess , QString filename)
907{ 924{
908 925
909 topLevelWidget()->showNormal(); 926 topLevelWidget()->showNormal();
910 topLevelWidget()->setActiveWindow(); 927 topLevelWidget()->setActiveWindow();
911 topLevelWidget()->raise(); 928 topLevelWidget()->raise();
912 929
913 mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount ); 930 mAlarmDialog->eventNotification( mess, KOPrefs::instance()->mAlarmPlayBeeps, filename, true,KOPrefs::instance()->mAlarmBeepInterval ,KOPrefs::instance()->mAlarmSuspendCount );
914 QTimer::singleShot( 2000, this, SLOT( checkNextTimerAlarm() ) ); 931 QTimer::singleShot( 2000, this, SLOT( checkNextTimerAlarm() ) );
915 932
916} 933}
917 934
918void CalendarView::checkNextTimerAlarm() 935void CalendarView::checkNextTimerAlarm()
919{ 936{
920 mCalendar->checkAlarmForIncidence( 0, true ); 937 mCalendar->checkAlarmForIncidence( 0, true );
921} 938}
922 939
923void CalendarView::computeAlarm( QString msg ) 940void CalendarView::computeAlarm( QString msg )
924{ 941{
925 942
926 QString mess = msg; 943 QString mess = msg;
927 QString mAlarmMessage = mess.mid( 9 ); 944 QString mAlarmMessage = mess.mid( 9 );
928 QString filename = MainWindow::resourcePath(); 945 QString filename = MainWindow::resourcePath();
929 filename += "koalarm.wav"; 946 filename += "koalarm.wav";
930 QString tempfilename; 947 QString tempfilename;
931 if ( mess.left( 13 ) == "suspend_alarm") { 948 if ( mess.left( 13 ) == "suspend_alarm") {
932 bool error = false; 949 bool error = false;
933 int len = mess.mid( 13 ).find("+++"); 950 int len = mess.mid( 13 ).find("+++");
934 if ( len < 2 ) 951 if ( len < 2 )
935 error = true; 952 error = true;
936 else { 953 else {
937 tempfilename = mess.mid( 13, len ); 954 tempfilename = mess.mid( 13, len );
938 if ( !QFile::exists( tempfilename ) ) 955 if ( !QFile::exists( tempfilename ) )
939 error = true; 956 error = true;
940 } 957 }
941 if ( ! error ) { 958 if ( ! error ) {
942 filename = tempfilename; 959 filename = tempfilename;
943 } 960 }
944 mAlarmMessage = mess.mid( 13+len+3 ); 961 mAlarmMessage = mess.mid( 13+len+3 );
945 //qDebug("suspend file %s ",tempfilename.latin1() ); 962 //qDebug("suspend file %s ",tempfilename.latin1() );
946 startAlarm( mAlarmMessage, filename); 963 startAlarm( mAlarmMessage, filename);
947 return; 964 return;
948 } 965 }
949 if ( mess.left( 11 ) == "timer_alarm") { 966 if ( mess.left( 11 ) == "timer_alarm") {
950 //mTimerTime = 0; 967 //mTimerTime = 0;
951 startAlarm( mess.mid( 11 ), filename ); 968 startAlarm( mess.mid( 11 ), filename );
952 return; 969 return;
953 } 970 }
954 if ( mess.left( 10 ) == "proc_alarm") { 971 if ( mess.left( 10 ) == "proc_alarm") {
955 bool error = false; 972 bool error = false;
956 int len = mess.mid( 10 ).find("+++"); 973 int len = mess.mid( 10 ).find("+++");
957 if ( len < 2 ) 974 if ( len < 2 )
958 error = true; 975 error = true;
959 else { 976 else {
960 tempfilename = mess.mid( 10, len ); 977 tempfilename = mess.mid( 10, len );
961 if ( !QFile::exists( tempfilename ) ) 978 if ( !QFile::exists( tempfilename ) )
962 error = true; 979 error = true;
963 } 980 }
964 if ( error ) { 981 if ( error ) {
965 mAlarmMessage = "Procedure Alarm\nError - File not found\n"; 982 mAlarmMessage = "Procedure Alarm\nError - File not found\n";
966 mAlarmMessage += mess.mid( 10+len+3+9 ); 983 mAlarmMessage += mess.mid( 10+len+3+9 );
967 } else { 984 } else {
968 //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent"); 985 //QCopEnvelope e("QPE/Application/kopi", "-writeFileSilent");
969 //qDebug("-----system command %s ",tempfilename.latin1() ); 986 //qDebug("-----system command %s ",tempfilename.latin1() );
970#ifndef _WIN32_ 987#ifndef _WIN32_
971 if ( vfork () == 0 ) { 988 if ( vfork () == 0 ) {
972 execl ( tempfilename.latin1(), 0 ); 989 execl ( tempfilename.latin1(), 0 );
973 return; 990 return;
974 } 991 }
975#else 992#else
976 QProcess* p = new QProcess(); 993 QProcess* p = new QProcess();
977 p->addArgument( tempfilename.latin1() ); 994 p->addArgument( tempfilename.latin1() );
978 p->start(); 995 p->start();
979 return; 996 return;
980#endif 997#endif
981 998
982 return; 999 return;
983 } 1000 }
984 1001
985 //qDebug("+++++++system command %s ",tempfilename.latin1() ); 1002 //qDebug("+++++++system command %s ",tempfilename.latin1() );
986 } 1003 }
987 if ( mess.left( 11 ) == "audio_alarm") { 1004 if ( mess.left( 11 ) == "audio_alarm") {
988 bool error = false; 1005 bool error = false;
989 int len = mess.mid( 11 ).find("+++"); 1006 int len = mess.mid( 11 ).find("+++");
990 if ( len < 2 ) 1007 if ( len < 2 )
991 error = true; 1008 error = true;
992 else { 1009 else {
993 tempfilename = mess.mid( 11, len ); 1010 tempfilename = mess.mid( 11, len );
994 if ( !QFile::exists( tempfilename ) ) 1011 if ( !QFile::exists( tempfilename ) )
995 error = true; 1012 error = true;
996 } 1013 }
997 if ( ! error ) { 1014 if ( ! error ) {
998 filename = tempfilename; 1015 filename = tempfilename;
999 } 1016 }
1000 mAlarmMessage = mess.mid( 11+len+3+9 ); 1017 mAlarmMessage = mess.mid( 11+len+3+9 );
1001 //qDebug("audio file command %s ",tempfilename.latin1() ); 1018 //qDebug("audio file command %s ",tempfilename.latin1() );
1002 } 1019 }
1003 if ( mess.left( 9 ) == "cal_alarm") { 1020 if ( mess.left( 9 ) == "cal_alarm") {
1004 mAlarmMessage = mess.mid( 9 ) ; 1021 mAlarmMessage = mess.mid( 9 ) ;
1005 } 1022 }
1006 1023
1007 startAlarm( mAlarmMessage, filename ); 1024 startAlarm( mAlarmMessage, filename );
1008 1025
1009 1026
1010} 1027}
1011 1028
1012void CalendarView::addSuspendAlarm(const QDateTime &qdt, const QString &noti ) 1029void CalendarView::addSuspendAlarm(const QDateTime &qdt, const QString &noti )
1013{ 1030{
1014 //qDebug("+++++addSUSPENDAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 1031 //qDebug("+++++addSUSPENDAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
1015 1032
1016 mSuspendAlarmNotification = noti; 1033 mSuspendAlarmNotification = noti;
1017 int ms = QDateTime::currentDateTime().secsTo( qdt )*1000; 1034 int ms = QDateTime::currentDateTime().secsTo( qdt )*1000;
1018 //qDebug("Suspend Alarm timer started with secs: %d ", ms/1000); 1035 //qDebug("Suspend Alarm timer started with secs: %d ", ms/1000);
1019 mSuspendTimer->start( ms , true ); 1036 mSuspendTimer->start( ms , true );
1020 1037
1021} 1038}
1022 1039
1023void CalendarView::addAlarm(const QDateTime &qdt, const QString &noti ) 1040void CalendarView::addAlarm(const QDateTime &qdt, const QString &noti )
1024{ 1041{
1025 mNextAlarmDateTime = qdt; 1042 mNextAlarmDateTime = qdt;
1026 //qDebug("+++++addAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 1043 //qDebug("+++++addAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
1027 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) { 1044 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) {
1028#ifndef DESKTOP_VERSION 1045#ifndef DESKTOP_VERSION
1029 AlarmServer::addAlarm ( qdt,"koalarm", noti.utf8() ); 1046 AlarmServer::addAlarm ( qdt,"koalarm", noti.utf8() );
1030#endif 1047#endif
1031 return; 1048 return;
1032 } 1049 }
1033 int maxSec; 1050 int maxSec;
1034 //maxSec = 5; //testing only 1051 //maxSec = 5; //testing only
1035 maxSec = 86400+3600; // one day+1hour 1052 maxSec = 86400+3600; // one day+1hour
1036 mAlarmNotification = noti; 1053 mAlarmNotification = noti;
1037 int sec = QDateTime::currentDateTime().secsTo( qdt ); 1054 int sec = QDateTime::currentDateTime().secsTo( qdt );
1038 if ( sec > maxSec ) { 1055 if ( sec > maxSec ) {
1039 mRecheckAlarmTimer->start( maxSec * 1000 ); 1056 mRecheckAlarmTimer->start( maxSec * 1000 );
1040 // qDebug("recheck Alarm timer started with secs: %d next alarm in sec:%d", maxSec,sec ); 1057 // qDebug("recheck Alarm timer started with secs: %d next alarm in sec:%d", maxSec,sec );
1041 return; 1058 return;
1042 } else { 1059 } else {
1043 mRecheckAlarmTimer->stop(); 1060 mRecheckAlarmTimer->stop();
1044 } 1061 }
1045 //qDebug("Alarm timer started with secs: %d ", sec); 1062 //qDebug("Alarm timer started with secs: %d ", sec);
1046 mAlarmTimer->start( sec *1000 , true ); 1063 mAlarmTimer->start( sec *1000 , true );
1047 1064
1048} 1065}
1049// called by mRecheckAlarmTimer to get next alarm 1066// called by mRecheckAlarmTimer to get next alarm
1050// we need this, because a QTimer has only a max range of 25 days 1067// we need this, because a QTimer has only a max range of 25 days
1051void CalendarView::recheckTimerAlarm() 1068void CalendarView::recheckTimerAlarm()
1052{ 1069{
1053 mAlarmTimer->stop(); 1070 mAlarmTimer->stop();
1054 mRecheckAlarmTimer->stop(); 1071 mRecheckAlarmTimer->stop();
1055 mCalendar->checkAlarmForIncidence( 0, true ); 1072 mCalendar->checkAlarmForIncidence( 0, true );
1056} 1073}
1057#ifndef DESKTOP_VERSION 1074#ifndef DESKTOP_VERSION
1058void CalendarView::removeAlarm(const QDateTime &qdt, const QString &noti ) 1075void CalendarView::removeAlarm(const QDateTime &qdt, const QString &noti )
1059#else 1076#else
1060void CalendarView::removeAlarm(const QDateTime &, const QString & ) 1077void CalendarView::removeAlarm(const QDateTime &, const QString & )
1061#endif 1078#endif
1062{ 1079{
1063 //qDebug("-----removeAlarm %s %s ", qdt.toString().latin1() , noti.latin1() ); 1080 //qDebug("-----removeAlarm %s %s ", qdt.toString().latin1() , noti.latin1() );
1064 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) { 1081 if ( ! KOPrefs::instance()->mUseInternalAlarmNotification ) {
1065#ifndef DESKTOP_VERSION 1082#ifndef DESKTOP_VERSION
1066 AlarmServer::deleteAlarm (qdt ,"koalarm" ,noti.utf8() ); 1083 AlarmServer::deleteAlarm (qdt ,"koalarm" ,noti.utf8() );
1067#endif 1084#endif
1068 return; 1085 return;
1069 } 1086 }
1070 mAlarmTimer->stop(); 1087 mAlarmTimer->stop();
1071} 1088}
1072void CalendarView::selectWeekNum ( int num ) 1089void CalendarView::selectWeekNum ( int num )
1073{ 1090{
1074 dateNavigator()->blockSignals( true ); 1091 dateNavigator()->blockSignals( true );
1075 dateNavigator()->selectWeek( num ); 1092 dateNavigator()->selectWeek( num );
1076 dateNavigator()->blockSignals( false ); 1093 dateNavigator()->blockSignals( false );
1077 mViewManager->showWeekView(); 1094 mViewManager->showWeekView();
1078} 1095}
1079KOViewManager *CalendarView::viewManager() 1096KOViewManager *CalendarView::viewManager()
1080{ 1097{
1081 return mViewManager; 1098 return mViewManager;
1082} 1099}
1083 1100
1084KODialogManager *CalendarView::dialogManager() 1101KODialogManager *CalendarView::dialogManager()
1085{ 1102{
1086 return mDialogManager; 1103 return mDialogManager;
1087} 1104}
1088 1105
1089QDate CalendarView::startDate() 1106QDate CalendarView::startDate()
1090{ 1107{
1091 DateList dates = mNavigator->selectedDates(); 1108 DateList dates = mNavigator->selectedDates();
1092 1109
1093 return dates.first(); 1110 return dates.first();
1094} 1111}
1095 1112
1096QDate CalendarView::endDate() 1113QDate CalendarView::endDate()
1097{ 1114{
1098 DateList dates = mNavigator->selectedDates(); 1115 DateList dates = mNavigator->selectedDates();
1099 1116
1100 return dates.last(); 1117 return dates.last();
1101} 1118}
1102 1119
1103 1120
1104void CalendarView::createPrinter() 1121void CalendarView::createPrinter()
1105{ 1122{
1106#ifndef KORG_NOPRINTER 1123#ifndef KORG_NOPRINTER
1107 if (!mCalPrinter) { 1124 if (!mCalPrinter) {
1108 mCalPrinter = new CalPrinter(this, mCalendar); 1125 mCalPrinter = new CalPrinter(this, mCalendar);
1109 connect(this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig())); 1126 connect(this, SIGNAL(configChanged()), mCalPrinter, SLOT(updateConfig()));
1110 } 1127 }
1111#endif 1128#endif
1112} 1129}
1113 1130
1114 1131
1115//KOPrefs::instance()->mWriteBackFile 1132//KOPrefs::instance()->mWriteBackFile
1116//KOPrefs::instance()->mWriteBackExistingOnly 1133//KOPrefs::instance()->mWriteBackExistingOnly
1117 1134
1118// 0 syncPrefsGroup->addRadio(i18n("Take local entry on conflict")); 1135// 0 syncPrefsGroup->addRadio(i18n("Take local entry on conflict"));
1119// 1 syncPrefsGroup->addRadio(i18n("Take remote entry on conflict")); 1136// 1 syncPrefsGroup->addRadio(i18n("Take remote entry on conflict"));
1120// 2 syncPrefsGroup->addRadio(i18n("Take newest entry on conflict")); 1137// 2 syncPrefsGroup->addRadio(i18n("Take newest entry on conflict"));
1121// 3 syncPrefsGroup->addRadio(i18n("Ask for every entry on conflict")); 1138// 3 syncPrefsGroup->addRadio(i18n("Ask for every entry on conflict"));
1122// 4 syncPrefsGroup->addRadio(i18n("Force take local entry always")); 1139// 4 syncPrefsGroup->addRadio(i18n("Force take local entry always"));
1123// 5 syncPrefsGroup->addRadio(i18n("Force take remote entry always")); 1140// 5 syncPrefsGroup->addRadio(i18n("Force take remote entry always"));
1124 1141
1125int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , bool full ) 1142int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , bool full )
1126{ 1143{
1127 1144
1128 // 0 equal 1145 // 0 equal
1129 // 1 take local 1146 // 1 take local
1130 // 2 take remote 1147 // 2 take remote
1131 // 3 cancel 1148 // 3 cancel
1132 QDateTime lastSync = mLastCalendarSync; 1149 QDateTime lastSync = mLastCalendarSync;
1133 QDateTime localMod = local->lastModified(); 1150 QDateTime localMod = local->lastModified();
1134 QDateTime remoteMod = remote->lastModified(); 1151 QDateTime remoteMod = remote->lastModified();
1135 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1152 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1136 bool remCh, locCh; 1153 bool remCh, locCh;
1137 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) ); 1154 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
1138 //if ( remCh ) 1155 //if ( remCh )
1139 //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() ); 1156 //qDebug("loc %s rem %s", local->getCsum(mCurrentSyncDevice).latin1(), remote->getCsum(mCurrentSyncDevice).latin1() );
1140 locCh = ( localMod > mLastCalendarSync ); 1157 locCh = ( localMod > mLastCalendarSync );
1141 if ( !remCh && ! locCh ) { 1158 if ( !remCh && ! locCh ) {
1142 //qDebug("both not changed "); 1159 //qDebug("both not changed ");
1143 lastSync = localMod.addDays(1); 1160 lastSync = localMod.addDays(1);
1144 if ( mode <= SYNC_PREF_ASK ) 1161 if ( mode <= SYNC_PREF_ASK )
1145 return 0; 1162 return 0;
1146 } else { 1163 } else {
1147 if ( locCh ) { 1164 if ( locCh ) {
1148 //qDebug("loc changed %d %s %s", local->revision() , localMod.toString().latin1(), mLastCalendarSync.toString().latin1()); 1165 //qDebug("loc changed %d %s %s", local->revision() , localMod.toString().latin1(), mLastCalendarSync.toString().latin1());
1149 lastSync = localMod.addDays( -1 ); 1166 lastSync = localMod.addDays( -1 );
1150 if ( !remCh ) 1167 if ( !remCh )
1151 remoteMod = ( lastSync.addDays( -1 ) ); 1168 remoteMod = ( lastSync.addDays( -1 ) );
1152 } else { 1169 } else {
1153 //qDebug(" not loc changed "); 1170 //qDebug(" not loc changed ");
1154 lastSync = localMod.addDays( 1 ); 1171 lastSync = localMod.addDays( 1 );
1155 if ( remCh ) 1172 if ( remCh )
1156 remoteMod =( lastSync.addDays( 1 ) ); 1173 remoteMod =( lastSync.addDays( 1 ) );
1157 1174
1158 } 1175 }
1159 } 1176 }
1160 full = true; 1177 full = true;
1161 if ( mode < SYNC_PREF_ASK ) 1178 if ( mode < SYNC_PREF_ASK )
1162 mode = SYNC_PREF_ASK; 1179 mode = SYNC_PREF_ASK;
1163 } else { 1180 } else {
1164 if ( localMod == remoteMod ) 1181 if ( localMod == remoteMod )
1165 // if ( local->revision() == remote->revision() ) 1182 // if ( local->revision() == remote->revision() )
1166 return 0; 1183 return 0;
1167 1184
1168 } 1185 }
1169 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() ); 1186 // qDebug(" %d %d conflict on %s %s ", mode, full, local->summary().latin1(), remote->summary().latin1() );
1170 1187
1171 //qDebug("%s %d %s %d", localMod.toString().latin1() , local->revision(), remoteMod.toString().latin1(), remote->revision()); 1188 //qDebug("%s %d %s %d", localMod.toString().latin1() , local->revision(), remoteMod.toString().latin1(), remote->revision());
1172 //qDebug("%d %d %d %d ", localMod.time().second(), localMod.time().msec(), remoteMod.time().second(), remoteMod.time().msec() ); 1189 //qDebug("%d %d %d %d ", localMod.time().second(), localMod.time().msec(), remoteMod.time().second(), remoteMod.time().msec() );
1173 //full = true; //debug only 1190 //full = true; //debug only
1174 if ( full ) { 1191 if ( full ) {
1175 bool equ = false; 1192 bool equ = false;
1176 if ( local->typeID() == eventID ) { 1193 if ( local->typeID() == eventID ) {
1177 equ = (*((Event*) local) == *((Event*) remote)); 1194 equ = (*((Event*) local) == *((Event*) remote));
1178 } 1195 }
1179 else if ( local->typeID() == todoID ) 1196 else if ( local->typeID() == todoID )
1180 equ = (*((Todo*) local) == (*(Todo*) remote)); 1197 equ = (*((Todo*) local) == (*(Todo*) remote));
1181 else if ( local->typeID() == journalID ) 1198 else if ( local->typeID() == journalID )
1182 equ = (*((Journal*) local) == *((Journal*) remote)); 1199 equ = (*((Journal*) local) == *((Journal*) remote));
1183 if ( equ ) { 1200 if ( equ ) {
1184 //qDebug("equal "); 1201 //qDebug("equal ");
1185 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1202 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1186 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) ); 1203 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
1187 } 1204 }
1188 if ( mode < SYNC_PREF_FORCE_LOCAL ) 1205 if ( mode < SYNC_PREF_FORCE_LOCAL )
1189 return 0; 1206 return 0;
1190 1207
1191 }//else //debug only 1208 }//else //debug only
1192 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 1209 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
1193 } 1210 }
1194 int result; 1211 int result;
1195 bool localIsNew; 1212 bool localIsNew;
1196 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , localMod.toString().latin1() , remoteMod.toString().latin1() ); 1213 //qDebug("%s -- %s mLastCalendarSync %s lastsync %s --- local %s remote %s ",local->summary().latin1(), remote->summary().latin1(),mLastCalendarSync.toString().latin1() ,lastSync.toString().latin1() , localMod.toString().latin1() , remoteMod.toString().latin1() );
1197 1214
1198 1215
1199 // ************************************************ 1216 // ************************************************
1200 // ************************************************ 1217 // ************************************************
1201 // ************************************************ 1218 // ************************************************
1202 // We may have that lastSync > remoteMod AND lastSync > localMod 1219 // We may have that lastSync > remoteMod AND lastSync > localMod
1203 // BUT remoteMod != localMod 1220 // BUT remoteMod != localMod
1204 1221
1205 1222
1206 if ( full && mode < SYNC_PREF_NEWEST ) 1223 if ( full && mode < SYNC_PREF_NEWEST )
1207 mode = SYNC_PREF_ASK; 1224 mode = SYNC_PREF_ASK;
1208 1225
1209 switch( mode ) { 1226 switch( mode ) {
1210 case SYNC_PREF_LOCAL: 1227 case SYNC_PREF_LOCAL:
1211 if ( lastSync > remoteMod ) 1228 if ( lastSync > remoteMod )
1212 return 1; 1229 return 1;
1213 if ( lastSync > localMod ) 1230 if ( lastSync > localMod )
1214 return 2; 1231 return 2;
1215 return 1; 1232 return 1;
1216 break; 1233 break;
1217 case SYNC_PREF_REMOTE: 1234 case SYNC_PREF_REMOTE:
1218 if ( lastSync > localMod ) 1235 if ( lastSync > localMod )
1219 return 2; 1236 return 2;
1220 if ( lastSync > remoteMod ) 1237 if ( lastSync > remoteMod )
1221 return 1; 1238 return 1;
1222 return 2; 1239 return 2;
1223 break; 1240 break;
1224 case SYNC_PREF_NEWEST: 1241 case SYNC_PREF_NEWEST:
1225 if ( localMod >= remoteMod ) 1242 if ( localMod >= remoteMod )
1226 return 1; 1243 return 1;
1227 else 1244 else
1228 return 2; 1245 return 2;
1229 break; 1246 break;
1230 case SYNC_PREF_ASK: 1247 case SYNC_PREF_ASK:
1231 qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 1248 qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
1232 if ( lastSync > remoteMod && lastSync > localMod) 1249 if ( lastSync > remoteMod && lastSync > localMod)
1233 return 0; 1250 return 0;
1234 if ( lastSync > remoteMod ) 1251 if ( lastSync > remoteMod )
1235 return 1; 1252 return 1;
1236 if ( lastSync > localMod ) 1253 if ( lastSync > localMod )
1237 return 2; 1254 return 2;
1238 qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() ); 1255 qDebug("lsy %s --- lo %s --- re %s ", lastSync.toString().latin1(), localMod.toString().latin1(), remoteMod.toString().latin1() );
1239 localIsNew = localMod >= remoteMod; 1256 localIsNew = localMod >= remoteMod;
1240 if ( localIsNew ) 1257 if ( localIsNew )
1241 getEventViewerDialog()->setColorMode( 1 ); 1258 getEventViewerDialog()->setColorMode( 1 );
1242 else 1259 else
@@ -2263,1035 +2280,1044 @@ bool CalendarView::checkFileVersion(QString fn)
2263} 2280}
2264bool CalendarView::saveCalendars() 2281bool CalendarView::saveCalendars()
2265{ 2282{
2266 QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars; 2283 QPtrList<KopiCalendarFile> calendars = KOPrefs::instance()->mCalendars;
2267 KopiCalendarFile * cal = calendars.first(); 2284 KopiCalendarFile * cal = calendars.first();
2268 mCalendar->setDefaultCalendar( 1 ); 2285 mCalendar->setDefaultCalendar( 1 );
2269 mCalendar->setDefaultCalendarEnabledOnly(); 2286 mCalendar->setDefaultCalendarEnabledOnly();
2270 saveCalendar( MainWindow::defaultFileName() ); 2287 saveCalendar( MainWindow::defaultFileName() );
2271 cal = calendars.next(); 2288 cal = calendars.next();
2272 while ( cal ) { 2289 while ( cal ) {
2273 if ( !cal->isReadOnly && !cal->mErrorOnLoad ) { 2290 if ( !cal->isReadOnly && !cal->mErrorOnLoad ) {
2274 mCalendar->setDefaultCalendar( cal->mCalNumber ); 2291 mCalendar->setDefaultCalendar( cal->mCalNumber );
2275 mCalendar->setDefaultCalendarEnabledOnly(); 2292 mCalendar->setDefaultCalendarEnabledOnly();
2276 if ( saveCalendar( cal->mFileName ) ) 2293 if ( saveCalendar( cal->mFileName ) )
2277 cal->mLoadDt = QDateTime::currentDateTime(); 2294 cal->mLoadDt = QDateTime::currentDateTime();
2278 } 2295 }
2279 cal = calendars.next(); 2296 cal = calendars.next();
2280 } 2297 }
2281 restoreCalendarSettings(); 2298 restoreCalendarSettings();
2282 return true; 2299 return true;
2283} 2300}
2284bool CalendarView::saveCalendar( QString filename ) 2301bool CalendarView::saveCalendar( QString filename )
2285{ 2302{
2286 2303
2287 // Store back all unsaved data into calendar object 2304 // Store back all unsaved data into calendar object
2288 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() ); 2305 // qDebug("file %s %d ", filename.latin1() , mViewManager->currentView() );
2289 if ( mViewManager->currentView() ) 2306 if ( mViewManager->currentView() )
2290 mViewManager->currentView()->flushView(); 2307 mViewManager->currentView()->flushView();
2291 2308
2292 2309
2293 QDateTime lfv = QDateTime::currentDateTime().addSecs( -2); 2310 QDateTime lfv = QDateTime::currentDateTime().addSecs( -2);
2294 mStorage->setSaveFormat( new ICalFormat() ); 2311 mStorage->setSaveFormat( new ICalFormat() );
2295 mStorage->setFileName( filename ); 2312 mStorage->setFileName( filename );
2296 bool success; 2313 bool success;
2297 success = mStorage->save(); 2314 success = mStorage->save();
2298 if ( !success ) { 2315 if ( !success ) {
2299 return false; 2316 return false;
2300 } 2317 }
2301 if ( filename == MainWindow::defaultFileName() ) { 2318 if ( filename == MainWindow::defaultFileName() ) {
2302 setLoadedFileVersion( lfv ); 2319 setLoadedFileVersion( lfv );
2303 watchSavedFile(); 2320 watchSavedFile();
2304 } 2321 }
2305 return true; 2322 return true;
2306} 2323}
2307 2324
2308void CalendarView::closeCalendar() 2325void CalendarView::closeCalendar()
2309{ 2326{
2310 2327
2311 // child windows no longer valid 2328 // child windows no longer valid
2312 clearAllViews(); 2329 clearAllViews();
2313 emit closingDown(); 2330 emit closingDown();
2314 2331
2315 mCalendar->close(); 2332 mCalendar->close();
2316 setModified(false); 2333 setModified(false);
2317 updateView(); 2334 updateView();
2318} 2335}
2319 2336
2320void CalendarView::archiveCalendar() 2337void CalendarView::archiveCalendar()
2321{ 2338{
2322 mDialogManager->showArchiveDialog(); 2339 mDialogManager->showArchiveDialog();
2323} 2340}
2324 2341
2325 2342
2326void CalendarView::readSettings() 2343void CalendarView::readSettings()
2327{ 2344{
2328 2345
2329 2346
2330 // mViewManager->showAgendaView(); 2347 // mViewManager->showAgendaView();
2331 QString str; 2348 QString str;
2332 //qDebug("CalendarView::readSettings() "); 2349 //qDebug("CalendarView::readSettings() ");
2333 // read settings from the KConfig, supplying reasonable 2350 // read settings from the KConfig, supplying reasonable
2334 // defaults where none are to be found 2351 // defaults where none are to be found
2335 KConfig *config = KOGlobals::config(); 2352 KConfig *config = KOGlobals::config();
2336#ifndef KORG_NOSPLITTER 2353#ifndef KORG_NOSPLITTER
2337 config->setGroup("KOrganizer Geometry"); 2354 config->setGroup("KOrganizer Geometry");
2338 2355
2339 QValueList<int> sizes = config->readIntListEntry("Separator1"); 2356 QValueList<int> sizes = config->readIntListEntry("Separator1");
2340 if (sizes.count() != 2) { 2357 if (sizes.count() != 2) {
2341 sizes << mDateNavigator->minimumSizeHint().width(); 2358 sizes << mDateNavigator->minimumSizeHint().width();
2342 sizes << 300; 2359 sizes << 300;
2343 } 2360 }
2344 mPanner->setSizes(sizes); 2361 mPanner->setSizes(sizes);
2345 2362
2346 sizes = config->readIntListEntry("Separator2"); 2363 sizes = config->readIntListEntry("Separator2");
2347 if ( ( mResourceView && sizes.count() == 4 ) || 2364 if ( ( mResourceView && sizes.count() == 4 ) ||
2348 ( !mResourceView && sizes.count() == 3 ) ) { 2365 ( !mResourceView && sizes.count() == 3 ) ) {
2349 mLeftSplitter->setSizes(sizes); 2366 mLeftSplitter->setSizes(sizes);
2350 } 2367 }
2351#endif 2368#endif
2352 globalFlagBlockAgenda = 1; 2369 globalFlagBlockAgenda = 1;
2353 mViewManager->showAgendaView(); 2370 mViewManager->showAgendaView();
2354 //mViewManager->readSettings( config ); 2371 //mViewManager->readSettings( config );
2355 mTodoList->restoreLayout(config,QString("Todo Layout")); 2372 mTodoList->restoreLayout(config,QString("Todo Layout"));
2356 readFilterSettings(config); 2373 readFilterSettings(config);
2357 2374
2358#ifdef DESKTOP_VERSION 2375#ifdef DESKTOP_VERSION
2359 config->setGroup("WidgetLayout"); 2376 config->setGroup("WidgetLayout");
2360 QStringList list; 2377 QStringList list;
2361 list = config->readListEntry("MainLayout"); 2378 list = config->readListEntry("MainLayout");
2362 int x,y,w,h; 2379 int x,y,w,h;
2363 if ( ! list.isEmpty() ) { 2380 if ( ! list.isEmpty() ) {
2364 x = list[0].toInt(); 2381 x = list[0].toInt();
2365 y = list[1].toInt(); 2382 y = list[1].toInt();
2366 w = list[2].toInt(); 2383 w = list[2].toInt();
2367 h = list[3].toInt(); 2384 h = list[3].toInt();
2368 KApplication::testCoords( &x,&y,&w,&h ); 2385 KApplication::testCoords( &x,&y,&w,&h );
2369 topLevelWidget()->setGeometry(x,y,w,h); 2386 topLevelWidget()->setGeometry(x,y,w,h);
2370 2387
2371 } else { 2388 } else {
2372 topLevelWidget()->setGeometry( 40 ,40 , 640, 440); 2389 topLevelWidget()->setGeometry( 40 ,40 , 640, 440);
2373 } 2390 }
2374 list = config->readListEntry("EditEventLayout"); 2391 list = config->readListEntry("EditEventLayout");
2375 if ( ! list.isEmpty() ) { 2392 if ( ! list.isEmpty() ) {
2376 x = list[0].toInt(); 2393 x = list[0].toInt();
2377 y = list[1].toInt(); 2394 y = list[1].toInt();
2378 w = list[2].toInt(); 2395 w = list[2].toInt();
2379 h = list[3].toInt(); 2396 h = list[3].toInt();
2380 KApplication::testCoords( &x,&y,&w,&h ); 2397 KApplication::testCoords( &x,&y,&w,&h );
2381 mEventEditor->setGeometry(x,y,w,h); 2398 mEventEditor->setGeometry(x,y,w,h);
2382 2399
2383 } 2400 }
2384 list = config->readListEntry("EditTodoLayout"); 2401 list = config->readListEntry("EditTodoLayout");
2385 if ( ! list.isEmpty() ) { 2402 if ( ! list.isEmpty() ) {
2386 x = list[0].toInt(); 2403 x = list[0].toInt();
2387 y = list[1].toInt(); 2404 y = list[1].toInt();
2388 w = list[2].toInt(); 2405 w = list[2].toInt();
2389 h = list[3].toInt(); 2406 h = list[3].toInt();
2390 KApplication::testCoords( &x,&y,&w,&h ); 2407 KApplication::testCoords( &x,&y,&w,&h );
2391 mTodoEditor->setGeometry(x,y,w,h); 2408 mTodoEditor->setGeometry(x,y,w,h);
2392 2409
2393 } 2410 }
2394 list = config->readListEntry("ViewerLayout"); 2411 list = config->readListEntry("ViewerLayout");
2395 if ( ! list.isEmpty() ) { 2412 if ( ! list.isEmpty() ) {
2396 x = list[0].toInt(); 2413 x = list[0].toInt();
2397 y = list[1].toInt(); 2414 y = list[1].toInt();
2398 w = list[2].toInt(); 2415 w = list[2].toInt();
2399 h = list[3].toInt(); 2416 h = list[3].toInt();
2400 KApplication::testCoords( &x,&y,&w,&h ); 2417 KApplication::testCoords( &x,&y,&w,&h );
2401 getEventViewerDialog()->setGeometry(x,y,w,h); 2418 getEventViewerDialog()->setGeometry(x,y,w,h);
2402 } 2419 }
2403#endif 2420#endif
2404 config->setGroup( "Views" ); 2421 config->setGroup( "Views" );
2405 int dateCount = config->readNumEntry( "ShownDatesCount", 7 ); 2422 int dateCount = config->readNumEntry( "ShownDatesCount", 7 );
2406 2423
2407 QValueList<int> sizes = config->readIntListEntry("Left Splitter Frame"); 2424 QValueList<int> sizes = config->readIntListEntry("Left Splitter Frame");
2408 2425
2409 int resetval = 0; 2426 int resetval = 0;
2410 int maxVal = 0; 2427 int maxVal = 0;
2411 if (sizes.count() != 3) { 2428 if (sizes.count() != 3) {
2412 if ( KOPrefs::instance()->mVerticalScreen ) { 2429 if ( KOPrefs::instance()->mVerticalScreen ) {
2413 resetval = mDateNavigator->sizeHint().width()+2; 2430 resetval = mDateNavigator->sizeHint().width()+2;
2414 } else { 2431 } else {
2415 resetval = mDateNavigator->sizeHint().height()+2; 2432 resetval = mDateNavigator->sizeHint().height()+2;
2416 } 2433 }
2417 } 2434 }
2418 if ( resetval ) { 2435 if ( resetval ) {
2419 sizes.clear(); 2436 sizes.clear();
2420 if ( KOPrefs::instance()->mVerticalScreen ) { 2437 if ( KOPrefs::instance()->mVerticalScreen ) {
2421 maxVal = QApplication::desktop()->width() -10; 2438 maxVal = QApplication::desktop()->width() -10;
2422 } else { 2439 } else {
2423 maxVal = QApplication::desktop()->height()-10; 2440 maxVal = QApplication::desktop()->height()-10;
2424 } 2441 }
2425 sizes << resetval; 2442 sizes << resetval;
2426 if ( maxVal < resetval + resetval) 2443 if ( maxVal < resetval + resetval)
2427 resetval = maxVal - resetval; 2444 resetval = maxVal - resetval;
2428 sizes << resetval; 2445 sizes << resetval;
2429 sizes << 100; 2446 sizes << 100;
2430 } 2447 }
2431 mLeftFrame->setSizes(sizes); 2448 mLeftFrame->setSizes(sizes);
2432 sizes = config->readIntListEntry("Main Splitter Frame"); 2449 sizes = config->readIntListEntry("Main Splitter Frame");
2433 resetval = 0; 2450 resetval = 0;
2434 maxVal = 0; 2451 maxVal = 0;
2435 if (sizes.count() != 2) { 2452 if (sizes.count() != 2) {
2436 if ( !KOPrefs::instance()->mVerticalScreen ) { 2453 if ( !KOPrefs::instance()->mVerticalScreen ) {
2437 resetval = mDateNavigator->sizeHint().width()+2; 2454 resetval = mDateNavigator->sizeHint().width()+2;
2438 } else { 2455 } else {
2439 resetval = mDateNavigator->sizeHint().height()+2; 2456 resetval = mDateNavigator->sizeHint().height()+2;
2440 } 2457 }
2441 } 2458 }
2442 if ( resetval ) { 2459 if ( resetval ) {
2443 sizes.clear(); 2460 sizes.clear();
2444 if ( !KOPrefs::instance()->mVerticalScreen ) { 2461 if ( !KOPrefs::instance()->mVerticalScreen ) {
2445 maxVal = QApplication::desktop()->width() -10; 2462 maxVal = QApplication::desktop()->width() -10;
2446 } else { 2463 } else {
2447 maxVal = QApplication::desktop()->height()-10; 2464 maxVal = QApplication::desktop()->height()-10;
2448 } 2465 }
2449 sizes << resetval; 2466 sizes << resetval;
2450 if ( maxVal < resetval + resetval) 2467 if ( maxVal < resetval + resetval)
2451 resetval = maxVal - resetval; 2468 resetval = maxVal - resetval;
2452 sizes << resetval; 2469 sizes << resetval;
2453 } 2470 }
2454 mMainFrame->setSizes(sizes); 2471 mMainFrame->setSizes(sizes);
2455 if ( dateCount == 5 ) mNavigator->selectWorkWeek(); 2472 if ( dateCount == 5 ) mNavigator->selectWorkWeek();
2456 else if ( dateCount == 7 ) mNavigator->selectWeek(); 2473 else if ( dateCount == 7 ) mNavigator->selectWeek();
2457 else mNavigator->selectDates( dateCount ); 2474 else mNavigator->selectDates( dateCount );
2458 // mViewManager->readSettings( config ); 2475 // mViewManager->readSettings( config );
2459 updateConfig(); 2476 updateConfig();
2460 globalFlagBlockAgenda = 2; 2477 globalFlagBlockAgenda = 2;
2461 mViewManager->readSettings( config ); 2478 mViewManager->readSettings( config );
2462 QTimer::singleShot( 1, mDateNavigator, SLOT ( setResizeEnabled() ) ); 2479 QTimer::singleShot( 1, mDateNavigator, SLOT ( setResizeEnabled() ) );
2463} 2480}
2464 2481
2465void CalendarView::checkSuspendAlarm() 2482void CalendarView::checkSuspendAlarm()
2466{ 2483{
2467 if ( mSuspendTimer->isActive() ) { 2484 if ( mSuspendTimer->isActive() ) {
2468 KMessageBox::information( this, i18n("<b>WARNING:</b> There is a pending suspended alarm!"), i18n("Pending Suspend Alarm")); 2485 KMessageBox::information( this, i18n("<b>WARNING:</b> There is a pending suspended alarm!"), i18n("Pending Suspend Alarm"));
2469 } 2486 }
2470} 2487}
2471void CalendarView::writeSettings() 2488void CalendarView::writeSettings()
2472{ 2489{
2473 // kdDebug() << "CalendarView::writeSettings" << endl; 2490 // kdDebug() << "CalendarView::writeSettings" << endl;
2474 2491
2475 KConfig *config = KOGlobals::config(); 2492 KConfig *config = KOGlobals::config();
2476 2493
2477 mViewManager->writeSettings( config ); 2494 mViewManager->writeSettings( config );
2478 mTodoList->saveLayout(config,QString("Todo Layout")); 2495 mTodoList->saveLayout(config,QString("Todo Layout"));
2479 mDialogManager->writeSettings( config ); 2496 mDialogManager->writeSettings( config );
2480 //KOPrefs::instance()->usrWriteConfig(); 2497 //KOPrefs::instance()->usrWriteConfig();
2481 KOPrefs::instance()->writeConfig(); 2498 KOPrefs::instance()->writeConfig();
2482 2499
2483 writeFilterSettings(config); 2500 writeFilterSettings(config);
2484 config->setGroup( "AppRun" ); 2501 config->setGroup( "AppRun" );
2485 QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) ); 2502 QDateTime dt ( QDate (2005,1,1), QTime( 0,0,0 ) );
2486 int days = dt.daysTo( QDate::currentDate() ); 2503 int days = dt.daysTo( QDate::currentDate() );
2487 dt = dt.addDays( days ); 2504 dt = dt.addDays( days );
2488 int secs = dt.secsTo( QDateTime::currentDateTime() ); 2505 int secs = dt.secsTo( QDateTime::currentDateTime() );
2489 config->writeEntry( "LatestProgramStopDays", days ); 2506 config->writeEntry( "LatestProgramStopDays", days );
2490 config->writeEntry( "LatestProgramStopSecs", secs ); 2507 config->writeEntry( "LatestProgramStopSecs", secs );
2491 //qDebug("KO: Writing stop time: %d ", secs); 2508 //qDebug("KO: Writing stop time: %d ", secs);
2492 //qDebug("KO: Current Time %s ",QDateTime::currentDateTime().toString().latin1() ); 2509 //qDebug("KO: Current Time %s ",QDateTime::currentDateTime().toString().latin1() );
2493 //QDateTime latest = dt.addSecs ( secs ); 2510 //QDateTime latest = dt.addSecs ( secs );
2494 //qDebug("KO: Termination on %s ", latest.toString().latin1()); 2511 //qDebug("KO: Termination on %s ", latest.toString().latin1());
2495 config->setGroup( "Views" ); 2512 config->setGroup( "Views" );
2496 config->writeEntry( "ShownDatesCount", mNavigator->selectedDates().count() ); 2513 config->writeEntry( "ShownDatesCount", mNavigator->selectedDates().count() );
2497 2514
2498#if 0 2515#if 0
2499 qDebug("********************* "); 2516 qDebug("********************* ");
2500 qDebug("Testcode secsto "); 2517 qDebug("Testcode secsto ");
2501 QDateTime dt_nodaylight ( QDate (2005,3,26), QTime( 0,0,0 ) ); 2518 QDateTime dt_nodaylight ( QDate (2005,3,26), QTime( 0,0,0 ) );
2502 QDateTime dt_daylight ( QDate (2005,3,29), QTime( 0,0,0 ) ); 2519 QDateTime dt_daylight ( QDate (2005,3,29), QTime( 0,0,0 ) );
2503 int secsto = dt_nodaylight.secsTo( dt_daylight ); 2520 int secsto = dt_nodaylight.secsTo( dt_daylight );
2504 QDateTime dt_daylight_wrong = dt_nodaylight.addSecs( secsto ); 2521 QDateTime dt_daylight_wrong = dt_nodaylight.addSecs( secsto );
2505 qDebug("dt nodaylight %s ",dt_nodaylight.toString().latin1() ); 2522 qDebug("dt nodaylight %s ",dt_nodaylight.toString().latin1() );
2506 qDebug("dt daylight %s ",dt_daylight.toString().latin1() ); 2523 qDebug("dt daylight %s ",dt_daylight.toString().latin1() );
2507 qDebug("dt daylight_wrong %s ",dt_daylight_wrong.toString().latin1() ); 2524 qDebug("dt daylight_wrong %s ",dt_daylight_wrong.toString().latin1() );
2508 qDebug("Computed secsTo %d . in minutes: %d . in hours: %d ", secsto, secsto/60, secsto/3600); 2525 qDebug("Computed secsTo %d . in minutes: %d . in hours: %d ", secsto, secsto/60, secsto/3600);
2509 qDebug("********************* testcode end"); 2526 qDebug("********************* testcode end");
2510 2527
2511#endif 2528#endif
2512 2529
2513 QValueList<int> listINT = mLeftFrame->sizes(); 2530 QValueList<int> listINT = mLeftFrame->sizes();
2514 config->writeEntry("Left Splitter Frame",listINT); 2531 config->writeEntry("Left Splitter Frame",listINT);
2515 QValueList<int> listINT2 = mMainFrame->sizes(); 2532 QValueList<int> listINT2 = mMainFrame->sizes();
2516 config->writeEntry("Main Splitter Frame",listINT2); 2533 config->writeEntry("Main Splitter Frame",listINT2);
2517#ifdef DESKTOP_VERSION 2534#ifdef DESKTOP_VERSION
2518 config->setGroup("WidgetLayout"); 2535 config->setGroup("WidgetLayout");
2519 QStringList list ;//= config->readListEntry("MainLayout"); 2536 QStringList list ;//= config->readListEntry("MainLayout");
2520 int x,y,w,h; 2537 int x,y,w,h;
2521 QWidget* wid; 2538 QWidget* wid;
2522 wid = topLevelWidget(); 2539 wid = topLevelWidget();
2523 x = wid->geometry().x(); 2540 x = wid->geometry().x();
2524 y = wid->geometry().y(); 2541 y = wid->geometry().y();
2525 w = wid->width(); 2542 w = wid->width();
2526 h = wid->height(); 2543 h = wid->height();
2527 list.clear(); 2544 list.clear();
2528 list << QString::number( x ); 2545 list << QString::number( x );
2529 list << QString::number( y ); 2546 list << QString::number( y );
2530 list << QString::number( w ); 2547 list << QString::number( w );
2531 list << QString::number( h ); 2548 list << QString::number( h );
2532 config->writeEntry("MainLayout",list ); 2549 config->writeEntry("MainLayout",list );
2533 2550
2534 wid = mEventEditor; 2551 wid = mEventEditor;
2535 x = wid->geometry().x(); 2552 x = wid->geometry().x();
2536 y = wid->geometry().y(); 2553 y = wid->geometry().y();
2537 w = wid->width(); 2554 w = wid->width();
2538 h = wid->height(); 2555 h = wid->height();
2539 list.clear(); 2556 list.clear();
2540 list << QString::number( x ); 2557 list << QString::number( x );
2541 list << QString::number( y ); 2558 list << QString::number( y );
2542 list << QString::number( w ); 2559 list << QString::number( w );
2543 list << QString::number( h ); 2560 list << QString::number( h );
2544 config->writeEntry("EditEventLayout",list ); 2561 config->writeEntry("EditEventLayout",list );
2545 2562
2546 wid = mTodoEditor; 2563 wid = mTodoEditor;
2547 x = wid->geometry().x(); 2564 x = wid->geometry().x();
2548 y = wid->geometry().y(); 2565 y = wid->geometry().y();
2549 w = wid->width(); 2566 w = wid->width();
2550 h = wid->height(); 2567 h = wid->height();
2551 list.clear(); 2568 list.clear();
2552 list << QString::number( x ); 2569 list << QString::number( x );
2553 list << QString::number( y ); 2570 list << QString::number( y );
2554 list << QString::number( w ); 2571 list << QString::number( w );
2555 list << QString::number( h ); 2572 list << QString::number( h );
2556 config->writeEntry("EditTodoLayout",list ); 2573 config->writeEntry("EditTodoLayout",list );
2557 wid = getEventViewerDialog(); 2574 wid = getEventViewerDialog();
2558 x = wid->geometry().x(); 2575 x = wid->geometry().x();
2559 y = wid->geometry().y(); 2576 y = wid->geometry().y();
2560 w = wid->width(); 2577 w = wid->width();
2561 h = wid->height(); 2578 h = wid->height();
2562 list.clear(); 2579 list.clear();
2563 list << QString::number( x ); 2580 list << QString::number( x );
2564 list << QString::number( y ); 2581 list << QString::number( y );
2565 list << QString::number( w ); 2582 list << QString::number( w );
2566 list << QString::number( h ); 2583 list << QString::number( h );
2567 config->writeEntry("ViewerLayout",list ); 2584 config->writeEntry("ViewerLayout",list );
2568 wid = mDialogManager->getSearchDialog(); 2585 wid = mDialogManager->getSearchDialog();
2569 if ( wid ) { 2586 if ( wid ) {
2570 x = wid->geometry().x(); 2587 x = wid->geometry().x();
2571 y = wid->geometry().y(); 2588 y = wid->geometry().y();
2572 w = wid->width(); 2589 w = wid->width();
2573 h = wid->height(); 2590 h = wid->height();
2574 list.clear(); 2591 list.clear();
2575 list << QString::number( x ); 2592 list << QString::number( x );
2576 list << QString::number( y ); 2593 list << QString::number( y );
2577 list << QString::number( w ); 2594 list << QString::number( w );
2578 list << QString::number( h ); 2595 list << QString::number( h );
2579 config->writeEntry("SearchLayout",list ); 2596 config->writeEntry("SearchLayout",list );
2580 } 2597 }
2581#endif 2598#endif
2582 2599
2583 2600
2584 config->sync(); 2601 config->sync();
2585} 2602}
2586 2603
2587void CalendarView::readFilterSettings(KConfig *config) 2604void CalendarView::readFilterSettings(KConfig *config)
2588{ 2605{
2589 // kdDebug() << "CalendarView::readFilterSettings()" << endl; 2606 // kdDebug() << "CalendarView::readFilterSettings()" << endl;
2590 2607
2591 mFilters.clear(); 2608 mFilters.clear();
2592 2609
2593 config->setGroup("General"); 2610 config->setGroup("General");
2594 QStringList filterList = config->readListEntry("CalendarFilters"); 2611 QStringList filterList = config->readListEntry("CalendarFilters");
2595 2612
2596 QStringList::ConstIterator it = filterList.begin(); 2613 QStringList::ConstIterator it = filterList.begin();
2597 QStringList::ConstIterator end = filterList.end(); 2614 QStringList::ConstIterator end = filterList.end();
2598 while(it != end) { 2615 while(it != end) {
2599 // kdDebug() << " filter: " << (*it) << endl; 2616 // kdDebug() << " filter: " << (*it) << endl;
2600 2617
2601 CalFilter *filter; 2618 CalFilter *filter;
2602 filter = new CalFilter(*it); 2619 filter = new CalFilter(*it);
2603 config->setGroup("Filter_" + (*it).utf8()); 2620 config->setGroup("Filter_" + (*it).utf8());
2604 //qDebug("readFilterSettings %d ",config->readNumEntry("Criteria",0) ); 2621 //qDebug("readFilterSettings %d ",config->readNumEntry("Criteria",0) );
2605 filter->setCriteria(config->readNumEntry("Criteria",0)); 2622 filter->setCriteria(config->readNumEntry("Criteria",0));
2606 filter->setCategoryList(config->readListEntry("CategoryList")); 2623 filter->setCategoryList(config->readListEntry("CategoryList"));
2607 mFilters.append(filter); 2624 mFilters.append(filter);
2608 2625
2609 ++it; 2626 ++it;
2610 } 2627 }
2611 2628
2612 if (mFilters.count() == 0) { 2629 if (mFilters.count() == 0) {
2613 CalFilter *filter = new CalFilter(i18n("Default")); 2630 CalFilter *filter = new CalFilter(i18n("Default"));
2614 mFilters.append(filter); 2631 mFilters.append(filter);
2615 } 2632 }
2616 mFilterView->updateFilters(); 2633 mFilterView->updateFilters();
2617 config->setGroup("FilterView"); 2634 config->setGroup("FilterView");
2618 2635
2619 mFilterView->blockSignals(true); 2636 mFilterView->blockSignals(true);
2620 mFilterView->setFiltersEnabled(config->readBoolEntry("FilterEnabled")); 2637 mFilterView->setFiltersEnabled(config->readBoolEntry("FilterEnabled"));
2621 mFilterView->setSelectedFilter(config->readEntry("Current Filter")); 2638 mFilterView->setSelectedFilter(config->readEntry("Current Filter"));
2622 mFilterView->blockSignals(false); 2639 mFilterView->blockSignals(false);
2623 // We do it manually to avoid it being done twice by the above calls 2640 // We do it manually to avoid it being done twice by the above calls
2624 updateFilter(); 2641 updateFilter();
2625} 2642}
2626 2643
2627void CalendarView::writeFilterSettings(KConfig *config) 2644void CalendarView::writeFilterSettings(KConfig *config)
2628{ 2645{
2629 // kdDebug() << "CalendarView::writeFilterSettings()" << endl; 2646 // kdDebug() << "CalendarView::writeFilterSettings()" << endl;
2630 2647
2631 QStringList filterList; 2648 QStringList filterList;
2632 2649
2633 CalFilter *filter = mFilters.first(); 2650 CalFilter *filter = mFilters.first();
2634 while(filter) { 2651 while(filter) {
2635 // kdDebug() << " fn: " << filter->name() << endl; 2652 // kdDebug() << " fn: " << filter->name() << endl;
2636 filterList << filter->name(); 2653 filterList << filter->name();
2637 config->setGroup("Filter_" + filter->name().utf8()); 2654 config->setGroup("Filter_" + filter->name().utf8());
2638 config->writeEntry("Criteria",filter->criteria()); 2655 config->writeEntry("Criteria",filter->criteria());
2639 config->writeEntry("CategoryList",filter->categoryList()); 2656 config->writeEntry("CategoryList",filter->categoryList());
2640 filter = mFilters.next(); 2657 filter = mFilters.next();
2641 } 2658 }
2642 config->setGroup("General"); 2659 config->setGroup("General");
2643 config->writeEntry("CalendarFilters",filterList); 2660 config->writeEntry("CalendarFilters",filterList);
2644 2661
2645 config->setGroup("FilterView"); 2662 config->setGroup("FilterView");
2646 config->writeEntry("FilterEnabled",mFilterView->filtersEnabled()); 2663 config->writeEntry("FilterEnabled",mFilterView->filtersEnabled());
2647 config->writeEntry("Current Filter",mFilterView->selectedFilter()->name()); 2664 config->writeEntry("Current Filter",mFilterView->selectedFilter()->name());
2648} 2665}
2649 2666
2650 2667
2651void CalendarView::goToday() 2668void CalendarView::goToday()
2652{ 2669{
2653 if ( mViewManager->currentView()->isMonthView() ) 2670 if ( mViewManager->currentView()->isMonthView() )
2654 mNavigator->selectTodayMonth(); 2671 mNavigator->selectTodayMonth();
2655 else 2672 else
2656 mNavigator->selectToday(); 2673 mNavigator->selectToday();
2657} 2674}
2658 2675
2659void CalendarView::goNext() 2676void CalendarView::goNext()
2660{ 2677{
2661 mNavigator->selectNext(); 2678 mNavigator->selectNext();
2662} 2679}
2663 2680
2664void CalendarView::goPrevious() 2681void CalendarView::goPrevious()
2665{ 2682{
2666 mNavigator->selectPrevious(); 2683 mNavigator->selectPrevious();
2667} 2684}
2668void CalendarView::goNextMonth() 2685void CalendarView::goNextMonth()
2669{ 2686{
2670 mNavigator->selectNextMonth(); 2687 mNavigator->selectNextMonth();
2671} 2688}
2672 2689
2673void CalendarView::goPreviousMonth() 2690void CalendarView::goPreviousMonth()
2674{ 2691{
2675 mNavigator->selectPreviousMonth(); 2692 mNavigator->selectPreviousMonth();
2676} 2693}
2677 2694
2678void CalendarView::updateConfig() 2695void CalendarView::updateConfig()
2679{ 2696{
2680 if ( KOPrefs::instance()->mUseAppColors ) 2697 if ( KOPrefs::instance()->mUseAppColors )
2681 QApplication::setPalette( QPalette (KOPrefs::instance()->mAppColor1, KOPrefs::instance()->mAppColor2), true ); 2698 QApplication::setPalette( QPalette (KOPrefs::instance()->mAppColor1, KOPrefs::instance()->mAppColor2), true );
2682 emit configChanged(); 2699 emit configChanged();
2683 mTodoList->updateConfig(); 2700 mTodoList->updateConfig();
2684 // mDateNavigator->setFont ( KOPrefs::instance()->mDateNavigatorFont); 2701 // mDateNavigator->setFont ( KOPrefs::instance()->mDateNavigatorFont);
2685 mCalendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 2702 mCalendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
2686 // To make the "fill window" configurations work 2703 // To make the "fill window" configurations work
2687 //mViewManager->raiseCurrentView(); 2704 //mViewManager->raiseCurrentView();
2688} 2705}
2689 2706
2690 2707
2691void CalendarView::eventChanged(Event *event) 2708void CalendarView::eventChanged(Event *event)
2692{ 2709{
2693 changeEventDisplay(event,KOGlobals::EVENTEDITED); 2710 changeEventDisplay(event,KOGlobals::EVENTEDITED);
2694 //updateUnmanagedViews(); 2711 //updateUnmanagedViews();
2695} 2712}
2696 2713
2697void CalendarView::eventAdded(Event *event) 2714void CalendarView::eventAdded(Event *event)
2698{ 2715{
2699 changeEventDisplay(event,KOGlobals::EVENTADDED); 2716 changeEventDisplay(event,KOGlobals::EVENTADDED);
2700} 2717}
2701 2718
2702void CalendarView::eventToBeDeleted(Event *) 2719void CalendarView::eventToBeDeleted(Event *)
2703{ 2720{
2704 kdDebug() << "CalendarView::eventToBeDeleted(): to be implemented" << endl; 2721 kdDebug() << "CalendarView::eventToBeDeleted(): to be implemented" << endl;
2705} 2722}
2706 2723
2707void CalendarView::eventDeleted() 2724void CalendarView::eventDeleted()
2708{ 2725{
2709 changeEventDisplay(0,KOGlobals::EVENTDELETED); 2726 changeEventDisplay(0,KOGlobals::EVENTDELETED);
2710} 2727}
2711void CalendarView::changeTodoDisplay(Todo *which, int action) 2728void CalendarView::changeTodoDisplay(Todo *which, int action)
2712{ 2729{
2713 changeIncidenceDisplay((Incidence *)which, action); 2730 changeIncidenceDisplay((Incidence *)which, action);
2714 mDateNavigator->updateView(); //LR 2731 mDateNavigator->updateView(); //LR
2715 //mDialogManager->updateSearchDialog(); 2732 //mDialogManager->updateSearchDialog();
2716 2733
2717 if (which) { 2734 if (which) {
2718 mViewManager->updateWNview(); 2735 mViewManager->updateWNview();
2719 //mTodoList->updateView(); 2736 //mTodoList->updateView();
2720 } 2737 }
2721 2738
2722} 2739}
2723 2740
2724void CalendarView::changeIncidenceDisplay(Incidence *which, int action) 2741void CalendarView::changeIncidenceDisplay(Incidence *which, int action)
2725{ 2742{
2726 updateUnmanagedViews(); 2743 updateUnmanagedViews();
2727 //qDebug(" CalendarView::changeIncidenceDisplay++++++++++++++++++++++++++ %d %d ",which, action ); 2744 //qDebug(" CalendarView::changeIncidenceDisplay++++++++++++++++++++++++++ %d %d ",which, action );
2728 if ( action == KOGlobals::EVENTDELETED ) { //delete 2745 if ( action == KOGlobals::EVENTDELETED ) { //delete
2729 mCalendar->checkAlarmForIncidence( 0, true ); 2746 mCalendar->checkAlarmForIncidence( 0, true );
2730 if ( mEventViewerDialog ) 2747 if ( mEventViewerDialog )
2731 mEventViewerDialog->hide(); 2748 mEventViewerDialog->hide();
2732 } 2749 }
2733 else 2750 else
2734 mCalendar->checkAlarmForIncidence( which , false ); 2751 mCalendar->checkAlarmForIncidence( which , false );
2735} 2752}
2736 2753
2737// most of the changeEventDisplays() right now just call the view's 2754// most of the changeEventDisplays() right now just call the view's
2738// total update mode, but they SHOULD be recoded to be more refresh-efficient. 2755// total update mode, but they SHOULD be recoded to be more refresh-efficient.
2739void CalendarView::changeEventDisplay(Event *which, int action) 2756void CalendarView::changeEventDisplay(Event *which, int action)
2740{ 2757{
2741 // kdDebug() << "CalendarView::changeEventDisplay" << endl; 2758 // kdDebug() << "CalendarView::changeEventDisplay" << endl;
2742 changeIncidenceDisplay((Incidence *)which, action); 2759 changeIncidenceDisplay((Incidence *)which, action);
2743 static bool clearallviews = false; 2760 static bool clearallviews = false;
2744 if ( KOPrefs::instance()->mGlobalUpdateDisabled ) { 2761 if ( KOPrefs::instance()->mGlobalUpdateDisabled ) {
2745 if ( clearallviews ) { 2762 if ( clearallviews ) {
2746 clearAllViews(); 2763 clearAllViews();
2747 clearallviews = false; 2764 clearallviews = false;
2748 } 2765 }
2749 return; 2766 return;
2750 } 2767 }
2751 clearallviews = true; 2768 clearallviews = true;
2752 mDateNavigator->updateView(); 2769 mDateNavigator->updateView();
2753 //mDialogManager->updateSearchDialog(); 2770 //mDialogManager->updateSearchDialog();
2754 if (which) { 2771 if (which) {
2755 // If there is an event view visible update the display 2772 // If there is an event view visible update the display
2756 mViewManager->currentView()->changeEventDisplay(which,action); 2773 mViewManager->currentView()->changeEventDisplay(which,action);
2757 // TODO: check, if update needed 2774 // TODO: check, if update needed
2758 // if (which->getTodoStatus()) { 2775 // if (which->getTodoStatus()) {
2759 mTodoList->updateView(); 2776 mTodoList->updateView();
2760 if ( action != KOGlobals::EVENTDELETED ) { 2777 if ( action != KOGlobals::EVENTDELETED ) {
2761 mConflictingEvent = which ; 2778 mConflictingEvent = which ;
2762 QTimer::singleShot( 1000, this, SLOT ( checkConflictForEvent() ) ); 2779 QTimer::singleShot( 1000, this, SLOT ( checkConflictForEvent() ) );
2763 } 2780 }
2764 // } 2781 // }
2765 } else { 2782 } else {
2766 mViewManager->currentView()->updateView(); 2783 mViewManager->currentView()->updateView();
2767 } 2784 }
2768} 2785}
2769void CalendarView::checkConflictForEvent() 2786void CalendarView::checkConflictForEvent()
2770{ 2787{
2771 2788
2772 if (!KOPrefs::instance()->mConfirm) 2789 if (!KOPrefs::instance()->mConfirm)
2773 return; 2790 return;
2774 if ( ! mConflictingEvent ) return; 2791 if ( ! mConflictingEvent ) return;
2775 topLevelWidget()->setCaption( i18n("Checking conflicts ... please wait") ); 2792 QDateTime current = QDateTime::currentDateTime();
2793 if ( ! mConflictingEvent->matchTime( &current, 0 ) ) {
2794 mConflictingEvent = 0;
2795 return;
2796 }
2776 QPtrList<Event> testlist = mCalendar->events(); 2797 QPtrList<Event> testlist = mCalendar->events();
2777 Event * test = testlist.first(); 2798 Event * test = testlist.first();
2778 QDateTime conflict; 2799 QDateTime conflict;
2779 QDateTime retVal; 2800 QDateTime retVal;
2780 bool found = false; 2801 bool found = false;
2781 Event * cE = 0; 2802 Event * cE = 0;
2782 QDateTime current = QDateTime::currentDateTime(); 2803 topLevelWidget()->setCaption( i18n("Checking conflicts ... please wait") );
2783 while ( test ) { 2804 while ( test ) {
2784 qApp->processEvents(); 2805 qApp->processEvents();
2785 if ( !test->doesFloat() ) { 2806 bool skip = false;
2807 if ( found )
2808 skip = !test->matchTime( &current, &conflict );
2809 else
2810 skip = !test->matchTime( &current, 0 );
2811 if ( !skip && !test->doesFloat() ) {
2786 if ( mConflictingEvent->isOverlapping ( test, &retVal, &current ) ) { 2812 if ( mConflictingEvent->isOverlapping ( test, &retVal, &current ) ) {
2787 if ( ! found ) { 2813 if ( ! found ) {
2788 conflict = retVal; 2814 conflict = retVal;
2789 cE = test; 2815 cE = test;
2790 } else { 2816 } else {
2791 if ( retVal < conflict ) { 2817 if ( retVal < conflict ) {
2792 conflict = retVal; 2818 conflict = retVal;
2793 cE = test; 2819 cE = test;
2794 } 2820 }
2795 } 2821 }
2796 found = true; 2822 found = true;
2797 } 2823 }
2798 } 2824 }
2799 test = testlist.next(); 2825 test = testlist.next();
2800 } 2826 }
2801 if ( found ) { 2827 if ( found ) {
2802 QString mess = i18n("The event\n%1\nconflicts with event\n%2\nat date\n%3.\n").arg(KGlobal::formatMessage ( mConflictingEvent->summary(),0 ) ).arg( KGlobal::formatMessage ( cE->summary(),0 )).arg(KGlobal::locale()->formatDate(conflict.date()) ) ; 2828 QString mess = i18n("The event\n%1\nconflicts with event\n%2\nat date\n%3.\n").arg(KGlobal::formatMessage ( mConflictingEvent->summary(),0 ) ).arg( KGlobal::formatMessage ( cE->summary(),0 )).arg(KGlobal::locale()->formatDate(conflict.date()) ) ;
2803 qApp->processEvents(); 2829 qApp->processEvents();
2804 int km = KMessageBox::warningContinueCancel(this,mess, 2830 int km = KMessageBox::warningContinueCancel(this,mess,
2805 i18n("KO/Pi Conflict delected"),i18n("Show date"),i18n("No problem!")); 2831 i18n("KO/Pi Conflict delected"),i18n("Show date"),i18n("No problem!"));
2806 if ( km != KMessageBox::Continue ) 2832 if ( km != KMessageBox::Continue )
2807 return; 2833 return;
2808 2834
2809 if ( mViewManager->currentView() != mViewManager->agendaView() || mNavigator->selectedDates().count() > 1 ) 2835 if ( mViewManager->currentView() != mViewManager->agendaView() || mNavigator->selectedDates().count() > 1 )
2810 mViewManager->showDayView(); 2836 mViewManager->showDayView();
2811 mNavigator->slotDaySelect( conflict.date() ); 2837 mNavigator->slotDaySelect( conflict.date() );
2812 int hour = conflict.time().hour(); 2838 int hour = conflict.time().hour();
2813 mViewManager->agendaView()->setStartHour( hour ); 2839 mViewManager->agendaView()->setStartHour( hour );
2814 topLevelWidget()->setCaption( i18n("Conflict %1 <-> %2"). arg( mConflictingEvent->summary().left( 20 ) ).arg( cE->summary().left( 20 ) ) ); 2840 topLevelWidget()->setCaption( i18n("Conflict %1 <-> %2"). arg( mConflictingEvent->summary().left( 20 ) ).arg( cE->summary().left( 20 ) ) );
2815 } else 2841 } else
2816 topLevelWidget()->setCaption( i18n("No conflict found") ); 2842 topLevelWidget()->setCaption( i18n("No conflict found") );
2817 mConflictingEvent = 0; 2843 mConflictingEvent = 0;
2818 return; 2844 return;
2819 2845
2820} 2846}
2821 2847
2822void CalendarView::updateTodoViews() 2848void CalendarView::updateTodoViews()
2823{ 2849{
2824 mTodoList->updateView(); 2850 mTodoList->updateView();
2825 mViewManager->currentView()->updateView(); 2851 mViewManager->currentView()->updateView();
2826 2852
2827} 2853}
2828 2854
2829 2855
2830 2856
2831void CalendarView::clearAllViews() 2857void CalendarView::clearAllViews()
2832{ 2858{
2833 mTodoList->clearList(); 2859 mTodoList->clearList();
2834 mViewManager->clearAllViews(); 2860 mViewManager->clearAllViews();
2835 SearchDialog * sd = mDialogManager->getSearchDialog(); 2861 SearchDialog * sd = mDialogManager->getSearchDialog();
2836 if ( sd ) { 2862 if ( sd ) {
2837 KOListView* kol = sd->listview(); 2863 KOListView* kol = sd->listview();
2838 if ( kol ) 2864 if ( kol )
2839 kol->clearList(); 2865 kol->clearList();
2840 } 2866 }
2841} 2867}
2842void CalendarView::updateView() 2868void CalendarView::updateView()
2843{ 2869{
2844 static bool clearallviews = false; 2870 static bool clearallviews = false;
2845 if ( KOPrefs::instance()->mGlobalUpdateDisabled ) { 2871 if ( KOPrefs::instance()->mGlobalUpdateDisabled ) {
2846 if ( clearallviews ) { 2872 if ( clearallviews ) {
2847 clearAllViews(); 2873 clearAllViews();
2848 clearallviews = false; 2874 clearallviews = false;
2849 } 2875 }
2850 return; 2876 return;
2851 } 2877 }
2852 clearallviews = true; 2878 clearallviews = true;
2853 DateList tmpList = mNavigator->selectedDates(); 2879 DateList tmpList = mNavigator->selectedDates();
2854 2880
2855 if ( KOPrefs::instance()->mHideNonStartedTodos ) 2881 if ( KOPrefs::instance()->mHideNonStartedTodos )
2856 mTodoList->updateView(); 2882 mTodoList->updateView();
2857 // We assume that the navigator only selects consecutive days. 2883 // We assume that the navigator only selects consecutive days.
2858 updateView( tmpList.first(), tmpList.last() ); 2884 updateView( tmpList.first(), tmpList.last() );
2859} 2885}
2860 2886
2861void CalendarView::updateUnmanagedViews() 2887void CalendarView::updateUnmanagedViews()
2862{ 2888{
2863 mDateNavigator->updateDayMatrix(); 2889 mDateNavigator->updateDayMatrix();
2864} 2890}
2865 2891
2866int CalendarView::msgItemDelete(const QString name) 2892int CalendarView::msgItemDelete(const QString name)
2867{ 2893{
2868 return KMessageBox::warningContinueCancel(this,name +"\n\n"+ 2894 return KMessageBox::warningContinueCancel(this,name +"\n\n"+
2869 i18n("This item will be\npermanently deleted."), 2895 i18n("This item will be\npermanently deleted."),
2870 i18n("KO/Pi Confirmation"),i18n("Delete")); 2896 i18n("KO/Pi Confirmation"),i18n("Delete"));
2871} 2897}
2872 2898
2873 2899
2874void CalendarView::edit_cut() 2900void CalendarView::edit_cut()
2875{ 2901{
2876 Event *anEvent=0; 2902 Event *anEvent=0;
2877 2903
2878 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first(); 2904 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first();
2879 2905
2880 if (mViewManager->currentView()->isEventView()) { 2906 if (mViewManager->currentView()->isEventView()) {
2881 if ( incidence && incidence->typeID() == eventID ) { 2907 if ( incidence && incidence->typeID() == eventID ) {
2882 anEvent = static_cast<Event *>(incidence); 2908 anEvent = static_cast<Event *>(incidence);
2883 } 2909 }
2884 } 2910 }
2885 2911
2886 if (!anEvent) { 2912 if (!anEvent) {
2887 KNotifyClient::beep(); 2913 KNotifyClient::beep();
2888 return; 2914 return;
2889 } 2915 }
2890 DndFactory factory( mCalendar ); 2916 DndFactory factory( mCalendar );
2891 factory.cutIncidence(anEvent); 2917 factory.cutIncidence(anEvent);
2892 changeEventDisplay(anEvent, KOGlobals::EVENTDELETED); 2918 changeEventDisplay(anEvent, KOGlobals::EVENTDELETED);
2893} 2919}
2894 2920
2895void CalendarView::edit_copy() 2921void CalendarView::edit_copy()
2896{ 2922{
2897 Event *anEvent=0; 2923 Event *anEvent=0;
2898 2924
2899 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first(); 2925 Incidence *incidence = mViewManager->currentView()->selectedIncidences().first();
2900 2926
2901 if (mViewManager->currentView()->isEventView()) { 2927 if (mViewManager->currentView()->isEventView()) {
2902 if ( incidence && incidence->typeID() == eventID ) { 2928 if ( incidence && incidence->typeID() == eventID ) {
2903 anEvent = static_cast<Event *>(incidence); 2929 anEvent = static_cast<Event *>(incidence);
2904 } 2930 }
2905 } 2931 }
2906 2932
2907 if (!anEvent) { 2933 if (!anEvent) {
2908 KNotifyClient::beep(); 2934 KNotifyClient::beep();
2909 return; 2935 return;
2910 } 2936 }
2911 DndFactory factory( mCalendar ); 2937 DndFactory factory( mCalendar );
2912 factory.copyIncidence(anEvent); 2938 factory.copyIncidence(anEvent);
2913} 2939}
2914 2940
2915void CalendarView::edit_paste() 2941void CalendarView::edit_paste()
2916{ 2942{
2917 QDate date = mNavigator->selectedDates().first(); 2943 QDate date = mNavigator->selectedDates().first();
2918 2944
2919 DndFactory factory( mCalendar ); 2945 DndFactory factory( mCalendar );
2920 Event *pastedEvent = (Event *)factory.pasteIncidence( date ); 2946 Event *pastedEvent = (Event *)factory.pasteIncidence( date );
2921 2947
2922 changeEventDisplay( pastedEvent, KOGlobals::EVENTADDED ); 2948 changeEventDisplay( pastedEvent, KOGlobals::EVENTADDED );
2923} 2949}
2924void CalendarView::edit_global_options() 2950void CalendarView::edit_global_options()
2925{ 2951{
2926 QString tz = KPimGlobalPrefs::instance()->mTimeZoneId; 2952 QString tz = KPimGlobalPrefs::instance()->mTimeZoneId;
2927 emit save(); 2953 emit save();
2928 emit saveStopTimer(); 2954 emit saveStopTimer();
2929 mDialogManager->showGlobalOptionsDialog(); 2955 mDialogManager->showGlobalOptionsDialog();
2930 if ( tz != KPimGlobalPrefs::instance()->mTimeZoneId) { 2956 if ( tz != KPimGlobalPrefs::instance()->mTimeZoneId) {
2931 emit saveStopTimer(); 2957 emit saveStopTimer();
2932 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, i18n("The timezone has changed!\nShould the calendar be reloaded\nto shift the time of the events?\nPlease read Menu: Help->FAQ:\n\"How do I change the timezone?\"\nas well!"), 2958 if ( KMessageBox::Cancel == KMessageBox::warningContinueCancel(this, i18n("The timezone has changed!\nShould the calendar be reloaded\nto shift the time of the events?\nPlease read Menu: Help->FAQ:\n\"How do I change the timezone?\"\nas well!"),
2933 i18n("Timezone settings"),i18n("Reload"))) { 2959 i18n("Timezone settings"),i18n("Reload"))) {
2934 qDebug("KO: TZ reload cancelled "); 2960 qDebug("KO: TZ reload cancelled ");
2935 mCalendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 2961 mCalendar->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
2936 return; 2962 return;
2937 } 2963 }
2938 qDebug("KO: Timezone change "); 2964 qDebug("KO: Timezone change ");
2939 loadCalendars(); 2965 loadCalendars();
2940 setModified(true); 2966 setModified(true);
2941 } 2967 }
2942 else 2968 else
2943 qDebug("KO: No tz change "); 2969 qDebug("KO: No tz change ");
2944} 2970}
2945void CalendarView::edit_options() 2971void CalendarView::edit_options()
2946{ 2972{
2947 mDialogManager->showOptionsDialog(); 2973 mDialogManager->showOptionsDialog();
2948} 2974}
2949 2975
2950 2976
2951void CalendarView::slotSelectPickerDate( QDate d) 2977void CalendarView::slotSelectPickerDate( QDate d)
2952{ 2978{
2953 mDateFrame->hide(); 2979 mDateFrame->hide();
2954 if ( mDatePickerMode == 1 ) { 2980 if ( mDatePickerMode == 1 ) {
2955 mNavigator->slotDaySelect( d ); 2981 mNavigator->slotDaySelect( d );
2956 } else if ( mDatePickerMode == 2 ) { 2982 } else if ( mDatePickerMode == 2 ) {
2957 if ( mMoveIncidence->typeID() == todoID ) { 2983 if ( mMoveIncidence->typeID() == todoID ) {
2958 Todo * to = (Todo *) mMoveIncidence; 2984 Todo * to = (Todo *) mMoveIncidence;
2959 QTime tim; 2985 QTime tim;
2960 int len = 0; 2986 int len = 0;
2961 if ( to->hasStartDate() && to->hasDueDate() ) 2987 if ( to->hasStartDate() && to->hasDueDate() )
2962 len = to->dtStart().secsTo( to->dtDue()); 2988 len = to->dtStart().secsTo( to->dtDue());
2963 if ( to->hasDueDate() ) 2989 if ( to->hasDueDate() )
2964 tim = to->dtDue().time(); 2990 tim = to->dtDue().time();
2965 else { 2991 else {
2966 tim = QTime ( 0,0,0 ); 2992 tim = QTime ( 0,0,0 );
2967 to->setFloats( true ); 2993 to->setFloats( true );
2968 to->setHasDueDate( true ); 2994 to->setHasDueDate( true );
2969 } 2995 }
2970 QDateTime dt ( d,tim ); 2996 QDateTime dt ( d,tim );
2971 to->setDtDue( dt ); 2997 to->setDtDue( dt );
2972 2998
2973 if ( to->hasStartDate() ) { 2999 if ( to->hasStartDate() ) {
2974 if ( len>0 ) 3000 if ( len>0 )
2975 to->setDtStart(to->dtDue().addSecs( -len )); 3001 to->setDtStart(to->dtDue().addSecs( -len ));
2976 else 3002 else
2977 if (to->dtStart() > to->dtDue() ) 3003 if (to->dtStart() > to->dtDue() )
2978 to->setDtStart(to->dtDue().addDays( -3 )); 3004 to->setDtStart(to->dtDue().addDays( -3 ));
2979 } 3005 }
2980 3006
2981 todoChanged( to ); 3007 todoChanged( to );
2982 } else if ( mMoveIncidence->typeID() == eventID ) { 3008 } else if ( mMoveIncidence->typeID() == eventID ) {
2983 if ( mMoveIncidence->doesRecur() ) { 3009 if ( mMoveIncidence->doesRecur() ) {
2984#if 0 3010#if 0
2985 // PENDING implement this 3011 // PENDING implement this
2986 Incidence* newInc = mMoveIncidence->recreateCloneException( mMoveIncidenceOldDate ); 3012 Incidence* newInc = mMoveIncidence->recreateCloneException( mMoveIncidenceOldDate );
2987 mCalendar()->addIncidence( newInc ); 3013 mCalendar()->addIncidence( newInc );
2988 if ( mMoveIncidence->typeID() == todoID ) 3014 if ( mMoveIncidence->typeID() == todoID )
2989 emit todoMoved((Todo*)mMoveIncidence, KOGlobals::EVENTEDITED ); 3015 emit todoMoved((Todo*)mMoveIncidence, KOGlobals::EVENTEDITED );
2990 else 3016 else
2991 emit incidenceChanged(mMoveIncidence, KOGlobals::EVENTEDITED); 3017 emit incidenceChanged(mMoveIncidence, KOGlobals::EVENTEDITED);
2992 mMoveIncidence = newInc; 3018 mMoveIncidence = newInc;
2993 3019
2994#endif 3020#endif
2995 } 3021 }
2996 QTime tim = mMoveIncidence->dtStart().time(); 3022 QTime tim = mMoveIncidence->dtStart().time();
2997 int secs = mMoveIncidence->dtStart().secsTo( mMoveIncidence->dtEnd()); 3023 int secs = mMoveIncidence->dtStart().secsTo( mMoveIncidence->dtEnd());
2998 QDateTime dt ( d,tim ); 3024 QDateTime dt ( d,tim );
2999 mMoveIncidence->setDtStart( dt ); 3025 mMoveIncidence->setDtStart( dt );
3000 ((Event*)mMoveIncidence)->setDtEnd( dt.addSecs( secs ) ); 3026 ((Event*)mMoveIncidence)->setDtEnd( dt.addSecs( secs ) );
3001 changeEventDisplay((Event*)mMoveIncidence, KOGlobals::EVENTEDITED); 3027 changeEventDisplay((Event*)mMoveIncidence, KOGlobals::EVENTEDITED);
3002 } else if ( mMoveIncidence->typeID() == journalID ) { 3028 } else if ( mMoveIncidence->typeID() == journalID ) {
3003 QTime tim = mMoveIncidence->dtStart().time(); 3029 QTime tim = mMoveIncidence->dtStart().time();
3004 QDateTime dt ( d,tim ); 3030 QDateTime dt ( d,tim );
3005 mMoveIncidence->setDtStart( dt ); 3031 mMoveIncidence->setDtStart( dt );
3006 updateView(); 3032 updateView();
3007 } 3033 }
3008 mMoveIncidence->setRevision( mMoveIncidence->revision()+1 ); 3034 mMoveIncidence->setRevision( mMoveIncidence->revision()+1 );
3009 } 3035 }
3010} 3036}
3011 3037
3012void CalendarView::removeCategories() 3038void CalendarView::removeCategories()
3013{ 3039{
3014 QPtrList<Incidence> incList = mCalendar->rawIncidences(); 3040 QPtrList<Incidence> incList = mCalendar->rawIncidences();
3015 QStringList catList = KOPrefs::instance()->mCustomCategories; 3041 QStringList catList = KOPrefs::instance()->mCustomCategories;
3016 QStringList catIncList; 3042 QStringList catIncList;
3017 QStringList newCatList; 3043 QStringList newCatList;
3018 Incidence* inc = incList.first(); 3044 Incidence* inc = incList.first();
3019 uint i; 3045 uint i;
3020 while ( inc ) { 3046 while ( inc ) {
3021 newCatList.clear(); 3047 newCatList.clear();
3022 catIncList = inc->categories() ; 3048 catIncList = inc->categories() ;
3023 for( i = 0; i< catIncList.count(); ++i ) { 3049 for( i = 0; i< catIncList.count(); ++i ) {
3024 if ( catList.contains (catIncList[i])) 3050 if ( catList.contains (catIncList[i]))
3025 newCatList.append( catIncList[i] ); 3051 newCatList.append( catIncList[i] );
3026 } 3052 }
3027 newCatList.sort(); 3053 newCatList.sort();
3028 inc->setCategories( newCatList.join(",") ); 3054 inc->setCategories( newCatList.join(",") );
3029 inc = incList.next(); 3055 inc = incList.next();
3030 } 3056 }
3031} 3057}
3032 3058
3033int CalendarView::addCategories() 3059int CalendarView::addCategories()
3034{ 3060{
3035 QPtrList<Incidence> incList = mCalendar->rawIncidences(); 3061 QPtrList<Incidence> incList = mCalendar->rawIncidences();
3036 QStringList catList = KOPrefs::instance()->mCustomCategories; 3062 QStringList catList = KOPrefs::instance()->mCustomCategories;
3037 QStringList catIncList; 3063 QStringList catIncList;
3038 Incidence* inc = incList.first(); 3064 Incidence* inc = incList.first();
3039 uint i; 3065 uint i;
3040 int count = 0; 3066 int count = 0;
3041 while ( inc ) { 3067 while ( inc ) {
3042 catIncList = inc->categories() ; 3068 catIncList = inc->categories() ;
3043 for( i = 0; i< catIncList.count(); ++i ) { 3069 for( i = 0; i< catIncList.count(); ++i ) {
3044 if ( !catList.contains (catIncList[i])) { 3070 if ( !catList.contains (catIncList[i])) {
3045 catList.append( catIncList[i] ); 3071 catList.append( catIncList[i] );
3046 //qDebug("add cat %s ", catIncList[i].latin1()); 3072 //qDebug("add cat %s ", catIncList[i].latin1());
3047 ++count; 3073 ++count;
3048 } 3074 }
3049 } 3075 }
3050 inc = incList.next(); 3076 inc = incList.next();
3051 } 3077 }
3052 catList.sort(); 3078 catList.sort();
3053 KOPrefs::instance()->mCustomCategories = catList; 3079 KOPrefs::instance()->mCustomCategories = catList;
3054 return count; 3080 return count;
3055} 3081}
3056 3082
3057void CalendarView::editCategories() 3083void CalendarView::editCategories()
3058{ 3084{
3059 qDebug("CalendarView::editCategories() "); 3085 qDebug("CalendarView::editCategories() ");
3060 KPIM::CategoryEditDialog ced (KOPrefs::instance(),this ); 3086 KPIM::CategoryEditDialog ced (KOPrefs::instance(),this );
3061 ced.exec(); 3087 ced.exec();
3062} 3088}
3063void CalendarView::manageCategories() 3089void CalendarView::manageCategories()
3064{ 3090{
3065 KOCatPrefs* cp = new KOCatPrefs(); 3091 KOCatPrefs* cp = new KOCatPrefs();
3066 cp->show(); 3092 cp->show();
3067 int w =cp->sizeHint().width() ; 3093 int w =cp->sizeHint().width() ;
3068 int h = cp->sizeHint().height() ; 3094 int h = cp->sizeHint().height() ;
3069 int dw = QApplication::desktop()->width(); 3095 int dw = QApplication::desktop()->width();
3070 int dh = QApplication::desktop()->height(); 3096 int dh = QApplication::desktop()->height();
3071 cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 3097 cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
3072 if ( !cp->exec() ) { 3098 if ( !cp->exec() ) {
3073 delete cp; 3099 delete cp;
3074 return; 3100 return;
3075 } 3101 }
3076 int count = 0; 3102 int count = 0;
3077 if ( cp->addCat() ) { 3103 if ( cp->addCat() ) {
3078 count = addCategories(); 3104 count = addCategories();
3079 if ( count ) { 3105 if ( count ) {
3080 topLevelWidget()->setCaption(QString::number( count )+ i18n(" Categories added to list! ")); 3106 topLevelWidget()->setCaption(QString::number( count )+ i18n(" Categories added to list! "));
3081 writeSettings(); 3107 writeSettings();
3082 } else 3108 } else
3083 topLevelWidget()->setCaption(QString::number( 0 )+ i18n(" Categories added to list! ")); 3109 topLevelWidget()->setCaption(QString::number( 0 )+ i18n(" Categories added to list! "));
3084 } else { 3110 } else {
3085 removeCategories(); 3111 removeCategories();
3086 updateView(); 3112 updateView();
3087 } 3113 }
3088 delete cp; 3114 delete cp;
3089} 3115}
3090 3116
3091void CalendarView::beamIncidence(Incidence * Inc) 3117void CalendarView::beamIncidence(Incidence * Inc)
3092{ 3118{
3093 QPtrList<Incidence> delSel ; 3119 QPtrList<Incidence> delSel ;
3094 delSel.append(Inc); 3120 delSel.append(Inc);
3095 beamIncidenceList( delSel ); 3121 beamIncidenceList( delSel );
3096} 3122}
3097void CalendarView::beamCalendar() 3123void CalendarView::beamCalendar()
3098{ 3124{
3099 QPtrList<Incidence> delSel = mCalendar->rawIncidences(); 3125 QPtrList<Incidence> delSel = mCalendar->rawIncidences();
3100 //qDebug("beamCalendar() "); 3126 //qDebug("beamCalendar() ");
3101 beamIncidenceList( delSel ); 3127 beamIncidenceList( delSel );
3102} 3128}
3103void CalendarView::beamFilteredCalendar() 3129void CalendarView::beamFilteredCalendar()
3104{ 3130{
3105 QPtrList<Incidence> delSel = mCalendar->incidences(); 3131 QPtrList<Incidence> delSel = mCalendar->incidences();
3106 //qDebug("beamFilteredCalendar() "); 3132 //qDebug("beamFilteredCalendar() ");
3107 beamIncidenceList( delSel ); 3133 beamIncidenceList( delSel );
3108} 3134}
3109void CalendarView::beamIncidenceList(QPtrList<Incidence> delSel ) 3135void CalendarView::beamIncidenceList(QPtrList<Incidence> delSel )
3110{ 3136{
3111 3137
3112 KOBeamPrefs beamDialog; 3138 KOBeamPrefs beamDialog;
3113 if ( beamDialog.exec () == QDialog::Rejected ) 3139 if ( beamDialog.exec () == QDialog::Rejected )
3114 return; 3140 return;
3115#ifdef DESKTOP_VERSION 3141#ifdef DESKTOP_VERSION
3116 QString fn = locateLocal( "tmp", "kopibeamfile" ); 3142 QString fn = locateLocal( "tmp", "kopibeamfile" );
3117#else 3143#else
3118 QString fn = "/tmp/kopibeamfile"; 3144 QString fn = "/tmp/kopibeamfile";
3119#endif 3145#endif
3120 QString mes; 3146 QString mes;
3121 bool createbup = true; 3147 bool createbup = true;
3122 if ( createbup ) { 3148 if ( createbup ) {
3123 QString description = "\n"; 3149 QString description = "\n";
3124 CalendarLocal* cal = new CalendarLocal(); 3150 CalendarLocal* cal = new CalendarLocal();
3125 if ( beamDialog.beamLocal() ) 3151 if ( beamDialog.beamLocal() )
3126 cal->setLocalTime(); 3152 cal->setLocalTime();
3127 else 3153 else
3128 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 3154 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
3129 Incidence *incidence = delSel.first(); 3155 Incidence *incidence = delSel.first();
3130 bool addText = false; 3156 bool addText = false;
3131 if ( delSel.count() < 10 ) 3157 if ( delSel.count() < 10 )
3132 addText = true; 3158 addText = true;
3133 else { 3159 else {
3134 description.sprintf(i18n(" %d items?"),delSel.count() ); 3160 description.sprintf(i18n(" %d items?"),delSel.count() );
3135 } 3161 }
3136 while ( incidence ) { 3162 while ( incidence ) {
3137 Incidence *in = incidence->clone(); 3163 Incidence *in = incidence->clone();
3138 if ( ! in->summary().isEmpty() ) { 3164 if ( ! in->summary().isEmpty() ) {
3139 in->setDescription(""); 3165 in->setDescription("");
3140 } else { 3166 } else {
3141 in->setSummary( in->description().left(20)); 3167 in->setSummary( in->description().left(20));
3142 in->setDescription(""); 3168 in->setDescription("");
3143 } 3169 }
3144 if ( addText ) 3170 if ( addText )
3145 description += in->summary() + "\n"; 3171 description += in->summary() + "\n";
3146 cal->addIncidence( in ); 3172 cal->addIncidence( in );
3147 incidence = delSel.next(); 3173 incidence = delSel.next();
3148 } 3174 }
3149 if ( beamDialog.beamVcal() ) { 3175 if ( beamDialog.beamVcal() ) {
3150 fn += ".vcs"; 3176 fn += ".vcs";
3151 FileStorage storage( cal, fn, new VCalFormat ); 3177 FileStorage storage( cal, fn, new VCalFormat );
3152 storage.save(); 3178 storage.save();
3153 } else { 3179 } else {
3154 fn += ".ics"; 3180 fn += ".ics";
3155 FileStorage storage( cal, fn, new ICalFormat( ) ); 3181 FileStorage storage( cal, fn, new ICalFormat( ) );
3156 storage.save(); 3182 storage.save();
3157 } 3183 }
3158 delete cal; 3184 delete cal;
3159 mes = i18n("KO/Pi: Ready for beaming"); 3185 mes = i18n("KO/Pi: Ready for beaming");
3160 topLevelWidget()->setCaption(mes); 3186 topLevelWidget()->setCaption(mes);
3161 KApplication::convert2latin1( fn ); 3187 KApplication::convert2latin1( fn );
3162#ifndef DESKTOP_VERSION 3188#ifndef DESKTOP_VERSION
3163 Ir *ir = new Ir( this ); 3189 Ir *ir = new Ir( this );
3164 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); 3190 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
3165 ir->send( fn, description, "text/x-vCalendar" ); 3191 ir->send( fn, description, "text/x-vCalendar" );
3166#endif 3192#endif
3167 } 3193 }
3168} 3194}
3169 3195
3170#ifndef DESKTOP_VERSION 3196#ifndef DESKTOP_VERSION
3171void CalendarView::beamDone( Ir *ir ) 3197void CalendarView::beamDone( Ir *ir )
3172{ 3198{
3173 delete ir; 3199 delete ir;
3174 topLevelWidget()->setCaption( i18n("KO/Pi: Beaming done.") ); 3200 topLevelWidget()->setCaption( i18n("KO/Pi: Beaming done.") );
3175 topLevelWidget()->raise(); 3201 topLevelWidget()->raise();
3176} 3202}
3177#else 3203#else
3178void CalendarView::beamDone( Ir *){;} 3204void CalendarView::beamDone( Ir *){;}
3179#endif 3205#endif
3180void CalendarView::moveIncidence(Incidence * inc ) 3206void CalendarView::moveIncidence(Incidence * inc )
3181{ 3207{
3182 if ( !inc ) return; 3208 if ( !inc ) return;
3183 showDatePickerPopup(); 3209 showDatePickerPopup();
3184 mDatePickerMode = 2; 3210 mDatePickerMode = 2;
3185 mMoveIncidence = inc ; 3211 mMoveIncidence = inc ;
3186 QDate da; 3212 QDate da;
3187 if ( mMoveIncidence->typeID() == todoID ) { 3213 if ( mMoveIncidence->typeID() == todoID ) {
3188 Todo * to = (Todo *) mMoveIncidence; 3214 Todo * to = (Todo *) mMoveIncidence;
3189 if ( to->hasDueDate() ) 3215 if ( to->hasDueDate() )
3190 da = to->dtDue().date(); 3216 da = to->dtDue().date();
3191 else 3217 else
3192 da = QDate::currentDate(); 3218 da = QDate::currentDate();
3193 } else { 3219 } else {
3194 da = mMoveIncidence->dtStart().date(); 3220 da = mMoveIncidence->dtStart().date();
3195 } 3221 }
3196 //PENDING set date for recurring incidence to date of recurrence 3222 //PENDING set date for recurring incidence to date of recurrence
3197 //mMoveIncidenceOldDate; 3223 //mMoveIncidenceOldDate;
3198 mDatePicker->setDate( da ); 3224 mDatePicker->setDate( da );
3199} 3225}
3200void CalendarView::showDatePickerPopup() 3226void CalendarView::showDatePickerPopup()
3201{ 3227{
3202 if ( mDateFrame->isVisible() ) 3228 if ( mDateFrame->isVisible() )
3203 mDateFrame->hide(); 3229 mDateFrame->hide();
3204 else { 3230 else {
3205 int offX = 0, offY = 0; 3231 int offX = 0, offY = 0;
3206#ifdef DESKTOP_VERSION 3232#ifdef DESKTOP_VERSION
3207 int w =mDatePicker->sizeHint().width() ; 3233 int w =mDatePicker->sizeHint().width() ;
3208 int h = mDatePicker->sizeHint().height() ; 3234 int h = mDatePicker->sizeHint().height() ;
3209 int dw = topLevelWidget()->width(); 3235 int dw = topLevelWidget()->width();
3210 int dh = topLevelWidget()->height(); 3236 int dh = topLevelWidget()->height();
3211 offX = topLevelWidget()->x(); 3237 offX = topLevelWidget()->x();
3212 offY = topLevelWidget()->y(); 3238 offY = topLevelWidget()->y();
3213#else 3239#else
3214 int w =mDatePicker->sizeHint().width() ; 3240 int w =mDatePicker->sizeHint().width() ;
3215 int h = mDatePicker->sizeHint().height() ; 3241 int h = mDatePicker->sizeHint().height() ;
3216 int dw = QApplication::desktop()->width(); 3242 int dw = QApplication::desktop()->width();
3217 int dh = QApplication::desktop()->height(); 3243 int dh = QApplication::desktop()->height();
3218#endif 3244#endif
3219 mDateFrame->setGeometry( (dw-w)/2+offX, (dh - h )/2+offY ,w,h ); 3245 mDateFrame->setGeometry( (dw-w)/2+offX, (dh - h )/2+offY ,w,h );
3220 mDateFrame->show(); 3246 mDateFrame->show();
3221 } 3247 }
3222} 3248}
3223void CalendarView::showDatePicker( ) 3249void CalendarView::showDatePicker( )
3224{ 3250{
3225 showDatePickerPopup(); 3251 showDatePickerPopup();
3226 mDatePickerMode = 1; 3252 mDatePickerMode = 1;
3227 mDatePicker->setDate( mNavigator->selectedDates().first() ); 3253 mDatePicker->setDate( mNavigator->selectedDates().first() );
3228} 3254}
3229 3255
3230void CalendarView::showEventEditor() 3256void CalendarView::showEventEditor()
3231{ 3257{
3232#ifdef DESKTOP_VERSION 3258#ifdef DESKTOP_VERSION
3233 int x,y,w,h; 3259 int x,y,w,h;
3234 x = mEventEditor->geometry().x(); 3260 x = mEventEditor->geometry().x();
3235 y = mEventEditor->geometry().y(); 3261 y = mEventEditor->geometry().y();
3236 w = mEventEditor->width(); 3262 w = mEventEditor->width();
3237 h = mEventEditor->height(); 3263 h = mEventEditor->height();
3238 mEventEditor->show(); 3264 mEventEditor->show();
3239 mEventEditor->setGeometry(x,y,w,h); 3265 mEventEditor->setGeometry(x,y,w,h);
3240#else 3266#else
3241 if ( mEventEditor->width() < QApplication::desktop()->width() -60 || mEventEditor->width() > QApplication::desktop()->width() ) { 3267 if ( mEventEditor->width() < QApplication::desktop()->width() -60 || mEventEditor->width() > QApplication::desktop()->width() ) {
3242 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") ); 3268 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") );
3243 qDebug("KO: CalendarView: recreate mEventEditor %d %d", mEventEditor->width(), QApplication::desktop()->width() ); 3269 qDebug("KO: CalendarView: recreate mEventEditor %d %d", mEventEditor->width(), QApplication::desktop()->width() );
3244 qApp->processEvents(); 3270 qApp->processEvents();
3245 delete mEventEditor; 3271 delete mEventEditor;
3246 mEventEditor = mDialogManager->getEventEditor(); 3272 mEventEditor = mDialogManager->getEventEditor();
3247 topLevelWidget()->setCaption( i18n("") ); 3273 topLevelWidget()->setCaption( i18n("") );
3248 } 3274 }
3249 mEventEditor->showMaximized(); 3275 mEventEditor->showMaximized();
3250#endif 3276#endif
3251} 3277}
3252void CalendarView::showTodoEditor() 3278void CalendarView::showTodoEditor()
3253{ 3279{
3254#ifdef DESKTOP_VERSION 3280#ifdef DESKTOP_VERSION
3255 int x,y,w,h; 3281 int x,y,w,h;
3256 x = mTodoEditor->geometry().x(); 3282 x = mTodoEditor->geometry().x();
3257 y = mTodoEditor->geometry().y(); 3283 y = mTodoEditor->geometry().y();
3258 w = mTodoEditor->width(); 3284 w = mTodoEditor->width();
3259 h = mTodoEditor->height(); 3285 h = mTodoEditor->height();
3260 mTodoEditor->show(); 3286 mTodoEditor->show();
3261 mTodoEditor->setGeometry(x,y,w,h); 3287 mTodoEditor->setGeometry(x,y,w,h);
3262#else 3288#else
3263 if ( mTodoEditor->width() < QApplication::desktop()->width() -60|| mTodoEditor->width() > QApplication::desktop()->width() ) { 3289 if ( mTodoEditor->width() < QApplication::desktop()->width() -60|| mTodoEditor->width() > QApplication::desktop()->width() ) {
3264 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") ); 3290 topLevelWidget()->setCaption( i18n("Recreating edit dialog. Please wait...") );
3265 qDebug("KO: CalendarView: recreate mTodoEditor %d %d ", mTodoEditor->width() ,QApplication::desktop()->width() ); 3291 qDebug("KO: CalendarView: recreate mTodoEditor %d %d ", mTodoEditor->width() ,QApplication::desktop()->width() );
3266 qApp->processEvents(); 3292 qApp->processEvents();
3267 delete mTodoEditor; 3293 delete mTodoEditor;
3268 mTodoEditor = mDialogManager->getTodoEditor(); 3294 mTodoEditor = mDialogManager->getTodoEditor();
3269 topLevelWidget()->setCaption( i18n("") ); 3295 topLevelWidget()->setCaption( i18n("") );
3270 } 3296 }
3271 mTodoEditor->showMaximized(); 3297 mTodoEditor->showMaximized();
3272#endif 3298#endif
3273} 3299}
3274 3300
3275void CalendarView::cloneIncidence() 3301void CalendarView::cloneIncidence()
3276{ 3302{
3277 Incidence *incidence = currentSelection(); 3303 Incidence *incidence = currentSelection();
3278 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3304 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3279 if ( incidence ) { 3305 if ( incidence ) {
3280 cloneIncidence(incidence); 3306 cloneIncidence(incidence);
3281 } 3307 }
3282} 3308}
3283void CalendarView::moveIncidence() 3309void CalendarView::moveIncidence()
3284{ 3310{
3285 Incidence *incidence = currentSelection(); 3311 Incidence *incidence = currentSelection();
3286 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3312 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3287 if ( incidence ) { 3313 if ( incidence ) {
3288 moveIncidence(incidence); 3314 moveIncidence(incidence);
3289 } 3315 }
3290} 3316}
3291void CalendarView::beamIncidence() 3317void CalendarView::beamIncidence()
3292{ 3318{
3293 Incidence *incidence = currentSelection(); 3319 Incidence *incidence = currentSelection();
3294 if ( !incidence ) incidence = mTodoList->selectedIncidences().first(); 3320 if ( !incidence ) incidence = mTodoList->selectedIncidences().first();
3295 if ( incidence ) { 3321 if ( incidence ) {
3296 beamIncidence(incidence); 3322 beamIncidence(incidence);
3297 } 3323 }
diff --git a/libkcal/event.cpp b/libkcal/event.cpp
index 5285559..ad66639 100644
--- a/libkcal/event.cpp
+++ b/libkcal/event.cpp
@@ -1,395 +1,415 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24 24
25#include "event.h" 25#include "event.h"
26 26
27using namespace KCal; 27using namespace KCal;
28 28
29Event::Event() : 29Event::Event() :
30 mHasEndDate( false ), mTransparency( Opaque ) 30 mHasEndDate( false ), mTransparency( Opaque )
31{ 31{
32} 32}
33 33
34Event::Event(const Event &e) : Incidence(e) 34Event::Event(const Event &e) : Incidence(e)
35{ 35{
36 mDtEnd = e.mDtEnd; 36 mDtEnd = e.mDtEnd;
37 mHasEndDate = e.mHasEndDate; 37 mHasEndDate = e.mHasEndDate;
38 mTransparency = e.mTransparency; 38 mTransparency = e.mTransparency;
39} 39}
40 40
41Event::~Event() 41Event::~Event()
42{ 42{
43} 43}
44 44
45Incidence *Event::clone() 45Incidence *Event::clone()
46{ 46{
47 return new Event(*this); 47 return new Event(*this);
48} 48}
49 49
50bool KCal::operator==( const Event& e1, const Event& e2 ) 50bool KCal::operator==( const Event& e1, const Event& e2 )
51{ 51{
52 return operator==( (const Incidence&)e1, (const Incidence&)e2 ) && 52 return operator==( (const Incidence&)e1, (const Incidence&)e2 ) &&
53 e1.dtEnd() == e2.dtEnd() && 53 e1.dtEnd() == e2.dtEnd() &&
54 e1.hasEndDate() == e2.hasEndDate() && 54 e1.hasEndDate() == e2.hasEndDate() &&
55 e1.transparency() == e2.transparency(); 55 e1.transparency() == e2.transparency();
56} 56}
57 57
58 58
59bool Event::contains ( Event* from ) 59bool Event::contains ( Event* from )
60{ 60{
61 61
62 if ( !from->summary().isEmpty() ) 62 if ( !from->summary().isEmpty() )
63 if ( !summary().startsWith( from->summary() )) 63 if ( !summary().startsWith( from->summary() ))
64 return false; 64 return false;
65 if ( from->dtStart().isValid() ) 65 if ( from->dtStart().isValid() )
66 if (dtStart() != from->dtStart() ) 66 if (dtStart() != from->dtStart() )
67 return false; 67 return false;
68 if ( from->dtEnd().isValid() ) 68 if ( from->dtEnd().isValid() )
69 if ( dtEnd() != from->dtEnd() ) 69 if ( dtEnd() != from->dtEnd() )
70 return false; 70 return false;
71 if ( !from->location().isEmpty() ) 71 if ( !from->location().isEmpty() )
72 if ( !location().startsWith( from->location() ) ) 72 if ( !location().startsWith( from->location() ) )
73 return false; 73 return false;
74 if ( !from->description().isEmpty() ) 74 if ( !from->description().isEmpty() )
75 if ( !description().startsWith( from->description() )) 75 if ( !description().startsWith( from->description() ))
76 return false; 76 return false;
77 if ( from->alarms().count() ) { 77 if ( from->alarms().count() ) {
78 Alarm *a = from->alarms().first(); 78 Alarm *a = from->alarms().first();
79 if ( a->enabled() ){ 79 if ( a->enabled() ){
80 if ( !alarms().count() ) 80 if ( !alarms().count() )
81 return false; 81 return false;
82 Alarm *b = alarms().first(); 82 Alarm *b = alarms().first();
83 if( ! b->enabled() ) 83 if( ! b->enabled() )
84 return false; 84 return false;
85 if ( ! (a->offset() == b->offset() )) 85 if ( ! (a->offset() == b->offset() ))
86 return false; 86 return false;
87 } 87 }
88 } 88 }
89 QStringList cat = categories(); 89 QStringList cat = categories();
90 QStringList catFrom = from->categories(); 90 QStringList catFrom = from->categories();
91 QString nCat; 91 QString nCat;
92 unsigned int iii; 92 unsigned int iii;
93 for ( iii = 0; iii < catFrom.count();++iii ) { 93 for ( iii = 0; iii < catFrom.count();++iii ) {
94 nCat = catFrom[iii]; 94 nCat = catFrom[iii];
95 if ( !nCat.isEmpty() ) 95 if ( !nCat.isEmpty() )
96 if ( !cat.contains( nCat )) { 96 if ( !cat.contains( nCat )) {
97 return false; 97 return false;
98 } 98 }
99 } 99 }
100 if ( from->doesRecur() ) 100 if ( from->doesRecur() )
101 if ( from->doesRecur() != doesRecur() && ! (from->doesRecur()== Recurrence::rYearlyMonth && doesRecur()== Recurrence::rYearlyDay) ) 101 if ( from->doesRecur() != doesRecur() && ! (from->doesRecur()== Recurrence::rYearlyMonth && doesRecur()== Recurrence::rYearlyDay) )
102 return false; 102 return false;
103 return true; 103 return true;
104} 104}
105 105
106void Event::setDtEnd(const QDateTime &dtEnd) 106void Event::setDtEnd(const QDateTime &dtEnd)
107{ 107{
108 if (mReadOnly) return; 108 if (mReadOnly) return;
109 109
110 mDtEnd = getEvenTime( dtEnd ); 110 mDtEnd = getEvenTime( dtEnd );
111 111
112 setHasEndDate(true); 112 setHasEndDate(true);
113 setHasDuration(false); 113 setHasDuration(false);
114 114
115 updated(); 115 updated();
116} 116}
117 117
118QDateTime Event::dtEnd() const 118QDateTime Event::dtEnd() const
119{ 119{
120 if (hasEndDate()) return mDtEnd; 120 if (hasEndDate()) return mDtEnd;
121 if (hasDuration()) return dtStart().addSecs(duration()); 121 if (hasDuration()) return dtStart().addSecs(duration());
122 122
123 return dtStart(); 123 return dtStart();
124} 124}
125 125
126QString Event::dtEndTimeStr() const 126QString Event::dtEndTimeStr() const
127{ 127{
128 return KGlobal::locale()->formatTime(mDtEnd.time()); 128 return KGlobal::locale()->formatTime(mDtEnd.time());
129} 129}
130 130
131QString Event::dtEndDateStr(bool shortfmt) const 131QString Event::dtEndDateStr(bool shortfmt) const
132{ 132{
133 return KGlobal::locale()->formatDate(mDtEnd.date(),shortfmt); 133 return KGlobal::locale()->formatDate(mDtEnd.date(),shortfmt);
134} 134}
135 135
136QString Event::dtEndStr(bool shortfmt) const 136QString Event::dtEndStr(bool shortfmt) const
137{ 137{
138 return KGlobal::locale()->formatDateTime(mDtEnd, shortfmt); 138 return KGlobal::locale()->formatDateTime(mDtEnd, shortfmt);
139} 139}
140 140
141void Event::setHasEndDate(bool b) 141void Event::setHasEndDate(bool b)
142{ 142{
143 mHasEndDate = b; 143 mHasEndDate = b;
144} 144}
145 145
146bool Event::hasEndDate() const 146bool Event::hasEndDate() const
147{ 147{
148 return mHasEndDate; 148 return mHasEndDate;
149} 149}
150 150
151bool Event::isMultiDay() const 151bool Event::isMultiDay() const
152{ 152{
153 bool multi = !(dtStart().date() == dtEnd().date()); 153 bool multi = !(dtStart().date() == dtEnd().date());
154 return multi; 154 return multi;
155} 155}
156 156
157void Event::setTransparency(Event::Transparency transparency) 157void Event::setTransparency(Event::Transparency transparency)
158{ 158{
159 if (mReadOnly) return; 159 if (mReadOnly) return;
160 mTransparency = transparency; 160 mTransparency = transparency;
161 updated(); 161 updated();
162} 162}
163 163
164Event::Transparency Event::transparency() const 164Event::Transparency Event::transparency() const
165{ 165{
166 return mTransparency; 166 return mTransparency;
167} 167}
168 168
169void Event::setDuration(int seconds) 169void Event::setDuration(int seconds)
170{ 170{
171 setHasEndDate(false); 171 setHasEndDate(false);
172 Incidence::setDuration(seconds); 172 Incidence::setDuration(seconds);
173} 173}
174bool Event::matchTime(QDateTime*startDT, QDateTime* endDT)
175{
176 if ( ! doesRecur() ) {
177 if ( doesFloat() ) {
178 if ( mDtEnd.addDays( 1 ) < *startDT)
179 return false;
180 if ( endDT && mDtStart > * endDT)
181 return false;
182 } else {
183 if ( mDtEnd < *startDT )
184 return false;
185 if ( endDT && mDtStart > * endDT)
186 return false;
187 }
188 } else {
189 if ( endDT && mDtStart > * endDT)
190 return false;
191 }
192 return true;
193}
174bool Event::isOverlapping ( Event* testEvent, QDateTime* overlapDT, QDateTime* startDT ) 194bool Event::isOverlapping ( Event* testEvent, QDateTime* overlapDT, QDateTime* startDT )
175{ 195{
176 if ( testEvent == this ) 196 if ( testEvent == this )
177 return false; 197 return false;
178 if ( ! doesRecur() && !testEvent->doesRecur() ) { 198 if ( ! doesRecur() && !testEvent->doesRecur() ) {
179 QDateTime te; 199 QDateTime te;
180 if ( testEvent->doesFloat() ) 200 if ( testEvent->doesFloat() )
181 te = testEvent->mDtEnd.addDays( 1 ); 201 te = testEvent->mDtEnd.addDays( 1 );
182 else 202 else
183 te = testEvent->mDtEnd; 203 te = testEvent->mDtEnd;
184 QDateTime e; 204 QDateTime e;
185 if ( doesFloat() ) 205 if ( doesFloat() )
186 e = mDtEnd.addDays( 1 ); 206 e = mDtEnd.addDays( 1 );
187 else 207 else
188 e = mDtEnd; 208 e = mDtEnd;
189 if ( mDtStart < te && testEvent->mDtStart < e ) { 209 if ( mDtStart < te && testEvent->mDtStart < e ) {
190 if ( mDtStart < testEvent->mDtStart ) 210 if ( mDtStart < testEvent->mDtStart )
191 *overlapDT = testEvent->mDtStart; 211 *overlapDT = testEvent->mDtStart;
192 else 212 else
193 *overlapDT = mDtStart; 213 *overlapDT = mDtStart;
194 if ( startDT ) 214 if ( startDT )
195 return (*overlapDT >= *startDT ); 215 return (*overlapDT >= *startDT );
196 return true; 216 return true;
197 } 217 }
198 return false; 218 return false;
199 } 219 }
200 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) { 220 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) {
201 if ( mDtStart.time() >= testEvent->mDtEnd.time() || testEvent->mDtStart.time() >= mDtEnd.time() ) { 221 if ( mDtStart.time() >= testEvent->mDtEnd.time() || testEvent->mDtStart.time() >= mDtEnd.time() ) {
202 // no need to test. times mismatch 222 // no need to test. times mismatch
203 //fprintf(stderr,"timi "); 223 //fprintf(stderr,"timi ");
204 return false; 224 return false;
205 } 225 }
206 } 226 }
207 Event *nonRecur = 0; 227 Event *nonRecur = 0;
208 Event *recurEvent = 0; 228 Event *recurEvent = 0;
209 if ( ! doesRecur() ) { 229 if ( ! doesRecur() ) {
210 nonRecur = this; 230 nonRecur = this;
211 recurEvent = testEvent; 231 recurEvent = testEvent;
212 } 232 }
213 else if ( !testEvent->doesRecur() ) { 233 else if ( !testEvent->doesRecur() ) {
214 nonRecur = testEvent; 234 nonRecur = testEvent;
215 recurEvent = this; 235 recurEvent = this;
216 } 236 }
217 if ( nonRecur ) { 237 if ( nonRecur ) {
218 QDateTime enr; 238 QDateTime enr;
219 if ( nonRecur->doesFloat() ) 239 if ( nonRecur->doesFloat() )
220 enr = nonRecur->mDtEnd.addDays( 1 ); 240 enr = nonRecur->mDtEnd.addDays( 1 );
221 else 241 else
222 enr = nonRecur->mDtEnd; 242 enr = nonRecur->mDtEnd;
223 if ( enr < recurEvent->mDtStart ) 243 if ( enr < recurEvent->mDtStart )
224 return false; 244 return false;
225 if ( startDT && enr < *startDT ) 245 if ( startDT && enr < *startDT )
226 return false; 246 return false;
227 247
228 int recDuration = recurEvent->mDtStart.secsTo( recurEvent->mDtEnd ); 248 int recDuration = recurEvent->mDtStart.secsTo( recurEvent->mDtEnd );
229 if ( recurEvent->doesFloat() ) 249 if ( recurEvent->doesFloat() )
230 recDuration += 86400; 250 recDuration += 86400;
231 bool ok = false; 251 bool ok = false;
232 QDateTime recStart; 252 QDateTime recStart;
233 if ( startDT ) { 253 if ( startDT ) {
234 recStart = recurEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok ); 254 recStart = recurEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
235 } 255 }
236 if ( recStart.isValid() ) { 256 if ( recStart.isValid() ) {
237 //qDebug("%s start at %s ", startDT-> toString().latin1(), recStart.toString().latin1()); 257 //qDebug("%s start at %s ", startDT-> toString().latin1(), recStart.toString().latin1());
238 recStart = recStart.addSecs( -300); 258 recStart = recStart.addSecs( -300);
239 } 259 }
240 else 260 else
241 recStart = recurEvent->mDtStart.addSecs( -300); 261 recStart = recurEvent->mDtStart.addSecs( -300);
242 ok = true; 262 ok = true;
243 263
244 while ( ok ) { 264 while ( ok ) {
245 recStart = recurEvent->getNextOccurence( recStart.addSecs( 60 ), &ok ); 265 recStart = recurEvent->getNextOccurence( recStart.addSecs( 60 ), &ok );
246 if ( ok ) { 266 if ( ok ) {
247 if ( recStart > enr ) 267 if ( recStart > enr )
248 return false; 268 return false;
249 QDateTime recEnd = recStart.addSecs( recDuration ); 269 QDateTime recEnd = recStart.addSecs( recDuration );
250 if ( nonRecur->mDtStart < recEnd && recStart < nonRecur->mDtEnd ) { 270 if ( nonRecur->mDtStart < recEnd && recStart < nonRecur->mDtEnd ) {
251 if ( nonRecur->mDtStart < recStart ) 271 if ( nonRecur->mDtStart < recStart )
252 *overlapDT = recStart; 272 *overlapDT = recStart;
253 else 273 else
254 *overlapDT = nonRecur->mDtStart; 274 *overlapDT = nonRecur->mDtStart;
255 if ( startDT ) { 275 if ( startDT ) {
256 if ( *overlapDT >= *startDT ) 276 if ( *overlapDT >= *startDT )
257 return true; 277 return true;
258 } else 278 } else
259 return true; 279 return true;
260 } 280 }
261 } 281 }
262 } 282 }
263 return false; 283 return false;
264 } 284 }
265 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) { 285 if ( !doesFloat() && !testEvent->doesFloat() && !isMultiDay() && !testEvent->isMultiDay() ) {
266 if ( recurrence()->doesRecur() == Recurrence::rWeekly && testEvent->recurrence()->doesRecur() == Recurrence::rWeekly ) { 286 if ( recurrence()->doesRecur() == Recurrence::rWeekly && testEvent->recurrence()->doesRecur() == Recurrence::rWeekly ) {
267 bool found = false; 287 bool found = false;
268 uint i; 288 uint i;
269 for ( i=0; i< recurrence()->days().size();++i ) { 289 for ( i=0; i< recurrence()->days().size();++i ) {
270 found = found || (recurrence()->days().testBit( i ) && testEvent->recurrence()->days().testBit( i ) ); 290 found = found || (recurrence()->days().testBit( i ) && testEvent->recurrence()->days().testBit( i ) );
271 } 291 }
272 if ( ! found ) { 292 if ( ! found ) {
273 //qDebug("recurring days mismatch %s -- %s", summary().latin1(),testEvent->summary().latin1()); 293 //qDebug("recurring days mismatch %s -- %s", summary().latin1(),testEvent->summary().latin1());
274 return false; 294 return false;
275 } 295 }
276 296
277 } 297 }
278 } 298 }
279 bool ok = true; 299 bool ok = true;
280 QDateTime incidenceStart;// = mDtStart; 300 QDateTime incidenceStart;// = mDtStart;
281 QDateTime testincidenceStart;// = testEvent->mDtStart; 301 QDateTime testincidenceStart;// = testEvent->mDtStart;
282 if ( startDT ) { 302 if ( startDT ) {
283 incidenceStart = recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok ); 303 incidenceStart = recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
284 testincidenceStart = testEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok ); 304 testincidenceStart = testEvent->recurrence()->getPreviousDateTime( startDT->addSecs( 61 ), &ok );
285 } 305 }
286 if ( !testincidenceStart.isValid() ) 306 if ( !testincidenceStart.isValid() )
287 testincidenceStart = testEvent->mDtStart; 307 testincidenceStart = testEvent->mDtStart;
288 if ( !incidenceStart.isValid() ) 308 if ( !incidenceStart.isValid() )
289 incidenceStart = mDtStart; 309 incidenceStart = mDtStart;
290 int duration = mDtStart.secsTo( mDtEnd ); 310 int duration = mDtStart.secsTo( mDtEnd );
291 if ( doesFloat() ) 311 if ( doesFloat() )
292 duration += 86400; 312 duration += 86400;
293 int testduration = testEvent->mDtStart.secsTo( testEvent->mDtEnd ); 313 int testduration = testEvent->mDtStart.secsTo( testEvent->mDtEnd );
294 if ( testEvent->doesFloat() ) 314 if ( testEvent->doesFloat() )
295 testduration += 86400; 315 testduration += 86400;
296 bool computeThis = false; 316 bool computeThis = false;
297 if ( incidenceStart < testincidenceStart ) 317 if ( incidenceStart < testincidenceStart )
298 computeThis = true; 318 computeThis = true;
299 if ( computeThis ) 319 if ( computeThis )
300 incidenceStart = incidenceStart.addSecs( -300 ); 320 incidenceStart = incidenceStart.addSecs( -300 );
301 else 321 else
302 testincidenceStart = testincidenceStart.addSecs( -300 ); 322 testincidenceStart = testincidenceStart.addSecs( -300 );
303 int count = 0; 323 int count = 0;
304 ok = true; 324 ok = true;
305 int countbreak = 2000; 325 int countbreak = 2000;
306 QDateTime stopSearch; 326 QDateTime stopSearch;
307 bool testStop = false; 327 bool testStop = false;
308 if ( startDT ) { 328 if ( startDT ) {
309 stopSearch = startDT->addDays( 365*3 ); 329 stopSearch = startDT->addDays( 365*3 );
310 testStop = true; 330 testStop = true;
311 } 331 }
312 while ( ok ) { 332 while ( ok ) {
313 ++count; 333 ++count;
314 if ( count > countbreak ) break; 334 if ( count > countbreak ) break;
315 if ( computeThis ) { 335 if ( computeThis ) {
316 if ( testStop ) 336 if ( testStop )
317 if ( testincidenceStart > stopSearch ) 337 if ( testincidenceStart > stopSearch )
318 break; 338 break;
319 incidenceStart = getNextOccurence( incidenceStart.addSecs( 60 ), &ok ); 339 incidenceStart = getNextOccurence( incidenceStart.addSecs( 60 ), &ok );
320 } 340 }
321 else { 341 else {
322 if ( testStop ) 342 if ( testStop )
323 if ( incidenceStart > stopSearch ) 343 if ( incidenceStart > stopSearch )
324 break; 344 break;
325 testincidenceStart = testEvent->getNextOccurence( testincidenceStart.addSecs( 60 ), &ok ); 345 testincidenceStart = testEvent->getNextOccurence( testincidenceStart.addSecs( 60 ), &ok );
326 } 346 }
327 if ( ok ) { 347 if ( ok ) {
328 if ( incidenceStart < testincidenceStart.addSecs( testduration ) && testincidenceStart < incidenceStart.addSecs( duration ) ) { 348 if ( incidenceStart < testincidenceStart.addSecs( testduration ) && testincidenceStart < incidenceStart.addSecs( duration ) ) {
329 if ( incidenceStart < testincidenceStart ) 349 if ( incidenceStart < testincidenceStart )
330 *overlapDT = testincidenceStart; 350 *overlapDT = testincidenceStart;
331 else 351 else
332 *overlapDT = incidenceStart; 352 *overlapDT = incidenceStart;
333 if ( startDT ) { 353 if ( startDT ) {
334 if ( *overlapDT >= *startDT ) 354 if ( *overlapDT >= *startDT )
335 return true; 355 return true;
336 } else 356 } else
337 return true; 357 return true;
338 } 358 }
339 computeThis = ( incidenceStart < testincidenceStart ); 359 computeThis = ( incidenceStart < testincidenceStart );
340 } 360 }
341 361
342 } 362 }
343 //qDebug("%d rec counter stopped at %d - %s %s", ok ,count, summary().latin1(),testEvent->summary().latin1() ); 363 //qDebug("%d rec counter stopped at %d - %s %s", ok ,count, summary().latin1(),testEvent->summary().latin1() );
344 return false; 364 return false;
345} 365}
346QDateTime Event::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const 366QDateTime Event::getNextAlarmDateTime( bool * ok, int * offset, QDateTime start_dt ) const
347{ 367{
348 *ok = false; 368 *ok = false;
349 if ( !alarmEnabled() ) 369 if ( !alarmEnabled() )
350 return QDateTime (); 370 return QDateTime ();
351 bool yes; 371 bool yes;
352 QDateTime incidenceStart = getNextOccurence( start_dt, &yes ); 372 QDateTime incidenceStart = getNextOccurence( start_dt, &yes );
353 if ( ! yes || cancelled() ) { 373 if ( ! yes || cancelled() ) {
354 *ok = false; 374 *ok = false;
355 return QDateTime (); 375 return QDateTime ();
356 } 376 }
357 377
358 bool enabled = false; 378 bool enabled = false;
359 Alarm* alarm; 379 Alarm* alarm;
360 int off = 0; 380 int off = 0;
361 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );; 381 QDateTime alarmStart = QDateTime::currentDateTime().addDays( 3650 );;
362 // if ( QDateTime::currentDateTime() > incidenceStart ){ 382 // if ( QDateTime::currentDateTime() > incidenceStart ){
363// *ok = false; 383// *ok = false;
364// return incidenceStart; 384// return incidenceStart;
365// } 385// }
366 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) { 386 for (QPtrListIterator<Alarm> it(mAlarms); (alarm = it.current()) != 0; ++it) {
367 if (alarm->enabled()) { 387 if (alarm->enabled()) {
368 if ( alarm->hasTime () ) { 388 if ( alarm->hasTime () ) {
369 if ( alarm->time() < alarmStart ) { 389 if ( alarm->time() < alarmStart ) {
370 alarmStart = alarm->time(); 390 alarmStart = alarm->time();
371 enabled = true; 391 enabled = true;
372 off = alarmStart.secsTo( incidenceStart ); 392 off = alarmStart.secsTo( incidenceStart );
373 } 393 }
374 394
375 } else { 395 } else {
376 int secs = alarm->startOffset().asSeconds(); 396 int secs = alarm->startOffset().asSeconds();
377 if ( incidenceStart.addSecs( secs ) < alarmStart ) { 397 if ( incidenceStart.addSecs( secs ) < alarmStart ) {
378 alarmStart = incidenceStart.addSecs( secs ); 398 alarmStart = incidenceStart.addSecs( secs );
379 enabled = true; 399 enabled = true;
380 off = -secs; 400 off = -secs;
381 } 401 }
382 } 402 }
383 } 403 }
384 } 404 }
385 if ( enabled ) { 405 if ( enabled ) {
386 if ( alarmStart > start_dt ) { 406 if ( alarmStart > start_dt ) {
387 *ok = true; 407 *ok = true;
388 * offset = off; 408 * offset = off;
389 return alarmStart; 409 return alarmStart;
390 } 410 }
391 } 411 }
392 *ok = false; 412 *ok = false;
393 return QDateTime (); 413 return QDateTime ();
394 414
395} 415}
diff --git a/libkcal/event.h b/libkcal/event.h
index e6055a5..2da9770 100644
--- a/libkcal/event.h
+++ b/libkcal/event.h
@@ -1,93 +1,94 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#ifndef EVENT_H 21#ifndef EVENT_H
22#define EVENT_H 22#define EVENT_H
23// 23//
24// Event component, representing a VEVENT object 24// Event component, representing a VEVENT object
25// 25//
26 26
27#include "incidence.h" 27#include "incidence.h"
28namespace KCal { 28namespace KCal {
29 29
30/** 30/**
31 This class provides an Event in the sense of RFC2445. 31 This class provides an Event in the sense of RFC2445.
32*/ 32*/
33class Event : public Incidence 33class Event : public Incidence
34{ 34{
35 public: 35 public:
36 enum Transparency { Opaque, Transparent }; 36 enum Transparency { Opaque, Transparent };
37 typedef ListBase<Event> List; 37 typedef ListBase<Event> List;
38 Event(); 38 Event();
39 Event(const Event &); 39 Event(const Event &);
40 ~Event(); 40 ~Event();
41 bool matchTime(QDateTime*startDT, QDateTime* endDT);
41 42
42 QCString type() const { return "Event"; } 43 QCString type() const { return "Event"; }
43 IncTypeID typeID() const { return eventID; } 44 IncTypeID typeID() const { return eventID; }
44 45
45 Incidence *clone(); 46 Incidence *clone();
46 QDateTime getNextAlarmDateTime( bool * ok, int * offset ,QDateTime start_dt ) const; 47 QDateTime getNextAlarmDateTime( bool * ok, int * offset ,QDateTime start_dt ) const;
47 48
48 /** for setting an event's ending date/time with a QDateTime. */ 49 /** for setting an event's ending date/time with a QDateTime. */
49 void setDtEnd(const QDateTime &dtEnd); 50 void setDtEnd(const QDateTime &dtEnd);
50 /** Return the event's ending date/time as a QDateTime. */ 51 /** Return the event's ending date/time as a QDateTime. */
51 virtual QDateTime dtEnd() const; 52 virtual QDateTime dtEnd() const;
52 /** returns an event's end time as a string formatted according to the 53 /** returns an event's end time as a string formatted according to the
53 users locale settings */ 54 users locale settings */
54 QString dtEndTimeStr() const; 55 QString dtEndTimeStr() const;
55 /** returns an event's end date as a string formatted according to the 56 /** returns an event's end date as a string formatted according to the
56 users locale settings */ 57 users locale settings */
57 QString dtEndDateStr(bool shortfmt=true) const; 58 QString dtEndDateStr(bool shortfmt=true) const;
58 /** returns an event's end date and time as a string formatted according 59 /** returns an event's end date and time as a string formatted according
59 to the users locale settings */ 60 to the users locale settings */
60 QString dtEndStr(bool shortfmt=true) const; 61 QString dtEndStr(bool shortfmt=true) const;
61 void setHasEndDate(bool); 62 void setHasEndDate(bool);
62 /** Return whether the event has an end date/time. */ 63 /** Return whether the event has an end date/time. */
63 bool hasEndDate() const; 64 bool hasEndDate() const;
64 65
65 /** Return true if the event spans multiple days, otherwise return false. */ 66 /** Return true if the event spans multiple days, otherwise return false. */
66 bool isMultiDay() const; 67 bool isMultiDay() const;
67 68
68 /** set the event's time transparency level. */ 69 /** set the event's time transparency level. */
69 void setTransparency(Transparency transparency); 70 void setTransparency(Transparency transparency);
70 /** get the event's time transparency level. */ 71 /** get the event's time transparency level. */
71 Transparency transparency() const; 72 Transparency transparency() const;
72 73
73 void setDuration(int seconds); 74 void setDuration(int seconds);
74 75
75 bool contains ( Event*); 76 bool contains ( Event*);
76 77
77 bool isOverlapping ( Event*, QDateTime*, QDateTime* ); 78 bool isOverlapping ( Event*, QDateTime*, QDateTime* );
78 79
79 private: 80 private:
80 bool accept(Visitor &v) { return v.visit(this); } 81 bool accept(Visitor &v) { return v.visit(this); }
81 82
82 QDateTime mDtEnd; 83 QDateTime mDtEnd;
83 bool mHasEndDate; 84 bool mHasEndDate;
84 Transparency mTransparency; 85 Transparency mTransparency;
85}; 86};
86 87
87bool operator==( const Event&, const Event& ); 88bool operator==( const Event&, const Event& );
88 89
89 90
90} 91}
91 92
92 93
93#endif 94#endif