summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt5
-rw-r--r--desktop/rpm/kdepim_rpm2
-rw-r--r--korganizer/journalentry.cpp4
-rw-r--r--korganizer/koagenda.cpp6
-rw-r--r--korganizer/koagenda.h2
-rw-r--r--korganizer/kotodoview.cpp4
-rw-r--r--version2
7 files changed, 18 insertions, 7 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index d0b2880..f4b3ddb 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,194 +1,199 @@
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.19 ************
4
5Fixed a crash in journal view and a crash in setting a todo to stopped when KO/Pi saved the file when "stop todo" dialog was shown.
6Fixed a minor problem with the marcus bains line (whatever that is).
7
3********** VERSION 2.1.18 ************ 8********** VERSION 2.1.18 ************
4 9
5Pi-Sync mode: 10Pi-Sync mode:
6The "Write back file" status dialog was updated too often such that writing back the file on the Z was very slow. Fixed. 11The "Write back file" status dialog was updated too often such that writing back the file on the Z was very slow. Fixed.
7 12
8KO/Pi: 13KO/Pi:
9Fixed a layout problem on the Z 5500 with the calender box right of the location box in the event/todo editor. Thanks to Andrew, who found, reported and fixed this problem ( I did not get that problem - it was working on my 5500 ). 14Fixed a layout problem on the Z 5500 with the calender box right of the location box in the event/todo editor. Thanks to Andrew, who found, reported and fixed this problem ( I did not get that problem - it was working on my 5500 ).
10 15
11Fixed a problem when (imported or added from other applications) events or todos did have attachments. 16Fixed a problem when (imported or added from other applications) events or todos did have attachments.
12Fixed a really ugly and hidden problem in the management of the parent/child relationchip of todos. 17Fixed a really ugly and hidden problem in the management of the parent/child relationchip of todos.
13 18
14 19
15********** VERSION 2.1.17 ************ 20********** VERSION 2.1.17 ************
16 21
17KO/Pi: 22KO/Pi:
18Added option to display times in What's Next View on two lines. 23Added option to display times in What's Next View on two lines.
19(Useful for display on the Zaurus with 240x320 screen) 24(Useful for display on the Zaurus with 240x320 screen)
20Removed "Allday" for allday events of one day duration in What's Next View. 25Removed "Allday" for allday events of one day duration in What's Next View.
21Added date range for allday events of more than one day duration in What's Next View. 26Added date range for allday events of more than one day duration in What's Next View.
22Fixed two problems in the data importing from Outlook: 27Fixed two problems in the data importing from Outlook:
23 Fixed the duplicated import if the summary, location or description had whitespaces at the end. 28 Fixed the duplicated import if the summary, location or description had whitespaces at the end.
24 Fixed a problem importing certain recurrence rules. 29 Fixed a problem importing certain recurrence rules.
25 30
26A journal in an ics file may have no dtStart value (as files from KNotes, which stores its notes in an ics journal file). 31A journal in an ics file may have no dtStart value (as files from KNotes, which stores its notes in an ics journal file).
27If now a journal has no dtStart value the dtStart value is set to the created value of the journal when loading the file. That makes it possible to view and edit "notes" from KNotes. Simply add another Resource in KO/Pi which is a copy of the ics file from KNotes. You will find the "notes" in KO/Pi as a journal entry on the date you created it. 32If now a journal has no dtStart value the dtStart value is set to the created value of the journal when loading the file. That makes it possible to view and edit "notes" from KNotes. Simply add another Resource in KO/Pi which is a copy of the ics file from KNotes. You will find the "notes" in KO/Pi as a journal entry on the date you created it.
28 33
29And some minor fixes in KO/Pi. 34And some minor fixes in KO/Pi.
30 35
31Fixed a crash on the desktop when closing KO/Pi after accessing adressbook data (Linux + Windows ). 36Fixed a crash on the desktop when closing KO/Pi after accessing adressbook data (Linux + Windows ).
32 37
33 38
34********** VERSION 2.1.16 ************ 39********** VERSION 2.1.16 ************
35 40
36Fixed a problem with the menu bar in KO/Pi and using the "Menu" hardware key on the Zaurus. 41Fixed a problem with the menu bar in KO/Pi and using the "Menu" hardware key on the Zaurus.
37Added columns for datetime in todo view: Last modified, created and last modified subtodo 42Added columns for datetime in todo view: Last modified, created and last modified subtodo
38Fixed a bug in agenda view displaying recurring multiday events which are longer than two days. 43Fixed a bug in agenda view displaying recurring multiday events which are longer than two days.
39Made conflict detection up to 4 times faster. 44Made conflict detection up to 4 times faster.
40 45
41********** VERSION 2.1.15 ************ 46********** VERSION 2.1.15 ************
42 47
43Fixed two layout problems on the Z: 48Fixed two layout problems on the Z:
44Made the with of the newly added buttons on the Quick-Todo smaller. 49Made the with of the newly added buttons on the Quick-Todo smaller.
45Made listweek layout in 2 columns on the Z760 in portait screen and full menubar visible. 50Made listweek layout in 2 columns on the Z760 in portait screen and full menubar visible.
46 51
47 52
48********** VERSION 2.1.14 ************ 53********** VERSION 2.1.14 ************
49 54
50Added 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. 55Added 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.
51Added a button to add a subtodo quickly. 56Added a button to add a subtodo quickly.
52 57
53Added a possibility to search for conflicting events. (In the Action menu. Keyboard shortcut "q", shift+q or ctrl +q ). 58Added a possibility to search for conflicting events. (In the Action menu. Keyboard shortcut "q", shift+q or ctrl +q ).
54Added an option to change the layout of the list week to column mode. 59Added an option to change the layout of the list week to column mode.
55 60
56Fixed some usability problems in pi-sync mode by adding some progress information about file transfer. 61Fixed some usability problems in pi-sync mode by adding some progress information about file transfer.
57 62
58Fixed pi-sync problems with the new multi calendar feature. 63Fixed pi-sync problems with the new multi calendar feature.
59Now pi-sync behaviour should be: 64Now pi-sync behaviour should be:
601) Local sends file request ( as usual ) 651) Local sends file request ( as usual )
612) Remote sends file which contains data of all enabled ( the calendar where the "eye" column is checked ) calendars. 662) Remote sends file which contains data of all enabled ( the calendar where the "eye" column is checked ) calendars.
623) Local syncs with data, adds new entries to default calendar and sends file back ( as usual ). 673) Local syncs with data, adds new entries to default calendar and sends file back ( as usual ).
63 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. 68 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.
644) Remote updates the data and adds new entries to default calendar. Readonly entries are not changed on remote. 694) Remote updates the data and adds new entries to default calendar. Readonly entries are not changed on remote.
65 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. 70 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.
66 71
67Summary: 72Summary:
68No 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. 73No 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.
69If you have different calendars on remote and local and some of them disabled you may get some "strange" bahaviour. 74If you have different calendars on remote and local and some of them disabled you may get some "strange" bahaviour.
70Well, the syncing has become quite complicated ... you should have no problems if you enable all calendars. 75Well, the syncing has become quite complicated ... you should have no problems if you enable all calendars.
71 76
72********** VERSION 2.1.13 ************ 77********** VERSION 2.1.13 ************
73 78
74Fixed a problem in KA/Pi search. 79Fixed a problem in KA/Pi search.
75Fixed some minor problems in KO/Pi. 80Fixed some minor problems in KO/Pi.
76Added calendar selection possibility to the todo view popup and to the event/todo/journal editor. 81Added calendar selection possibility to the todo view popup and to the event/todo/journal editor.
77 82
78Fixed memory usage problems in KA/Pi: 83Fixed memory usage problems in KA/Pi:
79When loading data KA/Pi did load the file data twice. 84When loading data KA/Pi did load the file data twice.
80Example: 85Example:
81 A 600k file did consume 1200k memory during loading process. 86 A 600k file did consume 1200k memory during loading process.
82 This is fixed, it does now consume only 600k during loading process. 87 This is fixed, it does now consume only 600k during loading process.
83When saving data KA/Pi did consume a lot of memory for the data parsing during the save process. 88When saving data KA/Pi did consume a lot of memory for the data parsing during the save process.
84This is fixed. 89This is fixed.
85Example: 90Example:
86 Before saving a 600k file KA/Pi did consume 21.7 Meg of Ram. 91 Before saving a 600k file KA/Pi did consume 21.7 Meg of Ram.
87 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. 92 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.
88 Now KA/Pi is consuming on saving the same data 22.0 Meg of Ram during the save process. 93 Now KA/Pi is consuming on saving the same data 22.0 Meg of Ram during the save process.
89Note: The memory usage of KA/Pi after the data is loaded/saved has not changed. 94Note: The memory usage of KA/Pi after the data is loaded/saved has not changed.
90The saving of data may be a bit slower now. 95The saving of data may be a bit slower now.
91 96
92Fixed memory usage problems in KO/Pi: 97Fixed memory usage problems in KO/Pi:
93When KO/Pi did save the data to file, it did not release the used buffers after saving. 98When KO/Pi did save the data to file, it did not release the used buffers after saving.
94The used buffer was released after saving the next time, but there was new buffer space allocated again on that save operation. 99The used buffer was released after saving the next time, but there was new buffer space allocated again on that save operation.
95This is fixed. 100This is fixed.
96Example: 101Example:
97 When saving a 400k file KO/Pi do now use 400k less memory now. 102 When saving a 400k file KO/Pi do now use 400k less memory now.
98 103
99Optimized memory usage in KO/Pi Agenda view: 104Optimized memory usage in KO/Pi Agenda view:
100KO/Pi is storing some paint information in extra buffers for faster repainting of the agenda view. 105KO/Pi is storing some paint information in extra buffers for faster repainting of the agenda view.
101These buffers were not made smaller (i.e. downsized) because of performance reasons. 106These buffers were not made smaller (i.e. downsized) because of performance reasons.
102The handling of these buffers are now much smarter: 107The handling of these buffers are now much smarter:
103Two (of six) buffers are removed completely. 108Two (of six) buffers are removed completely.
104The remaing four buffers are now downsized after not using the agenda view for 45 seconds. 109The remaing four buffers are now downsized after not using the agenda view for 45 seconds.
105Such 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. 110Such 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.
106 111
107Worst case example ( for a maximum size agenda content): 112Worst case example ( for a maximum size agenda content):
108 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. 113 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.
109 114
110When 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. 115When 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.
111 116
112Summary: 117Summary:
113Many memory wasting problems of KA/Pi and KO/Pi fixed such that it is better to use on the Zaurus. 118Many memory wasting problems of KA/Pi and KO/Pi fixed such that it is better to use on the Zaurus.
114 119
115********** VERSION 2.1.12 ************ 120********** VERSION 2.1.12 ************
116 121
117KO/Pi: 122KO/Pi:
118Many small usability fixes, e.g. rearranged the popup menus such that they are better to use on the Zaurus. 123Many small usability fixes, e.g. rearranged the popup menus such that they are better to use on the Zaurus.
119Fixed a problem with the month view when file was saved but KO/Pi was not the active window. 124Fixed a problem with the month view when file was saved but KO/Pi was not the active window.
120Fixed some problems in the resource config dialog (e.g. added a warning if you set all calendars to read-only). 125Fixed some problems in the resource config dialog (e.g. added a warning if you set all calendars to read-only).
121Fixed some other small problems. 126Fixed some other small problems.
122 127
123********** VERSION 2.1.11 ************ 128********** VERSION 2.1.11 ************
124 129
125KO/Pi: 130KO/Pi:
126Because we can have many calendars now in KO/Pi we can have more than one journal entry per day. 131Because we can have many calendars now in KO/Pi we can have more than one journal entry per day.
127Added features to handle (and add ) more than one journal entry per day. 132Added features to handle (and add ) more than one journal entry per day.
128Added option for a journal title. 133Added option for a journal title.
129 134
130Added info about the calendar, the item belongs to, to the event/todo/journal viewer. 135Added info about the calendar, the item belongs to, to the event/todo/journal viewer.
131Fixed a problem of the alarm of completed recurring todos. 136Fixed a problem of the alarm of completed recurring todos.
132Added to the event/todo editor to set quickly the category of an item. 137Added to the event/todo editor to set quickly the category of an item.
133 138
134 139
135Fixed some problems when calling KO/Pi or KA/Pi from the alarm applet. 140Fixed some problems when calling KO/Pi or KA/Pi from the alarm applet.
136 141
137Added KA/Pi multi sync to the multi sync called from the alarm applet. 142Added KA/Pi multi sync to the multi sync called from the alarm applet.
138 143
139********** VERSION 2.1.10 ************ 144********** VERSION 2.1.10 ************
140 145
141KO/Pi: 146KO/Pi:
142Importing Birthdays will now create another file resource "Birthdays" and import the birthday data from KA/Pi into that file. 147Importing Birthdays will now create another file resource "Birthdays" and import the birthday data from KA/Pi into that file.
143When a multidayevent is selected in monthview all occurences of this event in the monthview are now hightlighted. 148When a multidayevent is selected in monthview all occurences of this event in the monthview are now hightlighted.
144Fixed a bug in searching for a small timerange, i.e. one day. 149Fixed a bug in searching for a small timerange, i.e. one day.
145 150
146KA/Pi: 151KA/Pi:
147Fixed two problems in csv export. 152Fixed two problems in csv export.
148Fixed problems when calling the contact selection dialog from KO/Pi or OM/Pi. 153Fixed problems when calling the contact selection dialog from KO/Pi or OM/Pi.
149 154
150********** VERSION 2.1.9 ************ 155********** VERSION 2.1.9 ************
151 156
152KO/Pi: 157KO/Pi:
153Fixed some problems of the new search options in the search dialog. 158Fixed some problems of the new search options in the search dialog.
154Fixed some problems in the new resource config options. 159Fixed some problems in the new resource config options.
155Changed 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. 160Changed 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.
156Fixed a problem creating new events in the agenda view if at the day/time is already an agenda item shown: 161Fixed a problem creating new events in the agenda view if at the day/time is already an agenda item shown:
157Now 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. 162Now 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.
158 163
159Fixed a problem in recurrence range in syncing with DTM. 164Fixed a problem in recurrence range in syncing with DTM.
160 165
161KA/Pi: 166KA/Pi:
162Made it posiible to show in the contact overview the details of all data available for that contact( e.g. office, spouse, children, nickname ...) 167Made it posiible to show in the contact overview the details of all data available for that contact( e.g. office, spouse, children, nickname ...)
163 168
164PwM/Pi: 169PwM/Pi:
165Added "sec" to the timeout config settings to make it clear the timeout values are seconds. 170Added "sec" to the timeout config settings to make it clear the timeout values are seconds.
166 171
167********** VERSION 2.1.8 ************ 172********** VERSION 2.1.8 ************
168 173
169KO/Pi: 174KO/Pi:
170Added info about the completion state of a todo in the ListView/Searchdialog. 175Added info about the completion state of a todo in the ListView/Searchdialog.
171If in TodoView is selected "do not show compledted todos" then completed todos are not shown in the ListView as well. 176If in TodoView is selected "do not show compledted todos" then completed todos are not shown in the ListView as well.
172Fixed some updating problems when changing the filter. 177Fixed some updating problems when changing the filter.
173 178
174KA/Pi: 179KA/Pi:
175In the addressee selection dialog now the formatted name is shown, if not empty. 180In the addressee selection dialog now the formatted name is shown, if not empty.
176Added a column "category" to the addressee selection dialog to make it possible to sort addressees after category. 181Added a column "category" to the addressee selection dialog to make it possible to sort addressees after category.
177Now in the addressee selection dialog a selected contact is remove with a single click from the selected list. 182Now in the addressee selection dialog a selected contact is remove with a single click from the selected list.
178 183
179Fixed in the file selector on the Zaurus the problem that symbolic links to files/dirs were ignored. 184Fixed in the file selector on the Zaurus the problem that symbolic links to files/dirs were ignored.
180Fixed the sorting for size in the file selector on the Z. 185Fixed the sorting for size in the file selector on the Z.
181 186
182Changed the color selection dialog on the Zaurus to a more user friendly version. 187Changed the color selection dialog on the Zaurus to a more user friendly version.
183 188
184********** VERSION 2.1.7 ************ 189********** VERSION 2.1.7 ************
185 190
186KO/Pi: 191KO/Pi:
187Fixed several problems in the new Resource handling. 192Fixed several problems in the new Resource handling.
188Added more options to the search dialog. 193Added more options to the search dialog.
189Fixed a problem in the Month view. 194Fixed a problem in the Month view.
190Added more options to the dialog when setting a todo to stopped. 195Added more options to the dialog when setting a todo to stopped.
191 196
192Fixed two small problems in KO/Pi Alarm applet. 197Fixed two small problems in KO/Pi Alarm applet.
193 198
194********** VERSION 2.1.6 ************ 199********** VERSION 2.1.6 ************
diff --git a/desktop/rpm/kdepim_rpm b/desktop/rpm/kdepim_rpm
index 133d0d1..a29e4ea 100644
--- a/desktop/rpm/kdepim_rpm
+++ b/desktop/rpm/kdepim_rpm
@@ -1,84 +1,84 @@
1Summary: A collection of PIM programs 1Summary: A collection of PIM programs
2Name: KDE-Pim-Pi 2Name: KDE-Pim-Pi
3Version: 2.1.18 3Version: 2.1.19
4Release: SuSE_9.2 4Release: SuSE_9.2
5Copyright:GPL 5Copyright:GPL
6Group: Productivity/Pim 6Group: Productivity/Pim
7Source:http://sourceforge.net/projects/kdepimpi/ 7Source:http://sourceforge.net/projects/kdepimpi/
8URL:http://sourceforge.net/projects/kdepimpi/ 8URL:http://sourceforge.net/projects/kdepimpi/
9Packager: zautrix 9Packager: zautrix
10 10
11%description 11%description
12This package contains the platform-independent PIM programs from 12This package contains the platform-independent PIM programs from
13www.pi-sync.info, compiled for SuSE 9.2: 13www.pi-sync.info, compiled for SuSE 9.2:
14KTimeTacker/Pi 14KTimeTacker/Pi
15KPhone/Pi 15KPhone/Pi
16KAddressbook/Pi 16KAddressbook/Pi
17KOrganizer/Pi 17KOrganizer/Pi
18PasswordManager/Pi 18PasswordManager/Pi
19KOPieMail/Pi 19KOPieMail/Pi
20 20
21These applications do not need anything from the KDE-desktop 21These applications do not need anything from the KDE-desktop
22at all to run on Linux. However, there is a dependency from 22at all to run on Linux. However, there is a dependency from
23two KDE libs, because a small command line program is included 23two KDE libs, because a small command line program is included
24to make it possible to sync with the KDE-desktop applications. 24to make it possible to sync with the KDE-desktop applications.
25 25
26These applications are independent from the KDE-desktop 26These applications are independent from the KDE-desktop
27environment. That means, nothing of your existing 27environment. That means, nothing of your existing
28KDE-desktop setup will be changed, or any data 28KDE-desktop setup will be changed, or any data
29(calendar-addressbook) used by the KDE-desktop 29(calendar-addressbook) used by the KDE-desktop
30applications will be changed or accessed. 30applications will be changed or accessed.
31These applications stores their data and config in 31These applications stores their data and config in
32$HOME/kdepim/ 32$HOME/kdepim/
33However, because the same file format is used, 33However, because the same file format is used,
34an easy exchange of data with the KDE-desktop 34an easy exchange of data with the KDE-desktop
35is possible. 35is possible.
36A small command line program is included 36A small command line program is included
37to make it possible to sync with the KDE-desktop applications. 37to make it possible to sync with the KDE-desktop applications.
38You do not need to call this program from the commandline, 38You do not need to call this program from the commandline,
39it is called from the KDE-Pim/Pi apps when you choose there: 39it is called from the KDE-Pim/Pi apps when you choose there:
40Sync with KDE_Desktop. 40Sync with KDE_Desktop.
41If something is going wrong, please start the 41If something is going wrong, please start the
42KDE-Pim/Pi program itself from the console to get detailed output. 42KDE-Pim/Pi program itself from the console to get detailed output.
43 43
44After installation, you should have a 44After installation, you should have a
45PIM-pi 45PIM-pi
46folder in your KDE start menu, where you can 46folder in your KDE start menu, where you can
47start the applications from. 47start the applications from.
48 48
49These programs makes it possible to sync your Zaurus easily 49These programs makes it possible to sync your Zaurus easily
50(with the KDE-Pim/Pi programs running on the Zaurus) 50(with the KDE-Pim/Pi programs running on the Zaurus)
51with the KDE-desktop calendar/addressbook data. 51with the KDE-desktop calendar/addressbook data.
52If you want to use that, you have to update your 52If you want to use that, you have to update your
53KDE-desktop to version 3.3.0 or higher. 53KDE-desktop to version 3.3.0 or higher.
54SuSE 9.2 contains KDE 3.3.0 such that no update is needed. 54SuSE 9.2 contains KDE 3.3.0 such that no update is needed.
55Actually - after the (non difficult) configuration is set up - 55Actually - after the (non difficult) configuration is set up -
56with two mouseklicks on the Zaurus, 56with two mouseklicks on the Zaurus,
57the Zaurus syncs with the corresponding KDE-Pim/Pi 57the Zaurus syncs with the corresponding KDE-Pim/Pi
58program on the Linux Desktop which syncs automatically 58program on the Linux Desktop which syncs automatically
59with the KDE-desktop data. 59with the KDE-desktop data.
60 60
61If you want to use the KDE-desktop calendar/addressbook applications, 61If you want to use the KDE-desktop calendar/addressbook applications,
62just install these apps in this package and use them as a syncing tool for the 62just install these apps in this package and use them as a syncing tool for the
63Zaurus <-> KDE-desktop sync. 63Zaurus <-> KDE-desktop sync.
64The sync requires a network connection from your Zaurus to 64The sync requires a network connection from your Zaurus to
65the PC. A detailed Sync HowTo is available in the 65the PC. A detailed Sync HowTo is available in the
66Help menu of the applications. 66Help menu of the applications.
67 67
68These applications makes it also possible, that you can sync 68These applications makes it also possible, that you can sync
69(or just export the data to) your mobile phone with your 69(or just export the data to) your mobile phone with your
70data of the KDE-desktop calendar/addressbook applications. 70data of the KDE-desktop calendar/addressbook applications.
71This is tested and working for Nokia mobile phones, 71This is tested and working for Nokia mobile phones,
72it may work with others as well. 72it may work with others as well.
73(More info about that: -> Sync HowTo) 73(More info about that: -> Sync HowTo)
74 74
75NOTE: 75NOTE:
76When using SuSE 9.1 you have to update your KDE to 3.3.x 76When using SuSE 9.1 you have to update your KDE to 3.3.x
77and you have to make an online update in SuSE 9.1 to make it 77and you have to make an online update in SuSE 9.1 to make it
78possible to get the infrared connection working, such that 78possible to get the infrared connection working, such that
79you can sync your (Nokia) mobile phone via infrared. 79you can sync your (Nokia) mobile phone via infrared.
80 80
81%files 81%files
82/opt/kde3/share/applnk/PIM-pi/ 82/opt/kde3/share/applnk/PIM-pi/
83/opt/kdepimpi/ 83/opt/kdepimpi/
84/usr/lib/libmicro* 84/usr/lib/libmicro*
diff --git a/korganizer/journalentry.cpp b/korganizer/journalentry.cpp
index 5fc3f2f..7f6f221 100644
--- a/korganizer/journalentry.cpp
+++ b/korganizer/journalentry.cpp
@@ -61,311 +61,313 @@ JournalEntry::JournalEntry(Calendar *calendar,QWidget *parent) :
61{ 61{
62 62
63 int fac = 5; 63 int fac = 5;
64 heiHint = QApplication::desktop()->height(); 64 heiHint = QApplication::desktop()->height();
65 if ( heiHint > 800 ) 65 if ( heiHint > 800 )
66 fac += 2; 66 fac += 2;
67 heiHint = heiHint / fac; 67 heiHint = heiHint / fac;
68 68
69 showOnlyMode = false; 69 showOnlyMode = false;
70 mCalendar = calendar; 70 mCalendar = calendar;
71 mJournal = 0; 71 mJournal = 0;
72 visibleMode = true; 72 visibleMode = true;
73 QHBox * vb = new QHBox ( this ); 73 QHBox * vb = new QHBox ( this );
74 QPixmap iconp; 74 QPixmap iconp;
75 vb->setMargin ( KDialog::marginHint()-1 ); 75 vb->setMargin ( KDialog::marginHint()-1 );
76 QPushButton * toggleJournal = new QPushButton( vb ); 76 QPushButton * toggleJournal = new QPushButton( vb );
77 iconp = SmallIcon("1updownarrow"); 77 iconp = SmallIcon("1updownarrow");
78 toggleJournal->setPixmap (iconp ) ; 78 toggleJournal->setPixmap (iconp ) ;
79 QLabel* textLabel = new QLabel(" "+i18n("Title: "),vb); 79 QLabel* textLabel = new QLabel(" "+i18n("Title: "),vb);
80 mTitle = new KOLocationBox(TRUE, vb, 30); 80 mTitle = new KOLocationBox(TRUE, vb, 30);
81 mTitle->setSizePolicy( QSizePolicy( QSizePolicy::Preferred ,QSizePolicy::Fixed ,FALSE) ); 81 mTitle->setSizePolicy( QSizePolicy( QSizePolicy::Preferred ,QSizePolicy::Fixed ,FALSE) );
82 mCalendarBox = new QComboBox(vb); 82 mCalendarBox = new QComboBox(vb);
83 mCalendarBox->setSizePolicy( QSizePolicy( QSizePolicy::Preferred ,QSizePolicy::Fixed ,FALSE) ); 83 mCalendarBox->setSizePolicy( QSizePolicy( QSizePolicy::Preferred ,QSizePolicy::Fixed ,FALSE) );
84#ifndef DESKTOP_VERSION 84#ifndef DESKTOP_VERSION
85 mTitle->setSizeLimit( 8 ); 85 mTitle->setSizeLimit( 8 );
86 mCalendarBox->setSizeLimit( 8 ); 86 mCalendarBox->setSizeLimit( 8 );
87#endif 87#endif
88 vb->setStretchFactor ( mTitle, 8 ); 88 vb->setStretchFactor ( mTitle, 8 );
89 int limit = 3; 89 int limit = 3;
90 if ( QApplication::desktop()->width() < 640 ) 90 if ( QApplication::desktop()->width() < 640 )
91 limit = 6; 91 limit = 6;
92 vb->setStretchFactor ( mCalendarBox, limit ); 92 vb->setStretchFactor ( mCalendarBox, limit );
93 //mTitleLabel->setMargin(0); 93 //mTitleLabel->setMargin(0);
94 //mTitleLabel->setAlignment(AlignCenter); 94 //mTitleLabel->setAlignment(AlignCenter);
95 QPushButton * loadTemplate = new QPushButton( vb ); 95 QPushButton * loadTemplate = new QPushButton( vb );
96 QPushButton * saveTemplate = new QPushButton( vb ); 96 QPushButton * saveTemplate = new QPushButton( vb );
97 if ( QApplication::desktop()->width() < 321 ) 97 if ( QApplication::desktop()->width() < 321 )
98 iconp = SmallIcon("fileexport16"); 98 iconp = SmallIcon("fileexport16");
99 else 99 else
100 iconp = SmallIcon("fileexport"); 100 iconp = SmallIcon("fileexport");
101 saveTemplate->setPixmap (iconp ) ; 101 saveTemplate->setPixmap (iconp ) ;
102 int size = saveTemplate->sizeHint().height(); 102 int size = saveTemplate->sizeHint().height();
103 if ( QApplication::desktop()->width() < 321 ) 103 if ( QApplication::desktop()->width() < 321 )
104 iconp = SmallIcon("fileimport16"); 104 iconp = SmallIcon("fileimport16");
105 else 105 else
106 iconp = SmallIcon("fileimport"); 106 iconp = SmallIcon("fileimport");
107 loadTemplate->setPixmap (iconp ) ; 107 loadTemplate->setPixmap (iconp ) ;
108 loadTemplate->setFixedSize( size, size ); 108 loadTemplate->setFixedSize( size, size );
109 saveTemplate->setFixedSize( size, size ); 109 saveTemplate->setFixedSize( size, size );
110 int widwid = size; 110 int widwid = size;
111 if ( QApplication::desktop()->width() < 320 ) 111 if ( QApplication::desktop()->width() < 320 )
112 widwid = size/2+1; 112 widwid = size/2+1;
113 toggleJournal->setFixedSize( widwid , size ); 113 toggleJournal->setFixedSize( widwid , size );
114 mTitle->setFixedHeight( size+4); 114 mTitle->setFixedHeight( size+4);
115 mCalendarBox->setFixedHeight( size+4); 115 mCalendarBox->setFixedHeight( size+4);
116 mEditor = new KTextEdit(this); 116 mEditor = new KTextEdit(this);
117#ifndef DESKTOP_VERSION 117#ifndef DESKTOP_VERSION
118 QPEApplication::setStylusOperation( mEditor, QPEApplication::RightOnHold ); 118 QPEApplication::setStylusOperation( mEditor, QPEApplication::RightOnHold );
119#endif 119#endif
120 mMaxWidDiff = 3*size - 2*frameWidth() - textLabel->sizeHint().width(); 120 mMaxWidDiff = 3*size - 2*frameWidth() - textLabel->sizeHint().width();
121 mDeskWid = QApplication::desktop()->width(); 121 mDeskWid = QApplication::desktop()->width();
122 int maxwid = mDeskWid - mMaxWidDiff; 122 int maxwid = mDeskWid - mMaxWidDiff;
123 if ( QApplication::desktop()->width() < 640 ) { 123 if ( QApplication::desktop()->width() < 640 ) {
124 mTitle->setMaximumWidth( maxwid/2 +20 ); 124 mTitle->setMaximumWidth( maxwid/2 +20 );
125 mCalendarBox->setMaximumWidth( maxwid/2 -20); 125 mCalendarBox->setMaximumWidth( maxwid/2 -20);
126 } else { 126 } else {
127 mTitle->setMaximumWidth( (maxwid/4)*3); 127 mTitle->setMaximumWidth( (maxwid/4)*3);
128 mCalendarBox->setMaximumWidth( maxwid/2 ); 128 mCalendarBox->setMaximumWidth( maxwid/2 );
129 } 129 }
130 //mCalendarBox->setMaximumWidth( maxwid/2 -20 ); 130 //mCalendarBox->setMaximumWidth( maxwid/2 -20 );
131 mEditor->setWordWrap( KTextEdit::WidgetWidth ); 131 mEditor->setWordWrap( KTextEdit::WidgetWidth );
132 QBoxLayout *topLayout = new QVBoxLayout(this); 132 QBoxLayout *topLayout = new QVBoxLayout(this);
133 topLayout->addWidget(vb); 133 topLayout->addWidget(vb);
134 topLayout->addWidget(mEditor); 134 topLayout->addWidget(mEditor);
135 mEditor->installEventFilter(this); 135 mEditor->installEventFilter(this);
136 connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) ); 136 connect( saveTemplate, SIGNAL( clicked() ), this , SLOT( slotSaveTemplate() ) );
137 connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) ); 137 connect( loadTemplate, SIGNAL( clicked() ), this , SLOT( slotLoadTemplate() ) );
138 connect( toggleJournal, SIGNAL( clicked() ), this , SLOT( toggleShowJournal() ) ); 138 connect( toggleJournal, SIGNAL( clicked() ), this , SLOT( toggleShowJournal() ) );
139 mTitle->load( KOLocationBox::SUMMARYJOURNAL ); 139 mTitle->load( KOLocationBox::SUMMARYJOURNAL );
140 mTitle->lineEdit ()->setText(""); 140 mTitle->lineEdit ()->setText("");
141} 141}
142 142
143JournalEntry::~JournalEntry() 143JournalEntry::~JournalEntry()
144{ 144{
145 //qDebug("JournalEntry::~JournalEntry() "); 145 //qDebug("JournalEntry::~JournalEntry() ");
146} 146}
147void JournalEntry::resizeEvent(QResizeEvent* e ) 147void JournalEntry::resizeEvent(QResizeEvent* e )
148{ 148{
149#ifndef DESKTOP_VERSION 149#ifndef DESKTOP_VERSION
150 150
151 if ( mDeskWid != QApplication::desktop()->width() ) { 151 if ( mDeskWid != QApplication::desktop()->width() ) {
152 mDeskWid == QApplication::desktop()->width(); 152 mDeskWid == QApplication::desktop()->width();
153 int maxwid = mDeskWid - mMaxWidDiff; 153 int maxwid = mDeskWid - mMaxWidDiff;
154 if ( QApplication::desktop()->width() < 640 ) { 154 if ( QApplication::desktop()->width() < 640 ) {
155 mTitle->setMaximumWidth( maxwid/2 +20 ); 155 mTitle->setMaximumWidth( maxwid/2 +20 );
156 mCalendarBox->setMaximumWidth( maxwid/2 -20); 156 mCalendarBox->setMaximumWidth( maxwid/2 -20);
157 } 157 }
158 else { 158 else {
159 mTitle->setMaximumWidth( (maxwid/4)*3); 159 mTitle->setMaximumWidth( (maxwid/4)*3);
160 mCalendarBox->setMaximumWidth( maxwid/2 ); 160 mCalendarBox->setMaximumWidth( maxwid/2 );
161 } 161 }
162 //mCalendarBox->setMaximumWidth( maxwid/2 -20 ); 162 //mCalendarBox->setMaximumWidth( maxwid/2 -20 );
163 } 163 }
164 //setMaximumWidth( QApplication::desktop()->width() ); 164 //setMaximumWidth( QApplication::desktop()->width() );
165 //qDebug("MAXXX %d ", QApplication::desktop()->width()); 165 //qDebug("MAXXX %d ", QApplication::desktop()->width());
166#endif 166#endif
167 QFrame::resizeEvent( e ); 167 QFrame::resizeEvent( e );
168} 168}
169QSize JournalEntry::sizeHint() const 169QSize JournalEntry::sizeHint() const
170{ 170{
171 return QSize ( 240, heiHint ); 171 return QSize ( 240, heiHint );
172} 172}
173void JournalEntry::slotSaveTemplate() 173void JournalEntry::slotSaveTemplate()
174{ 174{
175 QString fileName =locateLocal( "templates", "journals" ); 175 QString fileName =locateLocal( "templates", "journals" );
176 QDir t_dir; 176 QDir t_dir;
177 if ( !t_dir.exists(fileName) ) 177 if ( !t_dir.exists(fileName) )
178 t_dir.mkdir ( fileName ); 178 t_dir.mkdir ( fileName );
179 fileName += "/journal"; 179 fileName += "/journal";
180 fileName = KFileDialog::getSaveFileName( fileName , i18n("Save as Journal template"), this ); 180 fileName = KFileDialog::getSaveFileName( fileName , i18n("Save as Journal template"), this );
181 if ( fileName.length() == 0 ) 181 if ( fileName.length() == 0 )
182 return; 182 return;
183 183
184 QFile fileIn( fileName ); 184 QFile fileIn( fileName );
185 if (!fileIn.open( IO_WriteOnly ) ) { 185 if (!fileIn.open( IO_WriteOnly ) ) {
186 KMessageBox::error( this, i18n("Error saving template file\n '%1'.") 186 KMessageBox::error( this, i18n("Error saving template file\n '%1'.")
187 .arg( fileName ) ); 187 .arg( fileName ) );
188 return; 188 return;
189 } 189 }
190 // QString text; 190 // QString text;
191 QTextStream tsIn( &fileIn ); 191 QTextStream tsIn( &fileIn );
192 tsIn.setCodec( QTextCodec::codecForName("utf8") ); 192 tsIn.setCodec( QTextCodec::codecForName("utf8") );
193 tsIn << mEditor->text(); 193 tsIn << mEditor->text();
194 fileIn.close(); 194 fileIn.close();
195} 195}
196void JournalEntry::slotLoadTemplate() 196void JournalEntry::slotLoadTemplate()
197{ 197{
198 QString fileName =locateLocal( "templates", "journals" ); 198 QString fileName =locateLocal( "templates", "journals" );
199 QDir t_dir; 199 QDir t_dir;
200 if ( !t_dir.exists(fileName) ) 200 if ( !t_dir.exists(fileName) )
201 t_dir.mkdir ( fileName ); 201 t_dir.mkdir ( fileName );
202 fileName += "/journal"; 202 fileName += "/journal";
203 fileName = KFileDialog::getOpenFileName( fileName , i18n("Insert Journal template"), this ); 203 fileName = KFileDialog::getOpenFileName( fileName , i18n("Insert Journal template"), this );
204 if ( fileName.length() == 0 ) 204 if ( fileName.length() == 0 )
205 return; 205 return;
206 QFile fileIn( fileName ); 206 QFile fileIn( fileName );
207 if (!fileIn.open( IO_ReadOnly ) ) { 207 if (!fileIn.open( IO_ReadOnly ) ) {
208 KMessageBox::error( this, i18n("Error loading template file\n '%1'.") 208 KMessageBox::error( this, i18n("Error loading template file\n '%1'.")
209 .arg( fileName ) ); 209 .arg( fileName ) );
210 return; 210 return;
211 } 211 }
212 QTextStream tsIn( &fileIn ); 212 QTextStream tsIn( &fileIn );
213 tsIn.setCodec( QTextCodec::codecForName("utf8") ); 213 tsIn.setCodec( QTextCodec::codecForName("utf8") );
214 QString text = tsIn.read(); 214 QString text = tsIn.read();
215 fileIn.close(); 215 fileIn.close();
216 int line, col; 216 int line, col;
217 mEditor->getCursorPosition (& line, & col ); 217 mEditor->getCursorPosition (& line, & col );
218 mEditor-> insertAt ( text, line, col, true ); 218 mEditor-> insertAt ( text, line, col, true );
219 //mEditor->setIgnoreMark( true ); 219 //mEditor->setIgnoreMark( true );
220} 220}
221void JournalEntry::setDate(const QDate &date) 221void JournalEntry::setDate(const QDate &date)
222{ 222{
223 showOnlyMode = false; 223 showOnlyMode = false;
224 writeJournal(); 224 writeJournal();
225 mDate = date; 225 mDate = date;
226 fillCalendar( mCalendar->defaultCalendar() ); 226 fillCalendar( mCalendar->defaultCalendar() );
227} 227}
228void JournalEntry::fillCalendar( int setToID ) 228void JournalEntry::fillCalendar( int setToID )
229{ 229{
230 mCalendarBox->clear(); 230 mCalendarBox->clear();
231 KopiCalendarFile * kkf = KOPrefs::instance()->mCalendars.first(); 231 KopiCalendarFile * kkf = KOPrefs::instance()->mCalendars.first();
232 int std = 0; 232 int std = 0;
233 int count = 0; 233 int count = 0;
234 while ( kkf ) { 234 while ( kkf ) {
235 if ( (!kkf->mErrorOnLoad &&! kkf->isReadOnly) || setToID == kkf->mCalNumber ) { 235 if ( (!kkf->mErrorOnLoad &&! kkf->isReadOnly) || setToID == kkf->mCalNumber ) {
236 if ( setToID ) { 236 if ( setToID ) {
237 if ( kkf->mCalNumber == setToID ) 237 if ( kkf->mCalNumber == setToID )
238 std = count; 238 std = count;
239 } else { 239 } else {
240 if ( kkf->isStandard ) { 240 if ( kkf->isStandard ) {
241 std = count; 241 std = count;
242 } 242 }
243 } 243 }
244 ++count; 244 ++count;
245 mCalendarBox->insertItem( kkf->mName ); 245 mCalendarBox->insertItem( kkf->mName );
246 } 246 }
247 kkf = KOPrefs::instance()->mCalendars.next(); 247 kkf = KOPrefs::instance()->mCalendars.next();
248 } 248 }
249 mCalendarBox->setCurrentItem( std ); 249 mCalendarBox->setCurrentItem( std );
250} 250}
251 251
252void JournalEntry::toggleShowJournal() 252void JournalEntry::toggleShowJournal()
253{ 253{
254 if ( mEditor->text().isEmpty() && mTitle->currentText ().isEmpty() )
255 return;
254 if (!mEditor->text().isEmpty() || !mTitle->currentText ().isEmpty()) 256 if (!mEditor->text().isEmpty() || !mTitle->currentText ().isEmpty())
255 flushEntry(); 257 flushEntry();
256 if ( showOnlyMode ) 258 if ( showOnlyMode )
257 emit showJournalOnly( 0 ); 259 emit showJournalOnly( 0 );
258 else { 260 else {
259 // we have to protect mJournal from deleting if mJournal has empty text 261 // we have to protect mJournal from deleting if mJournal has empty text
260 visibleMode = false; // set to true via :setShowOnly() 262 visibleMode = false; // set to true via :setShowOnly()
261 emit showJournalOnly( mJournal ); 263 emit showJournalOnly( mJournal );
262 //QTimer::singleShot( 0, this, SLOT( setVisibleOn() ) ); 264 //QTimer::singleShot( 0, this, SLOT( setVisibleOn() ) );
263 } 265 }
264} 266}
265void JournalEntry::setVisibleOn() 267void JournalEntry::setVisibleOn()
266{ 268{
267 visibleMode = true; 269 visibleMode = true;
268} 270}
269void JournalEntry::setShowOnly() 271void JournalEntry::setShowOnly()
270{ 272{
271 showOnlyMode = true; 273 showOnlyMode = true;
272 if ( mTitle->currentText().isEmpty() ) 274 if ( mTitle->currentText().isEmpty() )
273 mTitle->setFocus(); 275 mTitle->setFocus();
274 else 276 else
275 mEditor->setFocus(); 277 mEditor->setFocus();
276} 278}
277void JournalEntry::setJournal(Journal *journal, bool saveJournal ) 279void JournalEntry::setJournal(Journal *journal, bool saveJournal )
278{ 280{
279 if ( saveJournal ) 281 if ( saveJournal )
280 writeJournal(); 282 writeJournal();
281 mTitle->load( KOLocationBox::SUMMARYJOURNAL ); 283 mTitle->load( KOLocationBox::SUMMARYJOURNAL );
282 284
283 mJournal = journal; 285 mJournal = journal;
284 if ( journal->isReadOnly() ) 286 if ( journal->isReadOnly() )
285 mTitle->lineEdit ()->setText(mJournal->summary()+" ("+i18n("readonly")+")"); 287 mTitle->lineEdit ()->setText(mJournal->summary()+" ("+i18n("readonly")+")");
286 else 288 else
287 mTitle->lineEdit ()->setText(mJournal->summary()); 289 mTitle->lineEdit ()->setText(mJournal->summary());
288 mEditor->setText(mJournal->description()); 290 mEditor->setText(mJournal->description());
289 mTitle->setEnabled (!journal->isReadOnly() ); 291 mTitle->setEnabled (!journal->isReadOnly() );
290 mEditor->setReadOnly ( journal->isReadOnly() ); 292 mEditor->setReadOnly ( journal->isReadOnly() );
291 mCalendarBox->setEnabled (!journal->isReadOnly() ); 293 mCalendarBox->setEnabled (!journal->isReadOnly() );
292 fillCalendar( mJournal->calID() ); 294 fillCalendar( mJournal->calID() );
293} 295}
294 296
295Journal *JournalEntry::journal() const 297Journal *JournalEntry::journal() const
296{ 298{
297 return mJournal; 299 return mJournal;
298} 300}
299 301
300 302
301void JournalEntry::clear() 303void JournalEntry::clear()
302{ 304{
303 mJournal = 0; 305 mJournal = 0;
304 mEditor->setText(""); 306 mEditor->setText("");
305 mTitle->load( KOLocationBox::SUMMARYJOURNAL ); 307 mTitle->load( KOLocationBox::SUMMARYJOURNAL );
306 mTitle->lineEdit ()->setText(""); 308 mTitle->lineEdit ()->setText("");
307} 309}
308 310
309bool JournalEntry::eventFilter( QObject *o, QEvent *e ) 311bool JournalEntry::eventFilter( QObject *o, QEvent *e )
310{ 312{
311// kdDebug() << "JournalEntry::event received " << e->type() << endl; 313// kdDebug() << "JournalEntry::event received " << e->type() << endl;
312 314
313 if ( e->type() == QEvent::FocusOut ) { 315 if ( e->type() == QEvent::FocusOut ) {
314 writeJournal(); 316 writeJournal();
315 } 317 }
316 if ( e->type() == QEvent::KeyPress ) { 318 if ( e->type() == QEvent::KeyPress ) {
317 QKeyEvent * k = (QKeyEvent *) e; 319 QKeyEvent * k = (QKeyEvent *) e;
318 if ( k->state() == Qt::ControlButton ) { 320 if ( k->state() == Qt::ControlButton ) {
319 k->ignore(); 321 k->ignore();
320 //return true; 322 //return true;
321 } 323 }
322 } 324 }
323 325
324 return QFrame::eventFilter( o, e ); // standard event processing 326 return QFrame::eventFilter( o, e ); // standard event processing
325} 327}
326 328
327void JournalEntry::writeJournal() 329void JournalEntry::writeJournal()
328{ 330{
329 if ( !visibleMode ) return; 331 if ( !visibleMode ) return;
330 if ( !mTitle->isEnabled() ) return; 332 if ( !mTitle->isEnabled() ) return;
331 if (mEditor->text().isEmpty() && mTitle->currentText().isEmpty()) { 333 if (mEditor->text().isEmpty() && mTitle->currentText().isEmpty()) {
332 if ( mJournal ) { 334 if ( mJournal ) {
333 Journal* j = mJournal; 335 Journal* j = mJournal;
334 mJournal = 0; 336 mJournal = 0;
335 bool conf = KOPrefs::instance()->mConfirm; 337 bool conf = KOPrefs::instance()->mConfirm;
336 KOPrefs::instance()->mConfirm = false; 338 KOPrefs::instance()->mConfirm = false;
337 emit deleteJournal(j); 339 emit deleteJournal(j);
338 KOPrefs::instance()->mConfirm = conf; 340 KOPrefs::instance()->mConfirm = conf;
339 } 341 }
340 return; 342 return;
341 } 343 }
342 344
343// kdDebug() << "JournalEntry::writeJournal()..." << endl; 345// kdDebug() << "JournalEntry::writeJournal()..." << endl;
344 346
345 if (!mJournal) { 347 if (!mJournal) {
346 mJournal = new Journal; 348 mJournal = new Journal;
347 mJournal->setDtStart(QDateTime(mDate,QTime(0,0,0))); 349 mJournal->setDtStart(QDateTime(mDate,QTime(0,0,0)));
348 mCalendar->addJournal(mJournal); 350 mCalendar->addJournal(mJournal);
349 } 351 }
350 if ( mJournal->description() != mEditor->text() ) { 352 if ( mJournal->description() != mEditor->text() ) {
351 mJournal->setDescription(mEditor->text()); 353 mJournal->setDescription(mEditor->text());
352 } 354 }
353 if ( mJournal->summary() != mTitle->currentText() ) { 355 if ( mJournal->summary() != mTitle->currentText() ) {
354 mJournal->setSummary(mTitle->currentText()); 356 mJournal->setSummary(mTitle->currentText());
355 mTitle->save(KOLocationBox::SUMMARYJOURNAL); 357 mTitle->save(KOLocationBox::SUMMARYJOURNAL);
356 } 358 }
357 int id = KOPrefs::instance()->getCalendarID( mCalendarBox->currentText() ); 359 int id = KOPrefs::instance()->getCalendarID( mCalendarBox->currentText() );
358 if ( mJournal->calID() != id ) { 360 if ( mJournal->calID() != id ) {
359 mJournal->setCalID( id ); 361 mJournal->setCalID( id );
360 } 362 }
361} 363}
362 364
363void JournalEntry::flushEntry() 365void JournalEntry::flushEntry()
364{ 366{
365 writeJournal(); 367 writeJournal();
366} 368}
367void JournalEntry::keyPressEvent ( QKeyEvent * e ) 369void JournalEntry::keyPressEvent ( QKeyEvent * e )
368{ 370{
369 e->ignore(); 371 e->ignore();
370 372
371} 373}
diff --git a/korganizer/koagenda.cpp b/korganizer/koagenda.cpp
index c738f7e..7e9fa71 100644
--- a/korganizer/koagenda.cpp
+++ b/korganizer/koagenda.cpp
@@ -1,566 +1,570 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 Marcus Bains line. 5 Marcus Bains line.
6 Copyright (c) 2001 Ali Rahimi 6 Copyright (c) 2001 Ali Rahimi
7 7
8 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or 10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version. 11 (at your option) any later version.
12 12
13 This program is distributed in the hope that it will be useful, 13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details. 16 GNU General Public License for more details.
17 17
18 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 21
22 As a special exception, permission is given to link this program 22 As a special exception, permission is given to link this program
23 with any edition of Qt, and distribute the resulting executable, 23 with any edition of Qt, and distribute the resulting executable,
24 without including the source code for Qt in the source distribution. 24 without including the source code for Qt in the source distribution.
25*/ 25*/
26 26
27#ifndef _WIN32_ 27#ifndef _WIN32_
28#define protected public 28#define protected public
29#include <qwidget.h> 29#include <qwidget.h>
30#undef protected 30#undef protected
31#endif 31#endif
32#include <qintdict.h> 32#include <qintdict.h>
33#include <qdatetime.h> 33#include <qdatetime.h>
34#include <qapplication.h> 34#include <qapplication.h>
35#include <qpopupmenu.h> 35#include <qpopupmenu.h>
36#include <qcursor.h> 36#include <qcursor.h>
37#include <qpainter.h> 37#include <qpainter.h>
38 38
39#include <kdebug.h> 39#include <kdebug.h>
40#include <klocale.h> 40#include <klocale.h>
41#include <kiconloader.h> 41#include <kiconloader.h>
42#include <kglobal.h> 42#include <kglobal.h>
43 43
44#include "koagendaitem.h" 44#include "koagendaitem.h"
45#include "koprefs.h" 45#include "koprefs.h"
46#include "koglobals.h" 46#include "koglobals.h"
47 47
48#include "koagenda.h" 48#include "koagenda.h"
49 49
50#include <libkcal/event.h> 50#include <libkcal/event.h>
51#include <libkcal/todo.h> 51#include <libkcal/todo.h>
52 52
53#ifndef DESKTOP_VERSION 53#ifndef DESKTOP_VERSION
54#include <qpe/qpeapplication.h> 54#include <qpe/qpeapplication.h>
55#endif 55#endif
56 56
57//extern bool globalFlagBlockPainting; 57//extern bool globalFlagBlockPainting;
58extern int globalFlagBlockAgenda; 58extern int globalFlagBlockAgenda;
59extern int globalFlagBlockAgendaItemPaint; 59extern int globalFlagBlockAgendaItemPaint;
60extern int globalFlagBlockAgendaItemUpdate; 60extern int globalFlagBlockAgendaItemUpdate;
61extern int globalFlagBlockStartup; 61extern int globalFlagBlockStartup;
62 62
63 63
64//////////////////////////////////////////////////////////////////////////// 64////////////////////////////////////////////////////////////////////////////
65MarcusBains::MarcusBains(KOAgenda *_agenda,const char *name) 65MarcusBains::MarcusBains(KOAgenda *_agenda,const char *name)
66 : QFrame(_agenda->viewport(),name), agenda(_agenda) 66 : QFrame(_agenda->viewport(),name), agenda(_agenda)
67{ 67{
68 setLineWidth(0); 68 setLineWidth(0);
69 setMargin(0); 69 setMargin(0);
70 setBackgroundColor(Qt::red); 70 setBackgroundColor(Qt::red);
71 minutes = new QTimer(this); 71 minutes = new QTimer(this);
72 connect(minutes, SIGNAL(timeout()), this, SLOT(updateLoc())); 72 connect(minutes, SIGNAL(timeout()), this, SLOT(updateLoc()));
73 minutes->start(0, true); 73 minutes->start(0, true);
74 mTimeBox = new QLabel(this); 74 mTimeBox = new QLabel(this);
75 mTimeBox->setAlignment(Qt::AlignRight | Qt::AlignBottom); 75 mTimeBox->setAlignment(Qt::AlignRight | Qt::AlignBottom);
76 QPalette pal = mTimeBox->palette(); 76 QPalette pal = mTimeBox->palette();
77 pal.setColor(QColorGroup::Foreground, Qt::red); 77 pal.setColor(QColorGroup::Foreground, Qt::red);
78 mTimeBox->setPalette(pal); 78 mTimeBox->setPalette(pal);
79 //mTimeBox->setAutoMask(true); 79 //mTimeBox->setAutoMask(true);
80 80
81 agenda->addChild(mTimeBox); 81 agenda->addChild(mTimeBox);
82 82
83 oldToday = -1; 83 oldToday = -1;
84} 84}
85 85
86MarcusBains::~MarcusBains() 86MarcusBains::~MarcusBains()
87{ 87{
88 //delete minutes; 88 //delete minutes;
89} 89}
90 90void MarcusBains::hideMe()
91{
92 hide(); mTimeBox->hide();
93}
91int MarcusBains::todayColumn() 94int MarcusBains::todayColumn()
92{ 95{
93 QDate currentDate = QDate::currentDate(); 96 QDate currentDate = QDate::currentDate();
94 97
95 DateList dateList = agenda->dateList(); 98 DateList dateList = agenda->dateList();
96 DateList::ConstIterator it; 99 DateList::ConstIterator it;
97 int col = 0; 100 int col = 0;
98 for(it = dateList.begin(); it != dateList.end(); ++it) { 101 for(it = dateList.begin(); it != dateList.end(); ++it) {
99 if((*it) == currentDate) 102 if((*it) == currentDate)
100 return KOGlobals::self()->reverseLayout() ? 103 return KOGlobals::self()->reverseLayout() ?
101 agenda->columns() - 1 - col : col; 104 agenda->columns() - 1 - col : col;
102 ++col; 105 ++col;
103 } 106 }
104 107
105 return -1; 108 return -1;
106} 109}
107void MarcusBains::updateLoc() 110void MarcusBains::updateLoc()
108{ 111{
109 updateLocation(); 112 updateLocation();
110} 113}
111void MarcusBains::updateLocation(bool recalculate) 114void MarcusBains::updateLocation(bool recalculate)
112{ 115{
113 116
114 QTime tim = QTime::currentTime(); 117 QTime tim = QTime::currentTime();
115 //qDebug(" MarcusBains::updateLocation %s ", tim.toString().latin1()); 118 //qDebug(" MarcusBains::updateLocation %s ", tim.toString().latin1());
116 if((tim.hour() == 0) && (oldTime.hour()==23)) 119 if((tim.hour() == 0) && (oldTime.hour()==23))
117 recalculate = true; 120 recalculate = true;
118 121
119 int mins = tim.hour()*60 + tim.minute(); 122 int mins = tim.hour()*60 + tim.minute();
120 int minutesPerCell = 24 * 60 / agenda->rows(); 123 int minutesPerCell = 24 * 60 / agenda->rows();
121 int y = mins*agenda->gridSpacingY()/minutesPerCell; 124 int y = mins*agenda->gridSpacingY()/minutesPerCell;
122 int today = recalculate ? todayColumn() : oldToday; 125 int today = recalculate ? todayColumn() : oldToday;
123 int x = agenda->gridSpacingX()*today; 126 int x = agenda->gridSpacingX()*today;
124 bool disabled = !(KOPrefs::instance()->mMarcusBainsEnabled); 127 bool disabled = !(KOPrefs::instance()->mMarcusBainsEnabled);
125 128
126 oldTime = tim; 129 oldTime = tim;
127 oldToday = today; 130 oldToday = today;
128 131
129 if(disabled || (today<0)) { 132 if(disabled || (today<0)) {
130 hide(); mTimeBox->hide(); 133 hide(); mTimeBox->hide();
131 return; 134 return;
132 } else { 135 } else {
133 show(); mTimeBox->show(); 136 show(); mTimeBox->show();
134 } 137 }
135 138
136 if(recalculate) 139 if(recalculate)
137 setFixedSize(agenda->gridSpacingX(),1); 140 setFixedSize(agenda->gridSpacingX(),1);
138 agenda->moveChild(this, x, y); 141 agenda->moveChild(this, x, y);
139 raise(); 142 raise();
140 143
141 if(recalculate) 144 if(recalculate)
142 //mTimeBox->setFont(QFont("helvetica",10)); 145 //mTimeBox->setFont(QFont("helvetica",10));
143 mTimeBox->setFont(KOPrefs::instance()->mMarcusBainsFont); 146 mTimeBox->setFont(KOPrefs::instance()->mMarcusBainsFont);
144 147
145 mTimeBox->setText(KGlobal::locale()->formatTime(tim, KOPrefs::instance()->mMarcusBainsShowSeconds)); 148 mTimeBox->setText(KGlobal::locale()->formatTime(tim, KOPrefs::instance()->mMarcusBainsShowSeconds));
146 mTimeBox->adjustSize(); 149 mTimeBox->adjustSize();
147 // the -2 below is there because there is a bug in this program 150 // the -2 below is there because there is a bug in this program
148 // somewhere, where the last column of this widget is a few pixels 151 // somewhere, where the last column of this widget is a few pixels
149 // narrower than the other columns. 152 // narrower than the other columns.
150 int offs = (today==agenda->columns()-1) ? -4 : 0; 153 int offs = (today==agenda->columns()-1) ? -4 : 0;
151 agenda->moveChild(mTimeBox, 154 agenda->moveChild(mTimeBox,
152 x+agenda->gridSpacingX()-mTimeBox->width()+offs-1, 155 x+agenda->gridSpacingX()-mTimeBox->width()+offs-1,
153 y-mTimeBox->height()); 156 y-mTimeBox->height());
154 mTimeBox->raise(); 157 mTimeBox->raise();
155 //mTimeBox->setAutoMask(true); 158 //mTimeBox->setAutoMask(true);
156 int secs = QTime::currentTime().second(); 159 int secs = QTime::currentTime().second();
157 minutes->start( (60 - secs +1)*1000 ,true); 160 minutes->start( (60 - secs +1)*1000 ,true);
158} 161}
159 162
160 163
161//////////////////////////////////////////////////////////////////////////// 164////////////////////////////////////////////////////////////////////////////
162 165
163 166
164/* 167/*
165 Create an agenda widget with rows rows and columns columns. 168 Create an agenda widget with rows rows and columns columns.
166*/ 169*/
167KOAgenda::KOAgenda(int columns,int rows,int rowSize,QWidget *parent, 170KOAgenda::KOAgenda(int columns,int rows,int rowSize,QWidget *parent,
168 const char *name,WFlags f) : 171 const char *name,WFlags f) :
169 QScrollView(parent,name,f) 172 QScrollView(parent,name,f)
170{ 173{
171 174
172 mAllAgendaPopup = 0; 175 mAllAgendaPopup = 0;
173 mColumns = columns; 176 mColumns = columns;
174 mRows = rows; 177 mRows = rows;
175 mGridSpacingY = rowSize; 178 mGridSpacingY = rowSize;
176 mAllDayMode = false; 179 mAllDayMode = false;
177#ifndef DESKTOP_VERSION 180#ifndef DESKTOP_VERSION
178 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); 181 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );
179#endif 182#endif
180 mHolidayMask = 0; 183 mHolidayMask = 0;
181 init(); 184 init();
182 connect ( this, SIGNAL (contentsMoving ( int , int ) ), this, SLOT ( slotContentMove(int,int)) ); 185 connect ( this, SIGNAL (contentsMoving ( int , int ) ), this, SLOT ( slotContentMove(int,int)) );
183} 186}
184 187
185/* 188/*
186 Create an agenda widget with columns columns and one row. This is used for 189 Create an agenda widget with columns columns and one row. This is used for
187 all-day events. 190 all-day events.
188*/ 191*/
189KOAgenda::KOAgenda(int columns,QWidget *parent,const char *name,WFlags f) : 192KOAgenda::KOAgenda(int columns,QWidget *parent,const char *name,WFlags f) :
190 QScrollView(parent,name,f) 193 QScrollView(parent,name,f)
191{ 194{
192 mAllAgendaPopup = 0; 195 mAllAgendaPopup = 0;
193 blockResize = false; 196 blockResize = false;
194 mColumns = columns; 197 mColumns = columns;
195 mRows = 1; 198 mRows = 1;
196 //qDebug("aaaaaaaaaaaaaaaaaaldays %d ", KOPrefs::instance()->mAllDaySize); 199 //qDebug("aaaaaaaaaaaaaaaaaaldays %d ", KOPrefs::instance()->mAllDaySize);
197 mGridSpacingY = KOPrefs::instance()->mAllDaySize; 200 mGridSpacingY = KOPrefs::instance()->mAllDaySize;
198 mAllDayMode = true; 201 mAllDayMode = true;
199#ifndef DESKTOP_VERSION 202#ifndef DESKTOP_VERSION
200 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); 203 //QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold );
201#endif 204#endif
202 mHolidayMask = 0; 205 mHolidayMask = 0;
203 init(); 206 init();
204} 207}
205 208
206 209
207KOAgenda::~KOAgenda() 210KOAgenda::~KOAgenda()
208{ 211{
209 if(mMarcusBains) delete mMarcusBains; 212 if(mMarcusBains) delete mMarcusBains;
210 213
211} 214}
212 215
213Incidence *KOAgenda::selectedIncidence() const 216Incidence *KOAgenda::selectedIncidence() const
214{ 217{
215 return (mSelectedItem ? mSelectedItem->incidence() : 0); 218 return (mSelectedItem ? mSelectedItem->incidence() : 0);
216} 219}
217 220
218 221
219QDate KOAgenda::selectedIncidenceDate() const 222QDate KOAgenda::selectedIncidenceDate() const
220{ 223{
221 return (mSelectedItem ? mSelectedItem->itemDate() : QDate()); 224 return (mSelectedItem ? mSelectedItem->itemDate() : QDate());
222} 225}
223 226
224 227
225void KOAgenda::init() 228void KOAgenda::init()
226{ 229{
227 mPopupTimer = new QTimer(this); 230 mPopupTimer = new QTimer(this);
228 connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu())); 231 connect(mPopupTimer , SIGNAL(timeout()), this, SLOT(popupMenu()));
229 232
230 mNewItemPopup = new QPopupMenu( this ); 233 mNewItemPopup = new QPopupMenu( this );
231 connect ( mNewItemPopup, SIGNAL (activated ( int ) ), this, SLOT ( newItem(int)) ); 234 connect ( mNewItemPopup, SIGNAL (activated ( int ) ), this, SLOT ( newItem(int)) );
232 QString pathString = ""; 235 QString pathString = "";
233 if ( !KOPrefs::instance()->mToolBarMiniIcons ) { 236 if ( !KOPrefs::instance()->mToolBarMiniIcons ) {
234 if ( QApplication::desktop()->width() < 480 ) 237 if ( QApplication::desktop()->width() < 480 )
235 pathString += "icons16/"; 238 pathString += "icons16/";
236 } else 239 } else
237 pathString += "iconsmini/"; 240 pathString += "iconsmini/";
238 241
239 mNewItemPopup->insertItem ( SmallIcon( pathString +"newevent" ), i18n("New Event..."), 1 ); 242 mNewItemPopup->insertItem ( SmallIcon( pathString +"newevent" ), i18n("New Event..."), 1 );
240 mNewItemPopup->insertItem ( SmallIcon( pathString +"newtodo" ), i18n("New Todo..."),2 ); 243 mNewItemPopup->insertItem ( SmallIcon( pathString +"newtodo" ), i18n("New Todo..."),2 );
241 mNewItemPopup->insertSeparator ( ); 244 mNewItemPopup->insertSeparator ( );
242 mNewItemPopup->insertItem ( SmallIcon( pathString +"day" ), i18n("Day view"),3 ); 245 mNewItemPopup->insertItem ( SmallIcon( pathString +"day" ), i18n("Day view"),3 );
243 mNewItemPopup->insertItem ( SmallIcon( pathString +"xdays" ), i18n("Next days"),8 ); 246 mNewItemPopup->insertItem ( SmallIcon( pathString +"xdays" ), i18n("Next days"),8 );
244 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next week"),4 ); 247 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next week"),4 );
245 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next two weeks"),5 ); 248 mNewItemPopup->insertItem ( SmallIcon( pathString +"week" ), i18n("Next two weeks"),5 );
246 mNewItemPopup->insertItem ( SmallIcon( pathString +"month" ), i18n("This month"),6 ); 249 mNewItemPopup->insertItem ( SmallIcon( pathString +"month" ), i18n("This month"),6 );
247 mNewItemPopup->insertItem ( SmallIcon( pathString +"journal" ), i18n("Journal view"),7 ); 250 mNewItemPopup->insertItem ( SmallIcon( pathString +"journal" ), i18n("Journal view"),7 );
248#ifndef _WIN32_ 251#ifndef _WIN32_
249 int wflags = viewport()-> getWFlags() |WRepaintNoErase;//WResizeNoErase 252 int wflags = viewport()-> getWFlags() |WRepaintNoErase;//WResizeNoErase
250 viewport()->setWFlags ( wflags); 253 viewport()->setWFlags ( wflags);
251#endif 254#endif
252 mGridSpacingX = 80; 255 mGridSpacingX = 80;
253 mResizeBorderWidth = 8; 256 mResizeBorderWidth = 8;
254 mScrollBorderWidth = 8; 257 mScrollBorderWidth = 8;
255 mScrollDelay = 30; 258 mScrollDelay = 30;
256 mScrollOffset = 10; 259 mScrollOffset = 10;
257 mPaintPixmap.resize( 20,20); 260 mPaintPixmap.resize( 20,20);
258 //enableClipper(true); 261 //enableClipper(true);
259 262
260 // Grab key strokes for keyboard navigation of agenda. Seems to have no 263 // Grab key strokes for keyboard navigation of agenda. Seems to have no
261 // effect. Has to be fixed. 264 // effect. Has to be fixed.
262 setFocusPolicy(WheelFocus); 265 setFocusPolicy(WheelFocus);
263 266
264 connect(&mScrollUpTimer,SIGNAL(timeout()),SLOT(scrollUp())); 267 connect(&mScrollUpTimer,SIGNAL(timeout()),SLOT(scrollUp()));
265 connect(&mScrollDownTimer,SIGNAL(timeout()),SLOT(scrollDown())); 268 connect(&mScrollDownTimer,SIGNAL(timeout()),SLOT(scrollDown()));
266 connect(&mResizeTimer,SIGNAL(timeout()),SLOT(finishResize())); 269 connect(&mResizeTimer,SIGNAL(timeout()),SLOT(finishResize()));
267 270
268 mStartCellX = 0; 271 mStartCellX = 0;
269 mStartCellY = 0; 272 mStartCellY = 0;
270 mCurrentCellX = 0; 273 mCurrentCellX = 0;
271 mCurrentCellY = 0; 274 mCurrentCellY = 0;
272 275
273 mSelectionCellX = 0; 276 mSelectionCellX = 0;
274 mSelectionYTop = 0; 277 mSelectionYTop = 0;
275 mSelectionHeight = 0; 278 mSelectionHeight = 0;
276 279
277 mOldLowerScrollValue = -1; 280 mOldLowerScrollValue = -1;
278 mOldUpperScrollValue = -1; 281 mOldUpperScrollValue = -1;
279 282
280 mClickedItem = 0; 283 mClickedItem = 0;
281 284
282 mActionItem = 0; 285 mActionItem = 0;
283 mActionType = NOP; 286 mActionType = NOP;
284 mItemMoved = false; 287 mItemMoved = false;
285 288
286 mSelectedItem = 0; 289 mSelectedItem = 0;
287 290
288 // mItems.setAutoDelete(true); 291 // mItems.setAutoDelete(true);
289 292
290 resizeContents( mGridSpacingX * mColumns + 1 , mGridSpacingY * mRows + 1 ); 293 resizeContents( mGridSpacingX * mColumns + 1 , mGridSpacingY * mRows + 1 );
291 294
292 viewport()->update(); 295 viewport()->update();
293 296
294 setMinimumSize(30, 1); 297 setMinimumSize(30, 1);
295// setMaximumHeight(mGridSpacingY * mRows + 5); 298// setMaximumHeight(mGridSpacingY * mRows + 5);
296 299
297 // Disable horizontal scrollbar. This is a hack. The geometry should be 300 // Disable horizontal scrollbar. This is a hack. The geometry should be
298 // controlled in a way that the contents horizontally always fits. Then it is 301 // controlled in a way that the contents horizontally always fits. Then it is
299 // not necessary to turn off the scrollbar. 302 // not necessary to turn off the scrollbar.
300 setHScrollBarMode(AlwaysOff); 303 setHScrollBarMode(AlwaysOff);
301 if ( ! mAllDayMode ) 304 if ( ! mAllDayMode )
302 setVScrollBarMode(AlwaysOn); 305 setVScrollBarMode(AlwaysOn);
303 else 306 else
304 setVScrollBarMode(AlwaysOff); 307 setVScrollBarMode(AlwaysOff);
305 308
306 setStartHour(KOPrefs::instance()->mDayBegins); 309 setStartHour(KOPrefs::instance()->mDayBegins);
307 310
308 calculateWorkingHours(); 311 calculateWorkingHours();
309 312
310 connect(verticalScrollBar(),SIGNAL(valueChanged(int)), 313 connect(verticalScrollBar(),SIGNAL(valueChanged(int)),
311 SLOT(checkScrollBoundaries(int))); 314 SLOT(checkScrollBoundaries(int)));
312 315
313 // Create the Marcus Bains line. 316 // Create the Marcus Bains line.
314 if(mAllDayMode) 317 if(mAllDayMode)
315 mMarcusBains = 0; 318 mMarcusBains = 0;
316 else { 319 else {
317 mMarcusBains = new MarcusBains(this); 320 mMarcusBains = new MarcusBains(this);
318 addChild(mMarcusBains); 321 addChild(mMarcusBains);
319 } 322 }
320 mPopupKind = 0; 323 mPopupKind = 0;
321 mPopupItem = 0; 324 mPopupItem = 0;
322 mInvalidPixmap = false; 325 mInvalidPixmap = false;
323 326
324} 327}
325 328
326void KOAgenda::shrinkPixmap() 329void KOAgenda::shrinkPixmap()
327{ 330{
328 mPaintPixmap.resize( 20,20); 331 mPaintPixmap.resize( 20,20);
329 mInvalidPixmap = true; 332 mInvalidPixmap = true;
330} 333}
331void KOAgenda::slotContentMove(int,int) 334void KOAgenda::slotContentMove(int,int)
332{ 335{
333 emit sendPing(); 336 emit sendPing();
334 if ( mActionType == NOP ) 337 if ( mActionType == NOP )
335 slotClearSelection(); 338 slotClearSelection();
336 if ( mSelectedItem && !mActionItem ) { 339 if ( mSelectedItem && !mActionItem ) {
337 deselectItem(); 340 deselectItem();
338 emit incidenceSelected( 0 ); 341 emit incidenceSelected( 0 );
339 } 342 }
340} 343}
341void KOAgenda::clear() 344void KOAgenda::clear()
342{ 345{
343 KOAgendaItem *item; 346 KOAgendaItem *item;
344 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 347 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
345 mUnusedItems.append( item ); 348 mUnusedItems.append( item );
346 //item->hide(); 349 //item->hide();
347 } 350 }
348 mItems.clear(); 351 mItems.clear();
349 mSelectedItem = 0; 352 mSelectedItem = 0;
350 clearSelection(); 353 clearSelection();
351} 354}
352 355
353void KOAgenda::clearSelection() 356void KOAgenda::clearSelection()
354{ 357{
355 mSelectionCellX = 0; 358 mSelectionCellX = 0;
356 mSelectionYTop = 0; 359 mSelectionYTop = 0;
357 mSelectionHeight = 0; 360 mSelectionHeight = 0;
358} 361}
359 362
360void KOAgenda::marcus_bains() 363void KOAgenda::marcus_bains()
361{ 364{
362 if(mMarcusBains) mMarcusBains->updateLocation(true); 365 if(mMarcusBains) mMarcusBains->updateLocation(true);
363} 366}
364 367
365 368
366void KOAgenda::changeColumns(int columns) 369void KOAgenda::changeColumns(int columns)
367{ 370{
368 if (columns == 0) { 371 if (columns == 0) {
369 qDebug("KOAgenda::changeColumns() called with argument 0 "); 372 qDebug("KOAgenda::changeColumns() called with argument 0 ");
370 return; 373 return;
371 } 374 }
372 clear(); 375 clear();
373 mColumns = columns; 376 mColumns = columns;
374 computeSizes(); 377 computeSizes();
378 if(mMarcusBains) mMarcusBains->hideMe();
375} 379}
376 380
377/* 381/*
378 This is the eventFilter function, which gets all events from the KOAgendaItems 382 This is the eventFilter function, which gets all events from the KOAgendaItems
379 contained in the agenda. It has to handle moving and resizing for all items. 383 contained in the agenda. It has to handle moving and resizing for all items.
380*/ 384*/
381bool KOAgenda::eventFilter ( QObject *object, QEvent *event ) 385bool KOAgenda::eventFilter ( QObject *object, QEvent *event )
382{ 386{
383 // kdDebug() << "KOAgenda::eventFilter" << endl; 387 // kdDebug() << "KOAgenda::eventFilter" << endl;
384 switch(event->type()) { 388 switch(event->type()) {
385 case QEvent::MouseButtonPress: 389 case QEvent::MouseButtonPress:
386 case QEvent::MouseButtonDblClick: 390 case QEvent::MouseButtonDblClick:
387 case QEvent::MouseButtonRelease: 391 case QEvent::MouseButtonRelease:
388 case QEvent::MouseMove: 392 case QEvent::MouseMove:
389 return eventFilter_mouse(object, static_cast<QMouseEvent *>(event)); 393 return eventFilter_mouse(object, static_cast<QMouseEvent *>(event));
390 394
391 case (QEvent::Leave): 395 case (QEvent::Leave):
392 if (!mActionItem) 396 if (!mActionItem)
393 setCursor(arrowCursor); 397 setCursor(arrowCursor);
394 return true; 398 return true;
395 399
396 default: 400 default:
397 return QScrollView::eventFilter(object,event); 401 return QScrollView::eventFilter(object,event);
398 } 402 }
399} 403}
400void KOAgenda::popupMenu() 404void KOAgenda::popupMenu()
401{ 405{
402 mPopupTimer->stop(); 406 mPopupTimer->stop();
403 if ( mPopupKind == 1 || mPopupKind == 3 ) { 407 if ( mPopupKind == 1 || mPopupKind == 3 ) {
404 if (mActionItem ) { 408 if (mActionItem ) {
405 endItemAction(); 409 endItemAction();
406 } 410 }
407 mLeftMouseDown = false; // no more leftMouse computation 411 mLeftMouseDown = false; // no more leftMouse computation
408 if (mPopupItem) { 412 if (mPopupItem) {
409 //mClickedItem = mPopupItem; 413 //mClickedItem = mPopupItem;
410 selectItem(mPopupItem); 414 selectItem(mPopupItem);
411 if ( mAllAgendaPopup && KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 1 ) 415 if ( mAllAgendaPopup && KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 1 )
412 mAllAgendaPopup->installEventFilter( this ); 416 mAllAgendaPopup->installEventFilter( this );
413 emit showIncidencePopupSignal(mPopupItem->incidence()); 417 emit showIncidencePopupSignal(mPopupItem->incidence());
414 418
415 } 419 }
416 } else if ( mPopupKind == 2 || mPopupKind == 4 ) { 420 } else if ( mPopupKind == 2 || mPopupKind == 4 ) {
417 if ( mLeftMouseDown ) { // we have a simulated right click - clear left mouse action 421 if ( mLeftMouseDown ) { // we have a simulated right click - clear left mouse action
418 endSelectAction( false ); // do not emit new event signal 422 endSelectAction( false ); // do not emit new event signal
419 mLeftMouseDown = false; // no more leftMouse computation 423 mLeftMouseDown = false; // no more leftMouse computation
420 } 424 }
421 if ( KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 2 ) 425 if ( KOPrefs::instance()->mBlockPopupMenu && mPopupKind == 2 )
422 mNewItemPopup->installEventFilter( this ); 426 mNewItemPopup->installEventFilter( this );
423 mNewItemPopup->popup( mPopupPos); 427 mNewItemPopup->popup( mPopupPos);
424 428
425 } 429 }
426 mLeftMouseDown = false; 430 mLeftMouseDown = false;
427 mPopupItem = 0; 431 mPopupItem = 0;
428 mPopupKind = 0; 432 mPopupKind = 0;
429} 433}
430void KOAgenda::categoryChanged(Incidence * inc) 434void KOAgenda::categoryChanged(Incidence * inc)
431{ 435{
432 KOAgendaItem *item; 436 KOAgendaItem *item;
433 for ( item=mItems.first(); item != 0; item=mItems.next() ) { 437 for ( item=mItems.first(); item != 0; item=mItems.next() ) {
434 if ( item->incidence() == inc ) { 438 if ( item->incidence() == inc ) {
435 item->initColor (); 439 item->initColor ();
436 item->updateItem(); 440 item->updateItem();
437 } 441 }
438 } 442 }
439} 443}
440bool KOAgenda::eventFilter_mouse(QObject *object, QMouseEvent *me) 444bool KOAgenda::eventFilter_mouse(QObject *object, QMouseEvent *me)
441{ 445{
442 446
443 if ( mInvalidPixmap ) { 447 if ( mInvalidPixmap ) {
444 mInvalidPixmap = false; 448 mInvalidPixmap = false;
445 qDebug("KO: Upsizing Pixmaps "); 449 qDebug("KO: Upsizing Pixmaps ");
446 computeSizes(); 450 computeSizes();
447 emit updateViewSignal(); 451 emit updateViewSignal();
448 return true; 452 return true;
449 } 453 }
450 emit sendPing(); 454 emit sendPing();
451 static int startX = 0; 455 static int startX = 0;
452 static int startY = 0; 456 static int startY = 0;
453 int blockmoveDist = ( QApplication::desktop()->width() < 480 ? 7 : 9 ); 457 int blockmoveDist = ( QApplication::desktop()->width() < 480 ? 7 : 9 );
454 static bool blockMoving = true; 458 static bool blockMoving = true;
455 459
456 //qDebug("KOAgenda::eventFilter_mous "); 460 //qDebug("KOAgenda::eventFilter_mous ");
457 if ( object == mNewItemPopup ) { 461 if ( object == mNewItemPopup ) {
458 //qDebug("mNewItemPopup "); 462 //qDebug("mNewItemPopup ");
459 if ( me->type() == QEvent::MouseButtonRelease ) { 463 if ( me->type() == QEvent::MouseButtonRelease ) {
460 mNewItemPopup->removeEventFilter( this ); 464 mNewItemPopup->removeEventFilter( this );
461 int dX = me->globalPos().x() - mPopupPos.x();; 465 int dX = me->globalPos().x() - mPopupPos.x();;
462 if ( dX < 0 ) 466 if ( dX < 0 )
463 dX = -dX; 467 dX = -dX;
464 int dY = me->globalPos().y() - mPopupPos.y(); 468 int dY = me->globalPos().y() - mPopupPos.y();
465 if ( dY < 0 ) 469 if ( dY < 0 )
466 dY = -dY; 470 dY = -dY;
467 if ( dX > blockmoveDist || dY > blockmoveDist ) { 471 if ( dX > blockmoveDist || dY > blockmoveDist ) {
468 mNewItemPopup->hide(); 472 mNewItemPopup->hide();
469 } 473 }
470 } 474 }
471 return true; 475 return true;
472 } 476 }
473 if ( object == mAllAgendaPopup ) { 477 if ( object == mAllAgendaPopup ) {
474 //qDebug(" mAllAgendaPopup "); 478 //qDebug(" mAllAgendaPopup ");
475 if ( me->type() == QEvent::MouseButtonRelease ) { 479 if ( me->type() == QEvent::MouseButtonRelease ) {
476 mAllAgendaPopup->removeEventFilter( this ); 480 mAllAgendaPopup->removeEventFilter( this );
477 int dX = me->globalPos().x() - mPopupPos.x();; 481 int dX = me->globalPos().x() - mPopupPos.x();;
478 if ( dX < 0 ) 482 if ( dX < 0 )
479 dX = -dX; 483 dX = -dX;
480 int dY = me->globalPos().y() - mPopupPos.y(); 484 int dY = me->globalPos().y() - mPopupPos.y();
481 if ( dY < 0 ) 485 if ( dY < 0 )
482 dY = -dY; 486 dY = -dY;
483 if ( dX > blockmoveDist || dY > blockmoveDist ) { 487 if ( dX > blockmoveDist || dY > blockmoveDist ) {
484 mAllAgendaPopup->hide(); 488 mAllAgendaPopup->hide();
485 } 489 }
486 } 490 }
487 return true; 491 return true;
488 } 492 }
489 QPoint viewportPos; 493 QPoint viewportPos;
490 if (object != viewport()) { 494 if (object != viewport()) {
491 blockmoveDist = blockmoveDist*2; 495 blockmoveDist = blockmoveDist*2;
492 viewportPos = ((QWidget *)object)->mapToParent(me->pos()); 496 viewportPos = ((QWidget *)object)->mapToParent(me->pos());
493 } else { 497 } else {
494 viewportPos = me->pos(); 498 viewportPos = me->pos();
495 } 499 }
496 bool objIsNotViewport = (object != viewport()); 500 bool objIsNotViewport = (object != viewport());
497 bool leftButt = false; 501 bool leftButt = false;
498#ifdef DESKTOP_VERSION 502#ifdef DESKTOP_VERSION
499 leftButt = (me->button() == LeftButton); 503 leftButt = (me->button() == LeftButton);
500#endif 504#endif
501 switch (me->type()) { 505 switch (me->type()) {
502 case QEvent::MouseButtonPress: 506 case QEvent::MouseButtonPress:
503 if (me->button() == LeftButton) { 507 if (me->button() == LeftButton) {
504 mPopupTimer->start( 600 ); 508 mPopupTimer->start( 600 );
505 mLeftMouseDown = true; 509 mLeftMouseDown = true;
506 } 510 }
507 blockMoving = true; 511 blockMoving = true;
508 startX = viewportPos.x(); 512 startX = viewportPos.x();
509 startY = viewportPos.y(); 513 startY = viewportPos.y();
510 mPopupPos = me->globalPos(); 514 mPopupPos = me->globalPos();
511 if ( objIsNotViewport && !leftButt ) { 515 if ( objIsNotViewport && !leftButt ) {
512 KOAgendaItem * tempItem = (KOAgendaItem *)object; 516 KOAgendaItem * tempItem = (KOAgendaItem *)object;
513 if (mAllDayMode) { 517 if (mAllDayMode) {
514 if ( tempItem->height() > 10 ) { 518 if ( tempItem->height() > 10 ) {
515 int minV = tempItem->height()/4; 519 int minV = tempItem->height()/4;
516 if ( minV > (blockmoveDist/2)-2 ) { 520 if ( minV > (blockmoveDist/2)-2 ) {
517 if ( minV > blockmoveDist ) 521 if ( minV > blockmoveDist )
518 minV = blockmoveDist; 522 minV = blockmoveDist;
519 else 523 else
520 minV = (blockmoveDist/2); 524 minV = (blockmoveDist/2);
521 } 525 }
522 bool border = false; 526 bool border = false;
523 int diff = tempItem->y() - viewportPos.y(); 527 int diff = tempItem->y() - viewportPos.y();
524 if ( diff < 0 ) 528 if ( diff < 0 )
525 diff *= -1; 529 diff *= -1;
526 if ( diff < minV ) { 530 if ( diff < minV ) {
527 border = true; 531 border = true;
528 objIsNotViewport = false; 532 objIsNotViewport = false;
529 } 533 }
530 if ( ! border ) { 534 if ( ! border ) {
531 diff = tempItem->y() + tempItem->height()- viewportPos.y(); 535 diff = tempItem->y() + tempItem->height()- viewportPos.y();
532 if ( diff < 0 ) 536 if ( diff < 0 )
533 diff *= -1; 537 diff *= -1;
534 if ( diff < minV ) { 538 if ( diff < minV ) {
535 border = true; 539 border = true;
536 objIsNotViewport = false; 540 objIsNotViewport = false;
537 } 541 }
538 } 542 }
539 } 543 }
540 } else { // not allday 544 } else { // not allday
541 if ( tempItem->width() > 10 ) { 545 if ( tempItem->width() > 10 ) {
542 int minH = tempItem->width()/4; 546 int minH = tempItem->width()/4;
543 if ( minH > (blockmoveDist/2)-2 ) { 547 if ( minH > (blockmoveDist/2)-2 ) {
544 if ( minH > blockmoveDist ) 548 if ( minH > blockmoveDist )
545 minH = blockmoveDist; 549 minH = blockmoveDist;
546 else 550 else
547 minH = (blockmoveDist/2); 551 minH = (blockmoveDist/2);
548 } 552 }
549 bool border = false; 553 bool border = false;
550 int diff = tempItem->x() - viewportPos.x(); 554 int diff = tempItem->x() - viewportPos.x();
551 if ( diff < 0 ) 555 if ( diff < 0 )
552 diff *= -1; 556 diff *= -1;
553 if ( diff < minH ) { 557 if ( diff < minH ) {
554 border = true; 558 border = true;
555 objIsNotViewport = false; 559 objIsNotViewport = false;
556 } 560 }
557 if ( ! border ) { 561 if ( ! border ) {
558 diff = tempItem->x() + tempItem->width() - viewportPos.x(); 562 diff = tempItem->x() + tempItem->width() - viewportPos.x();
559 if ( diff < 0 ) 563 if ( diff < 0 )
560 diff *= -1; 564 diff *= -1;
561 if ( diff < minH ) { 565 if ( diff < minH ) {
562 border = true; 566 border = true;
563 objIsNotViewport = false; 567 objIsNotViewport = false;
564 } 568 }
565 } 569 }
566 } 570 }
diff --git a/korganizer/koagenda.h b/korganizer/koagenda.h
index 86cf2f4..59e7472 100644
--- a/korganizer/koagenda.h
+++ b/korganizer/koagenda.h
@@ -1,243 +1,243 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23#ifndef KOAGENDA_H 23#ifndef KOAGENDA_H
24#define KOAGENDA_H 24#define KOAGENDA_H
25 25
26#include <qscrollview.h> 26#include <qscrollview.h>
27#include <qtimer.h> 27#include <qtimer.h>
28#include <qmemarray.h> 28#include <qmemarray.h>
29#include <qpainter.h> 29#include <qpainter.h>
30#include <qpixmap.h> 30#include <qpixmap.h>
31#include <qguardedptr.h> 31#include <qguardedptr.h>
32 32
33#include "koagendaitem.h" 33#include "koagendaitem.h"
34#include "koeventview.h" 34#include "koeventview.h"
35 35
36class QPopupMenu; 36class QPopupMenu;
37class QTime; 37class QTime;
38class KConfig; 38class KConfig;
39class QFrame; 39class QFrame;
40class KOAgenda; 40class KOAgenda;
41class KCal::Event; 41class KCal::Event;
42class KCal::Todo; 42class KCal::Todo;
43 43
44using namespace KCal; 44using namespace KCal;
45 45
46class MarcusBains : public QFrame { 46class MarcusBains : public QFrame {
47 Q_OBJECT 47 Q_OBJECT
48 public: 48 public:
49 MarcusBains(KOAgenda *agenda=0,const char *name=0); 49 MarcusBains(KOAgenda *agenda=0,const char *name=0);
50 virtual ~MarcusBains(); 50 virtual ~MarcusBains();
51 51 void hideMe();
52 public slots: 52 public slots:
53 void updateLocation(bool recalculate=false); 53 void updateLocation(bool recalculate=false);
54 void updateLoc(); 54 void updateLoc();
55 55
56 private: 56 private:
57 int todayColumn(); 57 int todayColumn();
58 QTimer *minutes; 58 QTimer *minutes;
59 QLabel *mTimeBox; 59 QLabel *mTimeBox;
60 KOAgenda *agenda; 60 KOAgenda *agenda;
61 QTime oldTime; 61 QTime oldTime;
62 int oldToday; 62 int oldToday;
63}; 63};
64 64
65 65
66class KOAgenda : public QScrollView 66class KOAgenda : public QScrollView
67{ 67{
68 Q_OBJECT 68 Q_OBJECT
69 public: 69 public:
70 enum MouseActionType { NOP, MOVE, SELECT, 70 enum MouseActionType { NOP, MOVE, SELECT,
71 RESIZETOP, RESIZEBOTTOM, RESIZELEFT, RESIZERIGHT }; 71 RESIZETOP, RESIZEBOTTOM, RESIZELEFT, RESIZERIGHT };
72 72
73 KOAgenda ( int columns, int rows, int columnSize, QWidget * parent=0, 73 KOAgenda ( int columns, int rows, int columnSize, QWidget * parent=0,
74 const char * name=0, WFlags f=0 ); 74 const char * name=0, WFlags f=0 );
75 KOAgenda ( int columns, QWidget * parent=0, 75 KOAgenda ( int columns, QWidget * parent=0,
76 const char * name=0, WFlags f=0 ); 76 const char * name=0, WFlags f=0 );
77 virtual ~KOAgenda(); 77 virtual ~KOAgenda();
78 bool mInvalidPixmap; 78 bool mInvalidPixmap;
79 79
80 Incidence *selectedIncidence() const; 80 Incidence *selectedIncidence() const;
81 QDate selectedIncidenceDate() const; 81 QDate selectedIncidenceDate() const;
82 82
83 virtual bool eventFilter ( QObject *, QEvent * ); 83 virtual bool eventFilter ( QObject *, QEvent * );
84 84
85 void contentsToGrid (int x, int y, int& gx, int& gy); 85 void contentsToGrid (int x, int y, int& gx, int& gy);
86 void gridToContents (int gx, int gy, int& x, int& y); 86 void gridToContents (int gx, int gy, int& x, int& y);
87 87
88 int timeToY (const QTime &time); 88 int timeToY (const QTime &time);
89 QTime gyToTime (int y); 89 QTime gyToTime (int y);
90 90
91 void setStartHour(int startHour); 91 void setStartHour(int startHour);
92 92
93 KOAgendaItem *insertItem (Incidence *event,QDate qd,int X,int YTop,int YBottom); 93 KOAgendaItem *insertItem (Incidence *event,QDate qd,int X,int YTop,int YBottom);
94 KOAgendaItem *insertAllDayItem (Incidence *event,QDate qd,int XBegin,int XEnd); 94 KOAgendaItem *insertAllDayItem (Incidence *event,QDate qd,int XBegin,int XEnd);
95 void insertMultiItem (Event *event,QDate qd,int XBegin,int XEnd, 95 void insertMultiItem (Event *event,QDate qd,int XBegin,int XEnd,
96 int YTop,int YBottom); 96 int YTop,int YBottom);
97 97
98 void changeColumns(int columns); 98 void changeColumns(int columns);
99 99
100 int columns() { return mColumns; } 100 int columns() { return mColumns; }
101 int rows() { return mRows; } 101 int rows() { return mRows; }
102 102
103 int gridSpacingX() const { return mGridSpacingX; } 103 int gridSpacingX() const { return mGridSpacingX; }
104 int gridSpacingY() const { return mGridSpacingY; } 104 int gridSpacingY() const { return mGridSpacingY; }
105 105
106// virtual QSizePolicy sizePolicy() const; 106// virtual QSizePolicy sizePolicy() const;
107 107
108 void clear(); 108 void clear();
109 109
110 void clearSelection(); 110 void clearSelection();
111 void hideUnused(); 111 void hideUnused();
112 112
113 /** Calculates the minimum width */ 113 /** Calculates the minimum width */
114 virtual int minimumWidth() const; 114 virtual int minimumWidth() const;
115 /** Update configuration from preference settings */ 115 /** Update configuration from preference settings */
116 void updateConfig(); 116 void updateConfig();
117 117
118 void checkScrollBoundaries(); 118 void checkScrollBoundaries();
119 119
120 void setHolidayMask(QMemArray<bool> *); 120 void setHolidayMask(QMemArray<bool> *);
121 void setDateList(const DateList &selectedDates); 121 void setDateList(const DateList &selectedDates);
122 DateList dateList() const; 122 DateList dateList() const;
123 void drawContentsToPainter( QPainter* paint = 0, bool backgroundOnly = false); 123 void drawContentsToPainter( QPainter* paint = 0, bool backgroundOnly = false);
124 void finishUpdate(); 124 void finishUpdate();
125 void printSelection(); 125 void printSelection();
126 void storePosition(); 126 void storePosition();
127 void restorePosition(); 127 void restorePosition();
128 void setPopup( KOEventPopupMenu * p ) { mAllAgendaPopup = p; } 128 void setPopup( KOEventPopupMenu * p ) { mAllAgendaPopup = p; }
129 void shrinkPixmap(); 129 void shrinkPixmap();
130 QTime getEndTime(); 130 QTime getEndTime();
131 131
132 public slots: 132 public slots:
133 void slotContentMove(int,int); 133 void slotContentMove(int,int);
134 void categoryChanged(Incidence * inc); 134 void categoryChanged(Incidence * inc);
135 void slotClearSelection(); 135 void slotClearSelection();
136 void popupMenu(); 136 void popupMenu();
137 void newItem( int ); 137 void newItem( int );
138 void moveChild( QWidget *, int, int ); 138 void moveChild( QWidget *, int, int );
139 void scrollUp(); 139 void scrollUp();
140 void scrollDown(); 140 void scrollDown();
141 void updateTodo( Todo * t, int , bool ); 141 void updateTodo( Todo * t, int , bool );
142 void popupAlarm(); 142 void popupAlarm();
143 143
144 void checkScrollBoundaries(int); 144 void checkScrollBoundaries(int);
145 145
146 /** Deselect selected items. This function does not emit any signals. */ 146 /** Deselect selected items. This function does not emit any signals. */
147 void deselectItem(); 147 void deselectItem();
148 /** Select item. If the argument is 0, the currently selected item gets 148 /** Select item. If the argument is 0, the currently selected item gets
149 deselected. This function emits the itemSelected(bool) signal to inform 149 deselected. This function emits the itemSelected(bool) signal to inform
150 about selection/deseelction of events. */ 150 about selection/deseelction of events. */
151 void selectItem(KOAgendaItem *); 151 void selectItem(KOAgendaItem *);
152 void finishResize(); 152 void finishResize();
153 153
154 signals: 154 signals:
155 void signalClearSelection(); 155 void signalClearSelection();
156 void showDateView( int, int); 156 void showDateView( int, int);
157 void newEventSignal(); 157 void newEventSignal();
158 void newEventSignal(int gx,int gy); 158 void newEventSignal(int gx,int gy);
159 void newTodoSignal(int gx,int gy); 159 void newTodoSignal(int gx,int gy);
160 void newEventSignal(int gxStart, int gyStart, int gxEnd, int gyEnd); 160 void newEventSignal(int gxStart, int gyStart, int gxEnd, int gyEnd);
161 void newTimeSpanSignal(int gxStart, int gyStart, int gxEnd, int gyEnd); 161 void newTimeSpanSignal(int gxStart, int gyStart, int gxEnd, int gyEnd);
162 void newStartSelectSignal(); 162 void newStartSelectSignal();
163 void showIncidenceSignal(Incidence *); 163 void showIncidenceSignal(Incidence *);
164 void editIncidenceSignal(Incidence *); 164 void editIncidenceSignal(Incidence *);
165 void deleteIncidenceSignal(Incidence *); 165 void deleteIncidenceSignal(Incidence *);
166 void showIncidencePopupSignal(Incidence *); 166 void showIncidencePopupSignal(Incidence *);
167 167
168 void itemModified(KOAgendaItem *item, int ); 168 void itemModified(KOAgendaItem *item, int );
169 void incidenceSelected(Incidence *); 169 void incidenceSelected(Incidence *);
170 170
171 void lowerYChanged(int); 171 void lowerYChanged(int);
172 void upperYChanged(int); 172 void upperYChanged(int);
173 173
174 void startDragSignal(Incidence *); 174 void startDragSignal(Incidence *);
175 void addToCalSignal(Incidence *, Incidence *); 175 void addToCalSignal(Incidence *, Incidence *);
176 void resizedSignal(); 176 void resizedSignal();
177 void updateViewSignal(); 177 void updateViewSignal();
178 void sendPing(); 178 void sendPing();
179 179
180 protected: 180 protected:
181 KOEventPopupMenu * mAllAgendaPopup; 181 KOEventPopupMenu * mAllAgendaPopup;
182 QPainter mPixPainter; 182 QPainter mPixPainter;
183 QPixmap mPaintPixmap; 183 QPixmap mPaintPixmap;
184 QPixmap mHighlightPixmap; 184 QPixmap mHighlightPixmap;
185 void drawContents(QPainter *p,int cx, int cy, int cw, int ch); 185 void drawContents(QPainter *p,int cx, int cy, int cw, int ch);
186 virtual void resizeEvent ( QResizeEvent * ); 186 virtual void resizeEvent ( QResizeEvent * );
187 187
188 /** Handles mouse events. Called from eventFilter */ 188 /** Handles mouse events. Called from eventFilter */
189 virtual bool eventFilter_mouse ( QObject *, QMouseEvent * ); 189 virtual bool eventFilter_mouse ( QObject *, QMouseEvent * );
190 190
191 /** Start selecting time span. */ 191 /** Start selecting time span. */
192 void startSelectAction(QPoint viewportPos); 192 void startSelectAction(QPoint viewportPos);
193 193
194 /** Select time span. */ 194 /** Select time span. */
195 void performSelectAction(QPoint viewportPos); 195 void performSelectAction(QPoint viewportPos);
196 196
197 /** Emd selecting time span. */ 197 /** Emd selecting time span. */
198 void endSelectAction( bool emitNewEvent = false ); 198 void endSelectAction( bool emitNewEvent = false );
199 199
200 /** Start moving/resizing agenda item */ 200 /** Start moving/resizing agenda item */
201 void startItemAction(QPoint viewportPos); 201 void startItemAction(QPoint viewportPos);
202 202
203 /** Move/resize agenda item */ 203 /** Move/resize agenda item */
204 void performItemAction(QPoint viewportPos); 204 void performItemAction(QPoint viewportPos);
205 205
206 /** End moving/resizing agenda item */ 206 /** End moving/resizing agenda item */
207 void endItemAction(); 207 void endItemAction();
208 208
209 /** Set cursor, when no item action is in progress */ 209 /** Set cursor, when no item action is in progress */
210 void setNoActionCursor(KOAgendaItem *moveItem,QPoint viewportPos); 210 void setNoActionCursor(KOAgendaItem *moveItem,QPoint viewportPos);
211 211
212 /** Place agenda item in agenda and adjust other cells if necessary */ 212 /** Place agenda item in agenda and adjust other cells if necessary */
213 void placeSubCells(KOAgendaItem *placeItem); 213 void placeSubCells(KOAgendaItem *placeItem);
214 214
215 /** Process the keyevent, including the ignored keyevents of eventwidgets. 215 /** Process the keyevent, including the ignored keyevents of eventwidgets.
216 * Implements pgup/pgdn and cursor key navigation in the view. 216 * Implements pgup/pgdn and cursor key navigation in the view.
217 */ 217 */
218 void keyPressEvent( QKeyEvent * ); 218 void keyPressEvent( QKeyEvent * );
219 219
220 void calculateWorkingHours(); 220 void calculateWorkingHours();
221 221
222 virtual void contentsMousePressEvent ( QMouseEvent * ); 222 virtual void contentsMousePressEvent ( QMouseEvent * );
223 223
224 private: 224 private:
225 void init(); 225 void init();
226 void marcus_bains(); 226 void marcus_bains();
227 bool mAllDayMode; 227 bool mAllDayMode;
228 bool blockResize; 228 bool blockResize;
229 bool mLeftMouseDown; 229 bool mLeftMouseDown;
230 KOAgendaItem *mPopupItem; 230 KOAgendaItem *mPopupItem;
231 QTimer* mPopupTimer; 231 QTimer* mPopupTimer;
232 int mPopupKind; 232 int mPopupKind;
233 QPoint mPopupPos; 233 QPoint mPopupPos;
234 QTimer mResizeTimer; 234 QTimer mResizeTimer;
235 double mContentPosition; 235 double mContentPosition;
236 236
237 // Width and height of agenda cells 237 // Width and height of agenda cells
238 int mGridSpacingX; 238 int mGridSpacingX;
239 int mGridSpacingY; 239 int mGridSpacingY;
240 240
241 // size of border, where mouse action will resize the KOAgendaItem 241 // size of border, where mouse action will resize the KOAgendaItem
242 int mResizeBorderWidth; 242 int mResizeBorderWidth;
243 243
diff --git a/korganizer/kotodoview.cpp b/korganizer/kotodoview.cpp
index f46a103..82c0f4c 100644
--- a/korganizer/kotodoview.cpp
+++ b/korganizer/kotodoview.cpp
@@ -1168,402 +1168,402 @@ void KOTodoView::editTodo()
1168void KOTodoView::cloneTodo() 1168void KOTodoView::cloneTodo()
1169{ 1169{
1170 if (mActiveItem) { 1170 if (mActiveItem) {
1171 emit cloneTodoSignal((Incidence*)mActiveItem->todo()); 1171 emit cloneTodoSignal((Incidence*)mActiveItem->todo());
1172 } 1172 }
1173} 1173}
1174void KOTodoView::cancelTodo() 1174void KOTodoView::cancelTodo()
1175{ 1175{
1176 if (mActiveItem) { 1176 if (mActiveItem) {
1177 emit cancelTodoSignal((Incidence*)mActiveItem->todo()); 1177 emit cancelTodoSignal((Incidence*)mActiveItem->todo());
1178 } 1178 }
1179} 1179}
1180void KOTodoView::moveTodo() 1180void KOTodoView::moveTodo()
1181{ 1181{
1182 if (mActiveItem) { 1182 if (mActiveItem) {
1183 emit moveTodoSignal((Incidence*)mActiveItem->todo()); 1183 emit moveTodoSignal((Incidence*)mActiveItem->todo());
1184 } 1184 }
1185} 1185}
1186void KOTodoView::beamTodo() 1186void KOTodoView::beamTodo()
1187{ 1187{
1188 if (mActiveItem) { 1188 if (mActiveItem) {
1189 emit beamTodoSignal((Incidence*)mActiveItem->todo()); 1189 emit beamTodoSignal((Incidence*)mActiveItem->todo());
1190 } 1190 }
1191} 1191}
1192 1192
1193 1193
1194void KOTodoView::showTodo() 1194void KOTodoView::showTodo()
1195{ 1195{
1196 if (mActiveItem) { 1196 if (mActiveItem) {
1197 emit showTodoSignal(mActiveItem->todo()); 1197 emit showTodoSignal(mActiveItem->todo());
1198 } 1198 }
1199} 1199}
1200 1200
1201void KOTodoView::deleteTodo() 1201void KOTodoView::deleteTodo()
1202{ 1202{
1203 if (mActiveItem) { 1203 if (mActiveItem) {
1204 emit deleteTodoSignal(mActiveItem->todo()); 1204 emit deleteTodoSignal(mActiveItem->todo());
1205 } 1205 }
1206} 1206}
1207 1207
1208void KOTodoView::setNewPriority(int index) 1208void KOTodoView::setNewPriority(int index)
1209{ 1209{
1210 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1210 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1211 mActiveItem->todo()->setPriority(mPriority[index]); 1211 mActiveItem->todo()->setPriority(mPriority[index]);
1212 mActiveItem->construct(); 1212 mActiveItem->construct();
1213 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED); 1213 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED);
1214 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1214 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1215 } 1215 }
1216 processSelectionChange(); 1216 processSelectionChange();
1217} 1217}
1218 1218
1219void KOTodoView::setNewPercentage(int index) 1219void KOTodoView::setNewPercentage(int index)
1220{ 1220{
1221 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1221 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1222 1222
1223 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) { 1223 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) {
1224 mActiveItem->setOn( true ); 1224 mActiveItem->setOn( true );
1225 processSelectionChange(); 1225 processSelectionChange();
1226 return; 1226 return;
1227 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) { 1227 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) {
1228 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent())); 1228 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent()));
1229 if ( par && par->isOn() ) 1229 if ( par && par->isOn() )
1230 par->setOn( false ); 1230 par->setOn( false );
1231 } 1231 }
1232 if (mPercentage[index] == 100) { 1232 if (mPercentage[index] == 100) {
1233 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime()); 1233 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime());
1234 } else { 1234 } else {
1235 mActiveItem->todo()->setCompleted(false); 1235 mActiveItem->todo()->setCompleted(false);
1236 } 1236 }
1237 mActiveItem->todo()->setPercentComplete(mPercentage[index]); 1237 mActiveItem->todo()->setPercentComplete(mPercentage[index]);
1238 mActiveItem->construct(); 1238 mActiveItem->construct();
1239 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED); 1239 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED);
1240 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1240 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1241 } 1241 }
1242 processSelectionChange(); 1242 processSelectionChange();
1243} 1243}
1244 1244
1245void KOTodoView::fillCategories () 1245void KOTodoView::fillCategories ()
1246{ 1246{
1247 mCategoryPopupMenu->clear(); 1247 mCategoryPopupMenu->clear();
1248 if ( ! mActiveItem ) return; 1248 if ( ! mActiveItem ) return;
1249 QStringList checkedCategories = mActiveItem->todo()->categories (); 1249 QStringList checkedCategories = mActiveItem->todo()->categories ();
1250 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin (); 1250 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin ();
1251 it != KOPrefs::instance()->mCustomCategories.end (); 1251 it != KOPrefs::instance()->mCustomCategories.end ();
1252 ++it) { 1252 ++it) {
1253 int index = mCategoryPopupMenu->insertItem (*it); 1253 int index = mCategoryPopupMenu->insertItem (*it);
1254 mCategory[index] = *it; 1254 mCategory[index] = *it;
1255 if (checkedCategories.find (*it) != checkedCategories.end ()) mCategoryPopupMenu->setItemChecked (index, true); 1255 if (checkedCategories.find (*it) != checkedCategories.end ()) mCategoryPopupMenu->setItemChecked (index, true);
1256 } 1256 }
1257} 1257}
1258void KOTodoView::fillCal () 1258void KOTodoView::fillCal ()
1259{ 1259{
1260 mCalPopupMenu->clear(); 1260 mCalPopupMenu->clear();
1261 if (!mActiveItem) return; 1261 if (!mActiveItem) return;
1262 bool readO = mActiveItem->todo()->isReadOnly(); 1262 bool readO = mActiveItem->todo()->isReadOnly();
1263 KopiCalendarFile * kkf = KOPrefs::instance()->mCalendars.first(); 1263 KopiCalendarFile * kkf = KOPrefs::instance()->mCalendars.first();
1264 while ( kkf ) { 1264 while ( kkf ) {
1265 int index = mCalPopupMenu->insertItem( kkf->mName, kkf->mCalNumber); 1265 int index = mCalPopupMenu->insertItem( kkf->mName, kkf->mCalNumber);
1266 if ( kkf->mErrorOnLoad || kkf->isReadOnly || readO ) 1266 if ( kkf->mErrorOnLoad || kkf->isReadOnly || readO )
1267 mCalPopupMenu->setItemEnabled( index, false ); 1267 mCalPopupMenu->setItemEnabled( index, false );
1268 mCalPopupMenu->setItemChecked (index, kkf->mCalNumber == mActiveItem->todo()->calID()); 1268 mCalPopupMenu->setItemChecked (index, kkf->mCalNumber == mActiveItem->todo()->calID());
1269 kkf = KOPrefs::instance()->mCalendars.next(); 1269 kkf = KOPrefs::instance()->mCalendars.next();
1270 } 1270 }
1271} 1271}
1272void KOTodoView::changedCal (int index ) 1272void KOTodoView::changedCal (int index )
1273{ 1273{
1274 if (!mActiveItem) return; 1274 if (!mActiveItem) return;
1275 mActiveItem->todo()->setCalID( index ); 1275 mActiveItem->todo()->setCalID( index );
1276 mActiveItem->construct(); 1276 mActiveItem->construct();
1277} 1277}
1278void KOTodoView::changedCategories(int index) 1278void KOTodoView::changedCategories(int index)
1279{ 1279{
1280 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1280 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1281 QStringList categories = mActiveItem->todo()->categories (); 1281 QStringList categories = mActiveItem->todo()->categories ();
1282 QString colcat = categories.first(); 1282 QString colcat = categories.first();
1283 if (categories.find (mCategory[index]) != categories.end ()) 1283 if (categories.find (mCategory[index]) != categories.end ())
1284 categories.remove (mCategory[index]); 1284 categories.remove (mCategory[index]);
1285 else 1285 else
1286 categories.insert (categories.end(), mCategory[index]); 1286 categories.insert (categories.end(), mCategory[index]);
1287 categories.sort (); 1287 categories.sort ();
1288 if ( !colcat.isEmpty() ) { 1288 if ( !colcat.isEmpty() ) {
1289 if ( categories.find ( colcat ) != categories.end () ) { 1289 if ( categories.find ( colcat ) != categories.end () ) {
1290 categories.remove( colcat ); 1290 categories.remove( colcat );
1291 categories.prepend( colcat ); 1291 categories.prepend( colcat );
1292 } 1292 }
1293 } 1293 }
1294 mActiveItem->todo()->setCategories (categories); 1294 mActiveItem->todo()->setCategories (categories);
1295 mActiveItem->construct(); 1295 mActiveItem->construct();
1296 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1296 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1297 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED); 1297 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED);
1298 } 1298 }
1299} 1299}
1300void KOTodoView::itemDoubleClicked(QListViewItem *item) 1300void KOTodoView::itemDoubleClicked(QListViewItem *item)
1301{ 1301{
1302 if ( pendingSubtodo != 0 ) { 1302 if ( pendingSubtodo != 0 ) {
1303 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1303 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1304 } 1304 }
1305 pendingSubtodo = 0; 1305 pendingSubtodo = 0;
1306 //int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() ); 1306 //int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() );
1307 int row = mTodoListView->header()->sectionAt ( mTodoListView->viewportToContents(mTodoListView->viewport()->mapFromGlobal( QCursor::pos())) .x() ); 1307 int row = mTodoListView->header()->sectionAt ( mTodoListView->viewportToContents(mTodoListView->viewport()->mapFromGlobal( QCursor::pos())) .x() );
1308 //qDebug("ROW %d ", row); 1308 //qDebug("ROW %d ", row);
1309 if (!item) { 1309 if (!item) {
1310 newTodo(); 1310 newTodo();
1311 return; 1311 return;
1312 } else { 1312 } else {
1313 if ( row == 1 ) { 1313 if ( row == 1 ) {
1314 mActiveItem = (KOTodoViewItem *) item; 1314 mActiveItem = (KOTodoViewItem *) item;
1315 newSubTodo(); 1315 newSubTodo();
1316 return; 1316 return;
1317 } 1317 }
1318 if ( row == 5 || row == 6 || row == 2) { 1318 if ( row == 5 || row == 6 || row == 2) {
1319 mActiveItem = (KOTodoViewItem *) item; 1319 mActiveItem = (KOTodoViewItem *) item;
1320 Todo * t = mActiveItem->todo(); 1320 Todo * t = mActiveItem->todo();
1321 if ( t->isRunning() ) { 1321 if ( t->isRunning() ) {
1322 if ( t->runTime() < 15) { 1322 if ( t->runTime() < 15) {
1323 t->stopRunning(); 1323 t->stopRunning();
1324 mActiveItem->construct(); 1324 mActiveItem->construct();
1325 topLevelWidget()->setCaption(i18n("Todo stopped - no data saved because runtime was < 15 sec!")); 1325 topLevelWidget()->setCaption(i18n("Todo stopped - no data saved because runtime was < 15 sec!"));
1326 return; 1326 return;
1327 } 1327 }
1328 else 1328 else
1329 toggleRunningItem(); 1329 toggleRunningItem();
1330 return; 1330 return;
1331 } else { 1331 } else {
1332 t->setRunning( true ); 1332 t->setRunning( true );
1333 mActiveItem->construct(); 1333 mActiveItem->construct();
1334 topLevelWidget()->setCaption(i18n("Todo started! Double click again to stop!")); 1334 topLevelWidget()->setCaption(i18n("Todo started! Double click again to stop!"));
1335 return; 1335 return;
1336 } 1336 }
1337 } 1337 }
1338 } 1338 }
1339 if ( KOPrefs::instance()->mEditOnDoubleClick ) 1339 if ( KOPrefs::instance()->mEditOnDoubleClick )
1340 editItem( item ); 1340 editItem( item );
1341 else 1341 else
1342 showItem( item , QPoint(), 0 ); 1342 showItem( item , QPoint(), 0 );
1343} 1343}
1344void KOTodoView::toggleRunningItem() 1344void KOTodoView::toggleRunningItem()
1345{ 1345{
1346 // qDebug("KOTodoView::toggleRunning() "); 1346 // qDebug("KOTodoView::toggleRunning() ");
1347 if ( ! mActiveItem ) 1347 if ( ! mActiveItem )
1348 return; 1348 return;
1349 Todo * t = mActiveItem->todo(); 1349 Todo * t = mActiveItem->todo();
1350 if ( t->isRunning() ) { 1350 if ( t->isRunning() ) {
1351 KOStopTodoPrefs tp ( t, this ); 1351 KOStopTodoPrefs tp ( t, this );
1352 if (QApplication::desktop()->width() <= 800 ){ 1352 if (QApplication::desktop()->width() <= 800 ){
1353 int wid = tp.width(); 1353 int wid = tp.width();
1354 int hei = tp.height(); 1354 int hei = tp.height();
1355 int xx = (QApplication::desktop()->width()-wid)/2; 1355 int xx = (QApplication::desktop()->width()-wid)/2;
1356 int yy = (QApplication::desktop()->height()-hei)/2; 1356 int yy = (QApplication::desktop()->height()-hei)/2;
1357 tp.setGeometry( xx,yy,wid,hei ); 1357 tp.setGeometry( xx,yy,wid,hei );
1358 } 1358 }
1359 tp.exec(); 1359 tp.exec();
1360 mActiveItem->construct(); 1360 updateTodo ( t, 0 );
1361 } else { 1361 } else {
1362 KOStartTodoPrefs tp ( t->summary(), this ); 1362 KOStartTodoPrefs tp ( t->summary(), this );
1363 if (QApplication::desktop()->width() <= 800 ){ 1363 if (QApplication::desktop()->width() <= 800 ){
1364 int wid = tp.width(); 1364 int wid = tp.width();
1365 int hei = tp.height(); 1365 int hei = tp.height();
1366 int xx = (QApplication::desktop()->width()-wid)/2; 1366 int xx = (QApplication::desktop()->width()-wid)/2;
1367 int yy = (QApplication::desktop()->height()-hei)/2; 1367 int yy = (QApplication::desktop()->height()-hei)/2;
1368 tp.setGeometry( xx,yy,wid,hei ); 1368 tp.setGeometry( xx,yy,wid,hei );
1369 } 1369 }
1370 if ( !tp.exec() ) return; 1370 if ( !tp.exec() ) return;
1371 if ( tp.stopAll() ) { 1371 if ( tp.stopAll() ) {
1372 mCalendar->stopAllTodos(); 1372 mCalendar->stopAllTodos();
1373 t->setRunning( true ); 1373 t->setRunning( true );
1374 updateView(); 1374 updateView();
1375 } else { 1375 } else {
1376 t->setRunning( true ); 1376 t->setRunning( true );
1377 mActiveItem->construct(); 1377 updateTodo ( t, 0 );
1378 } 1378 }
1379 } 1379 }
1380} 1380}
1381 1381
1382void KOTodoView::itemClicked(QListViewItem *item) 1382void KOTodoView::itemClicked(QListViewItem *item)
1383{ 1383{
1384 //qDebug("KOTodoView::itemClicked %d", item); 1384 //qDebug("KOTodoView::itemClicked %d", item);
1385 if (!item) { 1385 if (!item) {
1386 if ( pendingSubtodo != 0 ) { 1386 if ( pendingSubtodo != 0 ) {
1387 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1387 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1388 } 1388 }
1389 pendingSubtodo = 0; 1389 pendingSubtodo = 0;
1390 return; 1390 return;
1391 } 1391 }
1392 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1392 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1393 if ( pendingSubtodo != 0 ) { 1393 if ( pendingSubtodo != 0 ) {
1394 bool allowReparent = true; 1394 bool allowReparent = true;
1395 QListViewItem *par = item; 1395 QListViewItem *par = item;
1396 while ( par ) { 1396 while ( par ) {
1397 if ( par == pendingSubtodo ) { 1397 if ( par == pendingSubtodo ) {
1398 allowReparent = false; 1398 allowReparent = false;
1399 break; 1399 break;
1400 } 1400 }
1401 par = par->parent(); 1401 par = par->parent();
1402 } 1402 }
1403 if ( !allowReparent ) { 1403 if ( !allowReparent ) {
1404 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!")); 1404 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!"));
1405 pendingSubtodo = 0; 1405 pendingSubtodo = 0;
1406 } else { 1406 } else {
1407 Todo* newParent = todoItem->todo(); 1407 Todo* newParent = todoItem->todo();
1408 Todo* newSub = pendingSubtodo->todo(); 1408 Todo* newSub = pendingSubtodo->todo();
1409 pendingSubtodo = 0; 1409 pendingSubtodo = 0;
1410 emit reparentTodoSignal( newParent,newSub ); 1410 emit reparentTodoSignal( newParent,newSub );
1411 return; 1411 return;
1412 } 1412 }
1413 } 1413 }
1414 1414
1415} 1415}
1416 1416
1417void KOTodoView::setDocumentId( const QString &id ) 1417void KOTodoView::setDocumentId( const QString &id )
1418{ 1418{
1419 1419
1420 mDocPrefs->setDoc( id ); 1420 mDocPrefs->setDoc( id );
1421} 1421}
1422 1422
1423void KOTodoView::itemStateChanged( QListViewItem *item ) 1423void KOTodoView::itemStateChanged( QListViewItem *item )
1424{ 1424{
1425 if (!item) return; 1425 if (!item) return;
1426 1426
1427 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1427 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1428 1428
1429// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl; 1429// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl;
1430 1430
1431 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() ); 1431 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() );
1432} 1432}
1433 1433
1434void KOTodoView::saveLayout(KConfig *config, const QString &group) const 1434void KOTodoView::saveLayout(KConfig *config, const QString &group) const
1435{ 1435{
1436 mTodoListView->saveLayout(config,group); 1436 mTodoListView->saveLayout(config,group);
1437} 1437}
1438 1438
1439void KOTodoView::restoreLayout(KConfig *config, const QString &group) 1439void KOTodoView::restoreLayout(KConfig *config, const QString &group)
1440{ 1440{
1441 mTodoListView->restoreLayout(config,group); 1441 mTodoListView->restoreLayout(config,group);
1442} 1442}
1443 1443
1444void KOTodoView::processSelectionChange() 1444void KOTodoView::processSelectionChange()
1445{ 1445{
1446// kdDebug() << "KOTodoView::processSelectionChange()" << endl; 1446// kdDebug() << "KOTodoView::processSelectionChange()" << endl;
1447 1447
1448 KOTodoViewItem *item = 1448 KOTodoViewItem *item =
1449 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() ); 1449 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() );
1450 1450
1451 if ( !item ) { 1451 if ( !item ) {
1452 emit incidenceSelected( 0 ); 1452 emit incidenceSelected( 0 );
1453 mNewSubBut->setEnabled( false ); 1453 mNewSubBut->setEnabled( false );
1454 } else { 1454 } else {
1455 emit incidenceSelected( item->todo() ); 1455 emit incidenceSelected( item->todo() );
1456 mNewSubBut->setEnabled( true ); 1456 mNewSubBut->setEnabled( true );
1457 } 1457 }
1458} 1458}
1459 1459
1460void KOTodoView::modified(bool b) 1460void KOTodoView::modified(bool b)
1461{ 1461{
1462 emit isModified(b); 1462 emit isModified(b);
1463} 1463}
1464void KOTodoView::setTodoModified( Todo* todo ) 1464void KOTodoView::setTodoModified( Todo* todo )
1465{ 1465{
1466 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED ); 1466 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED );
1467} 1467}
1468void KOTodoView::clearSelection() 1468void KOTodoView::clearSelection()
1469{ 1469{
1470 mTodoListView->selectAll( false ); 1470 mTodoListView->selectAll( false );
1471} 1471}
1472void KOTodoView::setAllOpen() 1472void KOTodoView::setAllOpen()
1473{ 1473{
1474 if ( isFlatDisplay ) { 1474 if ( isFlatDisplay ) {
1475 isFlatDisplay = false; 1475 isFlatDisplay = false;
1476 mPopupMenu->setItemChecked( 8,false ); 1476 mPopupMenu->setItemChecked( 8,false );
1477 updateView(); 1477 updateView();
1478 } else { 1478 } else {
1479 storeCurrentItem(); 1479 storeCurrentItem();
1480 } 1480 }
1481 setOpen(mTodoListView->firstChild(), true); 1481 setOpen(mTodoListView->firstChild(), true);
1482 resetCurrentItem(); 1482 resetCurrentItem();
1483} 1483}
1484void KOTodoView::setAllClose() 1484void KOTodoView::setAllClose()
1485{ 1485{
1486 if ( isFlatDisplay ) { 1486 if ( isFlatDisplay ) {
1487 isFlatDisplay = false; 1487 isFlatDisplay = false;
1488 mPopupMenu->setItemChecked( 8,false ); 1488 mPopupMenu->setItemChecked( 8,false );
1489 updateView(); 1489 updateView();
1490 } else { 1490 } else {
1491 storeCurrentItem(); 1491 storeCurrentItem();
1492 } 1492 }
1493 setOpen(mTodoListView->firstChild(), false); 1493 setOpen(mTodoListView->firstChild(), false);
1494 resetCurrentItem(); 1494 resetCurrentItem();
1495} 1495}
1496void KOTodoView::setOpen( QListViewItem* item, bool setOpenI) 1496void KOTodoView::setOpen( QListViewItem* item, bool setOpenI)
1497{ 1497{
1498 1498
1499 while ( item ) { 1499 while ( item ) {
1500 setOpen( item->firstChild(), setOpenI ); 1500 setOpen( item->firstChild(), setOpenI );
1501 item->setOpen( setOpenI ); 1501 item->setOpen( setOpenI );
1502 item = item->nextSibling(); 1502 item = item->nextSibling();
1503 } 1503 }
1504} 1504}
1505 1505
1506void KOTodoView::displayAllFlat() 1506void KOTodoView::displayAllFlat()
1507{ 1507{
1508 storeCurrentItem(); 1508 storeCurrentItem();
1509 pendingSubtodo = 0; 1509 pendingSubtodo = 0;
1510 if ( mBlockUpdate ) { 1510 if ( mBlockUpdate ) {
1511 return; 1511 return;
1512 } 1512 }
1513 mPopupMenu->setItemChecked( 8,true ); 1513 mPopupMenu->setItemChecked( 8,true );
1514 isFlatDisplay = true; 1514 isFlatDisplay = true;
1515 QPtrList<Todo> todoList = calendar()->todos(); 1515 QPtrList<Todo> todoList = calendar()->todos();
1516 mTodoMap.clear(); 1516 mTodoMap.clear();
1517 mTodoListView->clear(); 1517 mTodoListView->clear();
1518 Todo *todo; 1518 Todo *todo;
1519 for(todo = todoList.first(); todo; todo = todoList.next()) { 1519 for(todo = todoList.first(); todo; todo = todoList.next()) {
1520 if ( checkTodo( todo ) ) { 1520 if ( checkTodo( todo ) ) {
1521 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 1521 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
1522 mTodoMap.insert(todo,todoItem); 1522 mTodoMap.insert(todo,todoItem);
1523 } 1523 }
1524 } 1524 }
1525 resetCurrentItem(); 1525 resetCurrentItem();
1526} 1526}
1527 1527
1528void KOTodoView::setAllFlat() 1528void KOTodoView::setAllFlat()
1529{ 1529{
1530 if ( isFlatDisplay ) { 1530 if ( isFlatDisplay ) {
1531 isFlatDisplay = false; 1531 isFlatDisplay = false;
1532 mPopupMenu->setItemChecked( 8,false ); 1532 mPopupMenu->setItemChecked( 8,false );
1533 updateView(); 1533 updateView();
1534 return; 1534 return;
1535 } 1535 }
1536 displayAllFlat(); 1536 displayAllFlat();
1537} 1537}
1538 1538
1539void KOTodoView::purgeCompleted() 1539void KOTodoView::purgeCompleted()
1540{ 1540{
1541 emit purgeCompletedSignal(); 1541 emit purgeCompletedSignal();
1542 1542
1543} 1543}
1544void KOTodoView::toggleQuickTodo() 1544void KOTodoView::toggleQuickTodo()
1545{ 1545{
1546 if ( mQuickBar->isVisible() ) { 1546 if ( mQuickBar->isVisible() ) {
1547 mQuickBar->hide(); 1547 mQuickBar->hide();
1548 KOPrefs::instance()->mEnableQuickTodo = false; 1548 KOPrefs::instance()->mEnableQuickTodo = false;
1549 } 1549 }
1550 else { 1550 else {
1551 mQuickBar->show(); 1551 mQuickBar->show();
1552 KOPrefs::instance()->mEnableQuickTodo = true; 1552 KOPrefs::instance()->mEnableQuickTodo = true;
1553 } 1553 }
1554 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 1554 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
1555 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 1555 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
1556} 1556}
1557 1557
1558void KOTodoView::toggleRunning() 1558void KOTodoView::toggleRunning()
1559{ 1559{
1560 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos; 1560 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos;
1561 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 1561 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
1562 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 1562 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
1563 updateView(); 1563 updateView();
1564 if ( KOPrefs::instance()->mHideNonStartedTodos ) 1564 if ( KOPrefs::instance()->mHideNonStartedTodos )
1565 topLevelWidget()->setCaption(i18n("Hide not Running")); 1565 topLevelWidget()->setCaption(i18n("Hide not Running"));
1566 else 1566 else
1567 topLevelWidget()->setCaption(i18n("Show not Running")); 1567 topLevelWidget()->setCaption(i18n("Show not Running"));
1568} 1568}
1569 1569
diff --git a/version b/version
index b29da4e..0e55faa 100644
--- a/version
+++ b/version
@@ -1 +1 @@
version = "2.1.18"; version = "2.1.19";