summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/WhatsNew.txt9
-rw-r--r--kaddressbook/kaddressbookview.cpp4
-rw-r--r--kaddressbook/kaddressbookview.h2
-rw-r--r--kaddressbook/views/kaddressbookcardview.cpp2
-rw-r--r--kaddressbook/views/kaddressbookiconview.cpp2
-rw-r--r--kaddressbook/views/kaddressbooktableview.cpp6
6 files changed, 18 insertions, 7 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt
index a425311..2fd63e7 100644
--- a/bin/kdepim/WhatsNew.txt
+++ b/bin/kdepim/WhatsNew.txt
@@ -1,682 +1,691 @@
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 1.9.17 ************
4
5KO/Pi:
6Fixed that tooltips were not updated after moving an item in agenda view.
7
8KA/Pi:
9All fields search does now actually search all the (possible) fields,
10not only those listed in the contact list.
11
3********** VERSION 1.9.16 ************ 12********** VERSION 1.9.16 ************
4 13
5KO/Pi: 14KO/Pi:
6Fixed search dialog size on Z 6000 (480x640 display). 15Fixed search dialog size on Z 6000 (480x640 display).
7Added setting to hide/show time in agenda items. 16Added setting to hide/show time in agenda items.
8Added setting to hide not running todos in todo view. 17Added setting to hide not running todos in todo view.
9Added columns for start date/time in todo view. 18Added columns for start date/time in todo view.
10Replaced the solid half-hour lines in agenda view by dot lines. 19Replaced the solid half-hour lines in agenda view by dot lines.
11Added possibility of printing the What's Next View on the desktop 20Added possibility of printing the What's Next View on the desktop
12(i.e. Windows and Linux). 21(i.e. Windows and Linux).
13Fixed a crash in KO/Pi when starting KO/Pi with What's Next view. 22Fixed a crash in KO/Pi when starting KO/Pi with What's Next view.
14Added tooltips in month view.(Tooltips only available on desktop) 23Added tooltips in month view.(Tooltips only available on desktop)
15 24
16Fixed a strange problem in KO/Pi alarm applet. 25Fixed a strange problem in KO/Pi alarm applet.
17Did not find the actual problem, 26Did not find the actual problem,
18such that now Qtopia reboots again if deinstalling the alarm applet. 27such that now Qtopia reboots again if deinstalling the alarm applet.
19But the alarm applet should work again. 28But the alarm applet should work again.
20 29
21KA/Pi: 30KA/Pi:
22Fixed the problem, that internal pictures were not saved. 31Fixed the problem, that internal pictures were not saved.
23 32
24Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes. 33Fixed a problem in the pi-sync mode by increasing the timeout for data transfer from 20 seconds to 5 minutes.
25 34
26Fixed some minor problems. (Like word wrap in help text windows). 35Fixed some minor problems. (Like word wrap in help text windows).
27 36
28Fixed a compiling problem in microkde/kresources. 37Fixed a compiling problem in microkde/kresources.
29 38
30KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM. 39KO/Pi is using zdbat (renamed to db2file) for syncing with Sharp DTM.
31This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9) 40This version now includes zdbat 1.0.0 (old version was zdbat 0.2.9)
32such that now syncing KO/Pi with Sharp DTM should work on the 41such that now syncing KO/Pi with Sharp DTM should work on the
33Zaurus C 3000 model. 42Zaurus C 3000 model.
34 43
35********** VERSION 1.9.15 ************ 44********** VERSION 1.9.15 ************
36 45
37Usebilty enhancements in KO/Pi: 46Usebilty enhancements in KO/Pi:
38When clicking on the date in a month view cell, the day view is shown. 47When clicking on the date in a month view cell, the day view is shown.
39Old behaviour was, that the "new event" dialog popped up. 48Old behaviour was, that the "new event" dialog popped up.
40 49
41Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu). 50Added a one step "undo delete" in KO/Pi (Accessable in the "Action" menu).
42That means, you can restore the latest 51That means, you can restore the latest
43event/todo/journal you have deleted. 52event/todo/journal you have deleted.
44A journal is deleted, if you clear all the text of the journal. 53A journal is deleted, if you clear all the text of the journal.
45 54
46Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14. 55Fixed the bug of the editor dialogs in KO/Pi of version 1.9.14.
47 56
48KA/Pi starting in 480x640 resolution: 57KA/Pi starting in 480x640 resolution:
49Hide the filter action in toolbar 58Hide the filter action in toolbar
50and added icons for undo/delete/redo in toolbar. 59and added icons for undo/delete/redo in toolbar.
51 60
52Change in OM/Pi ViewMail dialog: 61Change in OM/Pi ViewMail dialog:
53When clicking on the "delete" icon the mail is deleted after confirmation as usual. 62When clicking on the "delete" icon the mail is deleted after confirmation as usual.
54But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any). 63But the edit dialog is not closed as before, now the next mail in the folder is shown automatically (if there is any).
55 64
56Fixed a crash when deleting mail-accounts in OM/Pi. 65Fixed a crash when deleting mail-accounts in OM/Pi.
57 66
58 67
59********** VERSION 1.9.14 ************ 68********** VERSION 1.9.14 ************
60 69
61Fixed some problems with the dialog sizes when switching 70Fixed some problems with the dialog sizes when switching
62portrait/landscape mode on 640x480 PDA display. 71portrait/landscape mode on 640x480 PDA display.
63 72
64Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi. 73Fixed some other small bugs in KA/Pi KO/Pi and OM/Pi and PwM/Pi.
65 74
66Fixed an ugly bug in KOpieMail: 75Fixed an ugly bug in KOpieMail:
67KOpieMail was not able to write files (mails) to MSDOS file system, 76KOpieMail was not able to write files (mails) to MSDOS file system,
68like on an usual preformatted SD card. That should work now. 77like on an usual preformatted SD card. That should work now.
69To save your mail data on the Sd card do the following: 78To save your mail data on the Sd card do the following:
70Create a dir on the SD card: 79Create a dir on the SD card:
71mkdir /mnt/card/localmail 80mkdir /mnt/card/localmail
72Go to your home dir: 81Go to your home dir:
73cd 82cd
74Go to kopiemail data storage dir: 83Go to kopiemail data storage dir:
75cd kdepim/apps/kopiemail 84cd kdepim/apps/kopiemail
76Create a symlink to the SD card: 85Create a symlink to the SD card:
77ls -s /mnt/card/localmail 86ls -s /mnt/card/localmail
78Now KOpieMail will store all mails on the SD card. 87Now KOpieMail will store all mails on the SD card.
79 88
80KO/Pi Monthview: 89KO/Pi Monthview:
81Now "Go to Today" selects the current month from day 1-end, 90Now "Go to Today" selects the current month from day 1-end,
82not the current date + some days. 91not the current date + some days.
83I.e. "Go to Today" shows now always 92I.e. "Go to Today" shows now always
84the current month with first day of month in the first row. 93the current month with first day of month in the first row.
85 94
86Added missing German translation. 95Added missing German translation.
87 96
88Fixed icons of executeable on Wintendo. 97Fixed icons of executeable on Wintendo.
89 98
90Added a "Show next Mail" button to the OM/Pi 99Added a "Show next Mail" button to the OM/Pi
91mail viewer such that the mail below the current mail 100mail viewer such that the mail below the current mail
92in the mail list view of the current folder 101in the mail list view of the current folder
93can be read with a single click. 102can be read with a single click.
94 103
95 104
96********** VERSION 1.9.13 ************ 105********** VERSION 1.9.13 ************
97 106
98Fixed nasty PwM/Pi file reading bug, when 107Fixed nasty PwM/Pi file reading bug, when
99the used hash algo of file is different then the global 108the used hash algo of file is different then the global
100hash algo. 109hash algo.
101 110
102Added KA/Pi support for opie mailit mailapplication. 111Added KA/Pi support for opie mailit mailapplication.
103 112
104Fixed some bugs in OM/Pi. 113Fixed some bugs in OM/Pi.
105Now character conversion tables are available for the Zaurus 114Now character conversion tables are available for the Zaurus
106to make OM/Pi working properly. 115to make OM/Pi working properly.
107To get the character conversion in OM/Pi working, please download 116To get the character conversion in OM/Pi working, please download
108at the sourceforge project site the package 117at the sourceforge project site the package
109sr-character-conversion_SharpROM_arm.ipk.zip 118sr-character-conversion_SharpROM_arm.ipk.zip
110(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms) 119(or oz-character-conversion_OZ-gcc3xx_arm.ipk.zip for OZ roms)
111from the section "general files for KDE/Pim" 120from the section "general files for KDE/Pim"
112Instructions how to install this package are in a ReadMe in this file. 121Instructions how to install this package are in a ReadMe in this file.
113 122
114 123
115Fixed the orientation change problem in KA/Pi when switching 124Fixed the orientation change problem in KA/Pi when switching
116portrait/landscape mode. 125portrait/landscape mode.
117 126
118French translation available for KA/Pi and OM/Pi. 127French translation available for KA/Pi and OM/Pi.
119 128
120Fixed some problems with categories in KO/Pi in DTM sync. 129Fixed some problems with categories in KO/Pi in DTM sync.
121 130
122Added selection dialog for export to phone in KA/Pi. 131Added selection dialog for export to phone in KA/Pi.
123 132
124If in KO/Pi is an attendee selected to add to a meeting and this 133If in KO/Pi is an attendee selected to add to a meeting and this
125attendee is already in the list of attendees, this person is not added 134attendee is already in the list of attendees, this person is not added
126again. 135again.
127 136
128Some menu cleanup in KA/Pi. 137Some menu cleanup in KA/Pi.
129 138
130********** VERSION 1.9.12 ************ 139********** VERSION 1.9.12 ************
131 140
132Fix for the bug in KO/Pi What's Next view of version 1.9.11. 141Fix for the bug in KO/Pi What's Next view of version 1.9.11.
133 142
134Bugfix: Licence file is now shown again. 143Bugfix: Licence file is now shown again.
135 144
136OM/Pi now supports Unicode (utf8 charset). 145OM/Pi now supports Unicode (utf8 charset).
137Fixed some bugs in OM/Pi. 146Fixed some bugs in OM/Pi.
138 147
139KA/Pi has more German translation. 148KA/Pi has more German translation.
140 149
141 150
142********** VERSION 1.9.11 ************ 151********** VERSION 1.9.11 ************
143 152
144Fixed several problems in PWM/Pi, like 153Fixed several problems in PWM/Pi, like
145asking the user, if unsaved changed are pending 154asking the user, if unsaved changed are pending
146when closing the app. 155when closing the app.
147And PwM/Pi handles now different texts for the 156And PwM/Pi handles now different texts for the
148fields Description, Username, Password, configurable per category. 157fields Description, Username, Password, configurable per category.
149 158
150Fixed a crash in KO/Pi , when importing/loading vcs files 159Fixed a crash in KO/Pi , when importing/loading vcs files
151which have an entry with an attendee with state: 160which have an entry with an attendee with state:
152NEEDS ACTION 161NEEDS ACTION
153 162
154Fixed some problems in the German translation of OM/Pi, 163Fixed some problems in the German translation of OM/Pi,
155which makes some dialogs not fitting on the screen 164which makes some dialogs not fitting on the screen
156of the Z 5500. 165of the Z 5500.
157 166
158Fixed Qtopia crash, when disabling/deinstalling 167Fixed Qtopia crash, when disabling/deinstalling
159KO/Pi alarm applet. 168KO/Pi alarm applet.
160 169
161Implemented direct KDE<->KA/Pi sync for KA/Pi running 170Implemented direct KDE<->KA/Pi sync for KA/Pi running
162on Linux desktop. 171on Linux desktop.
163 172
164Added feature "remove sync info" to sync menu. 173Added feature "remove sync info" to sync menu.
165 174
166Tweaked the KO/Pi What's next view a bit, added 175Tweaked the KO/Pi What's next view a bit, added
167setting to hide events that are done. 176setting to hide events that are done.
168 177
169Disabled "beam receive enabled" on startup to 178Disabled "beam receive enabled" on startup to
170avoid problems if Fastload is enabled. 179avoid problems if Fastload is enabled.
171Please set "beam receive enabled", 180Please set "beam receive enabled",
172if you want to receive data via IR. 181if you want to receive data via IR.
173 182
174Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running 183Fixed bug in direct KDE<->KO/Pi sync for KO/Pi running
175on Linux desktop. 184on Linux desktop.
176 185
177Made in KA/Pi scrolling possible, if details view is selected. 186Made in KA/Pi scrolling possible, if details view is selected.
178(The keyboard focus is set automatically to the search line) 187(The keyboard focus is set automatically to the search line)
179 188
180Fixed a bug in DMT sync, that a new entry in DTM was added 189Fixed a bug in DMT sync, that a new entry in DTM was added
181on every sync to Kx/Pi. 190on every sync to Kx/Pi.
182 191
183Fixed missing writing of KA/Pi categories to DMT entries when syncing. 192Fixed missing writing of KA/Pi categories to DMT entries when syncing.
184 193
185Fixed a bug in DMT sync with todos created in KO/Pi containing 194Fixed a bug in DMT sync with todos created in KO/Pi containing
186non-latin1 characters. 195non-latin1 characters.
187 196
188Rearranged package contents of Sharp-ipks and made all 197Rearranged package contents of Sharp-ipks and made all
189packages installable on SD again. 198packages installable on SD again.
190 199
191Fixed the writing of addressbook data in DTM sync. 200Fixed the writing of addressbook data in DTM sync.
192Empty fields in KA/Pi were not removed. 201Empty fields in KA/Pi were not removed.
193 202
194Added better category handling in KA/Pi: 203Added better category handling in KA/Pi:
195Added item 204Added item
196Edit Categories and 205Edit Categories and
197Manage new categories 206Manage new categories
198to the settings menu. 207to the settings menu.
199Possible to configure a view to display categories. 208Possible to configure a view to display categories.
200 209
201Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu. 210Added detailed "KDE Sync Howto" and "Multi Sync Howto" to Help menu.
202 211
203Fixed displaying of "free" days and time in KO Monthview and Agendaview. 212Fixed displaying of "free" days and time in KO Monthview and Agendaview.
204 213
205... and many other bugfixes. 214... and many other bugfixes.
206 215
207********** VERSION 1.9.10 ************ 216********** VERSION 1.9.10 ************
208 217
209Many internal small bugfixes. 218Many internal small bugfixes.
210And fix of the "big" bug in KO/Pi, 219And fix of the "big" bug in KO/Pi,
211that after Syncing the appointments had an offset by several hours. 220that after Syncing the appointments had an offset by several hours.
212That was a problem with the internal timezone setting, 221That was a problem with the internal timezone setting,
213introduced by the changed timezone configuration settings. 222introduced by the changed timezone configuration settings.
214 223
215German translation for OM/Pi is now available. 224German translation for OM/Pi is now available.
216 225
217 226
218********** VERSION 1.9.9 ************ 227********** VERSION 1.9.9 ************
219 228
220KDE-Pim/Pi has a new Member! 229KDE-Pim/Pi has a new Member!
221It is called PWM/Pi (Passwordmanager/platform-independent) 230It is called PWM/Pi (Passwordmanager/platform-independent)
222and it is available for the Zaurus. 231and it is available for the Zaurus.
223It is planned, that it will be available later for Windows. 232It is planned, that it will be available later for Windows.
224(And for Linux, of course). 233(And for Linux, of course).
225It is a port of the Passwordmanager of KDE. 234It is a port of the Passwordmanager of KDE.
226It will need the MicroKDElibs to run. 235It will need the MicroKDElibs to run.
227 236
228Made loading of addressbooks in KA/Pi up to 7 times faster! 237Made loading of addressbooks in KA/Pi up to 7 times faster!
229The bigger your addressbook file, the more starting speed 238The bigger your addressbook file, the more starting speed
230will you gain. (relatively) 239will you gain. (relatively)
231 240
232The Qtopia addressbook connector is now platform independend 241The Qtopia addressbook connector is now platform independend
233as well and should work on any platform for importing/exporting 242as well and should work on any platform for importing/exporting
234Qtopia and Opie XML files. 243Qtopia and Opie XML files.
235 244
236Added a +30min feature to the timezone settings to make 245Added a +30min feature to the timezone settings to make
237KDE-Pim/Pi useable in Australia and other parts on the 246KDE-Pim/Pi useable in Australia and other parts on the
238world with strange timezones ;-) 247world with strange timezones ;-)
239 248
240German "Umlaute" should now be sorted correctly on the Z in KA/Pi. 249German "Umlaute" should now be sorted correctly on the Z in KA/Pi.
241 250
242It is now possible to disable the 251It is now possible to disable the
243"receive data via infrared" feature, such that syncing with 252"receive data via infrared" feature, such that syncing with
244Outlook is now possible again with Kx/Pi runing. 253Outlook is now possible again with Kx/Pi runing.
245Please disable it, before syncing Sharp DTM with Outlook. 254Please disable it, before syncing Sharp DTM with Outlook.
246For your convenience, the "receive data via infrared" feature 255For your convenience, the "receive data via infrared" feature
247is disabled automatically, if you sync Kx/Pi with DTM. 256is disabled automatically, if you sync Kx/Pi with DTM.
248You have to enable it again manually after syncing. 257You have to enable it again manually after syncing.
249Enabling this feature makes it impossible to start the 258Enabling this feature makes it impossible to start the
250Sharp DTM apps. If this feature is enabled, you will only get the 259Sharp DTM apps. If this feature is enabled, you will only get the
251alarm notification from KO/Pi and not from the Sharp calendar. 260alarm notification from KO/Pi and not from the Sharp calendar.
252This is very useful if you sync KO/Pi with Sharp DTM, 261This is very useful if you sync KO/Pi with Sharp DTM,
253because after syncing you usually would get notified about 262because after syncing you usually would get notified about
254an alarm by KO/Pi and the Sharp Calendar. 263an alarm by KO/Pi and the Sharp Calendar.
255 264
256Together with the Linux desktop version of KO/Pi 265Together with the Linux desktop version of KO/Pi
257it is now possible to sync KO/Pi on the Zaurus 266it is now possible to sync KO/Pi on the Zaurus
258with the complete KDE-desktop (3.3 or later) 267with the complete KDE-desktop (3.3 or later)
259calendar data easily. 268calendar data easily.
260That makes it possible to sync the Z with one 269That makes it possible to sync the Z with one
261click of a mouse with the KDE-Desktop. 270click of a mouse with the KDE-Desktop.
262This feature it available for all Zaurus platforms KO/Pi 271This feature it available for all Zaurus platforms KO/Pi
263is running on. 272is running on.
264The only thing needed is a running KO/Pi on Linux and 273The only thing needed is a running KO/Pi on Linux and
265a compiled version of the small 274a compiled version of the small
266KDE-Pim/Pi<->KDE-Desktop access command line program, 275KDE-Pim/Pi<->KDE-Desktop access command line program,
267which is in the KDE-Pim/Pi sources available. 276which is in the KDE-Pim/Pi sources available.
268 277
269The "KDE-desktop" syncing feature for KA/Pi will follow 278The "KDE-desktop" syncing feature for KA/Pi will follow
270in the next releases. 279in the next releases.
271 280
272Fixed the vcard export bug, which had the version 1.9.8. 281Fixed the vcard export bug, which had the version 1.9.8.
273 282
274Added missing GERMAN translation to KO/Pi. 283Added missing GERMAN translation to KO/Pi.
275Hi PsionX, could you add the missing french translation?Thx! 284Hi PsionX, could you add the missing french translation?Thx!
276 285
277Translation files for KA/Pi are available as well. 286Translation files for KA/Pi are available as well.
278GERMAN translation will be available in the next release. 287GERMAN translation will be available in the next release.
279PsionX ( yres, you again ;-) ), could you start translating 288PsionX ( yres, you again ;-) ), could you start translating
280KA/Pi? Thx! 289KA/Pi? Thx!
281 290
282You can download the version 1.9.9 at 291You can download the version 1.9.9 at
283 292
284http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604 293http://sourceforge.net/project/showfiles.php?group_id=104103&package_id=112604
285 294
286Note: 295Note:
287To run the mail program OM/Pi you need libopenssl. 296To run the mail program OM/Pi you need libopenssl.
288A link to a download loaction is available at 297A link to a download loaction is available at
289ZSI at www.killefiz.de 298ZSI at www.killefiz.de
290 299
291 300
292********** VERSION 1.9.8 ************ 301********** VERSION 1.9.8 ************
293 302
294Fixed character decoding in OM/Pi. 303Fixed character decoding in OM/Pi.
295(e.g. German "Umlaute" were not displayed properly.) 304(e.g. German "Umlaute" were not displayed properly.)
296 305
297Made is possible to reparent todos in KO/Pi. 306Made is possible to reparent todos in KO/Pi.
298Use contextmenu or keys (look at Help-Keys + Colors) for that. 307Use contextmenu or keys (look at Help-Keys + Colors) for that.
299 308
300Added the missing Sync-Howto and WhatsNew to the packages. 309Added the missing Sync-Howto and WhatsNew to the packages.
301 310
302KO/Pi on Linux desktop can now sync with KDE desktop. 311KO/Pi on Linux desktop can now sync with KDE desktop.
303That means: When using KO/Pi on Linux desktop for syncing with 312That means: When using KO/Pi on Linux desktop for syncing with
304KDE desktop and the Zaurus, the Zaurus can be synced now 313KDE desktop and the Zaurus, the Zaurus can be synced now
305with all KDE-Calendar resources, not only with one local file. 314with all KDE-Calendar resources, not only with one local file.
306(That makes it possible to sync the Zaurus with the 315(That makes it possible to sync the Zaurus with the
307calendar data on a Kolab server) 316calendar data on a Kolab server)
308 317
309KA/Pi syncing with KDE desktop will be available in the next version. 318KA/Pi syncing with KDE desktop will be available in the next version.
310 319
311 320
312********** VERSION 1.9.7 ************ 321********** VERSION 1.9.7 ************
313 322
314KO/Pi - KA/Pi on Windows: 323KO/Pi - KA/Pi on Windows:
315Now a directory can be defined by the user, where the 324Now a directory can be defined by the user, where the
316application/config data should be saved. 325application/config data should be saved.
317 Define your desired path in the evironment variable 326 Define your desired path in the evironment variable
318 MICROKDEHOME 327 MICROKDEHOME
319 before starting KO/Pi or KA/Pi. 328 before starting KO/Pi or KA/Pi.
320 329
321An easy Kx/Pi to Kx/Pi syncing is now possible 330An easy Kx/Pi to Kx/Pi syncing is now possible
322(it is called Pi-Sync) via network. 331(it is called Pi-Sync) via network.
323Please look at the Sync Howto. 332Please look at the Sync Howto.
324 333
325Exporting of calendar data and contacts to mobile phones is now possible. 334Exporting of calendar data and contacts to mobile phones is now possible.
326The SyncHowto is updated with information howto 335The SyncHowto is updated with information howto
327access/sync mobile phones. 336access/sync mobile phones.
328Please look at the Sync Howto. 337Please look at the Sync Howto.
329 338
330Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly. 339Now KO/Pi and KA/Pi on the Zaurus can receive data via infrared directly.
331Please disable Fastload for the original contact/calendar applications 340Please disable Fastload for the original contact/calendar applications
332and close them. 341and close them.
333KO/Pi and KA/Pi must be running in order to receive the data. 342KO/Pi and KA/Pi must be running in order to receive the data.
334(KO/Pi and KA/Pi are always running if Fastload for them is enabled!) 343(KO/Pi and KA/Pi are always running if Fastload for them is enabled!)
335 344
336In the KA/Pi details view are now the preferred tel. numbers displayed on top 345In the KA/Pi details view are now the preferred tel. numbers displayed on top
337of the other data ( emails/tel.numbers/addresses) 346of the other data ( emails/tel.numbers/addresses)
338 347
339Fixed some syncing problems in KA/Pi. 348Fixed some syncing problems in KA/Pi.
340 349
341Added font settings for the KA/Pi details view. 350Added font settings for the KA/Pi details view.
342Added fields "children's name" and "gender" to KA/Pi. 351Added fields "children's name" and "gender" to KA/Pi.
343 352
344Made searching in KA/Pi better: 353Made searching in KA/Pi better:
345Now the first item in a view is selected after a search automatically and 354Now the first item in a view is selected after a search automatically and
346the views can be scrolled up/down when the search input field has the keyboard focus. 355the views can be scrolled up/down when the search input field has the keyboard focus.
347 356
348And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi. 357And, of course, fixed a bunch of reported bugs in KO/Pi and KA/Pi.
349 358
350 359
351********** VERSION 1.9.6 ************ 360********** VERSION 1.9.6 ************
352 361
353Changes in the external application communication on the Zaurus 362Changes in the external application communication on the Zaurus
354in order to use less RAM when the apps are running. 363in order to use less RAM when the apps are running.
355First syncing of addressbooks (KA/Pi) is possible. 364First syncing of addressbooks (KA/Pi) is possible.
356 365
357 366
358********** VERSION 1.9.5a ************ 367********** VERSION 1.9.5a ************
359 368
360Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5. 369Fixed a bug in KO/Pi in the SharpDTM sync of version 1.9.5.
361Fixed some small bugs. 370Fixed some small bugs.
362KA/Pi shows now the birthday in summary view. 371KA/Pi shows now the birthday in summary view.
363Now OM/Pi and KA/Pi are using the date format defined in KO/Pi 372Now OM/Pi and KA/Pi are using the date format defined in KO/Pi
364for displaying dates. 373for displaying dates.
365 374
366 375
367********** VERSION 1.9.5 ************ 376********** VERSION 1.9.5 ************
368 377
369There is still no Addressbook syncing! 378There is still no Addressbook syncing!
370 379
371New in 1.9.5: 380New in 1.9.5:
372 381
373Many bugfixes. 382Many bugfixes.
374Better searching in KA/Pi. 383Better searching in KA/Pi.
375You can configure in KA/Pi if you want to search only after 384You can configure in KA/Pi if you want to search only after
376<return> key pressed. 385<return> key pressed.
377 386
378Better mail downloading in OM/Pi. 387Better mail downloading in OM/Pi.
379 388
380First experimental alpha version of sync of KO/Pi with mobile phones. 389First experimental alpha version of sync of KO/Pi with mobile phones.
381See gammu documentation for supported phones. 390See gammu documentation for supported phones.
382You need to install the package kammu_1.9.5_arm.ipk for sync of KO/Pi with mobile phones. kammu_1.9.5_arm.ipk needs libbluetooth and libsdp. 391You need to install the package kammu_1.9.5_arm.ipk for sync of KO/Pi with mobile phones. kammu_1.9.5_arm.ipk needs libbluetooth and libsdp.
383Quick hint how to use: 392Quick hint how to use:
384NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL! 393NOTE: MOBILE PHONE SYNC IS EXPERIMENTAL!
385Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp. 394Install kammu_1.9.5_arm.ipk , libbluetooth and libsdp.
386Create syncprofile - mobile device 395Create syncprofile - mobile device
387Remove entry for model. (Leave empty ). 396Remove entry for model. (Leave empty ).
388Enable infrared on Zaurus and your Phone. 397Enable infrared on Zaurus and your Phone.
389Sync. 398Sync.
390To get a more detailed log, start kopi from konsole. 399To get a more detailed log, start kopi from konsole.
391 400
392********** VERSION 1.9.4 ************ 401********** VERSION 1.9.4 ************
393 402
394This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus. 403This is the version 1.9.4 of KDE-Pim/Pi for the Zaurus.
395 404
396WARNING: 405WARNING:
397PLEASE BACKUP ALL YOUR DATA! 406PLEASE BACKUP ALL YOUR DATA!
398We have changed a lot and maybe there are some unknown problems. 407We have changed a lot and maybe there are some unknown problems.
399 408
400SYNC HANDLING HAS CHANGED! 409SYNC HANDLING HAS CHANGED!
401Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 410Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
402(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 411(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
403 412
404You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs. 413You need the kmicrokdelibs_1.9.4_arm.ipk as a base for the other programs.
405If you get the error: "Install only possible in main memory", just try it again to install it on SD card. That worked for me. And it was reported that rebooting Qtopia did help in this case as well. 414If you get the error: "Install only possible in main memory", just try it again to install it on SD card. That worked for me. And it was reported that rebooting Qtopia did help in this case as well.
406 415
407As programs are available: 416As programs are available:
408KO/Pi (korganizer ipk) - a calendar program. 417KO/Pi (korganizer ipk) - a calendar program.
409KA/Pi (kaddressbook ipk ) - an addressbook 418KA/Pi (kaddressbook ipk ) - an addressbook
410OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support. 419OM/Pi (kopiemail ipk ) an email program with pop/smtp and IMAP support.
411 420
412An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode. 421An alarm notification program ( korganizer-alarm ipk ) for KO/Pi that notifies you about alarms, even if the Zaurus is in suspend mode.
413(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia) 422(If you do not see an icon in the taskbar after installing korganizer-alarm, please restart Qtopia)
414 423
415All the applications are installed in a "Pim" TAB. 424All the applications are installed in a "Pim" TAB.
416If this TAB is new on your system, you can get an icon in this TAB by installing pim_TAB_icon_1.9.4_arm.ipk 425If this TAB is new on your system, you can get an icon in this TAB by installing pim_TAB_icon_1.9.4_arm.ipk
417 426
418All the application are integrated. 427All the application are integrated.
419Such that you can choose in KO/Pi the attendees of a meeting from the addresses in KA/Pi. When you click in KA/Pi on the email address, OM/Pi is started to write the mail. 428Such that you can choose in KO/Pi the attendees of a meeting from the addresses in KA/Pi. When you click in KA/Pi on the email address, OM/Pi is started to write the mail.
420 429
421HINT: 430HINT:
422If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number. 431If you install KPhone/Pi 0.9.7, it will be called, if you click in KA/Pi on a phone number.
423 432
424What's new? 433What's new?
425 434
426SYNC HANDLING HAS CHANGED! 435SYNC HANDLING HAS CHANGED!
427Such that, if you sync now with an already synded device, you will duplicated entries after the first sync. 436Such that, if you sync now with an already synded device, you will duplicated entries after the first sync.
428(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks). 437(This change was introduced to make it possible to sync with mobile phones, which will be available later (maybe in 4 weeks).
429 438
430New in OM/Pi: 439New in OM/Pi:
431When copying(i.e. downloading mails) , you can specify, that only mails of a given size should be downloaded. Added mail copy possibility for selected mails. 440When copying(i.e. downloading mails) , you can specify, that only mails of a given size should be downloaded. Added mail copy possibility for selected mails.
432 441
433New in KO/Pi: 442New in KO/Pi:
434French is now available for KO/Pi. 443French is now available for KO/Pi.
435Choose menu:Actions - Configure:TAB locale 444Choose menu:Actions - Configure:TAB locale
436Syncing has changed. 445Syncing has changed.
437Phone sync available soon. 446Phone sync available soon.
438Not much changes, I cannot remember them ... 447Not much changes, I cannot remember them ...
439 448
440New in KA/Pi: 449New in KA/Pi:
441Beaming possible. 450Beaming possible.
442Sharp DTM readonly access possible( create a new DTM resource ); 451Sharp DTM readonly access possible( create a new DTM resource );
443Better searching possible. 452Better searching possible.
444Search is performed only after pressing the return key. 453Search is performed only after pressing the return key.
445Use wildcard * to specify parts of a name. 454Use wildcard * to specify parts of a name.
446 455
447Better name/email selection dialog (called from KO/Pi or OM/Pi). In this dialog, now searching is possible. Like in KA/Pi, use return key and wildcard * . 456Better name/email selection dialog (called from KO/Pi or OM/Pi). In this dialog, now searching is possible. Like in KA/Pi, use return key and wildcard * .
448 457
449A big improvement is the new management of the contact access. 458A big improvement is the new management of the contact access.
450In version 1.9.3, every application was using their own addressbook access data. 459In version 1.9.3, every application was using their own addressbook access data.
451That means, the addressbook was loaded up to three times in the memory, when accessed by KA/Pi, KO/Pi and OM/Pi. 460That means, the addressbook was loaded up to three times in the memory, when accessed by KA/Pi, KO/Pi and OM/Pi.
452That was wasting of memory, if you had several hundreds of contacts. 461That was wasting of memory, if you had several hundreds of contacts.
453 462
454Now only KA/Pi accesses the addressbook. 463Now only KA/Pi accesses the addressbook.
455If KO/Pi or OM/Pi want to get some name/email data, they request KA/Pi to open the name/email selection dialog and send it back to them. 464If KO/Pi or OM/Pi want to get some name/email data, they request KA/Pi to open the name/email selection dialog and send it back to them.
456If you click on an attendee in a meeting, its contact data is displayed in KA/Pi directly. 465If you click on an attendee in a meeting, its contact data is displayed in KA/Pi directly.
457That means, if KO/Pi or OM/Pi want to access contact data, KA/Pi is started first. 466That means, if KO/Pi or OM/Pi want to access contact data, KA/Pi is started first.
458 467
459New in the KO/Pi alarm applet: 468New in the KO/Pi alarm applet:
460Configure your own timer popup menu! 469Configure your own timer popup menu!
461(Text and minutes for timer countdown) 470(Text and minutes for timer countdown)
462Just edit the file 471Just edit the file
463(yourhomedir)/.kopialarmtimerrc 472(yourhomedir)/.kopialarmtimerrc
464and start/stop a timer to get a new menu with the data of this file. 473and start/stop a timer to get a new menu with the data of this file.
465 474
466********** VERSION 1.9.3 ************ 475********** VERSION 1.9.3 ************
4671) 4761)
468Now KO/Pi on Windows imports directly the calendar data of 477Now KO/Pi on Windows imports directly the calendar data of
469an installed Outlook. Should work with OL version >= 2000. 478an installed Outlook. Should work with OL version >= 2000.
470 479
471********** VERSION 1.9.2 ************ 480********** VERSION 1.9.2 ************
4721) 4811)
473KDE-Pim/Pi has got a new member: 482KDE-Pim/Pi has got a new member:
474KmicroMail (KM/Pi) is a mail program, 483KmicroMail (KM/Pi) is a mail program,
475which can handle IMAP and POP mail access. 484which can handle IMAP and POP mail access.
476It is based on Opie-Mail v3. 485It is based on Opie-Mail v3.
477All dependencies to the Opie libraries ar removed, 486All dependencies to the Opie libraries ar removed,
478such that no additional Opie lib is needed. 487such that no additional Opie lib is needed.
479It is already integrated in KO/Pi and KA/Pi. 488It is already integrated in KO/Pi and KA/Pi.
480It it now available for the Zaurus,probably it 489It it now available for the Zaurus,probably it
481will be available for other platforms later. 490will be available for other platforms later.
482Hint: 491Hint:
483Create your own contact (name + email) 492Create your own contact (name + email)
484in KA/Pi, select this contact and choose menu: 493in KA/Pi, select this contact and choose menu:
485Settings - Set Who Am I. 494Settings - Set Who Am I.
486Now the settings of this contact are used as 495Now the settings of this contact are used as
487the sender data in KM/Pi. 496the sender data in KM/Pi.
4882) 4972)
489KDE-Pim/Pi is split up in five different 498KDE-Pim/Pi is split up in five different
490packages now precompiled for Sharp Zaurus: 499packages now precompiled for Sharp Zaurus:
491--kmicrokdelibs_1.9.2_arm.ipk 500--kmicrokdelibs_1.9.2_arm.ipk
492The libs are needed for any 501The libs are needed for any
493of the following programs: 502of the following programs:
494--kaddressbook_1.9.2_arm.ipk 503--kaddressbook_1.9.2_arm.ipk
495--kmicromail_1.9.2_arm.ipk 504--kmicromail_1.9.2_arm.ipk
496--korganizer_1.9.2_arm.ipk 505--korganizer_1.9.2_arm.ipk
497Independ from that, there is the alarm applet 506Independ from that, there is the alarm applet
498available for KO/Pi, which also offers 507available for KO/Pi, which also offers
499quick access for a new mail or 508quick access for a new mail or
500showing the addressbook.: 509showing the addressbook.:
501--korganizer-alarm_1.9.2_arm.ipk 510--korganizer-alarm_1.9.2_arm.ipk
502Independend means, that the alarm applet 511Independend means, that the alarm applet
503does not need any of the libs or programs above to run. 512does not need any of the libs or programs above to run.
504But it would be quite useless without these programs. 513But it would be quite useless without these programs.
505NOTE: 514NOTE:
506If you get a 515If you get a
507"This application depends on other programs" 516"This application depends on other programs"
508during installation of 517during installation of
509--kmicrokdelibs_1.9.2_arm.ipk 518--kmicrokdelibs_1.9.2_arm.ipk
510you probably do not have to care about that. 519you probably do not have to care about that.
511kmicrokdelibs_1.9.2 will come with some 520kmicrokdelibs_1.9.2 will come with some
512resource plugins, which needs additional libraries. 521resource plugins, which needs additional libraries.
513(E.g. libopie1, if you want to use the 522(E.g. libopie1, if you want to use the
514opie resource connector in KA/Pi). 523opie resource connector in KA/Pi).
515If you do not have this libraries installed, 524If you do not have this libraries installed,
516you simply cannot use the resource. 525you simply cannot use the resource.
517To make it clear: 526To make it clear:
518If the libraries are missing, the applications 527If the libraries are missing, the applications
519using kmicrokdelibs will start, 528using kmicrokdelibs will start,
520because the resources are plugins. 529because the resources are plugins.
5213) 5303)
522KO/Pi and friends are now installable on SD-Card! 531KO/Pi and friends are now installable on SD-Card!
523It is recommended to install all libs and apps 532It is recommended to install all libs and apps
524on the SD card or all in the internal storage. 533on the SD card or all in the internal storage.
525There may be problems, if this is mixed. 534There may be problems, if this is mixed.
5264) 5354)
527Fixed two bugs in the alarm notification on Windows. 536Fixed two bugs in the alarm notification on Windows.
5285) 5375)
529Great improvement! 538Great improvement!
530KO/Pi uses now the latest version of libical. 539KO/Pi uses now the latest version of libical.
531Libical is the library which actually reads 540Libical is the library which actually reads
532the calendar files and extract the data from it. 541the calendar files and extract the data from it.
533With the old version, there were problems 542With the old version, there were problems
534(crashes or program hangs) when licical did read 543(crashes or program hangs) when licical did read
535files, which were not stored from KO/Pi. 544files, which were not stored from KO/Pi.
536I do not know, if the new libical works perfect, 545I do not know, if the new libical works perfect,
537but actually it works much better than 546but actually it works much better than
538the old version. 547the old version.
539There are no problems with compatibility with 548There are no problems with compatibility with
540old calendar files of KO/Pi, of course! 549old calendar files of KO/Pi, of course!
5416) 5506)
542New in KA/Pi: 551New in KA/Pi:
543Opie addressbook resource connector available! 552Opie addressbook resource connector available!
544You will need libopie1 and the opie addressbook, 553You will need libopie1 and the opie addressbook,
545of course. 554of course.
546With the Opie addressbook resource connector, 555With the Opie addressbook resource connector,
547you can access the Opie addressbook readonly in KA/Pi. 556you can access the Opie addressbook readonly in KA/Pi.
548If you want to edit or import the data into KA/Pi, 557If you want to edit or import the data into KA/Pi,
549do this: 558do this:
550a) Create an Opie resource. 559a) Create an Opie resource.
551 (Menu: Settings-Configure Resources). 560 (Menu: Settings-Configure Resources).
552After configuration and restarting KA/Pi you should see 561After configuration and restarting KA/Pi you should see
553the Opie contacts in KA/Pi. 562the Opie contacts in KA/Pi.
554b) Select some or all Opie contacts. 563b) Select some or all Opie contacts.
555(NOTE: +++++ 564(NOTE: +++++
556To know exactly, what contacts are Opie contacts, 565To know exactly, what contacts are Opie contacts,
557do this: Choose menu: 566do this: Choose menu:
558View-Modify View - TAB Fields. 567View-Modify View - TAB Fields.
559Select in the above list "Resource" and click 568Select in the above list "Resource" and click
560down arrow to add it to the "Selected fields". 569down arrow to add it to the "Selected fields".
561Click OK. 570Click OK.
562Now you have a new column "Resource" in your list, 571Now you have a new column "Resource" in your list,
563where you can see, what an Opie resource is. 572where you can see, what an Opie resource is.
564++++ NOTE end.) 573++++ NOTE end.)
565Ok, we do have now some Opie contacts seleted. 574Ok, we do have now some Opie contacts seleted.
566(Use SHIFT or CTRL key in order to multiple select). 575(Use SHIFT or CTRL key in order to multiple select).
567c) Choose menu: Edit-Copy. 576c) Choose menu: Edit-Copy.
568d) Choose menu: Edit-Paste. 577d) Choose menu: Edit-Paste.
569e) Select the resource, you want to add the contacts to. 578e) Select the resource, you want to add the contacts to.
570Congrats! Now you have read/write access to the copied 579Congrats! Now you have read/write access to the copied
571opie contacts as "real" KA/Pi contacts. 580opie contacts as "real" KA/Pi contacts.
572 581
573 582
574********** VERSION 1.9.1 ************ 583********** VERSION 1.9.1 ************
5751) 5841)
576 +++ IMPORTANT 1 +++ 585 +++ IMPORTANT 1 +++
577 586
578The storing place of the default calendar 587The storing place of the default calendar
579file has changed! 588file has changed!
580The default calendar file was 589The default calendar file was
581Applications/korganizer/mycalendar.ics 590Applications/korganizer/mycalendar.ics
582on Zaurus and 591on Zaurus and
583(yourHomeDir)/korganizer/mycalendar.ics 592(yourHomeDir)/korganizer/mycalendar.ics
584on Windows/Linux desktop. Now it is 593on Windows/Linux desktop. Now it is
585(yourHomeDir)/kdepim/korganizer/mycalendar.ics 594(yourHomeDir)/kdepim/korganizer/mycalendar.ics
586on Zaurus, Windows and Linux. 595on Zaurus, Windows and Linux.
587To load the old file, choose menu 596To load the old file, choose menu
588File-Load calendar backup. 597File-Load calendar backup.
589(It should be loaded automatically 598(It should be loaded automatically
590at startup with a warning message displayed). 599at startup with a warning message displayed).
591The place of the configuration file has changed too. 600The place of the configuration file has changed too.
592If you want to use your old KO/Pi config, 601If you want to use your old KO/Pi config,
593copy it to 602copy it to
594(yourHomeDir)/kdepim/config/korganizerrc 603(yourHomeDir)/kdepim/config/korganizerrc
595Please read VERSION 1.9.0 - topic 3) as well! 604Please read VERSION 1.9.0 - topic 3) as well!
596 605
597 +++ IMPORTANT 2 +++ 606 +++ IMPORTANT 2 +++
598 607
599Because of the new paths, you will need 608Because of the new paths, you will need
600a new version of the KO/Pi alarm applet 609a new version of the KO/Pi alarm applet
601for Zaurus. 610for Zaurus.
602Use version >= 1.9.1 611Use version >= 1.9.1
603 612
6042) 6132)
605Now the QWhat'sThis Icon works for items 614Now the QWhat'sThis Icon works for items
606in the month view as well. 615in the month view as well.
607(See VERSION 1.7.8 Topic 1) ). 616(See VERSION 1.7.8 Topic 1) ).
6083) 6173)
609You can import birtsdays/anniversaries 618You can import birtsdays/anniversaries
610from KA/Pi into KO/Pi. 619from KA/Pi into KO/Pi.
611Choose menu File-Import birthdays. 620Choose menu File-Import birthdays.
612If you import twice, already imported items 621If you import twice, already imported items
613will not be imported again, if they 622will not be imported again, if they
614have not been changed in KO/Pi. 623have not been changed in KO/Pi.
6154) 6244)
616When syncing with sharp DTM, now a progress 625When syncing with sharp DTM, now a progress
617is shown, when the data is written back. 626is shown, when the data is written back.
618If there is much data in KO/Pi and no data 627If there is much data in KO/Pi and no data
619in DTM, that can take a long time. 628in DTM, that can take a long time.
620(But only for the first time ). 629(But only for the first time ).
6215) 6305)
622In the search dialog, you can search 631In the search dialog, you can search
623now for the name/email of an attendee 632now for the name/email of an attendee
624of an event/todo. 633of an event/todo.
625To get more space for displaying 634To get more space for displaying
626search results, the buttons 635search results, the buttons
627for "search" and "close" on the 636for "search" and "close" on the
628bottom are removed in the PDA version. 637bottom are removed in the PDA version.
629You have to click OK in the top right 638You have to click OK in the top right
630corner to do a search. 639corner to do a search.
6316) 6406)
632Now it is possible to disable the displaying 641Now it is possible to disable the displaying
633of todo items in the Allday part of the Agenda. 642of todo items in the Allday part of the Agenda.
634Choose Menu Action-Configure, 643Choose Menu Action-Configure,
635TAB Todo View, checkbox 644TAB Todo View, checkbox
636"Allday Agenda view shows todos" 645"Allday Agenda view shows todos"
6377) 6467)
638If FastLoad is enabled, now the settings and the 647If FastLoad is enabled, now the settings and the
639calendar data are saved, when KO/Pi is closed. 648calendar data are saved, when KO/Pi is closed.
640(If no Fastload is enabled, KO/Pi saves 649(If no Fastload is enabled, KO/Pi saves
641the data as well, of course) 650the data as well, of course)
6428) 6518)
643The Agenda View has a minimize-splitter now, 652The Agenda View has a minimize-splitter now,
644such that the height of the allday part can be 653such that the height of the allday part can be
645changed quickly. 654changed quickly.
646 655
647********** VERSION 1.9.0 ************ 656********** VERSION 1.9.0 ************
6481) 6571)
649KO/Pi is now merged with the new microKDE from KA/Pi. 658KO/Pi is now merged with the new microKDE from KA/Pi.
650KO/Pi accesses now KA/Pi as the addressbook. 659KO/Pi accesses now KA/Pi as the addressbook.
651The other ddressbook-plugins are not working any longer. 660The other ddressbook-plugins are not working any longer.
652(It is planned, that later KA/Pi itself uses these plugins) 661(It is planned, that later KA/Pi itself uses these plugins)
653New versions of KO/Pi are only available 662New versions of KO/Pi are only available
654together with KA/Pi as the KDE-Pim/Pi package. 663together with KA/Pi as the KDE-Pim/Pi package.
6552) 6642)
656If you click on an attendee of a meeting in the 665If you click on an attendee of a meeting in the
657event viewer, a detailed summary of the 666event viewer, a detailed summary of the
658attendee is shown. 667attendee is shown.
6593) 6683)
660The place of the configuration file has changed. 669The place of the configuration file has changed.
661If you want to use your old KO/Pi config, copy 670If you want to use your old KO/Pi config, copy
662Applications/korganizer/config_korganizerrc 671Applications/korganizer/config_korganizerrc
663to 672to
664Applications/korganizer/config/korganizerrc 673Applications/korganizer/config/korganizerrc
665 674
666********** VERSION 1.7.8 ************ 675********** VERSION 1.7.8 ************
6671) 6761)
668Now the QWhat'sThis ist working. 677Now the QWhat'sThis ist working.
669Enable the QWhat'sThis icon in the toolbar. 678Enable the QWhat'sThis icon in the toolbar.
670(You have to restart to reload the changed toolbar config). 679(You have to restart to reload the changed toolbar config).
671Now click on the QWhat'sThis Icon 680Now click on the QWhat'sThis Icon
672in the top right corner of KO/Pi. 681in the top right corner of KO/Pi.
673Then click on an item in the Agenda View: 682Then click on an item in the Agenda View:
674You will get a detailed display of the items content. 683You will get a detailed display of the items content.
6752) 6842)
676Some other very minor changes. 685Some other very minor changes.
677But I have forgotten the details ... 686But I have forgotten the details ...
678For that reason I start this log here: 687For that reason I start this log here:
679To document my changes, when I am doing it. 688To document my changes, when I am doing it.
680 689
681********** VERSION 1.7.7 ************ 690********** VERSION 1.7.7 ************
682Stable Version of KO/Pi 691Stable Version of KO/Pi
diff --git a/kaddressbook/kaddressbookview.cpp b/kaddressbook/kaddressbookview.cpp
index 8062354..424d52a 100644
--- a/kaddressbook/kaddressbookview.cpp
+++ b/kaddressbook/kaddressbookview.cpp
@@ -1,166 +1,170 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
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 23
24#ifndef KAB_EMBEDDED 24#ifndef KAB_EMBEDDED
25#include <qapplication.h> 25#include <qapplication.h>
26 26
27#include <kabc/distributionlistdialog.h> 27#include <kabc/distributionlistdialog.h>
28#include <kconfig.h> 28#include <kconfig.h>
29#include <klocale.h> 29#include <klocale.h>
30 30
31#include "viewmanager.h" 31#include "viewmanager.h"
32 32
33#endif //KAB_EMBEDDED 33#endif //KAB_EMBEDDED
34#include <qlayout.h> 34#include <qlayout.h>
35 35
36#include <kabc/distributionlistdialog.h> 36#include <kabc/distributionlistdialog.h>
37#include <kabc/addressbook.h> 37#include <kabc/addressbook.h>
38#include <kdebug.h> 38#include <kdebug.h>
39 39
40#include "kaddressbookview.h" 40#include "kaddressbookview.h"
41 41
42KAddressBookView::KAddressBookView( KABC::AddressBook *ab, QWidget *parent, 42KAddressBookView::KAddressBookView( KABC::AddressBook *ab, QWidget *parent,
43 const char *name ) 43 const char *name )
44 : QWidget( parent, name ), mAddressBook( ab ), mFieldList() 44 : QWidget( parent, name ), mAddressBook( ab ), mFieldList()
45{ 45{
46 46
47 initGUI(); 47 initGUI();
48} 48}
49 49
50KAddressBookView::~KAddressBookView() 50KAddressBookView::~KAddressBookView()
51{ 51{
52 kdDebug(5720) << "KAddressBookView::~KAddressBookView: destroying - " 52 kdDebug(5720) << "KAddressBookView::~KAddressBookView: destroying - "
53 << name() << endl; 53 << name() << endl;
54} 54}
55 55
56void KAddressBookView::readConfig( KConfig *config ) 56void KAddressBookView::readConfig( KConfig *config )
57{ 57{
58 mFieldList = KABC::Field::restoreFields( config, "KABCFields" ); 58 mFieldList = KABC::Field::restoreFields( config, "KABCFields" );
59 59
60 if ( mFieldList.isEmpty() ) 60 if ( mFieldList.isEmpty() )
61 mFieldList = KABC::Field::defaultFields(); 61 mFieldList = KABC::Field::defaultFields();
62 62
63 mDefaultFilterType = (DefaultFilterType)config->readNumEntry( "DefaultFilterType", 1 ); 63 mDefaultFilterType = (DefaultFilterType)config->readNumEntry( "DefaultFilterType", 1 );
64 mDefaultFilterName = config->readEntry( "DefaultFilterName", QString::null ); 64 mDefaultFilterName = config->readEntry( "DefaultFilterName", QString::null );
65} 65}
66 66
67void KAddressBookView::writeConfig( KConfig* ) 67void KAddressBookView::writeConfig( KConfig* )
68{ 68{
69 // Most of writing the config is handled by the ConfigureViewDialog 69 // Most of writing the config is handled by the ConfigureViewDialog
70} 70}
71 71
72QString KAddressBookView::selectedEmails() 72QString KAddressBookView::selectedEmails()
73{ 73{
74 bool first = true; 74 bool first = true;
75 QString emailAddrs; 75 QString emailAddrs;
76 QStringList uidList = selectedUids(); 76 QStringList uidList = selectedUids();
77 KABC::Addressee addr; 77 KABC::Addressee addr;
78 QString email; 78 QString email;
79 79
80 QStringList::Iterator it; 80 QStringList::Iterator it;
81 for ( it = uidList.begin(); it != uidList.end(); ++it ) { 81 for ( it = uidList.begin(); it != uidList.end(); ++it ) {
82 addr = mAddressBook->findByUid( *it ); 82 addr = mAddressBook->findByUid( *it );
83 83
84 if ( !addr.isEmpty() ) { 84 if ( !addr.isEmpty() ) {
85 QString m = QString::null; 85 QString m = QString::null;
86 86
87 if ( addr.emails().count() > 1 ) 87 if ( addr.emails().count() > 1 )
88 m = KABC::EmailSelector::getEmail( addr.emails(), addr.preferredEmail(), this ); 88 m = KABC::EmailSelector::getEmail( addr.emails(), addr.preferredEmail(), this );
89 89
90 email = addr.fullEmail( m ); 90 email = addr.fullEmail( m );
91 91
92 if ( !first ) 92 if ( !first )
93 emailAddrs += ", "; 93 emailAddrs += ", ";
94 else 94 else
95 first = false; 95 first = false;
96 96
97 emailAddrs += email; 97 emailAddrs += email;
98 } 98 }
99 } 99 }
100 100
101 return emailAddrs; 101 return emailAddrs;
102} 102}
103 103
104KABC::Addressee::List KAddressBookView::addressees() 104KABC::Addressee::List KAddressBookView::addressees()
105{ 105{
106 KABC::Addressee::List addresseeList; 106 KABC::Addressee::List addresseeList;
107 107
108 KABC::AddressBook::Iterator it; 108 KABC::AddressBook::Iterator it;
109 for (it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { 109 for (it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
110 if ( mFilter.filterAddressee( *it ) ) 110 if ( mFilter.filterAddressee( *it ) )
111 addresseeList.append( *it ); 111 addresseeList.append( *it );
112 } 112 }
113 113
114 return addresseeList; 114 return addresseeList;
115} 115}
116 116
117void KAddressBookView::initGUI() 117void KAddressBookView::initGUI()
118{ 118{
119 // Create the layout 119 // Create the layout
120 QVBoxLayout *layout = new QVBoxLayout( this ); 120 QVBoxLayout *layout = new QVBoxLayout( this );
121 121
122 // Add the view widget 122 // Add the view widget
123 mViewWidget = new QWidget( this ); 123 mViewWidget = new QWidget( this );
124 layout->addWidget( mViewWidget ); 124 layout->addWidget( mViewWidget );
125} 125}
126 126
127KABC::Field::List KAddressBookView::fields() const 127KABC::Field::List KAddressBookView::fields() const
128{ 128{
129 return mFieldList; 129 return mFieldList;
130} 130}
131KABC::Field::List KAddressBookView::allFields() const
132{
133 return KABC::Field::allFields();
134}
131 135
132void KAddressBookView::setFilter( const Filter &filter ) 136void KAddressBookView::setFilter( const Filter &filter )
133{ 137{
134 mFilter = filter; 138 mFilter = filter;
135} 139}
136 140
137KAddressBookView::DefaultFilterType KAddressBookView::defaultFilterType() const 141KAddressBookView::DefaultFilterType KAddressBookView::defaultFilterType() const
138{ 142{
139 return mDefaultFilterType; 143 return mDefaultFilterType;
140} 144}
141 145
142const QString &KAddressBookView::defaultFilterName() const 146const QString &KAddressBookView::defaultFilterName() const
143{ 147{
144 return mDefaultFilterName; 148 return mDefaultFilterName;
145} 149}
146 150
147KABC::AddressBook *KAddressBookView::addressBook() const 151KABC::AddressBook *KAddressBookView::addressBook() const
148{ 152{
149 return mAddressBook; 153 return mAddressBook;
150} 154}
151 155
152QWidget *KAddressBookView::viewWidget() 156QWidget *KAddressBookView::viewWidget()
153{ 157{
154 return mViewWidget; 158 return mViewWidget;
155} 159}
156 160
157ViewConfigureWidget *ViewFactory::configureWidget( KABC::AddressBook *ab, 161ViewConfigureWidget *ViewFactory::configureWidget( KABC::AddressBook *ab,
158 QWidget *parent, 162 QWidget *parent,
159 const char *name ) 163 const char *name )
160{ 164{
161 return new ViewConfigureWidget( ab, parent, name ); 165 return new ViewConfigureWidget( ab, parent, name );
162} 166}
163 167
164#ifndef KAB_EMBEDDED 168#ifndef KAB_EMBEDDED
165#include "kaddressbookview.moc" 169#include "kaddressbookview.moc"
166#endif //KAB_EMBEDDED 170#endif //KAB_EMBEDDED
diff --git a/kaddressbook/kaddressbookview.h b/kaddressbook/kaddressbookview.h
index 2e91cbc..8646136 100644
--- a/kaddressbook/kaddressbookview.h
+++ b/kaddressbook/kaddressbookview.h
@@ -1,299 +1,301 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
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 23
24#ifndef KADDRESSBOOKVIEW_H 24#ifndef KADDRESSBOOKVIEW_H
25#define KADDRESSBOOKVIEW_H 25#define KADDRESSBOOKVIEW_H
26 26
27#ifndef KAB_EMBEDDED 27#ifndef KAB_EMBEDDED
28#include <klibloader.h> 28#include <klibloader.h>
29#endif //KAB_EMBEDDED 29#endif //KAB_EMBEDDED
30 30
31class KConfig; 31class KConfig;
32class QDropEvent; 32class QDropEvent;
33 33
34#include <qstringlist.h> 34#include <qstringlist.h>
35#include <kabc/field.h> 35#include <kabc/field.h>
36#include <qwidget.h> 36#include <qwidget.h>
37 37
38#include "viewconfigurewidget.h" 38#include "viewconfigurewidget.h"
39#include "filter.h" 39#include "filter.h"
40 40
41namespace KABC { class AddressBook; } 41namespace KABC { class AddressBook; }
42 42
43/** 43/**
44 Base class for all views in kaddressbook. This class implements 44 Base class for all views in kaddressbook. This class implements
45 all the common methods needed to provide a view to the user. 45 all the common methods needed to provide a view to the user.
46 46
47 To implement a specific view (table, card, etc), just inherit from 47 To implement a specific view (table, card, etc), just inherit from
48 this class and implement all the pure virtuals. 48 this class and implement all the pure virtuals.
49 49
50 @author Mike Pilone <mpilone@slac.com> 50 @author Mike Pilone <mpilone@slac.com>
51 */ 51 */
52class KAddressBookView : public QWidget 52class KAddressBookView : public QWidget
53{ 53{
54 Q_OBJECT 54 Q_OBJECT
55 55
56 public: 56 public:
57 enum DefaultFilterType { None = 0, Active = 1, Specific = 2 }; 57 enum DefaultFilterType { None = 0, Active = 1, Specific = 2 };
58 58
59 KAddressBookView( KABC::AddressBook *ab, QWidget *parent, const char *name ); 59 KAddressBookView( KABC::AddressBook *ab, QWidget *parent, const char *name );
60 virtual ~KAddressBookView(); 60 virtual ~KAddressBookView();
61 61
62 /** 62 /**
63 Must be overloaded in subclasses. Should return a list of 63 Must be overloaded in subclasses. Should return a list of
64 all the uids of selected contacts. 64 all the uids of selected contacts.
65 */ 65 */
66 virtual QStringList selectedUids() = 0; 66 virtual QStringList selectedUids() = 0;
67 virtual void doSearch( const QString& s ,KABC::Field *field ) = 0; 67 virtual void doSearch( const QString& s ,KABC::Field *field ) = 0;
68 virtual void scrollUP() = 0; 68 virtual void scrollUP() = 0;
69 virtual void scrollDOWN() = 0; 69 virtual void scrollDOWN() = 0;
70 virtual void setFocusAV() = 0; 70 virtual void setFocusAV() = 0;
71 71
72 /** 72 /**
73 Called whenever this view should read the config. This can be used 73 Called whenever this view should read the config. This can be used
74 as a sign that the config has changed, therefore the view should 74 as a sign that the config has changed, therefore the view should
75 assume the worst and rebuild itself if necessary. For example, 75 assume the worst and rebuild itself if necessary. For example,
76 in a table view this method may be called when the user adds or 76 in a table view this method may be called when the user adds or
77 removes columns from the view. 77 removes columns from the view.
78 78
79 If overloaded in the subclass, do not forget to call super class's 79 If overloaded in the subclass, do not forget to call super class's
80 method. 80 method.
81 81
82 @param config The KConfig object to read from. The group will already 82 @param config The KConfig object to read from. The group will already
83 be set, so do not change the group. 83 be set, so do not change the group.
84 */ 84 */
85 virtual void readConfig( KConfig *config ); 85 virtual void readConfig( KConfig *config );
86 86
87 /** 87 /**
88 Called whenever this view should write the config. The view should not 88 Called whenever this view should write the config. The view should not
89 write out information handled by the application, such as which fields 89 write out information handled by the application, such as which fields
90 are visible. The view should only write out information specific 90 are visible. The view should only write out information specific
91 to itself (i.e.: All information in the ViewConfigWidget) 91 to itself (i.e.: All information in the ViewConfigWidget)
92 92
93 If overloaded in the subclass, do not forget to call the super class's 93 If overloaded in the subclass, do not forget to call the super class's
94 method. 94 method.
95 95
96 @param config The KConfig object to read from. The group will already 96 @param config The KConfig object to read from. The group will already
97 be set, so do not change the group. 97 be set, so do not change the group.
98 */ 98 */
99 virtual void writeConfig( KConfig *config ); 99 virtual void writeConfig( KConfig *config );
100 100
101 /** 101 /**
102 Returns a QString with all the selected email addresses concatenated 102 Returns a QString with all the selected email addresses concatenated
103 together with a ',' seperator. 103 together with a ',' seperator.
104 */ 104 */
105 virtual QString selectedEmails(); 105 virtual QString selectedEmails();
106 106
107 /** 107 /**
108 Return the type of the view: Icon, Table, etc. Please make sure that 108 Return the type of the view: Icon, Table, etc. Please make sure that
109 this is the same value that ViewWrapper::type() will return for your 109 this is the same value that ViewWrapper::type() will return for your
110 view. 110 view.
111 */ 111 */
112 virtual QString type() const = 0; 112 virtual QString type() const = 0;
113 113
114 /** 114 /**
115 Returns a list of the fields that should be displayed. The list 115 Returns a list of the fields that should be displayed. The list
116 is composed of the fields proper names (ie: Home Address), so 116 is composed of the fields proper names (ie: Home Address), so
117 the view may need to translate them in order to get the 117 the view may need to translate them in order to get the
118 value from the addressee. 118 value from the addressee.
119 119
120 This list is generated from the config file, so it is advisable to call 120 This list is generated from the config file, so it is advisable to call
121 this method whenever a readConfig() is called in order to get the newest 121 this method whenever a readConfig() is called in order to get the newest
122 list of fields. 122 list of fields.
123 */ 123 */
124 KABC::Field::List fields() const; 124 KABC::Field::List fields() const;
125
126 KABC::Field::List allFields() const;
125 127
126 /** 128 /**
127 Sets the active filter. This filter will be used for filtering 129 Sets the active filter. This filter will be used for filtering
128 the list of addressees to display. The view will <b>not</b> 130 the list of addressees to display. The view will <b>not</b>
129 automatically refresh itself, so in most cases you will want to call 131 automatically refresh itself, so in most cases you will want to call
130 KAddressBookView::refresh() after this method. 132 KAddressBookView::refresh() after this method.
131 */ 133 */
132 void setFilter( const Filter& ); 134 void setFilter( const Filter& );
133 135
134 /** 136 /**
135 @return The default filter type selection. If the selection 137 @return The default filter type selection. If the selection
136 is SpecificFilter, the name of the filter can be retrieved with 138 is SpecificFilter, the name of the filter can be retrieved with
137 defaultFilterName() 139 defaultFilterName()
138 */ 140 */
139 DefaultFilterType defaultFilterType() const; 141 DefaultFilterType defaultFilterType() const;
140 142
141 /** 143 /**
142 @return The name of the default filter. This string is 144 @return The name of the default filter. This string is
143 only valid if defaultFilterType() is returning SpecificFilter. 145 only valid if defaultFilterType() is returning SpecificFilter.
144 */ 146 */
145 const QString &defaultFilterName() const; 147 const QString &defaultFilterName() const;
146 148
147 /** 149 /**
148 @return The address book. 150 @return The address book.
149 */ 151 */
150 KABC::AddressBook *addressBook() const; 152 KABC::AddressBook *addressBook() const;
151 153
152 public slots: 154 public slots:
153 /** 155 /**
154 Must be overloaded in subclasses to refresh the view. 156 Must be overloaded in subclasses to refresh the view.
155 Refreshing includes updating the view to ensure that only items 157 Refreshing includes updating the view to ensure that only items
156 in the document are visible. If <i>uid</i> is valid, only the 158 in the document are visible. If <i>uid</i> is valid, only the
157 addressee with uid needs to be refreshed. This is an optimization 159 addressee with uid needs to be refreshed. This is an optimization
158 only. 160 only.
159 */ 161 */
160 virtual void refresh( QString uid = QString::null ) = 0; 162 virtual void refresh( QString uid = QString::null ) = 0;
161 163
162 /** 164 /**
163 This method must be overloaded in subclasses. Select (highlight) 165 This method must be overloaded in subclasses. Select (highlight)
164 the addressee matching <i>uid</i>. If uid 166 the addressee matching <i>uid</i>. If uid
165 is equal to QString::null, then all addressees should be selected. 167 is equal to QString::null, then all addressees should be selected.
166 */ 168 */
167#ifndef KAB_EMBEDDED 169#ifndef KAB_EMBEDDED
168//MOC_SKIP_BEGIN 170//MOC_SKIP_BEGIN
169 virtual void setSelected( QString uid = QString::null, bool selected = true ) = 0; 171 virtual void setSelected( QString uid = QString::null, bool selected = true ) = 0;
170//MOC_SKIP_END 172//MOC_SKIP_END
171#else //KAB_EMBEDDED 173#else //KAB_EMBEDDED
172 //US my moc can not handle the default parameters. Is this a problem ??? 174 //US my moc can not handle the default parameters. Is this a problem ???
173 virtual void setSelected( QString uid, bool selected) = 0; 175 virtual void setSelected( QString uid, bool selected) = 0;
174#endif //KAB_EMBEDDED 176#endif //KAB_EMBEDDED
175 177
176 signals: 178 signals:
177 /** 179 /**
178 This signal should be emitted by a subclass whenever an addressee 180 This signal should be emitted by a subclass whenever an addressee
179 is modified. 181 is modified.
180 */ 182 */
181 void modified(); 183 void modified();
182 184
183 /** 185 /**
184 This signal should be emitted by a subclass whenever an addressee 186 This signal should be emitted by a subclass whenever an addressee
185 is selected. Selected means that the addressee was given the focus. 187 is selected. Selected means that the addressee was given the focus.
186 Some widgets may call this 'highlighted'. The view is responsible for 188 Some widgets may call this 'highlighted'. The view is responsible for
187 emitting this signal multiple times if multiple items are selected, 189 emitting this signal multiple times if multiple items are selected,
188 with the last item selected being the last emit. 190 with the last item selected being the last emit.
189 191
190 @param uid The uid of the selected addressee. 192 @param uid The uid of the selected addressee.
191 193
192 @see KListView 194 @see KListView
193 */ 195 */
194 void selected( const QString &uid ); 196 void selected( const QString &uid );
195 void deleteRequest(); 197 void deleteRequest();
196 /** 198 /**
197 This signal should be emitted by a subclass whenever an addressee 199 This signal should be emitted by a subclass whenever an addressee
198 is executed. This is defined by the KDE system wide config, but it 200 is executed. This is defined by the KDE system wide config, but it
199 either means single or doubleclicked. 201 either means single or doubleclicked.
200 202
201 @param ui The uid of the selected addressee 203 @param ui The uid of the selected addressee
202 204
203 @see KListView 205 @see KListView
204 */ 206 */
205 void executed( const QString &uid ); 207 void executed( const QString &uid );
206 208
207 /** 209 /**
208 This signal is emitted whenever a user attempts to start a drag 210 This signal is emitted whenever a user attempts to start a drag
209 in the view. The slot connected to this signal would usually want 211 in the view. The slot connected to this signal would usually want
210 to create a QDragObject. 212 to create a QDragObject.
211 */ 213 */
212 void startDrag(); 214 void startDrag();
213 215
214 /** 216 /**
215 This signal is emitted whenever the user drops something on the 217 This signal is emitted whenever the user drops something on the
216 view. The individual view should handle checking if the item is 218 view. The individual view should handle checking if the item is
217 droppable (ie: if it is a vcard). 219 droppable (ie: if it is a vcard).
218 */ 220 */
219 void dropped( QDropEvent* ); 221 void dropped( QDropEvent* );
220 222
221 protected: 223 protected:
222 /** 224 /**
223 Returns a list of the addressees that should be displayed. This method 225 Returns a list of the addressees that should be displayed. This method
224 should always be used by the subclass to get a list of addressees. This 226 should always be used by the subclass to get a list of addressees. This
225 method internally takes many factors into account, including the current 227 method internally takes many factors into account, including the current
226 filter. 228 filter.
227 */ 229 */
228 KABC::Addressee::List addressees(); 230 KABC::Addressee::List addressees();
229 231
230 /** 232 /**
231 This method returns the widget that should be used as the parent for 233 This method returns the widget that should be used as the parent for
232 all view components. By using this widget as the parent and not 234 all view components. By using this widget as the parent and not
233 'this', the view subclass has the option of placing other widgets 235 'this', the view subclass has the option of placing other widgets
234 around the view (ie: search fields, etc). Do not delete this widget! 236 around the view (ie: search fields, etc). Do not delete this widget!
235 */ 237 */
236 QWidget *viewWidget(); 238 QWidget *viewWidget();
237 239
238 private: 240 private:
239 void initGUI(); 241 void initGUI();
240 242
241 DefaultFilterType mDefaultFilterType; 243 DefaultFilterType mDefaultFilterType;
242 Filter mFilter; 244 Filter mFilter;
243 QString mDefaultFilterName; 245 QString mDefaultFilterName;
244 KABC::AddressBook *mAddressBook; 246 KABC::AddressBook *mAddressBook;
245 KABC::Field::List mFieldList; 247 KABC::Field::List mFieldList;
246 248
247 QWidget *mViewWidget; 249 QWidget *mViewWidget;
248}; 250};
249 251
250#ifndef KAB_EMBEDDED 252#ifndef KAB_EMBEDDED
251//MOC_SKIP_BEGIN 253//MOC_SKIP_BEGIN
252class ViewFactory : public KLibFactory 254class ViewFactory : public KLibFactory
253//MOC_SKIP_END 255//MOC_SKIP_END
254#else //KAB_EMBEDDED 256#else //KAB_EMBEDDED
255class ViewFactory 257class ViewFactory
256#endif //KAB_EMBEDDED 258#endif //KAB_EMBEDDED
257{ 259{
258 260
259 public: 261 public:
260 virtual KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, 262 virtual KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent,
261 const char *name = 0 ) = 0; 263 const char *name = 0 ) = 0;
262 264
263 /** 265 /**
264 @return The type of the view. This is normally a small one word 266 @return The type of the view. This is normally a small one word
265 string (ie: Table, Icon, Tree, etc). 267 string (ie: Table, Icon, Tree, etc).
266 */ 268 */
267 virtual QString type() const = 0; 269 virtual QString type() const = 0;
268 270
269 /** 271 /**
270 @return The description of the view. This should be a 3 to 272 @return The description of the view. This should be a 3 to
271 4 line string (don't actually use return characters in the string) 273 4 line string (don't actually use return characters in the string)
272 describing the features offered by the view. 274 describing the features offered by the view.
273 */ 275 */
274 virtual QString description() const = 0; 276 virtual QString description() const = 0;
275 277
276 /** 278 /**
277 Creates a config dialog for the view type. The default 279 Creates a config dialog for the view type. The default
278 implementation will return a ViewConfigDialog. This default 280 implementation will return a ViewConfigDialog. This default
279 dialog will allow the user to set the visible fields only. If 281 dialog will allow the user to set the visible fields only. If
280 you need more config options (as most views will), this method 282 you need more config options (as most views will), this method
281 can be overloaded to return your sublcass of ViewConfigDialog. 283 can be overloaded to return your sublcass of ViewConfigDialog.
282 If this method is over loaded the base classes method should 284 If this method is over loaded the base classes method should
283 <B>not</B> be called. 285 <B>not</B> be called.
284 */ 286 */
285 virtual ViewConfigureWidget *configureWidget( KABC::AddressBook *ab, 287 virtual ViewConfigureWidget *configureWidget( KABC::AddressBook *ab,
286 QWidget *parent, 288 QWidget *parent,
287 const char *name = 0 ); 289 const char *name = 0 );
288 290
289 protected: 291 protected:
290 virtual QObject* createObject( QObject*, const char*, const char*, 292 virtual QObject* createObject( QObject*, const char*, const char*,
291 const QStringList & ) 293 const QStringList & )
292 { 294 {
293 return 0; 295 return 0;
294 } 296 }
295 297
296}; 298};
297 299
298 300
299#endif 301#endif
diff --git a/kaddressbook/views/kaddressbookcardview.cpp b/kaddressbook/views/kaddressbookcardview.cpp
index 2c9b162..2d7ed08 100644
--- a/kaddressbook/views/kaddressbookcardview.cpp
+++ b/kaddressbook/views/kaddressbookcardview.cpp
@@ -1,478 +1,478 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
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 23
24#include <qdragobject.h> 24#include <qdragobject.h>
25#include <qevent.h> 25#include <qevent.h>
26#include <qiconview.h> 26#include <qiconview.h>
27#include <qlayout.h> 27#include <qlayout.h>
28#include <qstringlist.h> 28#include <qstringlist.h>
29#include <qregexp.h> 29#include <qregexp.h>
30#include <qapplication.h> 30#include <qapplication.h>
31 31
32#include <kabc/addressbook.h> 32#include <kabc/addressbook.h>
33#include <kabc/addressee.h> 33#include <kabc/addressee.h>
34#include <kconfig.h> 34#include <kconfig.h>
35#include <kdebug.h> 35#include <kdebug.h>
36#include <klocale.h> 36#include <klocale.h>
37 37
38#include "kabprefs.h" 38#include "kabprefs.h"
39#include "viewmanager.h" 39#include "viewmanager.h"
40 40
41#include "kaddressbookcardview.h" 41#include "kaddressbookcardview.h"
42 42
43#ifndef KAB_EMBEDDED 43#ifndef KAB_EMBEDDED
44extern "C" { 44extern "C" {
45 void *init_libkaddrbk_cardview() 45 void *init_libkaddrbk_cardview()
46 { 46 {
47 return ( new CardViewFactory ); 47 return ( new CardViewFactory );
48 } 48 }
49} 49}
50#endif //KAB_EMBEDDED 50#endif //KAB_EMBEDDED
51 51
52//////////////////////////////// 52////////////////////////////////
53// AddresseeCardViewItem (internal class) 53// AddresseeCardViewItem (internal class)
54class AddresseeCardViewItem : public CardViewItem 54class AddresseeCardViewItem : public CardViewItem
55{ 55{
56 public: 56 public:
57 AddresseeCardViewItem(const KABC::Field::List &fields, 57 AddresseeCardViewItem(const KABC::Field::List &fields,
58 bool showEmptyFields, 58 bool showEmptyFields,
59 KABC::AddressBook *doc, const KABC::Addressee &a, 59 KABC::AddressBook *doc, const KABC::Addressee &a,
60 CardView *parent) 60 CardView *parent)
61 : CardViewItem(parent, a.formattedName()), 61 : CardViewItem(parent, a.formattedName()),
62 mFields( fields ), mShowEmptyFields(showEmptyFields), 62 mFields( fields ), mShowEmptyFields(showEmptyFields),
63 mDocument(doc), mAddressee(a) 63 mDocument(doc), mAddressee(a)
64 { 64 {
65 if ( mFields.isEmpty() ) { 65 if ( mFields.isEmpty() ) {
66 mFields = KABC::Field::defaultFields(); 66 mFields = KABC::Field::defaultFields();
67 } 67 }
68 refresh(); 68 refresh();
69 } 69 }
70 70
71 const KABC::Addressee &addressee() const { return mAddressee; } 71 const KABC::Addressee &addressee() const { return mAddressee; }
72 72
73 void refresh() 73 void refresh()
74 { 74 {
75 // Update our addressee, since it may have changed elsewhere 75 // Update our addressee, since it may have changed elsewhere
76 mAddressee = mDocument->findByUid(mAddressee.uid()); 76 mAddressee = mDocument->findByUid(mAddressee.uid());
77 77
78 if (!mAddressee.isEmpty()) 78 if (!mAddressee.isEmpty())
79 { 79 {
80 clearFields(); 80 clearFields();
81 81
82 // Try all the selected fields until we find one with text. 82 // Try all the selected fields until we find one with text.
83 // This will limit the number of unlabeled icons in the view 83 // This will limit the number of unlabeled icons in the view
84 KABC::Field::List::Iterator iter; 84 KABC::Field::List::Iterator iter;
85 for (iter = mFields.begin(); iter != mFields.end(); ++iter) 85 for (iter = mFields.begin(); iter != mFields.end(); ++iter)
86 { 86 {
87 // insert empty fields or not? not doing so saves a bit of memory and CPU 87 // insert empty fields or not? not doing so saves a bit of memory and CPU
88 // (during geometry calculations), but prevents having equally 88 // (during geometry calculations), but prevents having equally
89 // wide label columns in all cards, unless CardViewItem/CardView search 89 // wide label columns in all cards, unless CardViewItem/CardView search
90 // globally for the widest label. (anders) 90 // globally for the widest label. (anders)
91 //if (mShowEmptyFields || !(*iter)->value( mAddressee ).isEmpty()) 91 //if (mShowEmptyFields || !(*iter)->value( mAddressee ).isEmpty())
92 insertField((*iter)->label(), (*iter)->value( mAddressee )); 92 insertField((*iter)->label(), (*iter)->value( mAddressee ));
93 } 93 }
94 94
95 // We might want to make this the first field. hmm... -mpilone 95 // We might want to make this the first field. hmm... -mpilone
96 setCaption( mAddressee.realName() ); 96 setCaption( mAddressee.realName() );
97 } 97 }
98 } 98 }
99 99
100 private: 100 private:
101 KABC::Field::List mFields; 101 KABC::Field::List mFields;
102 bool mShowEmptyFields; 102 bool mShowEmptyFields;
103 KABC::AddressBook *mDocument; 103 KABC::AddressBook *mDocument;
104 KABC::Addressee mAddressee; 104 KABC::Addressee mAddressee;
105}; 105};
106 106
107/////////////////////////////// 107///////////////////////////////
108// AddresseeCardView 108// AddresseeCardView
109 109
110AddresseeCardView::AddresseeCardView(QWidget *parent, const char *name) 110AddresseeCardView::AddresseeCardView(QWidget *parent, const char *name)
111 : CardView(parent, name) 111 : CardView(parent, name)
112{ 112{
113 setAcceptDrops(true); 113 setAcceptDrops(true);
114} 114}
115 115
116AddresseeCardView::~AddresseeCardView() 116AddresseeCardView::~AddresseeCardView()
117{ 117{
118} 118}
119 119
120 120
121void AddresseeCardView::dragEnterEvent(QDragEnterEvent *e) 121void AddresseeCardView::dragEnterEvent(QDragEnterEvent *e)
122{ 122{
123#ifndef KAB_EMBEDDED 123#ifndef KAB_EMBEDDED
124 if (QTextDrag::canDecode(e)) 124 if (QTextDrag::canDecode(e))
125 e->accept(); 125 e->accept();
126#else //KAB_EMBEDDED 126#else //KAB_EMBEDDED
127qDebug("AddresseeCardView::dragEnterEvent drag&drop is not implemented"); 127qDebug("AddresseeCardView::dragEnterEvent drag&drop is not implemented");
128#endif //KAB_EMBEDDED 128#endif //KAB_EMBEDDED
129} 129}
130 130
131void AddresseeCardView::dropEvent(QDropEvent *e) 131void AddresseeCardView::dropEvent(QDropEvent *e)
132{ 132{
133 emit addresseeDropped(e); 133 emit addresseeDropped(e);
134} 134}
135 135
136void AddresseeCardView::startDrag() 136void AddresseeCardView::startDrag()
137{ 137{
138 emit startAddresseeDrag(); 138 emit startAddresseeDrag();
139} 139}
140 140
141 141
142/////////////////////////////// 142///////////////////////////////
143// KAddressBookCardView 143// KAddressBookCardView
144 144
145KAddressBookCardView::KAddressBookCardView( KABC::AddressBook *ab, 145KAddressBookCardView::KAddressBookCardView( KABC::AddressBook *ab,
146 QWidget *parent, const char *name ) 146 QWidget *parent, const char *name )
147 : KAddressBookView( ab, parent, name ) 147 : KAddressBookView( ab, parent, name )
148{ 148{
149 mShowEmptyFields = false; 149 mShowEmptyFields = false;
150 150
151 // Init the GUI 151 // Init the GUI
152 QVBoxLayout *layout = new QVBoxLayout(viewWidget()); 152 QVBoxLayout *layout = new QVBoxLayout(viewWidget());
153 153
154 mCardView = new AddresseeCardView(viewWidget(), "mCardView"); 154 mCardView = new AddresseeCardView(viewWidget(), "mCardView");
155 mCardView->setSelectionMode(CardView::Extended); 155 mCardView->setSelectionMode(CardView::Extended);
156 layout->addWidget(mCardView); 156 layout->addWidget(mCardView);
157 157
158 // Connect up the signals 158 // Connect up the signals
159 connect(mCardView, SIGNAL(executed(CardViewItem *)), 159 connect(mCardView, SIGNAL(executed(CardViewItem *)),
160 this, SLOT(addresseeExecuted(CardViewItem *))); 160 this, SLOT(addresseeExecuted(CardViewItem *)));
161 connect(mCardView, SIGNAL(selectionChanged()), 161 connect(mCardView, SIGNAL(selectionChanged()),
162 this, SLOT(addresseeSelected())); 162 this, SLOT(addresseeSelected()));
163 connect(mCardView, SIGNAL(addresseeDropped(QDropEvent*)), 163 connect(mCardView, SIGNAL(addresseeDropped(QDropEvent*)),
164 this, SIGNAL(dropped(QDropEvent*))); 164 this, SIGNAL(dropped(QDropEvent*)));
165 connect(mCardView, SIGNAL(startAddresseeDrag()), 165 connect(mCardView, SIGNAL(startAddresseeDrag()),
166 this, SIGNAL(startDrag())); 166 this, SIGNAL(startDrag()));
167} 167}
168 168
169KAddressBookCardView::~KAddressBookCardView() 169KAddressBookCardView::~KAddressBookCardView()
170{ 170{
171} 171}
172void KAddressBookCardView::setFocusAV() 172void KAddressBookCardView::setFocusAV()
173{ 173{
174 if ( mCardView ) 174 if ( mCardView )
175 mCardView->setFocus(); 175 mCardView->setFocus();
176 176
177} 177}
178void KAddressBookCardView::scrollUP() 178void KAddressBookCardView::scrollUP()
179{ 179{
180 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Up, 0,0 ); 180 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Up, 0,0 );
181 QApplication::postEvent( mCardView, ev ); 181 QApplication::postEvent( mCardView, ev );
182 182
183} 183}
184void KAddressBookCardView::scrollDOWN() 184void KAddressBookCardView::scrollDOWN()
185{ 185{
186 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Down, 0,0 ); 186 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Down, 0,0 );
187 QApplication::postEvent( mCardView, ev ); 187 QApplication::postEvent( mCardView, ev );
188} 188}
189void KAddressBookCardView::readConfig(KConfig *config) 189void KAddressBookCardView::readConfig(KConfig *config)
190{ 190{
191 KAddressBookView::readConfig(config); 191 KAddressBookView::readConfig(config);
192 192
193 // costum colors? 193 // costum colors?
194 if ( config->readBoolEntry( "EnableCustomColors", false ) ) 194 if ( config->readBoolEntry( "EnableCustomColors", false ) )
195 { 195 {
196 QPalette p( mCardView->palette() ); 196 QPalette p( mCardView->palette() );
197 QColor c = p.color(QPalette::Normal, QColorGroup::Base ); 197 QColor c = p.color(QPalette::Normal, QColorGroup::Base );
198 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) ); 198 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) );
199 c = p.color(QPalette::Normal, QColorGroup::Text ); 199 c = p.color(QPalette::Normal, QColorGroup::Text );
200 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) ); 200 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) );
201 c = p.color(QPalette::Normal, QColorGroup::Button ); 201 c = p.color(QPalette::Normal, QColorGroup::Button );
202 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) ); 202 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) );
203 c = p.color(QPalette::Normal, QColorGroup::ButtonText ); 203 c = p.color(QPalette::Normal, QColorGroup::ButtonText );
204 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) ); 204 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) );
205 c = p.color(QPalette::Normal, QColorGroup::Highlight ); 205 c = p.color(QPalette::Normal, QColorGroup::Highlight );
206 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) ); 206 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) );
207 c = p.color(QPalette::Normal, QColorGroup::HighlightedText ); 207 c = p.color(QPalette::Normal, QColorGroup::HighlightedText );
208 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) ); 208 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) );
209 mCardView->viewport()->setPalette( p ); 209 mCardView->viewport()->setPalette( p );
210 } 210 }
211 else 211 else
212 { 212 {
213 // needed if turned off during a session. 213 // needed if turned off during a session.
214 mCardView->viewport()->setPalette( mCardView->palette() ); 214 mCardView->viewport()->setPalette( mCardView->palette() );
215 } 215 }
216 216
217 //custom fonts? 217 //custom fonts?
218 QFont f( font() ); 218 QFont f( font() );
219 if ( config->readBoolEntry( "EnableCustomFonts", false ) ) 219 if ( config->readBoolEntry( "EnableCustomFonts", false ) )
220 { 220 {
221 mCardView->setFont( config->readFontEntry( "TextFont", &f) ); 221 mCardView->setFont( config->readFontEntry( "TextFont", &f) );
222 f.setBold( true ); 222 f.setBold( true );
223 mCardView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) ); 223 mCardView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) );
224 } 224 }
225 else 225 else
226 { 226 {
227 mCardView->setFont( f ); 227 mCardView->setFont( f );
228 f.setBold( true ); 228 f.setBold( true );
229 mCardView->setHeaderFont( f ); 229 mCardView->setHeaderFont( f );
230 } 230 }
231 231
232 mCardView->setDrawCardBorder(config->readBoolEntry("DrawBorder", true)); 232 mCardView->setDrawCardBorder(config->readBoolEntry("DrawBorder", true));
233 mCardView->setDrawColSeparators(config->readBoolEntry("DrawSeparators", 233 mCardView->setDrawColSeparators(config->readBoolEntry("DrawSeparators",
234 true)); 234 true));
235 mCardView->setDrawFieldLabels(config->readBoolEntry("DrawFieldLabels",false)); 235 mCardView->setDrawFieldLabels(config->readBoolEntry("DrawFieldLabels",false));
236 mShowEmptyFields = config->readBoolEntry("ShowEmptyFields", false); 236 mShowEmptyFields = config->readBoolEntry("ShowEmptyFields", false);
237 237
238 mCardView->setShowEmptyFields( mShowEmptyFields ); 238 mCardView->setShowEmptyFields( mShowEmptyFields );
239 239
240 mCardView->setItemWidth( config->readNumEntry( "ItemWidth", 200 ) ); 240 mCardView->setItemWidth( config->readNumEntry( "ItemWidth", 200 ) );
241 mCardView->setItemMargin( config->readNumEntry( "ItemMargin", 0 ) ); 241 mCardView->setItemMargin( config->readNumEntry( "ItemMargin", 0 ) );
242 mCardView->setItemSpacing( config->readNumEntry( "ItemSpacing", 10 ) ); 242 mCardView->setItemSpacing( config->readNumEntry( "ItemSpacing", 10 ) );
243 mCardView->setSeparatorWidth( config->readNumEntry( "SeparatorWidth", 2 ) ); 243 mCardView->setSeparatorWidth( config->readNumEntry( "SeparatorWidth", 2 ) );
244 244
245#if 0 245#if 0
246 // LR KABPrefs::instance()->mHonorSingleClick is handled and fixed in cardviews contentsMouseDoubleClickEven 246 // LR KABPrefs::instance()->mHonorSingleClick is handled and fixed in cardviews contentsMouseDoubleClickEven
247 disconnect(mCardView, SIGNAL(executed(CardViewItem *)), 247 disconnect(mCardView, SIGNAL(executed(CardViewItem *)),
248 this, SLOT(addresseeExecuted(CardViewItem *))); 248 this, SLOT(addresseeExecuted(CardViewItem *)));
249 249
250 if (KABPrefs::instance()->mHonorSingleClick) 250 if (KABPrefs::instance()->mHonorSingleClick)
251 connect(mCardView, SIGNAL(executed(CardViewItem *)), 251 connect(mCardView, SIGNAL(executed(CardViewItem *)),
252 this, SLOT(addresseeExecuted(CardViewItem *))); 252 this, SLOT(addresseeExecuted(CardViewItem *)));
253 else 253 else
254 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)), 254 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)),
255 this, SLOT(addresseeExecuted(CardViewItem *))); 255 this, SLOT(addresseeExecuted(CardViewItem *)));
256#endif 256#endif
257 257
258 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)), 258 connect(mCardView, SIGNAL(doubleClicked(CardViewItem *)),
259 this, SLOT(addresseeExecuted(CardViewItem *))); 259 this, SLOT(addresseeExecuted(CardViewItem *)));
260} 260}
261 261
262void KAddressBookCardView::writeConfig( KConfig *config ) 262void KAddressBookCardView::writeConfig( KConfig *config )
263{ 263{
264 config->writeEntry( "ItemWidth", mCardView->itemWidth() ); 264 config->writeEntry( "ItemWidth", mCardView->itemWidth() );
265 KAddressBookView::writeConfig( config ); 265 KAddressBookView::writeConfig( config );
266} 266}
267void KAddressBookCardView::doSearch( const QString& s,KABC::Field *field ) 267void KAddressBookCardView::doSearch( const QString& s,KABC::Field *field )
268{ 268{
269 mCardView->clear(); 269 mCardView->clear();
270 if ( s.isEmpty() || s == "*" ) { 270 if ( s.isEmpty() || s == "*" ) {
271 refresh(); 271 refresh();
272 return; 272 return;
273 } 273 }
274 QString pattern = s.lower()+"*"; 274 QString pattern = s.lower()+"*";
275 QRegExp re; 275 QRegExp re;
276 re.setWildcard(true); // most people understand these better. 276 re.setWildcard(true); // most people understand these better.
277 re.setCaseSensitive(false); 277 re.setCaseSensitive(false);
278 re.setPattern( pattern ); 278 re.setPattern( pattern );
279 if (!re.isValid()) 279 if (!re.isValid())
280 return; 280 return;
281 mCardView->viewport()->setUpdatesEnabled( false ); 281 mCardView->viewport()->setUpdatesEnabled( false );
282 KABC::Addressee::List addresseeList = addressees(); 282 KABC::Addressee::List addresseeList = addressees();
283 KABC::Addressee::List::Iterator it; 283 KABC::Addressee::List::Iterator it;
284 if ( field ) { 284 if ( field ) {
285 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 285 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
286 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 286 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
287 continue; 287 continue;
288#if QT_VERSION >= 300 288#if QT_VERSION >= 300
289 if (re.search(field->value( *it ).lower()) != -1) 289 if (re.search(field->value( *it ).lower()) != -1)
290#else 290#else
291 if (re.match(field->value( *it ).lower()) != -1) 291 if (re.match(field->value( *it ).lower()) != -1)
292#endif 292#endif
293 new AddresseeCardViewItem(fields(), mShowEmptyFields, 293 new AddresseeCardViewItem(fields(), mShowEmptyFields,
294 addressBook(), *it, mCardView); 294 addressBook(), *it, mCardView);
295 295
296 } 296 }
297 } else { 297 } else {
298 KABC::Field::List fieldList = fields(); 298 KABC::Field::List fieldList = allFields();
299 KABC::Field::List::ConstIterator fieldIt; 299 KABC::Field::List::ConstIterator fieldIt;
300 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 300 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
301 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 301 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
302 continue; 302 continue;
303 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) { 303 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
304#if QT_VERSION >= 300 304#if QT_VERSION >= 300
305 if (re.search((*fieldIt)->value( *it ).lower()) != -1) 305 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
306#else 306#else
307 if (re.match((*fieldIt)->value( *it ).lower()) != -1) 307 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
308#endif 308#endif
309 { 309 {
310 new AddresseeCardViewItem(fields(), mShowEmptyFields, 310 new AddresseeCardViewItem(fields(), mShowEmptyFields,
311 addressBook(), *it, mCardView); 311 addressBook(), *it, mCardView);
312 continue; 312 continue;
313 } 313 }
314 } 314 }
315 } 315 }
316 } 316 }
317 mCardView->viewport()->setUpdatesEnabled( true ); 317 mCardView->viewport()->setUpdatesEnabled( true );
318 mCardView->viewport()->update(); 318 mCardView->viewport()->update();
319 if ( mCardView->firstItem() ) { 319 if ( mCardView->firstItem() ) {
320 mCardView->setCurrentItem ( mCardView->firstItem() ); 320 mCardView->setCurrentItem ( mCardView->firstItem() );
321 mCardView->setSelected ( mCardView->firstItem() , true ); 321 mCardView->setSelected ( mCardView->firstItem() , true );
322 } 322 }
323 else 323 else
324 emit selected(QString::null); 324 emit selected(QString::null);
325} 325}
326QStringList KAddressBookCardView::selectedUids() 326QStringList KAddressBookCardView::selectedUids()
327{ 327{
328 QStringList uidList; 328 QStringList uidList;
329 CardViewItem *item; 329 CardViewItem *item;
330 AddresseeCardViewItem *aItem; 330 AddresseeCardViewItem *aItem;
331 331
332 for (item = mCardView->firstItem(); item; item = item->nextItem()) 332 for (item = mCardView->firstItem(); item; item = item->nextItem())
333 { 333 {
334 if (item->isSelected()) 334 if (item->isSelected())
335 { 335 {
336#ifndef KAB_EMBEDDED 336#ifndef KAB_EMBEDDED
337 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 337 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
338#else //KAB_EMBEDDED 338#else //KAB_EMBEDDED
339 aItem = (AddresseeCardViewItem*)(item); 339 aItem = (AddresseeCardViewItem*)(item);
340#endif //KAB_EMBEDDED 340#endif //KAB_EMBEDDED
341 if (aItem) 341 if (aItem)
342 uidList << aItem->addressee().uid(); 342 uidList << aItem->addressee().uid();
343 } 343 }
344 } 344 }
345 345
346 return uidList; 346 return uidList;
347} 347}
348 348
349void KAddressBookCardView::refresh(QString uid) 349void KAddressBookCardView::refresh(QString uid)
350{ 350{
351 CardViewItem *item; 351 CardViewItem *item;
352 AddresseeCardViewItem *aItem; 352 AddresseeCardViewItem *aItem;
353 353
354 if (uid.isNull()) 354 if (uid.isNull())
355 { 355 {
356 // Rebuild the view 356 // Rebuild the view
357 mCardView->viewport()->setUpdatesEnabled( false ); 357 mCardView->viewport()->setUpdatesEnabled( false );
358 mCardView->clear(); 358 mCardView->clear();
359 359
360 KABC::Addressee::List addresseeList = addressees(); 360 KABC::Addressee::List addresseeList = addressees();
361 KABC::Addressee::List::Iterator iter; 361 KABC::Addressee::List::Iterator iter;
362 for (iter = addresseeList.begin(); iter != addresseeList.end(); ++iter) 362 for (iter = addresseeList.begin(); iter != addresseeList.end(); ++iter)
363 { 363 {
364 if ( (*iter).uid().left(2) == "la" && (*iter).uid().left(19) == QString("last-syncAddressee-") ) 364 if ( (*iter).uid().left(2) == "la" && (*iter).uid().left(19) == QString("last-syncAddressee-") )
365 continue; 365 continue;
366 aItem = new AddresseeCardViewItem(fields(), mShowEmptyFields, 366 aItem = new AddresseeCardViewItem(fields(), mShowEmptyFields,
367 addressBook(), *iter, mCardView); 367 addressBook(), *iter, mCardView);
368 } 368 }
369 mCardView->viewport()->setUpdatesEnabled( true ); 369 mCardView->viewport()->setUpdatesEnabled( true );
370 mCardView->viewport()->update(); 370 mCardView->viewport()->update();
371 371
372 // by default nothing is selected 372 // by default nothing is selected
373 emit selected(QString::null); 373 emit selected(QString::null);
374 } 374 }
375 else 375 else
376 { 376 {
377 // Try to find the one to refresh 377 // Try to find the one to refresh
378 bool found = false; 378 bool found = false;
379 for (item = mCardView->firstItem(); item && !found; 379 for (item = mCardView->firstItem(); item && !found;
380 item = item->nextItem()) 380 item = item->nextItem())
381 { 381 {
382#ifndef KAB_EMBEDDED 382#ifndef KAB_EMBEDDED
383 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 383 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
384#else //KAB_EMBEDDED 384#else //KAB_EMBEDDED
385 aItem = (AddresseeCardViewItem*)(item); 385 aItem = (AddresseeCardViewItem*)(item);
386#endif //KAB_EMBEDDED 386#endif //KAB_EMBEDDED
387 387
388 if ((aItem) && (aItem->addressee().uid() == uid)) 388 if ((aItem) && (aItem->addressee().uid() == uid))
389 { 389 {
390 aItem->refresh(); 390 aItem->refresh();
391 found = true; 391 found = true;
392 } 392 }
393 } 393 }
394 } 394 }
395} 395}
396 396
397void KAddressBookCardView::setSelected(QString uid, bool selected) 397void KAddressBookCardView::setSelected(QString uid, bool selected)
398{ 398{
399 CardViewItem *item; 399 CardViewItem *item;
400 AddresseeCardViewItem *aItem; 400 AddresseeCardViewItem *aItem;
401 401
402 if (uid.isNull()) 402 if (uid.isNull())
403 { 403 {
404 mCardView->selectAll(selected); 404 mCardView->selectAll(selected);
405 } 405 }
406 else 406 else
407 { 407 {
408 bool found = false; 408 bool found = false;
409 for (item = mCardView->firstItem(); item && !found; 409 for (item = mCardView->firstItem(); item && !found;
410 item = item->nextItem()) 410 item = item->nextItem())
411 { 411 {
412#ifndef KAB_EMBEDDED 412#ifndef KAB_EMBEDDED
413 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 413 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
414#else //KAB_EMBEDDED 414#else //KAB_EMBEDDED
415 aItem = (AddresseeCardViewItem*)(item); 415 aItem = (AddresseeCardViewItem*)(item);
416#endif //KAB_EMBEDDED 416#endif //KAB_EMBEDDED
417 417
418 if ((aItem) && (aItem->addressee().uid() == uid)) 418 if ((aItem) && (aItem->addressee().uid() == uid))
419 { 419 {
420 mCardView->setSelected(aItem, selected); 420 mCardView->setSelected(aItem, selected);
421 mCardView->ensureItemVisible(item); 421 mCardView->ensureItemVisible(item);
422 found = true; 422 found = true;
423 } 423 }
424 } 424 }
425 } 425 }
426} 426}
427 427
428//US added an additional method without parameter 428//US added an additional method without parameter
429void KAddressBookCardView::setSelected() 429void KAddressBookCardView::setSelected()
430{ 430{
431 setSelected(QString::null, true); 431 setSelected(QString::null, true);
432} 432}
433 433
434void KAddressBookCardView::addresseeExecuted(CardViewItem *item) 434void KAddressBookCardView::addresseeExecuted(CardViewItem *item)
435{ 435{
436#ifndef KAB_EMBEDDED 436#ifndef KAB_EMBEDDED
437 AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>(item); 437 AddresseeCardViewItem *aItem = dynamic_cast<AddresseeCardViewItem*>(item);
438#else //KAB_EMBEDDED 438#else //KAB_EMBEDDED
439 AddresseeCardViewItem *aItem = (AddresseeCardViewItem*)(item); 439 AddresseeCardViewItem *aItem = (AddresseeCardViewItem*)(item);
440#endif //KAB_EMBEDDED 440#endif //KAB_EMBEDDED
441 if (aItem) 441 if (aItem)
442 { 442 {
443 //kdDebug()<<"... even has a valid item:)"<<endl; 443 //kdDebug()<<"... even has a valid item:)"<<endl;
444 emit executed(aItem->addressee().uid()); 444 emit executed(aItem->addressee().uid());
445 } 445 }
446} 446}
447 447
448void KAddressBookCardView::addresseeSelected() 448void KAddressBookCardView::addresseeSelected()
449{ 449{
450 CardViewItem *item; 450 CardViewItem *item;
451 AddresseeCardViewItem *aItem; 451 AddresseeCardViewItem *aItem;
452 452
453 bool found = false; 453 bool found = false;
454 for (item = mCardView->firstItem(); item && !found; 454 for (item = mCardView->firstItem(); item && !found;
455 item = item->nextItem()) 455 item = item->nextItem())
456 { 456 {
457 if (item->isSelected()) 457 if (item->isSelected())
458 { 458 {
459#ifndef KAB_EMBEDDED 459#ifndef KAB_EMBEDDED
460 aItem = dynamic_cast<AddresseeCardViewItem*>(item); 460 aItem = dynamic_cast<AddresseeCardViewItem*>(item);
461#else //KAB_EMBEDDED 461#else //KAB_EMBEDDED
462 aItem = (AddresseeCardViewItem*)(item); 462 aItem = (AddresseeCardViewItem*)(item);
463#endif //KAB_EMBEDDED 463#endif //KAB_EMBEDDED
464 if ( aItem ) 464 if ( aItem )
465 { 465 {
466 emit selected(aItem->addressee().uid()); 466 emit selected(aItem->addressee().uid());
467 found = true; 467 found = true;
468 } 468 }
469 } 469 }
470 } 470 }
471 471
472 if (!found) 472 if (!found)
473 emit selected(QString::null); 473 emit selected(QString::null);
474 474
475} 475}
476#ifndef KAB_EMBEDDED 476#ifndef KAB_EMBEDDED
477#include "kaddressbookcardview.moc" 477#include "kaddressbookcardview.moc"
478#endif //KAB_EMBEDDED 478#endif //KAB_EMBEDDED
diff --git a/kaddressbook/views/kaddressbookiconview.cpp b/kaddressbook/views/kaddressbookiconview.cpp
index 0ce56c8..faeda06 100644
--- a/kaddressbook/views/kaddressbookiconview.cpp
+++ b/kaddressbook/views/kaddressbookiconview.cpp
@@ -1,456 +1,456 @@
1/* 1/*
2 This file is part of KAddressBook. 2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com> 3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
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 23
24#ifndef KAB_EMBEDDED 24#ifndef KAB_EMBEDDED
25#include <qiconview.h> 25#include <qiconview.h>
26#include <qstringlist.h> 26#include <qstringlist.h>
27 27
28#include <kabc/addressee.h> 28#include <kabc/addressee.h>
29#include <kconfig.h> 29#include <kconfig.h>
30#include <kdebug.h> 30#include <kdebug.h>
31#include <kglobal.h> 31#include <kglobal.h>
32#include <kiconloader.h> 32#include <kiconloader.h>
33#include <klocale.h> 33#include <klocale.h>
34 34
35#else //KAB_EMBEDDED 35#else //KAB_EMBEDDED
36#endif //KAB_EMBEDDED 36#endif //KAB_EMBEDDED
37 37
38#include <kabc/addressbook.h> 38#include <kabc/addressbook.h>
39#include "kabprefs.h" 39#include "kabprefs.h"
40#include "viewmanager.h" 40#include "viewmanager.h"
41#include "kaddressbookiconview.h" 41#include "kaddressbookiconview.h"
42#include <qlayout.h> 42#include <qlayout.h>
43#include <qregexp.h> 43#include <qregexp.h>
44#include <qapplication.h> 44#include <qapplication.h>
45#include <kglobal.h> 45#include <kglobal.h>
46/*US transfered to the headerfile 46/*US transfered to the headerfile
47class IconViewFactory : public ViewFactory 47class IconViewFactory : public ViewFactory
48{ 48{
49 public: 49 public:
50 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name ) 50 KAddressBookView *view( KABC::AddressBook *ab, QWidget *parent, const char *name )
51 { 51 {
52 return new KAddressBookIconView( ab, parent, name ); 52 return new KAddressBookIconView( ab, parent, name );
53 } 53 }
54 54
55 QString type() const { return "Icon"; } 55 QString type() const { return "Icon"; }
56 56
57 QString description() const { return i18n( "Icons represent contacts. Very simple view." ); } 57 QString description() const { return i18n( "Icons represent contacts. Very simple view." ); }
58}; 58};
59 59
60*/ 60*/
61 61
62extern "C" { 62extern "C" {
63 void *init_libkaddrbk_iconview() 63 void *init_libkaddrbk_iconview()
64 { 64 {
65 return ( new IconViewFactory ); 65 return ( new IconViewFactory );
66 } 66 }
67} 67}
68 68
69//////////////////////////////// 69////////////////////////////////
70// AddresseeIconView (internal class) 70// AddresseeIconView (internal class)
71#ifndef KAB_EMBEDDED 71#ifndef KAB_EMBEDDED
72AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name) 72AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name)
73 : KIconView(parent, name) 73 : KIconView(parent, name)
74#else //KAB_EMBEDDED 74#else //KAB_EMBEDDED
75AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name) 75AddresseeIconView::AddresseeIconView(QWidget *parent, const char *name)
76 : QIconView(parent, name) 76 : QIconView(parent, name)
77#endif //KAB_EMBEDDED 77#endif //KAB_EMBEDDED
78 78
79{ 79{
80 setSelectionMode( QIconView::Extended ); 80 setSelectionMode( QIconView::Extended );
81 setResizeMode( QIconView::Adjust ); 81 setResizeMode( QIconView::Adjust );
82 setWordWrapIconText( true ); 82 setWordWrapIconText( true );
83 setGridX( 100 ); 83 setGridX( 100 );
84 setItemsMovable(false); 84 setItemsMovable(false);
85 setSorting(true, true); 85 setSorting(true, true);
86 86
87 87
88//US ??? setMode( KIconView::Select ); 88//US ??? setMode( KIconView::Select );
89 89
90#ifndef KAB_EMBEDDED 90#ifndef KAB_EMBEDDED
91 91
92 connect(this, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)), 92 connect(this, SIGNAL(dropped(QDropEvent*, const QValueList<QIconDragItem>&)),
93 this, SLOT(itemDropped(QDropEvent*, const QValueList<QIconDragItem>&))); 93 this, SLOT(itemDropped(QDropEvent*, const QValueList<QIconDragItem>&)));
94#endif //KAB_EMBEDDED 94#endif //KAB_EMBEDDED
95} 95}
96 96
97AddresseeIconView::~AddresseeIconView() 97AddresseeIconView::~AddresseeIconView()
98{ 98{
99} 99}
100 100
101 101
102void AddresseeIconView::itemDropped(QDropEvent *e, 102void AddresseeIconView::itemDropped(QDropEvent *e,
103 const QValueList<QIconDragItem> &) 103 const QValueList<QIconDragItem> &)
104{ 104{
105 emit addresseeDropped(e); 105 emit addresseeDropped(e);
106} 106}
107 107
108QDragObject *AddresseeIconView::dragObject() 108QDragObject *AddresseeIconView::dragObject()
109{ 109{
110 emit startAddresseeDrag(); 110 emit startAddresseeDrag();
111 111
112 // We never want IconView to start the drag 112 // We never want IconView to start the drag
113 return 0; 113 return 0;
114} 114}
115//////////////////////////////// 115////////////////////////////////
116// AddresseeIconViewItem (internal class) 116// AddresseeIconViewItem (internal class)
117#ifndef KAB_EMBEDDED 117#ifndef KAB_EMBEDDED
118class AddresseeIconViewItem : public KIconViewItem 118class AddresseeIconViewItem : public KIconViewItem
119#else //KAB_EMBEDDED 119#else //KAB_EMBEDDED
120class AddresseeIconViewItem : public QIconViewItem 120class AddresseeIconViewItem : public QIconViewItem
121#endif //KAB_EMBEDDED 121#endif //KAB_EMBEDDED
122{ 122{
123 public: 123 public:
124#ifndef KAB_EMBEDDED 124#ifndef KAB_EMBEDDED
125 AddresseeIconViewItem(const KABC::Field::List &fields, 125 AddresseeIconViewItem(const KABC::Field::List &fields,
126 KABC::AddressBook *doc, const KABC::Addressee &a, 126 KABC::AddressBook *doc, const KABC::Addressee &a,
127 QIconView *parent) 127 QIconView *parent)
128 : KIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a) 128 : KIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a)
129#else //KAB_EMBEDDED 129#else //KAB_EMBEDDED
130 AddresseeIconViewItem(const KABC::Field::List &fields, 130 AddresseeIconViewItem(const KABC::Field::List &fields,
131 KABC::AddressBook *doc, const KABC::Addressee &a, 131 KABC::AddressBook *doc, const KABC::Addressee &a,
132 QIconView *parent) 132 QIconView *parent)
133 : QIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a) 133 : QIconViewItem(parent), mFields( fields ), mDocument(doc), mAddressee(a)
134#endif //KAB_EMBEDDED 134#endif //KAB_EMBEDDED
135 { 135 {
136 if ( mFields.isEmpty() ) { 136 if ( mFields.isEmpty() ) {
137 mFields = KABC::Field::defaultFields(); 137 mFields = KABC::Field::defaultFields();
138 } 138 }
139 refresh(); 139 refresh();
140 } 140 }
141 141
142 const KABC::Addressee &addressee() const { return mAddressee; } 142 const KABC::Addressee &addressee() const { return mAddressee; }
143 143
144 void refresh() 144 void refresh()
145 { 145 {
146 // Update our addressee, since it may have changed elsewhere 146 // Update our addressee, since it may have changed elsewhere
147 mAddressee = mDocument->findByUid(mAddressee.uid()); 147 mAddressee = mDocument->findByUid(mAddressee.uid());
148 148
149 if (!mAddressee.isEmpty()) 149 if (!mAddressee.isEmpty())
150 setText( mAddressee.givenName() + " " + mAddressee.familyName() ); 150 setText( mAddressee.givenName() + " " + mAddressee.familyName() );
151 151
152 QPixmap icon; 152 QPixmap icon;
153 QPixmap defaultIcon( KGlobal::iconLoader()->loadIcon( "vcard", KIcon::Desktop, 128 ) ); 153 QPixmap defaultIcon( KGlobal::iconLoader()->loadIcon( "vcard", KIcon::Desktop, 128 ) );
154 KABC::Picture pic = mAddressee.photo(); 154 KABC::Picture pic = mAddressee.photo();
155 if ( pic.data().isNull() ) 155 if ( pic.data().isNull() )
156 pic = mAddressee.logo(); 156 pic = mAddressee.logo();
157 157
158 if ( pic.isIntern() && !pic.data().isNull() ) { 158 if ( pic.isIntern() && !pic.data().isNull() ) {
159 QImage img = pic.data(); 159 QImage img = pic.data();
160#ifndef KAB_EMBEDDED 160#ifndef KAB_EMBEDDED
161 if ( img.width() > img.height() ) 161 if ( img.width() > img.height() )
162 icon = img.scaleWidth( 32 ); 162 icon = img.scaleWidth( 32 );
163 else 163 else
164 icon = img.scaleHeight( 32 ); 164 icon = img.scaleHeight( 32 );
165#else //KAB_EMBEDDED 165#else //KAB_EMBEDDED
166 qDebug("AddresseeIconViewItem::refresh - scale here dependend of the displaysize and the right factor"); 166 qDebug("AddresseeIconViewItem::refresh - scale here dependend of the displaysize and the right factor");
167 icon.convertFromImage(img.smoothScale(32, 32)); 167 icon.convertFromImage(img.smoothScale(32, 32));
168#endif //KAB_EMBEDDED 168#endif //KAB_EMBEDDED
169 169
170 } else 170 } else
171 icon = defaultIcon; 171 icon = defaultIcon;
172 172
173 setPixmap( icon ); 173 setPixmap( icon );
174 } 174 }
175 175
176 private: 176 private:
177 KABC::Field::List mFields; 177 KABC::Field::List mFields;
178 KABC::AddressBook *mDocument; 178 KABC::AddressBook *mDocument;
179 KABC::Addressee mAddressee; 179 KABC::Addressee mAddressee;
180}; 180};
181 181
182/////////////////////////////// 182///////////////////////////////
183// KAddressBookView 183// KAddressBookView
184 184
185KAddressBookIconView::KAddressBookIconView( KABC::AddressBook *ab, 185KAddressBookIconView::KAddressBookIconView( KABC::AddressBook *ab,
186 QWidget *parent, const char *name) 186 QWidget *parent, const char *name)
187 : KAddressBookView( ab, parent, name ) 187 : KAddressBookView( ab, parent, name )
188{ 188{
189 // Init the GUI 189 // Init the GUI
190 QVBoxLayout *layout = new QVBoxLayout(viewWidget()); 190 QVBoxLayout *layout = new QVBoxLayout(viewWidget());
191 191
192 mIconView = new AddresseeIconView(viewWidget(), "mIconView"); 192 mIconView = new AddresseeIconView(viewWidget(), "mIconView");
193 layout->addWidget(mIconView); 193 layout->addWidget(mIconView);
194 194
195 // Connect up the signals 195 // Connect up the signals
196 196
197//US method executed is part of KIconView 197//US method executed is part of KIconView
198//US connect(mIconView, SIGNAL(executed(QIconViewItem *)), 198//US connect(mIconView, SIGNAL(executed(QIconViewItem *)),
199//US this, SLOT(addresseeExecuted(QIconViewItem *))); 199//US this, SLOT(addresseeExecuted(QIconViewItem *)));
200 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)), 200 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)),
201 this, SLOT(addresseeExecuted(QIconViewItem *))); 201 this, SLOT(addresseeExecuted(QIconViewItem *)));
202 202
203 connect(mIconView, SIGNAL(selectionChanged()), 203 connect(mIconView, SIGNAL(selectionChanged()),
204 this, SLOT(addresseeSelected())); 204 this, SLOT(addresseeSelected()));
205 connect(mIconView, SIGNAL(addresseeDropped(QDropEvent*)), 205 connect(mIconView, SIGNAL(addresseeDropped(QDropEvent*)),
206 this, SIGNAL(dropped(QDropEvent*))); 206 this, SIGNAL(dropped(QDropEvent*)));
207 connect(mIconView, SIGNAL(startAddresseeDrag()), 207 connect(mIconView, SIGNAL(startAddresseeDrag()),
208 this, SIGNAL(startDrag())); 208 this, SIGNAL(startDrag()));
209} 209}
210 210
211KAddressBookIconView::~KAddressBookIconView() 211KAddressBookIconView::~KAddressBookIconView()
212{ 212{
213} 213}
214void KAddressBookIconView::setFocusAV() 214void KAddressBookIconView::setFocusAV()
215{ 215{
216 if ( mIconView ) 216 if ( mIconView )
217 mIconView->setFocus(); 217 mIconView->setFocus();
218} 218}
219 219
220 220
221void KAddressBookIconView::scrollUP() 221void KAddressBookIconView::scrollUP()
222{ 222{
223 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Up, 0,0 ); 223 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Up, 0,0 );
224 QApplication::postEvent( mIconView, ev ); 224 QApplication::postEvent( mIconView, ev );
225} 225}
226void KAddressBookIconView::scrollDOWN() 226void KAddressBookIconView::scrollDOWN()
227{ 227{
228 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Down, 0,0 ); 228 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Down, 0,0 );
229 QApplication::postEvent( mIconView, ev ); 229 QApplication::postEvent( mIconView, ev );
230} 230}
231void KAddressBookIconView::readConfig(KConfig *config) 231void KAddressBookIconView::readConfig(KConfig *config)
232{ 232{
233 KAddressBookView::readConfig(config); 233 KAddressBookView::readConfig(config);
234 234
235//US method executed is part of KIconView 235//US method executed is part of KIconView
236//US disconnect(mIconView, SIGNAL(executed(QIconViewItem *)), 236//US disconnect(mIconView, SIGNAL(executed(QIconViewItem *)),
237//US this, SLOT(addresseeExecuted(QIconViewItem *))); 237//US this, SLOT(addresseeExecuted(QIconViewItem *)));
238 disconnect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)), 238 disconnect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)),
239 this, SLOT(addresseeExecuted(QIconViewItem *))); 239 this, SLOT(addresseeExecuted(QIconViewItem *)));
240 240
241//US method executed is part of KIconView. Use selectionChanged instead 241//US method executed is part of KIconView. Use selectionChanged instead
242/*US 242/*US
243 if (KABPrefs::instance()->mHonorSingleClick) 243 if (KABPrefs::instance()->mHonorSingleClick)
244 connect(mIconView, SIGNAL(executed(QIconViewItem *)), 244 connect(mIconView, SIGNAL(executed(QIconViewItem *)),
245 this, SLOT(addresseeExecuted(QIconViewItem *))); 245 this, SLOT(addresseeExecuted(QIconViewItem *)));
246 else 246 else
247 connect(mIconView, SIGNAL(doubleClicked(QIconViewItem *)), 247 connect(mIconView, SIGNAL(doubleClicked(QIconViewItem *)),
248 this, SLOT(addresseeExecuted(QIconViewItem *))); 248 this, SLOT(addresseeExecuted(QIconViewItem *)));
249*/ 249*/
250 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)), 250 connect(mIconView, SIGNAL(selectionChanged(QIconViewItem *)),
251 this, SLOT(addresseeExecuted(QIconViewItem *))); 251 this, SLOT(addresseeExecuted(QIconViewItem *)));
252 252
253} 253}
254void KAddressBookIconView::doSearch( const QString& s ,KABC::Field *field ) 254void KAddressBookIconView::doSearch( const QString& s ,KABC::Field *field )
255{ 255{
256 mIconView->clear(); 256 mIconView->clear();
257 mIconList.clear(); 257 mIconList.clear();
258 if ( s.isEmpty() || s == "*" ) { 258 if ( s.isEmpty() || s == "*" ) {
259 refresh(); 259 refresh();
260 return; 260 return;
261 } 261 }
262 QString pattern = s.lower()+"*"; 262 QString pattern = s.lower()+"*";
263 QRegExp re; 263 QRegExp re;
264 re.setWildcard(true); // most people understand these better. 264 re.setWildcard(true); // most people understand these better.
265 re.setCaseSensitive(false); 265 re.setCaseSensitive(false);
266 re.setPattern( pattern ); 266 re.setPattern( pattern );
267 if (!re.isValid()) 267 if (!re.isValid())
268 return; 268 return;
269 KABC::Addressee::List addresseeList = addressees(); 269 KABC::Addressee::List addresseeList = addressees();
270 KABC::Addressee::List::Iterator it; 270 KABC::Addressee::List::Iterator it;
271 if ( field ) { 271 if ( field ) {
272 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 272 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
273 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 273 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
274 continue; 274 continue;
275#if QT_VERSION >= 300 275#if QT_VERSION >= 300
276 if (re.search(field->value( *it ).lower()) != -1) 276 if (re.search(field->value( *it ).lower()) != -1)
277#else 277#else
278 if (re.match(field->value( *it ).lower()) != -1) 278 if (re.match(field->value( *it ).lower()) != -1)
279#endif 279#endif
280 mIconList.append(new AddresseeIconViewItem( fields(), addressBook(), *it, mIconView )); 280 mIconList.append(new AddresseeIconViewItem( fields(), addressBook(), *it, mIconView ));
281 281
282 282
283 } 283 }
284 } else { 284 } else {
285 KABC::Field::List fieldList = fields(); 285 KABC::Field::List fieldList = allFields();
286 KABC::Field::List::ConstIterator fieldIt; 286 KABC::Field::List::ConstIterator fieldIt;
287 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 287 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
288 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 288 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
289 continue; 289 continue;
290 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) { 290 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
291#if QT_VERSION >= 300 291#if QT_VERSION >= 300
292 if (re.search((*fieldIt)->value( *it ).lower()) != -1) 292 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
293#else 293#else
294 if (re.match((*fieldIt)->value( *it ).lower()) != -1) 294 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
295#endif 295#endif
296 { 296 {
297 mIconList.append( new AddresseeIconViewItem( fields(), addressBook(), *it, mIconView )); 297 mIconList.append( new AddresseeIconViewItem( fields(), addressBook(), *it, mIconView ));
298 continue; 298 continue;
299 } 299 }
300 } 300 }
301 } 301 }
302 } 302 }
303 mIconView->arrangeItemsInGrid( true ); 303 mIconView->arrangeItemsInGrid( true );
304 if ( mIconView->firstItem() ) { 304 if ( mIconView->firstItem() ) {
305 mIconView->setCurrentItem ( mIconView->firstItem() ); 305 mIconView->setCurrentItem ( mIconView->firstItem() );
306 mIconView->setSelected ( mIconView->firstItem() , true ); 306 mIconView->setSelected ( mIconView->firstItem() , true );
307 } 307 }
308 else 308 else
309 emit selected(QString::null); 309 emit selected(QString::null);
310} 310}
311QStringList KAddressBookIconView::selectedUids() 311QStringList KAddressBookIconView::selectedUids()
312{ 312{
313 QStringList uidList; 313 QStringList uidList;
314 QIconViewItem *item; 314 QIconViewItem *item;
315 AddresseeIconViewItem *aItem; 315 AddresseeIconViewItem *aItem;
316 316
317 for (item = mIconView->firstItem(); item; item = item->nextItem()) 317 for (item = mIconView->firstItem(); item; item = item->nextItem())
318 { 318 {
319 if (item->isSelected()) 319 if (item->isSelected())
320 { 320 {
321#ifndef KAB_EMBEDDED 321#ifndef KAB_EMBEDDED
322 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 322 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
323#else //KAB_EMBEDDED 323#else //KAB_EMBEDDED
324 aItem = (AddresseeIconViewItem*)(item); 324 aItem = (AddresseeIconViewItem*)(item);
325#endif //KAB_EMBEDDED 325#endif //KAB_EMBEDDED
326 if (aItem) 326 if (aItem)
327 uidList << aItem->addressee().uid(); 327 uidList << aItem->addressee().uid();
328 } 328 }
329 } 329 }
330 330
331 return uidList; 331 return uidList;
332} 332}
333 333
334void KAddressBookIconView::refresh(QString uid) 334void KAddressBookIconView::refresh(QString uid)
335{ 335{
336 QIconViewItem *item; 336 QIconViewItem *item;
337 AddresseeIconViewItem *aItem; 337 AddresseeIconViewItem *aItem;
338 338
339 if ( uid.isNull() ) { 339 if ( uid.isNull() ) {
340 // Rebuild the view 340 // Rebuild the view
341 mIconView->clear(); 341 mIconView->clear();
342 mIconList.clear(); 342 mIconList.clear();
343 343
344 KABC::Addressee::List addresseeList = addressees(); 344 KABC::Addressee::List addresseeList = addressees();
345 KABC::Addressee::List::Iterator iter; 345 KABC::Addressee::List::Iterator iter;
346 for ( iter = addresseeList.begin(); iter != addresseeList.end(); ++iter ) { 346 for ( iter = addresseeList.begin(); iter != addresseeList.end(); ++iter ) {
347 if ( (*iter).uid().left(2) == "la" && (*iter).uid().left(19) == QString("last-syncAddressee-") ) 347 if ( (*iter).uid().left(2) == "la" && (*iter).uid().left(19) == QString("last-syncAddressee-") )
348 continue; 348 continue;
349 aItem = new AddresseeIconViewItem( fields(), addressBook(), *iter, mIconView ); 349 aItem = new AddresseeIconViewItem( fields(), addressBook(), *iter, mIconView );
350 } 350 }
351 351
352 mIconView->arrangeItemsInGrid( true ); 352 mIconView->arrangeItemsInGrid( true );
353 353
354 for ( item = mIconView->firstItem(); item; item = item->nextItem() ) 354 for ( item = mIconView->firstItem(); item; item = item->nextItem() )
355 { 355 {
356#ifndef KAB_EMBEDDED 356#ifndef KAB_EMBEDDED
357 AddresseeIconViewItem* aivi = dynamic_cast<AddresseeIconViewItem*>( item ); 357 AddresseeIconViewItem* aivi = dynamic_cast<AddresseeIconViewItem*>( item );
358#else //KAB_EMBEDDED 358#else //KAB_EMBEDDED
359 AddresseeIconViewItem* aivi = (AddresseeIconViewItem*)( item ); 359 AddresseeIconViewItem* aivi = (AddresseeIconViewItem*)( item );
360#endif //KAB_EMBEDDED 360#endif //KAB_EMBEDDED
361 mIconList.append( aivi ); 361 mIconList.append( aivi );
362 } 362 }
363 363
364 } else { 364 } else {
365 // Try to find the one to refresh 365 // Try to find the one to refresh
366 for ( item = mIconView->firstItem(); item; item = item->nextItem() ) { 366 for ( item = mIconView->firstItem(); item; item = item->nextItem() ) {
367#ifndef KAB_EMBEDDED 367#ifndef KAB_EMBEDDED
368 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 368 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
369#else //KAB_EMBEDDED 369#else //KAB_EMBEDDED
370 aItem = (AddresseeIconViewItem*)(item); 370 aItem = (AddresseeIconViewItem*)(item);
371#endif //KAB_EMBEDDED 371#endif //KAB_EMBEDDED
372 if ((aItem) && (aItem->addressee().uid() == uid)) { 372 if ((aItem) && (aItem->addressee().uid() == uid)) {
373 aItem->refresh(); 373 aItem->refresh();
374 mIconView->arrangeItemsInGrid( true ); 374 mIconView->arrangeItemsInGrid( true );
375 return; 375 return;
376 } 376 }
377 } 377 }
378 refresh( QString::null ); 378 refresh( QString::null );
379 } 379 }
380} 380}
381 381
382void KAddressBookIconView::setSelected(QString uid, bool selected) 382void KAddressBookIconView::setSelected(QString uid, bool selected)
383{ 383{
384 QIconViewItem *item; 384 QIconViewItem *item;
385 AddresseeIconViewItem *aItem; 385 AddresseeIconViewItem *aItem;
386 386
387 if (uid.isNull()) 387 if (uid.isNull())
388 { 388 {
389 mIconView->selectAll(selected); 389 mIconView->selectAll(selected);
390 } 390 }
391 else 391 else
392 { 392 {
393 bool found = false; 393 bool found = false;
394 for (item = mIconView->firstItem(); item && !found; 394 for (item = mIconView->firstItem(); item && !found;
395 item = item->nextItem()) 395 item = item->nextItem())
396 { 396 {
397#ifndef KAB_EMBEDDED 397#ifndef KAB_EMBEDDED
398 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 398 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
399#else //KAB_EMBEDDED 399#else //KAB_EMBEDDED
400 aItem = (AddresseeIconViewItem*)(item); 400 aItem = (AddresseeIconViewItem*)(item);
401#endif //KAB_EMBEDDED 401#endif //KAB_EMBEDDED
402 402
403 if ((aItem) && (aItem->addressee().uid() == uid)) 403 if ((aItem) && (aItem->addressee().uid() == uid))
404 { 404 {
405 mIconView->setSelected(aItem, selected); 405 mIconView->setSelected(aItem, selected);
406 mIconView->ensureItemVisible( aItem ); 406 mIconView->ensureItemVisible( aItem );
407 found = true; 407 found = true;
408 } 408 }
409 } 409 }
410 } 410 }
411} 411}
412 412
413void KAddressBookIconView::addresseeExecuted(QIconViewItem *item) 413void KAddressBookIconView::addresseeExecuted(QIconViewItem *item)
414{ 414{
415#ifndef KAB_EMBEDDED 415#ifndef KAB_EMBEDDED
416 AddresseeIconViewItem *aItem = dynamic_cast<AddresseeIconViewItem*>(item); 416 AddresseeIconViewItem *aItem = dynamic_cast<AddresseeIconViewItem*>(item);
417#else //KAB_EMBEDDED 417#else //KAB_EMBEDDED
418 AddresseeIconViewItem *aItem = (AddresseeIconViewItem*)(item); 418 AddresseeIconViewItem *aItem = (AddresseeIconViewItem*)(item);
419#endif //KAB_EMBEDDED 419#endif //KAB_EMBEDDED
420 420
421 if (aItem) { 421 if (aItem) {
422 emit executed(aItem->addressee().uid()); 422 emit executed(aItem->addressee().uid());
423 } 423 }
424} 424}
425 425
426void KAddressBookIconView::addresseeSelected() 426void KAddressBookIconView::addresseeSelected()
427{ 427{
428 QIconViewItem *item; 428 QIconViewItem *item;
429 AddresseeIconViewItem *aItem; 429 AddresseeIconViewItem *aItem;
430 430
431 bool found = false; 431 bool found = false;
432 for (item = mIconView->firstItem(); item && !found; 432 for (item = mIconView->firstItem(); item && !found;
433 item = item->nextItem()) 433 item = item->nextItem())
434 { 434 {
435 if (item->isSelected()) 435 if (item->isSelected())
436 { 436 {
437#ifndef KAB_EMBEDDED 437#ifndef KAB_EMBEDDED
438 aItem = dynamic_cast<AddresseeIconViewItem*>(item); 438 aItem = dynamic_cast<AddresseeIconViewItem*>(item);
439#else //KAB_EMBEDDED 439#else //KAB_EMBEDDED
440 aItem = (AddresseeIconViewItem*)(item); 440 aItem = (AddresseeIconViewItem*)(item);
441#endif //KAB_EMBEDDED 441#endif //KAB_EMBEDDED
442 if (aItem) 442 if (aItem)
443 { 443 {
444 emit selected(aItem->addressee().uid()); 444 emit selected(aItem->addressee().uid());
445 found = true; 445 found = true;
446 } 446 }
447 } 447 }
448 } 448 }
449 449
450 if (!found) 450 if (!found)
451 emit selected(QString::null); 451 emit selected(QString::null);
452} 452}
453 453
454#ifndef KAB_EMBEDDED 454#ifndef KAB_EMBEDDED
455#include "kaddressbookiconview.moc" 455#include "kaddressbookiconview.moc"
456#endif //KAB_EMBEDDED 456#endif //KAB_EMBEDDED
diff --git a/kaddressbook/views/kaddressbooktableview.cpp b/kaddressbook/views/kaddressbooktableview.cpp
index 89053c2..61703ee 100644
--- a/kaddressbook/views/kaddressbooktableview.cpp
+++ b/kaddressbook/views/kaddressbooktableview.cpp
@@ -1,475 +1,471 @@
1// $Id$ 1// $Id$
2 2
3#include <qvbox.h> 3#include <qvbox.h>
4#include <qlistbox.h> 4#include <qlistbox.h>
5#include <qwidget.h> 5#include <qwidget.h>
6#include <qfile.h> 6#include <qfile.h>
7#include <qimage.h> 7#include <qimage.h>
8#include <qcombobox.h> 8#include <qcombobox.h>
9#include <qapplication.h> 9#include <qapplication.h>
10#include <qdragobject.h> 10#include <qdragobject.h>
11#include <qevent.h> 11#include <qevent.h>
12#include <qurl.h> 12#include <qurl.h>
13#include <qpixmap.h> 13#include <qpixmap.h>
14 14
15#include <kabc/addressbook.h> 15#include <kabc/addressbook.h>
16#include <kapplication.h> 16#include <kapplication.h>
17#include <kconfig.h> 17#include <kconfig.h>
18#include <kcolorbutton.h> 18#include <kcolorbutton.h>
19#include <kdebug.h> 19#include <kdebug.h>
20#include <kglobal.h> 20#include <kglobal.h>
21#include <kiconloader.h> 21#include <kiconloader.h>
22#include <klineedit.h> 22#include <klineedit.h>
23#include <klocale.h> 23#include <klocale.h>
24#include <kmessagebox.h> 24#include <kmessagebox.h>
25#include <kurl.h> 25#include <kurl.h>
26#include <kurlrequester.h> 26#include <kurlrequester.h>
27 27
28//US#include "configuretableviewdialog.h" 28//US#include "configuretableviewdialog.h"
29#include "contactlistview.h" 29#include "contactlistview.h"
30#include "kabprefs.h" 30#include "kabprefs.h"
31#include "undocmds.h" 31#include "undocmds.h"
32#include "viewmanager.h" 32#include "viewmanager.h"
33 33
34#include <qlayout.h> 34#include <qlayout.h>
35#include <qheader.h> 35#include <qheader.h>
36#include <qregexp.h> 36#include <qregexp.h>
37 37
38#include "kaddressbooktableview.h" 38#include "kaddressbooktableview.h"
39 39
40 40
41KAddressBookTableView::KAddressBookTableView( KABC::AddressBook *ab, 41KAddressBookTableView::KAddressBookTableView( KABC::AddressBook *ab,
42 QWidget *parent, const char *name ) 42 QWidget *parent, const char *name )
43 : KAddressBookView( ab, parent, name ) 43 : KAddressBookView( ab, parent, name )
44{ 44{
45 mainLayout = new QVBoxLayout( viewWidget(), 2 ); 45 mainLayout = new QVBoxLayout( viewWidget(), 2 );
46 46
47 // The list view will be created when the config is read. 47 // The list view will be created when the config is read.
48 mListView = 0; 48 mListView = 0;
49} 49}
50 50
51KAddressBookTableView::~KAddressBookTableView() 51KAddressBookTableView::~KAddressBookTableView()
52{ 52{
53} 53}
54void KAddressBookTableView::setFocusAV() 54void KAddressBookTableView::setFocusAV()
55{ 55{
56 if ( mListView ) 56 if ( mListView )
57 mListView->setFocus(); 57 mListView->setFocus();
58 58
59} 59}
60void KAddressBookTableView::scrollUP() 60void KAddressBookTableView::scrollUP()
61{ 61{
62 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Up, 0,0 ); 62 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Up, 0,0 );
63 QApplication::postEvent( mListView, ev ); 63 QApplication::postEvent( mListView, ev );
64} 64}
65void KAddressBookTableView::scrollDOWN() 65void KAddressBookTableView::scrollDOWN()
66{ 66{
67 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Down, 0,0 ); 67 QKeyEvent * ev = new QKeyEvent ( QEvent::KeyPress, Qt::Key_Down, 0,0 );
68 QApplication::postEvent( mListView, ev ); 68 QApplication::postEvent( mListView, ev );
69} 69}
70void KAddressBookTableView::reconstructListView() 70void KAddressBookTableView::reconstructListView()
71{ 71{
72 if (mListView) 72 if (mListView)
73 { 73 {
74 disconnect(mListView, SIGNAL(selectionChanged()), 74 disconnect(mListView, SIGNAL(selectionChanged()),
75 this, SLOT(addresseeSelected())); 75 this, SLOT(addresseeSelected()));
76 disconnect(mListView, SIGNAL(executed(QListViewItem*)), 76 disconnect(mListView, SIGNAL(executed(QListViewItem*)),
77 this, SLOT(addresseeExecuted(QListViewItem*))); 77 this, SLOT(addresseeExecuted(QListViewItem*)));
78 disconnect(mListView, SIGNAL(doubleClicked(QListViewItem*)), 78 disconnect(mListView, SIGNAL(doubleClicked(QListViewItem*)),
79 this, SLOT(addresseeExecuted(QListViewItem*))); 79 this, SLOT(addresseeExecuted(QListViewItem*)));
80 disconnect(mListView, SIGNAL(startAddresseeDrag()), this, 80 disconnect(mListView, SIGNAL(startAddresseeDrag()), this,
81 SIGNAL(startDrag())); 81 SIGNAL(startDrag()));
82 disconnect(mListView, SIGNAL(returnPressed(QListViewItem*)), 82 disconnect(mListView, SIGNAL(returnPressed(QListViewItem*)),
83 this, SLOT(addresseeExecuted(QListViewItem*))); 83 this, SLOT(addresseeExecuted(QListViewItem*)));
84 84
85 disconnect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this, 85 disconnect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this,
86 SIGNAL(dropped(QDropEvent*))); 86 SIGNAL(dropped(QDropEvent*)));
87 delete mListView; 87 delete mListView;
88 } 88 }
89 89
90 mListView = new ContactListView( this, addressBook(), viewWidget() ); 90 mListView = new ContactListView( this, addressBook(), viewWidget() );
91 91
92 //US set singleClick manually, because it is no global configparameter in embedded space 92 //US set singleClick manually, because it is no global configparameter in embedded space
93 mListView->setSingleClick(KABPrefs::instance()->mHonorSingleClick); 93 mListView->setSingleClick(KABPrefs::instance()->mHonorSingleClick);
94 94
95 // Add the columns 95 // Add the columns
96 KABC::Field::List fieldList = fields(); 96 KABC::Field::List fieldList = fields();
97 KABC::Field::List::ConstIterator it; 97 KABC::Field::List::ConstIterator it;
98 98
99 int c = 0; 99 int c = 0;
100 for( it = fieldList.begin(); it != fieldList.end(); ++it ) { 100 for( it = fieldList.begin(); it != fieldList.end(); ++it ) {
101 mListView->addColumn( (*it)->label() ); 101 mListView->addColumn( (*it)->label() );
102 mListView->setColumnWidthMode(c++, QListView::Manual); 102 mListView->setColumnWidthMode(c++, QListView::Manual);
103//US 103//US
104 // qDebug("KAddressBookTableView::reconstructListView: field %s", (*it)->label().latin1()); 104 // qDebug("KAddressBookTableView::reconstructListView: field %s", (*it)->label().latin1());
105 } 105 }
106 106
107 connect(mListView, SIGNAL(selectionChanged()), 107 connect(mListView, SIGNAL(selectionChanged()),
108 this, SLOT(addresseeSelected())); 108 this, SLOT(addresseeSelected()));
109 connect(mListView, SIGNAL(startAddresseeDrag()), this, 109 connect(mListView, SIGNAL(startAddresseeDrag()), this,
110 SIGNAL(startDrag())); 110 SIGNAL(startDrag()));
111 connect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this, 111 connect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this,
112 SIGNAL(dropped(QDropEvent*))); 112 SIGNAL(dropped(QDropEvent*)));
113 113
114 if (KABPrefs::instance()->mHonorSingleClick) { 114 if (KABPrefs::instance()->mHonorSingleClick) {
115 // qDebug("KAddressBookTableView::reconstructListView single"); 115 // qDebug("KAddressBookTableView::reconstructListView single");
116 connect(mListView, SIGNAL(executed(QListViewItem*)), 116 connect(mListView, SIGNAL(executed(QListViewItem*)),
117 this, SLOT(addresseeExecuted(QListViewItem*))); 117 this, SLOT(addresseeExecuted(QListViewItem*)));
118 } else { 118 } else {
119 // qDebug("KAddressBookTableView::reconstructListView double"); 119 // qDebug("KAddressBookTableView::reconstructListView double");
120 connect(mListView, SIGNAL(doubleClicked(QListViewItem*)), 120 connect(mListView, SIGNAL(doubleClicked(QListViewItem*)),
121 this, SLOT(addresseeExecuted(QListViewItem*))); 121 this, SLOT(addresseeExecuted(QListViewItem*)));
122 } 122 }
123 connect(mListView, SIGNAL(returnPressed(QListViewItem*)), 123 connect(mListView, SIGNAL(returnPressed(QListViewItem*)),
124 this, SLOT(addresseeExecuted(QListViewItem*))); 124 this, SLOT(addresseeExecuted(QListViewItem*)));
125 connect(mListView, SIGNAL(signalDelete()), 125 connect(mListView, SIGNAL(signalDelete()),
126 this, SLOT(addresseeDeleted())); 126 this, SLOT(addresseeDeleted()));
127 127
128//US performceimprovement. Refresh is done from the outside 128//US performceimprovement. Refresh is done from the outside
129//US refresh(); 129//US refresh();
130 130
131 mListView->setSorting( 0, true ); 131 mListView->setSorting( 0, true );
132 mainLayout->addWidget( mListView ); 132 mainLayout->addWidget( mListView );
133 mainLayout->activate(); 133 mainLayout->activate();
134 mListView->show(); 134 mListView->show();
135} 135}
136 136
137void KAddressBookTableView::doSearch( const QString& s, KABC::Field *field ) 137void KAddressBookTableView::doSearch( const QString& s, KABC::Field *field )
138{ 138{
139 mListView->clear(); 139 mListView->clear();
140 if ( s.isEmpty() || s == "*" ) { 140 if ( s.isEmpty() || s == "*" ) {
141 refresh(); 141 refresh();
142 return; 142 return;
143 } 143 }
144 QString pattern = s.lower()+"*"; 144 QString pattern = s.lower()+"*";
145 QRegExp re; 145 QRegExp re;
146 re.setWildcard(true); // most people understand these better. 146 re.setWildcard(true); // most people understand these better.
147 re.setCaseSensitive(false); 147 re.setCaseSensitive(false);
148 re.setPattern( pattern ); 148 re.setPattern( pattern );
149 if (!re.isValid()) 149 if (!re.isValid())
150 return; 150 return;
151 KABC::Addressee::List addresseeList = addressees(); 151 KABC::Addressee::List addresseeList = addressees();
152 KABC::Addressee::List::Iterator it; 152 KABC::Addressee::List::Iterator it;
153 if ( field ) { 153 if ( field ) {
154 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 154 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
155 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 155 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
156 continue; 156 continue;
157#if QT_VERSION >= 300 157#if QT_VERSION >= 300
158 if (re.search(field->value( *it ).lower()) != -1) 158 if (re.search(field->value( *it ).lower()) != -1)
159#else 159#else
160 if (re.match(field->value( *it ).lower()) != -1) 160 if (re.match(field->value( *it ).lower()) != -1)
161#endif 161#endif
162 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields()); 162 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields());
163 163
164 } 164 }
165 } else { 165 } else {
166 KABC::Field::List fieldList = fields(); 166 KABC::Field::List fieldList = allFields();
167 KABC::Field::List::ConstIterator fieldIt; 167 KABC::Field::List::ConstIterator fieldIt;
168 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 168 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
169 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 169 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
170 continue; 170 continue;
171 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) { 171 for ( fieldIt = fieldList.begin(); fieldIt != fieldList.end(); ++fieldIt ) {
172#if QT_VERSION >= 300 172#if QT_VERSION >= 300
173 if (re.search((*fieldIt)->value( *it ).lower()) != -1) 173 if (re.search((*fieldIt)->value( *it ).lower()) != -1)
174#else 174#else
175 if (re.match((*fieldIt)->value( *it ).lower()) != -1) 175 if (re.match((*fieldIt)->value( *it ).lower()) != -1)
176#endif 176#endif
177 { 177 {
178 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields()); 178 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields());
179 break; 179 break;
180 } 180 }
181 } 181 }
182 } 182 }
183 } 183 }
184 // Sometimes the background pixmap gets messed up when we add lots 184 // Sometimes the background pixmap gets messed up when we add lots
185 // of items. 185 // of items.
186 mListView->repaint(); 186 mListView->repaint();
187 if ( mListView->firstChild() ) { 187 if ( mListView->firstChild() ) {
188 mListView->setCurrentItem ( mListView->firstChild() ); 188 mListView->setCurrentItem ( mListView->firstChild() );
189 mListView->setSelected ( mListView->firstChild(), true ); 189 mListView->setSelected ( mListView->firstChild(), true );
190 } 190 }
191 else 191 else
192 emit selected(QString::null); 192 emit selected(QString::null);
193 193
194} 194}
195void KAddressBookTableView::writeConfig(KConfig *config) 195void KAddressBookTableView::writeConfig(KConfig *config)
196{ 196{
197 KAddressBookView::writeConfig(config); 197 KAddressBookView::writeConfig(config);
198 198
199 mListView->saveLayout(config, config->group()); 199 mListView->saveLayout(config, config->group());
200} 200}
201 201
202void KAddressBookTableView::readConfig(KConfig *config) 202void KAddressBookTableView::readConfig(KConfig *config)
203{ 203{
204 KAddressBookView::readConfig( config ); 204 KAddressBookView::readConfig( config );
205 // The config could have changed the fields, so we need to reconstruct 205 // The config could have changed the fields, so we need to reconstruct
206 // the listview. 206 // the listview.
207 reconstructListView(); 207 reconstructListView();
208 208
209 // costum colors? 209 // costum colors?
210 if ( config->readBoolEntry( "EnableCustomColors", false ) ) 210 if ( config->readBoolEntry( "EnableCustomColors", false ) )
211 { 211 {
212 QPalette p( mListView->palette() ); 212 QPalette p( mListView->palette() );
213 QColor c = p.color(QPalette::Normal, QColorGroup::Base ); 213 QColor c = p.color(QPalette::Normal, QColorGroup::Base );
214 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) ); 214 p.setColor( QPalette::Normal, QColorGroup::Base, config->readColorEntry( "BackgroundColor", &c ) );
215 c = p.color(QPalette::Normal, QColorGroup::Text ); 215 c = p.color(QPalette::Normal, QColorGroup::Text );
216 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) ); 216 p.setColor( QPalette::Normal, QColorGroup::Text, config->readColorEntry( "TextColor", &c ) );
217 c = p.color(QPalette::Normal, QColorGroup::Button ); 217 c = p.color(QPalette::Normal, QColorGroup::Button );
218 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) ); 218 p.setColor( QPalette::Normal, QColorGroup::Button, config->readColorEntry( "HeaderColor", &c ) );
219 c = p.color(QPalette::Normal, QColorGroup::ButtonText ); 219 c = p.color(QPalette::Normal, QColorGroup::ButtonText );
220 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) ); 220 p.setColor( QPalette::Normal, QColorGroup::ButtonText, config->readColorEntry( "HeaderTextColor", &c ) );
221 c = p.color(QPalette::Normal, QColorGroup::Highlight ); 221 c = p.color(QPalette::Normal, QColorGroup::Highlight );
222 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) ); 222 p.setColor( QPalette::Normal, QColorGroup::Highlight, config->readColorEntry( "HighlightColor", &c ) );
223 c = p.color(QPalette::Normal, QColorGroup::HighlightedText ); 223 c = p.color(QPalette::Normal, QColorGroup::HighlightedText );
224 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) ); 224 p.setColor( QPalette::Normal, QColorGroup::HighlightedText, config->readColorEntry( "HighlightedTextColor", &c ) );
225#ifndef KAB_EMBEDDED 225#ifndef KAB_EMBEDDED
226 c = KGlobalSettings::alternateBackgroundColor(); 226 c = KGlobalSettings::alternateBackgroundColor();
227#else //KAB_EMBEDDED 227#else //KAB_EMBEDDED
228 c = QColor(240, 240, 240); 228 c = QColor(240, 240, 240);
229#endif //KAB_EMBEDDED 229#endif //KAB_EMBEDDED
230 c = config->readColorEntry ("AlternatingBackgroundColor", &c); 230 c = config->readColorEntry ("AlternatingBackgroundColor", &c);
231 mListView->setAlternateColor(c); 231 mListView->setAlternateColor(c);
232 232
233 233
234 //US mListView->viewport()->setPalette( p ); 234 //US mListView->viewport()->setPalette( p );
235 mListView->setPalette( p ); 235 mListView->setPalette( p );
236 } 236 }
237 else 237 else
238 { 238 {
239 // needed if turned off during a session. 239 // needed if turned off during a session.
240 //US mListView->viewport()->setPalette( mListView->palette() ); 240 //US mListView->viewport()->setPalette( mListView->palette() );
241 mListView->setPalette( mListView->palette() ); 241 mListView->setPalette( mListView->palette() );
242 } 242 }
243 243
244 //custom fonts? 244 //custom fonts?
245 QFont f( font() ); 245 QFont f( font() );
246 if ( config->readBoolEntry( "EnableCustomFonts", false ) ) 246 if ( config->readBoolEntry( "EnableCustomFonts", false ) )
247 { 247 {
248 mListView->setFont( config->readFontEntry( "TextFont", &f) ); 248 mListView->setFont( config->readFontEntry( "TextFont", &f) );
249 f.setBold( true ); 249 f.setBold( true );
250 //US mListView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) ); 250 //US mListView->setHeaderFont( config->readFontEntry( "HeaderFont", &f ) );
251 mListView->header()->setFont( config->readFontEntry( "HeaderFont", &f ) ); 251 mListView->header()->setFont( config->readFontEntry( "HeaderFont", &f ) );
252 } 252 }
253 else 253 else
254 { 254 {
255 mListView->setFont( f ); 255 mListView->setFont( f );
256 f.setBold( true ); 256 f.setBold( true );
257 //US mListView->setHeaderFont( f ); 257 //US mListView->setHeaderFont( f );
258 mListView->header()->setFont( f ); 258 mListView->header()->setFont( f );
259 } 259 }
260 260
261
262
263
264
265 // Set the list view options 261 // Set the list view options
266 mListView->setAlternateBackgroundEnabled(config->readBoolEntry("ABackground", 262 mListView->setAlternateBackgroundEnabled(config->readBoolEntry("ABackground",
267 true)); 263 true));
268 mListView->setSingleLineEnabled(config->readBoolEntry("SingleLine", false)); 264 mListView->setSingleLineEnabled(config->readBoolEntry("SingleLine", false));
269 mListView->setToolTipsEnabled(config->readBoolEntry("ToolTips", true)); 265 mListView->setToolTipsEnabled(config->readBoolEntry("ToolTips", true));
270 266
271 if (config->readBoolEntry("Background", false)) 267 if (config->readBoolEntry("Background", false))
272 mListView->setBackgroundPixmap(config->readEntry("BackgroundName")); 268 mListView->setBackgroundPixmap(config->readEntry("BackgroundName"));
273 269
274 // Restore the layout of the listview 270 // Restore the layout of the listview
275 mListView->restoreLayout(config, config->group()); 271 mListView->restoreLayout(config, config->group());
276} 272}
277 273
278void KAddressBookTableView::refresh(QString uid) 274void KAddressBookTableView::refresh(QString uid)
279{ 275{
280 // For now just repopulate. In reality this method should 276 // For now just repopulate. In reality this method should
281 // check the value of uid, and if valid iterate through 277 // check the value of uid, and if valid iterate through
282 // the listview to find the entry, then tell it to refresh. 278 // the listview to find the entry, then tell it to refresh.
283 279
284 if (uid.isNull()) { 280 if (uid.isNull()) {
285 // Clear the list view 281 // Clear the list view
286 QString currentUID, nextUID; 282 QString currentUID, nextUID;
287#ifndef KAB_EMBEDDED 283#ifndef KAB_EMBEDDED
288 ContactListViewItem *currentItem = dynamic_cast<ContactListViewItem*>( mListView->currentItem() ); 284 ContactListViewItem *currentItem = dynamic_cast<ContactListViewItem*>( mListView->currentItem() );
289#else //KAB_EMBEDDED 285#else //KAB_EMBEDDED
290 ContactListViewItem *currentItem = (ContactListViewItem*)( mListView->currentItem() ); 286 ContactListViewItem *currentItem = (ContactListViewItem*)( mListView->currentItem() );
291#endif //KAB_EMBEDDED 287#endif //KAB_EMBEDDED
292 288
293 if ( currentItem ) { 289 if ( currentItem ) {
294#ifndef KAB_EMBEDDED 290#ifndef KAB_EMBEDDED
295 ContactListViewItem *nextItem = dynamic_cast<ContactListViewItem*>( currentItem->itemBelow() ); 291 ContactListViewItem *nextItem = dynamic_cast<ContactListViewItem*>( currentItem->itemBelow() );
296#else //KAB_EMBEDDED 292#else //KAB_EMBEDDED
297 ContactListViewItem *nextItem = (ContactListViewItem*)( currentItem->itemBelow() ); 293 ContactListViewItem *nextItem = (ContactListViewItem*)( currentItem->itemBelow() );
298#endif //KAB_EMBEDDED 294#endif //KAB_EMBEDDED
299 if ( nextItem ) 295 if ( nextItem )
300 nextUID = nextItem->addressee().uid(); 296 nextUID = nextItem->addressee().uid();
301 currentUID = currentItem->addressee().uid(); 297 currentUID = currentItem->addressee().uid();
302 } 298 }
303 299
304 mListView->clear(); 300 mListView->clear();
305 301
306 currentItem = 0; 302 currentItem = 0;
307 KABC::Addressee::List addresseeList = addressees(); 303 KABC::Addressee::List addresseeList = addressees();
308 KABC::Addressee::List::Iterator it; 304 KABC::Addressee::List::Iterator it;
309 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { 305 for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) {
310 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") ) 306 if ( (*it).uid().left(2) == "la" && (*it).uid().left(19) == QString("last-syncAddressee-") )
311 continue; 307 continue;
312 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields()); 308 ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields());
313 if ( (*it).uid() == currentUID ) 309 if ( (*it).uid() == currentUID )
314 currentItem = item; 310 currentItem = item;
315 else if ( (*it).uid() == nextUID && !currentItem ) 311 else if ( (*it).uid() == nextUID && !currentItem )
316 currentItem = item; 312 currentItem = item;
317 } 313 }
318 314
319 // Sometimes the background pixmap gets messed up when we add lots 315 // Sometimes the background pixmap gets messed up when we add lots
320 // of items. 316 // of items.
321 mListView->repaint(); 317 mListView->repaint();
322 318
323 if ( currentItem ) { 319 if ( currentItem ) {
324 mListView->setCurrentItem( currentItem ); 320 mListView->setCurrentItem( currentItem );
325 mListView->ensureItemVisible( currentItem ); 321 mListView->ensureItemVisible( currentItem );
326 } 322 }
327 } else { 323 } else {
328 // Only need to update on entry. Iterate through and try to find it 324 // Only need to update on entry. Iterate through and try to find it
329 ContactListViewItem *ceItem; 325 ContactListViewItem *ceItem;
330 QListViewItemIterator it( mListView ); 326 QListViewItemIterator it( mListView );
331 while ( it.current() ) { 327 while ( it.current() ) {
332#ifndef KAB_EMBEDDED 328#ifndef KAB_EMBEDDED
333 ceItem = dynamic_cast<ContactListViewItem*>( it.current() ); 329 ceItem = dynamic_cast<ContactListViewItem*>( it.current() );
334#else //KAB_EMBEDDED 330#else //KAB_EMBEDDED
335 ceItem = (ContactListViewItem*)( it.current() ); 331 ceItem = (ContactListViewItem*)( it.current() );
336#endif //KAB_EMBEDDED 332#endif //KAB_EMBEDDED
337 333
338 if ( ceItem && ceItem->addressee().uid() == uid ) { 334 if ( ceItem && ceItem->addressee().uid() == uid ) {
339 ceItem->refresh(); 335 ceItem->refresh();
340 return; 336 return;
341 } 337 }
342 ++it; 338 ++it;
343 } 339 }
344 340
345 refresh( QString::null ); 341 refresh( QString::null );
346 } 342 }
347} 343}
348 344
349QStringList KAddressBookTableView::selectedUids() 345QStringList KAddressBookTableView::selectedUids()
350{ 346{
351 QStringList uidList; 347 QStringList uidList;
352 QListViewItem *item; 348 QListViewItem *item;
353 ContactListViewItem *ceItem; 349 ContactListViewItem *ceItem;
354 350
355 for(item = mListView->firstChild(); item; item = item->itemBelow()) 351 for(item = mListView->firstChild(); item; item = item->itemBelow())
356 { 352 {
357 if (mListView->isSelected( item )) 353 if (mListView->isSelected( item ))
358 { 354 {
359#ifndef KAB_EMBEDDED 355#ifndef KAB_EMBEDDED
360 ceItem = dynamic_cast<ContactListViewItem*>(item); 356 ceItem = dynamic_cast<ContactListViewItem*>(item);
361#else //KAB_EMBEDDED 357#else //KAB_EMBEDDED
362 ceItem = (ContactListViewItem*)(item); 358 ceItem = (ContactListViewItem*)(item);
363#endif //KAB_EMBEDDED 359#endif //KAB_EMBEDDED
364 360
365 if (ceItem != 0L) 361 if (ceItem != 0L)
366 uidList << ceItem->addressee().uid(); 362 uidList << ceItem->addressee().uid();
367 } 363 }
368 } 364 }
369 if ( uidList.count() == 0 ) 365 if ( uidList.count() == 0 )
370 if ( mListView->currentItem() ) { 366 if ( mListView->currentItem() ) {
371 ceItem = (ContactListViewItem*)(mListView->currentItem()) ; 367 ceItem = (ContactListViewItem*)(mListView->currentItem()) ;
372 uidList << ceItem->addressee().uid(); 368 uidList << ceItem->addressee().uid();
373 } 369 }
374 370
375 return uidList; 371 return uidList;
376} 372}
377 373
378void KAddressBookTableView::setSelected(QString uid, bool selected) 374void KAddressBookTableView::setSelected(QString uid, bool selected)
379{ 375{
380 QListViewItem *item; 376 QListViewItem *item;
381 ContactListViewItem *ceItem; 377 ContactListViewItem *ceItem;
382 378
383 if (uid.isNull()) 379 if (uid.isNull())
384 { 380 {
385 mListView->selectAll(selected); 381 mListView->selectAll(selected);
386 } 382 }
387 else 383 else
388 { 384 {
389 for(item = mListView->firstChild(); item; item = item->itemBelow()) 385 for(item = mListView->firstChild(); item; item = item->itemBelow())
390 { 386 {
391#ifndef KAB_EMBEDDED 387#ifndef KAB_EMBEDDED
392 ceItem = dynamic_cast<ContactListViewItem*>(item); 388 ceItem = dynamic_cast<ContactListViewItem*>(item);
393#else //KAB_EMBEDDED 389#else //KAB_EMBEDDED
394 ceItem = (ContactListViewItem*)(item); 390 ceItem = (ContactListViewItem*)(item);
395#endif //KAB_EMBEDDED 391#endif //KAB_EMBEDDED
396 392
397 393
398 if ((ceItem != 0L) && (ceItem->addressee().uid() == uid)) 394 if ((ceItem != 0L) && (ceItem->addressee().uid() == uid))
399 { 395 {
400 mListView->setSelected(item, selected); 396 mListView->setSelected(item, selected);
401 397
402 if (selected) 398 if (selected)
403 mListView->ensureItemVisible(item); 399 mListView->ensureItemVisible(item);
404 } 400 }
405 } 401 }
406 } 402 }
407} 403}
408 404
409void KAddressBookTableView::addresseeSelected() 405void KAddressBookTableView::addresseeSelected()
410{ 406{
411 // We need to try to find the first selected item. This might not be the 407 // We need to try to find the first selected item. This might not be the
412 // last selected item, but when QListView is in multiselection mode, 408 // last selected item, but when QListView is in multiselection mode,
413 // there is no way to figure out which one was 409 // there is no way to figure out which one was
414 // selected last. 410 // selected last.
415 QListViewItem *item; 411 QListViewItem *item;
416 bool found =false; 412 bool found =false;
417 for (item = mListView->firstChild(); item && !found; 413 for (item = mListView->firstChild(); item && !found;
418 item = item->nextSibling()) 414 item = item->nextSibling())
419 { 415 {
420 if (item->isSelected()) 416 if (item->isSelected())
421 { 417 {
422 found = true; 418 found = true;
423#ifndef KAB_EMBEDDED 419#ifndef KAB_EMBEDDED
424 ContactListViewItem *ceItem 420 ContactListViewItem *ceItem
425 = dynamic_cast<ContactListViewItem*>(item); 421 = dynamic_cast<ContactListViewItem*>(item);
426#else //KAB_EMBEDDED 422#else //KAB_EMBEDDED
427 ContactListViewItem *ceItem 423 ContactListViewItem *ceItem
428 = (ContactListViewItem*)(item); 424 = (ContactListViewItem*)(item);
429#endif //KAB_EMBEDDED 425#endif //KAB_EMBEDDED
430 426
431 if ( ceItem ) emit selected(ceItem->addressee().uid()); 427 if ( ceItem ) emit selected(ceItem->addressee().uid());
432 } 428 }
433 } 429 }
434 430
435 if (!found) 431 if (!found)
436 emit selected(QString::null); 432 emit selected(QString::null);
437} 433}
438 434
439void KAddressBookTableView::addresseeExecuted(QListViewItem *item) 435void KAddressBookTableView::addresseeExecuted(QListViewItem *item)
440{ 436{
441 if (item) 437 if (item)
442 { 438 {
443#ifndef KAB_EMBEDDED 439#ifndef KAB_EMBEDDED
444 ContactListViewItem *ceItem 440 ContactListViewItem *ceItem
445 = dynamic_cast<ContactListViewItem*>(item); 441 = dynamic_cast<ContactListViewItem*>(item);
446#else //KAB_EMBEDDED 442#else //KAB_EMBEDDED
447 ContactListViewItem *ceItem 443 ContactListViewItem *ceItem
448 = (ContactListViewItem*)(item); 444 = (ContactListViewItem*)(item);
449#endif //KAB_EMBEDDED 445#endif //KAB_EMBEDDED
450 446
451 if (ceItem) 447 if (ceItem)
452 { 448 {
453 emit executed(ceItem->addressee().uid()); 449 emit executed(ceItem->addressee().uid());
454 } 450 }
455 } 451 }
456 else 452 else
457 { 453 {
458 emit executed(QString::null); 454 emit executed(QString::null);
459 } 455 }
460} 456}
461 457
462void KAddressBookTableView::addresseeDeleted() 458void KAddressBookTableView::addresseeDeleted()
463{ 459{
464 460
465 emit deleteRequest(); 461 emit deleteRequest();
466 462
467} 463}
468 464
469 465
470 466
471 467
472 468
473#ifndef KAB_EMBEDDED 469#ifndef KAB_EMBEDDED
474#include "kaddressbooktableview.moc" 470#include "kaddressbooktableview.moc"
475#endif //KAB_EMBEDDED 471#endif //KAB_EMBEDDED