-rw-r--r-- | bin/kdepim/WhatsNew.txt | 3 | ||||
-rw-r--r-- | kaddressbook/kabcore.cpp | 1 | ||||
-rw-r--r-- | libkdepim/externalapphandler.cpp | 5 |
3 files changed, 8 insertions, 1 deletions
diff --git a/bin/kdepim/WhatsNew.txt b/bin/kdepim/WhatsNew.txt index b5285bf..03aec7b 100644 --- a/bin/kdepim/WhatsNew.txt +++ b/bin/kdepim/WhatsNew.txt | |||
@@ -1,205 +1,208 @@ | |||
1 | Info about the changes in new versions of KDE-Pim/Pi | 1 | Info about the changes in new versions of KDE-Pim/Pi |
2 | 2 | ||
3 | ********** VERSION 2.0.22 ************ | 3 | ********** VERSION 2.0.22 ************ |
4 | 4 | ||
5 | KO/Pi: | 5 | KO/Pi: |
6 | Fix for creating events/todos via the abgenda context menu. | 6 | Fix for creating events/todos via the abgenda context menu. |
7 | Added option to split toolbar to 3 toolbars. | 7 | Added option to split toolbar to 3 toolbars. |
8 | Added option to show one small filter-view-toolbar. | 8 | Added option to show one small filter-view-toolbar. |
9 | Added a print option to the desktop version: | 9 | Added a print option to the desktop version: |
10 | Now you can print out the view of the "Event Viewer". | 10 | Now you can print out the view of the "Event Viewer". |
11 | That means you can print all data of one particular event/todo. | 11 | That means you can print all data of one particular event/todo. |
12 | Added scaling options to printout of Event Viewer and What'sNext View. | 12 | Added scaling options to printout of Event Viewer and What'sNext View. |
13 | Fixed some problems in the month view in "week start sunday" mode. | 13 | Fixed some problems in the month view in "week start sunday" mode. |
14 | KA/Pi: | ||
15 | Added two more config options. | ||
16 | Fixed resizing problem of address request dialog when orientation was switched. | ||
14 | 17 | ||
15 | ********** VERSION 2.0.21 ************ | 18 | ********** VERSION 2.0.21 ************ |
16 | 19 | ||
17 | Fixed another SMTP problem in OM/Pi. | 20 | Fixed another SMTP problem in OM/Pi. |
18 | Some small changed in the new datenavigator in KO/Pi. | 21 | Some small changed in the new datenavigator in KO/Pi. |
19 | Changed default setting for new filter in KA/Pi to "exclude categories". | 22 | Changed default setting for new filter in KA/Pi to "exclude categories". |
20 | Changed the default font size for 640x480 display . | 23 | Changed the default font size for 640x480 display . |
21 | Changed popup menu behaviour in agenda and list view. | 24 | Changed popup menu behaviour in agenda and list view. |
22 | Fixed some layout problems of the date label size in the month view. | 25 | Fixed some layout problems of the date label size in the month view. |
23 | Made month view update faster. | 26 | Made month view update faster. |
24 | Made first datenavigator repainting faster. | 27 | Made first datenavigator repainting faster. |
25 | Changed the title of the event/todo edit dialogs. | 28 | Changed the title of the event/todo edit dialogs. |
26 | Timelabels in agenga changed from 22:00 to 22 oo. ( the oo higher, of course). | 29 | Timelabels in agenga changed from 22:00 to 22 oo. ( the oo higher, of course). |
27 | Many small usebility fixes in KO/Pi. | 30 | Many small usebility fixes in KO/Pi. |
28 | Pressing the "Calendar" button on the Z switches now to the next view in KO/Pi. | 31 | Pressing the "Calendar" button on the Z switches now to the next view in KO/Pi. |
29 | The set of possible "next views" are the views you have toolbar buttons for. | 32 | The set of possible "next views" are the views you have toolbar buttons for. |
30 | 33 | ||
31 | Made alarm sound working on Linux. | 34 | Made alarm sound working on Linux. |
32 | 35 | ||
33 | KO/Pi alarm applet changed: | 36 | KO/Pi alarm applet changed: |
34 | Made buttons in alarm dialog much bigger. | 37 | Made buttons in alarm dialog much bigger. |
35 | Made setting of timer more user friendly by showing the actual timer fire time and making the buttons in the timer settings much bigger. | 38 | Made setting of timer more user friendly by showing the actual timer fire time and making the buttons in the timer settings much bigger. |
36 | The goal was it to make it possible to use a finger tip ( and not the stylus ) on the touchscreen to adjust the settings. | 39 | The goal was it to make it possible to use a finger tip ( and not the stylus ) on the touchscreen to adjust the settings. |
37 | 40 | ||
38 | And because this version is realeased at Easter, I added an Easter-egg: | 41 | And because this version is realeased at Easter, I added an Easter-egg: |
39 | With a new undocumented command you can get a message box about the next alarm. | 42 | With a new undocumented command you can get a message box about the next alarm. |
40 | Good luck to find it! | 43 | Good luck to find it! |
41 | 44 | ||
42 | 45 | ||
43 | 46 | ||
44 | ********** VERSION 2.0.20 ************ | 47 | ********** VERSION 2.0.20 ************ |
45 | 48 | ||
46 | Two small fixes in OM/Pi. | 49 | Two small fixes in OM/Pi. |
47 | 50 | ||
48 | Better resizing of the new datenavigator in KO/Pi. | 51 | Better resizing of the new datenavigator in KO/Pi. |
49 | 52 | ||
50 | ********** VERSION 2.0.19 ************ | 53 | ********** VERSION 2.0.19 ************ |
51 | KO/Pi: | 54 | KO/Pi: |
52 | Enhancements and bugfixes in the new datenavigator. | 55 | Enhancements and bugfixes in the new datenavigator. |
53 | Bugfix in this changelog: | 56 | Bugfix in this changelog: |
54 | The datenavigator was changed in version 2.0.18, not the datepicker. | 57 | The datenavigator was changed in version 2.0.18, not the datepicker. |
55 | 58 | ||
56 | ********** VERSION 2.0.18 ************ | 59 | ********** VERSION 2.0.18 ************ |
57 | KO/Pi: | 60 | KO/Pi: |
58 | Fixed some minor problems. | 61 | Fixed some minor problems. |
59 | Cleaned up the KO/Pi config dialog. | 62 | Cleaned up the KO/Pi config dialog. |
60 | Fixed problem moving events in aganda view. | 63 | Fixed problem moving events in aganda view. |
61 | Made datepicker scaleable, i.e. if the datenavigator shows now a | 64 | Made datepicker scaleable, i.e. if the datenavigator shows now a |
62 | datenavigator matrix depending on its size. | 65 | datenavigator matrix depending on its size. |
63 | Birthdays are now displayed green in the datenavigator. | 66 | Birthdays are now displayed green in the datenavigator. |
64 | What'sThis Help in datenavigator shows all events of the day. | 67 | What'sThis Help in datenavigator shows all events of the day. |
65 | 68 | ||
66 | OM/Pi: | 69 | OM/Pi: |
67 | Updated the backend mail library to the latest version. | 70 | Updated the backend mail library to the latest version. |
68 | Please backup your mail before using this version. | 71 | Please backup your mail before using this version. |
69 | 72 | ||
70 | ********** VERSION 2.0.17 ************ | 73 | ********** VERSION 2.0.17 ************ |
71 | 74 | ||
72 | KO/Pi: | 75 | KO/Pi: |
73 | Tooltips in month view were not sorted. Fixed. | 76 | Tooltips in month view were not sorted. Fixed. |
74 | Daylabel in agenda view ( for display of one day ) was too short. Fixed. | 77 | Daylabel in agenda view ( for display of one day ) was too short. Fixed. |
75 | Conflict display dialog for syncing was not on top of other windows. Fixed. | 78 | Conflict display dialog for syncing was not on top of other windows. Fixed. |
76 | Fixed some minor problems. | 79 | Fixed some minor problems. |
77 | 80 | ||
78 | Fixed an endless loop when importing vcs file with RESOURCES entry. | 81 | Fixed an endless loop when importing vcs file with RESOURCES entry. |
79 | 82 | ||
80 | ********** VERSION 2.0.16 ************ | 83 | ********** VERSION 2.0.16 ************ |
81 | OM/Pi: | 84 | OM/Pi: |
82 | Fixed the SMTP account setting the option. | 85 | Fixed the SMTP account setting the option. |
83 | Fixed something in mail sending. | 86 | Fixed something in mail sending. |
84 | 87 | ||
85 | KO/Pi: | 88 | KO/Pi: |
86 | Added possibility to export selected events/todos as vcal file. | 89 | Added possibility to export selected events/todos as vcal file. |
87 | 90 | ||
88 | ********** VERSION 2.0.15 ************ | 91 | ********** VERSION 2.0.15 ************ |
89 | 92 | ||
90 | PwM/Pi: | 93 | PwM/Pi: |
91 | Added keyboard shorcuts for | 94 | Added keyboard shorcuts for |
92 | - toggling summary view (space bar) | 95 | - toggling summary view (space bar) |
93 | - delete item (delete + backspace key) | 96 | - delete item (delete + backspace key) |
94 | - add new item ( i + n key) | 97 | - add new item ( i + n key) |
95 | Fixed length of info in the title. | 98 | Fixed length of info in the title. |
96 | 99 | ||
97 | KO/Pi-KA/Pi: | 100 | KO/Pi-KA/Pi: |
98 | Changed "ME" menu bar entry to an icon. | 101 | Changed "ME" menu bar entry to an icon. |
99 | 102 | ||
100 | KO/Pi: | 103 | KO/Pi: |
101 | Fixed two minor bugs in displaying todos. | 104 | Fixed two minor bugs in displaying todos. |
102 | If in month view a cell is selected, the key shortcut "d" shows now that date. | 105 | If in month view a cell is selected, the key shortcut "d" shows now that date. |
103 | Added complete info for a todo in month view as an icon left of the text. | 106 | Added complete info for a todo in month view as an icon left of the text. |
104 | Fixed problems of displaying data when "<" or ">" are used in summary/location/description. | 107 | Fixed problems of displaying data when "<" or ">" are used in summary/location/description. |
105 | Fixed problem of search dialog size when switching displays. | 108 | Fixed problem of search dialog size when switching displays. |
106 | Cancel key now closes date picker. | 109 | Cancel key now closes date picker. |
107 | Rearranged KO/Pi file menu structure. | 110 | Rearranged KO/Pi file menu structure. |
108 | 111 | ||
109 | OM/Pi: | 112 | OM/Pi: |
110 | Added to the SMTP account setting the option | 113 | Added to the SMTP account setting the option |
111 | "No secure connection". | 114 | "No secure connection". |
112 | You have to configure your SMTP accounts again, sorry. | 115 | You have to configure your SMTP accounts again, sorry. |
113 | 116 | ||
114 | KA/Pi: | 117 | KA/Pi: |
115 | Added support for importing quoted-printable. | 118 | Added support for importing quoted-printable. |
116 | Support was added by Peter P.. Thanks, Peter! | 119 | Support was added by Peter P.. Thanks, Peter! |
117 | 120 | ||
118 | 121 | ||
119 | ********** VERSION 2.0.14 ************ | 122 | ********** VERSION 2.0.14 ************ |
120 | 123 | ||
121 | Made Passwordmanager PwM/Pi more userfriendly: | 124 | Made Passwordmanager PwM/Pi more userfriendly: |
122 | Rearranged some toolbar icons, optimized setting of focus, fixed layout problems and more. | 125 | Rearranged some toolbar icons, optimized setting of focus, fixed layout problems and more. |
123 | Fixed bug in KO/Pi todo printing. | 126 | Fixed bug in KO/Pi todo printing. |
124 | Made Qtopia calendar import possible on desktop . | 127 | Made Qtopia calendar import possible on desktop . |
125 | 128 | ||
126 | ********** VERSION 2.0.13 ************ | 129 | ********** VERSION 2.0.13 ************ |
127 | 130 | ||
128 | Fixed a problem in the addressee select dialog and made it more user friendly by adding a minimize splitter. | 131 | Fixed a problem in the addressee select dialog and made it more user friendly by adding a minimize splitter. |
129 | 132 | ||
130 | In the search dialog you can switch now the focus from search line edit to the list view by pressing key "arrow down". | 133 | In the search dialog you can switch now the focus from search line edit to the list view by pressing key "arrow down". |
131 | 134 | ||
132 | OM/Pi: | 135 | OM/Pi: |
133 | Fixed a refresh problem of outgoing/sent/sendfailed folders after sending mails. | 136 | Fixed a refresh problem of outgoing/sent/sendfailed folders after sending mails. |
134 | Added missing German translation. | 137 | Added missing German translation. |
135 | Added warning if path is specified in local folder settings of account config. | 138 | Added warning if path is specified in local folder settings of account config. |
136 | 139 | ||
137 | ********** VERSION 2.0.12 ************ | 140 | ********** VERSION 2.0.12 ************ |
138 | 141 | ||
139 | KO/Pi: | 142 | KO/Pi: |
140 | Fixed a bug in todo start/due date handling for non recurring todos with a start and due date. | 143 | Fixed a bug in todo start/due date handling for non recurring todos with a start and due date. |
141 | Fixed some layout problems in the KO/Pi agenda view when there were many conflicting itmes. | 144 | Fixed some layout problems in the KO/Pi agenda view when there were many conflicting itmes. |
142 | Fixed several problems of the keyboard focus in the desktop versions when opening the search dialog/event viewer. | 145 | Fixed several problems of the keyboard focus in the desktop versions when opening the search dialog/event viewer. |
143 | 146 | ||
144 | Fixed problem in pi-sync mode when wrong password was sent. | 147 | Fixed problem in pi-sync mode when wrong password was sent. |
145 | 148 | ||
146 | OM/Pi: | 149 | OM/Pi: |
147 | Fixed a crash when displaying mails with "Show mail as html" was checked in the config. | 150 | Fixed a crash when displaying mails with "Show mail as html" was checked in the config. |
148 | Added a check before displaying the mail if the mail is in html format, if "Show mail as html" is enabled. | 151 | Added a check before displaying the mail if the mail is in html format, if "Show mail as html" is enabled. |
149 | 152 | ||
150 | ********** VERSION 2.0.11 ************ | 153 | ********** VERSION 2.0.11 ************ |
151 | 154 | ||
152 | Fixed some problems in pi-sync mode | 155 | Fixed some problems in pi-sync mode |
153 | (e.g. details of events were not synced properly) | 156 | (e.g. details of events were not synced properly) |
154 | 157 | ||
155 | ********** VERSION 2.0.10 ************ | 158 | ********** VERSION 2.0.10 ************ |
156 | 159 | ||
157 | KO/Pi: | 160 | KO/Pi: |
158 | In the desktop versions the context menu in the search dialog was broken after introducing the What'sThis info for the list view. | 161 | In the desktop versions the context menu in the search dialog was broken after introducing the What'sThis info for the list view. |
159 | This is fixed. | 162 | This is fixed. |
160 | Changed the search dialog a bit to make it more user friendly. | 163 | Changed the search dialog a bit to make it more user friendly. |
161 | (E.g.: Removed message box about "no items found" and set key focus to search line edit after search). | 164 | (E.g.: Removed message box about "no items found" and set key focus to search line edit after search). |
162 | 165 | ||
163 | Added config option to hide the week number in KO/Pi toolbar. | 166 | Added config option to hide the week number in KO/Pi toolbar. |
164 | 167 | ||
165 | ********** VERSION 2.0.9 ************ | 168 | ********** VERSION 2.0.9 ************ |
166 | 169 | ||
167 | Made month view icons for multiday events a bit nicer. | 170 | Made month view icons for multiday events a bit nicer. |
168 | Some minor fixes in KO/Pi | 171 | Some minor fixes in KO/Pi |
169 | (e.g. go to today did not work for new week view properly). | 172 | (e.g. go to today did not work for new week view properly). |
170 | 173 | ||
171 | 174 | ||
172 | ********** VERSION 2.0.8 ************ | 175 | ********** VERSION 2.0.8 ************ |
173 | 176 | ||
174 | Fixed a problem in dependency info in the ipk files for the Zaurus. | 177 | Fixed a problem in dependency info in the ipk files for the Zaurus. |
175 | 178 | ||
176 | Added icon for the stealth new week view and made navigation more user friendly in monthview by adding a prev/next week button to the navigator bar. | 179 | Added icon for the stealth new week view and made navigation more user friendly in monthview by adding a prev/next week button to the navigator bar. |
177 | 180 | ||
178 | Added a "go today" button to the datepicker. | 181 | Added a "go today" button to the datepicker. |
179 | 182 | ||
180 | Added "created" and "last modified" to event/todo viewer (and What'sThis viewer) | 183 | Added "created" and "last modified" to event/todo viewer (and What'sThis viewer) |
181 | and made it configureable to show these values. | 184 | and made it configureable to show these values. |
182 | 185 | ||
183 | Fixed a problem for events (from external iCal files) that do have a duration but no end date. | 186 | Fixed a problem for events (from external iCal files) that do have a duration but no end date. |
184 | 187 | ||
185 | 188 | ||
186 | ********** VERSION 2.0.7 ************ | 189 | ********** VERSION 2.0.7 ************ |
187 | 190 | ||
188 | Added global application font settings | 191 | Added global application font settings |
189 | (for all KDE-Pim/Pi apps) to the general settings. | 192 | (for all KDE-Pim/Pi apps) to the general settings. |
190 | 193 | ||
191 | Fixed a problem in OM/Pi when trying to login to some IMAP servers | 194 | Fixed a problem in OM/Pi when trying to login to some IMAP servers |
192 | (like the IMAP server of Apple: mail.mac.com ) | 195 | (like the IMAP server of Apple: mail.mac.com ) |
193 | 196 | ||
194 | Added recurring todos to KO/Pi. | 197 | Added recurring todos to KO/Pi. |
195 | 198 | ||
196 | 199 | ||
197 | ********** VERSION 2.0.6 ************ | 200 | ********** VERSION 2.0.6 ************ |
198 | 201 | ||
199 | Stable release 2.0.6! | 202 | Stable release 2.0.6! |
200 | 203 | ||
201 | Some bugfixes in the pi-sync mode. | 204 | Some bugfixes in the pi-sync mode. |
202 | Added German translation for pi-sync mode. | 205 | Added German translation for pi-sync mode. |
203 | 206 | ||
204 | KO/Pi: | 207 | KO/Pi: |
205 | Made the todolist using alternate background. | 208 | Made the todolist using alternate background. |
diff --git a/kaddressbook/kabcore.cpp b/kaddressbook/kabcore.cpp index db19dd5..27aca2d 100644 --- a/kaddressbook/kabcore.cpp +++ b/kaddressbook/kabcore.cpp | |||
@@ -2324,384 +2324,385 @@ void KABCore::manageCategories( ) | |||
2324 | int h = cp->sizeHint().height() ; | 2324 | int h = cp->sizeHint().height() ; |
2325 | int dw = QApplication::desktop()->width(); | 2325 | int dw = QApplication::desktop()->width(); |
2326 | int dh = QApplication::desktop()->height(); | 2326 | int dh = QApplication::desktop()->height(); |
2327 | cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); | 2327 | cp->setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); |
2328 | if ( !cp->exec() ) { | 2328 | if ( !cp->exec() ) { |
2329 | delete cp; | 2329 | delete cp; |
2330 | return; | 2330 | return; |
2331 | } | 2331 | } |
2332 | int count = 0; | 2332 | int count = 0; |
2333 | int cc = 0; | 2333 | int cc = 0; |
2334 | message( i18n("Please wait, processing categories...")); | 2334 | message( i18n("Please wait, processing categories...")); |
2335 | if ( cp->addCat() ) { | 2335 | if ( cp->addCat() ) { |
2336 | KABC::AddressBook::Iterator it; | 2336 | KABC::AddressBook::Iterator it; |
2337 | QStringList catList = KABPrefs::instance()->mCustomCategories; | 2337 | QStringList catList = KABPrefs::instance()->mCustomCategories; |
2338 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { | 2338 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { |
2339 | ++cc; | 2339 | ++cc; |
2340 | if ( cc %10 == 0) | 2340 | if ( cc %10 == 0) |
2341 | message(i18n("Processing contact #%1").arg(cc)); | 2341 | message(i18n("Processing contact #%1").arg(cc)); |
2342 | QStringList catIncList = (*it).categories(); | 2342 | QStringList catIncList = (*it).categories(); |
2343 | int i; | 2343 | int i; |
2344 | for( i = 0; i< catIncList.count(); ++i ) { | 2344 | for( i = 0; i< catIncList.count(); ++i ) { |
2345 | if ( !catList.contains (catIncList[i])) { | 2345 | if ( !catList.contains (catIncList[i])) { |
2346 | catList.append( catIncList[i] ); | 2346 | catList.append( catIncList[i] ); |
2347 | //qDebug("add cat %s ", catIncList[i].latin1()); | 2347 | //qDebug("add cat %s ", catIncList[i].latin1()); |
2348 | ++count; | 2348 | ++count; |
2349 | } | 2349 | } |
2350 | } | 2350 | } |
2351 | } | 2351 | } |
2352 | catList.sort(); | 2352 | catList.sort(); |
2353 | KABPrefs::instance()->mCustomCategories = catList; | 2353 | KABPrefs::instance()->mCustomCategories = catList; |
2354 | KABPrefs::instance()->writeConfig(); | 2354 | KABPrefs::instance()->writeConfig(); |
2355 | message(QString::number( count )+ i18n(" categories added to list! ")); | 2355 | message(QString::number( count )+ i18n(" categories added to list! ")); |
2356 | } else { | 2356 | } else { |
2357 | QStringList catList = KABPrefs::instance()->mCustomCategories; | 2357 | QStringList catList = KABPrefs::instance()->mCustomCategories; |
2358 | QStringList catIncList; | 2358 | QStringList catIncList; |
2359 | QStringList newCatList; | 2359 | QStringList newCatList; |
2360 | KABC::AddressBook::Iterator it; | 2360 | KABC::AddressBook::Iterator it; |
2361 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { | 2361 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { |
2362 | ++cc; | 2362 | ++cc; |
2363 | if ( cc %10 == 0) | 2363 | if ( cc %10 == 0) |
2364 | message(i18n("Processing contact #%1").arg(cc)); | 2364 | message(i18n("Processing contact #%1").arg(cc)); |
2365 | QStringList catIncList = (*it).categories(); | 2365 | QStringList catIncList = (*it).categories(); |
2366 | int i; | 2366 | int i; |
2367 | if ( catIncList.count() ) { | 2367 | if ( catIncList.count() ) { |
2368 | newCatList.clear(); | 2368 | newCatList.clear(); |
2369 | for( i = 0; i< catIncList.count(); ++i ) { | 2369 | for( i = 0; i< catIncList.count(); ++i ) { |
2370 | if ( catList.contains (catIncList[i])) { | 2370 | if ( catList.contains (catIncList[i])) { |
2371 | newCatList.append( catIncList[i] ); | 2371 | newCatList.append( catIncList[i] ); |
2372 | } | 2372 | } |
2373 | } | 2373 | } |
2374 | newCatList.sort(); | 2374 | newCatList.sort(); |
2375 | (*it).setCategories( newCatList ); | 2375 | (*it).setCategories( newCatList ); |
2376 | mAddressBook->insertAddressee( (*it) ); | 2376 | mAddressBook->insertAddressee( (*it) ); |
2377 | } | 2377 | } |
2378 | } | 2378 | } |
2379 | setModified( true ); | 2379 | setModified( true ); |
2380 | mViewManager->refreshView(); | 2380 | mViewManager->refreshView(); |
2381 | message( i18n("Removing categories done!")); | 2381 | message( i18n("Removing categories done!")); |
2382 | } | 2382 | } |
2383 | delete cp; | 2383 | delete cp; |
2384 | } | 2384 | } |
2385 | void KABCore::removeVoice() | 2385 | void KABCore::removeVoice() |
2386 | { | 2386 | { |
2387 | if ( KMessageBox::questionYesNo( this, i18n("After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as \"other\".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?") ) == KMessageBox::No ) | 2387 | if ( KMessageBox::questionYesNo( this, i18n("After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as \"other\".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?") ) == KMessageBox::No ) |
2388 | return; | 2388 | return; |
2389 | XXPortSelectDialog dlg( this, false, this ); | 2389 | XXPortSelectDialog dlg( this, false, this ); |
2390 | if ( !dlg.exec() ) | 2390 | if ( !dlg.exec() ) |
2391 | return; | 2391 | return; |
2392 | mAddressBook->setUntagged(); | 2392 | mAddressBook->setUntagged(); |
2393 | dlg.tagSelected(); | 2393 | dlg.tagSelected(); |
2394 | message(i18n("Removing voice..."), false ); | 2394 | message(i18n("Removing voice..."), false ); |
2395 | KABC::AddressBook::Iterator it; | 2395 | KABC::AddressBook::Iterator it; |
2396 | for ( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { | 2396 | for ( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { |
2397 | if ( (*it).tagged() ) { | 2397 | if ( (*it).tagged() ) { |
2398 | (*it).removeVoice(); | 2398 | (*it).removeVoice(); |
2399 | } | 2399 | } |
2400 | } | 2400 | } |
2401 | message(i18n("Refreshing view...") ); | 2401 | message(i18n("Refreshing view...") ); |
2402 | qApp->processEvents(); | 2402 | qApp->processEvents(); |
2403 | mViewManager->refreshView( "" ); | 2403 | mViewManager->refreshView( "" ); |
2404 | Addressee add; | 2404 | Addressee add; |
2405 | mDetails->setAddressee( add ); | 2405 | mDetails->setAddressee( add ); |
2406 | message(i18n("Remove voice completed!") ); | 2406 | message(i18n("Remove voice completed!") ); |
2407 | 2407 | ||
2408 | 2408 | ||
2409 | 2409 | ||
2410 | } | 2410 | } |
2411 | 2411 | ||
2412 | void KABCore::setFormattedName() | 2412 | void KABCore::setFormattedName() |
2413 | { | 2413 | { |
2414 | KABFormatPrefs setpref; | 2414 | KABFormatPrefs setpref; |
2415 | if ( !setpref.exec() ) { | 2415 | if ( !setpref.exec() ) { |
2416 | return; | 2416 | return; |
2417 | } | 2417 | } |
2418 | XXPortSelectDialog dlg( this, false, this ); | 2418 | XXPortSelectDialog dlg( this, false, this ); |
2419 | if ( !dlg.exec() ) | 2419 | if ( !dlg.exec() ) |
2420 | return; | 2420 | return; |
2421 | mAddressBook->setUntagged(); | 2421 | mAddressBook->setUntagged(); |
2422 | dlg.tagSelected(); | 2422 | dlg.tagSelected(); |
2423 | int count = 0; | 2423 | int count = 0; |
2424 | KABC::AddressBook::Iterator it; | 2424 | KABC::AddressBook::Iterator it; |
2425 | for ( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { | 2425 | for ( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { |
2426 | if ( (*it).tagged() ) { | 2426 | if ( (*it).tagged() ) { |
2427 | ++count; | 2427 | ++count; |
2428 | if ( count %10 == 0 ) | 2428 | if ( count %10 == 0 ) |
2429 | message(i18n("Changing contact #%1").arg( count ) ); | 2429 | message(i18n("Changing contact #%1").arg( count ) ); |
2430 | qApp->processEvents(); | 2430 | qApp->processEvents(); |
2431 | QString fName; | 2431 | QString fName; |
2432 | if ( setpref.simple->isChecked() ) | 2432 | if ( setpref.simple->isChecked() ) |
2433 | fName = NameEditDialog::formattedName( (*it), NameEditDialog::SimpleName ); | 2433 | fName = NameEditDialog::formattedName( (*it), NameEditDialog::SimpleName ); |
2434 | else if ( setpref.full->isChecked() ) | 2434 | else if ( setpref.full->isChecked() ) |
2435 | fName = NameEditDialog::formattedName( (*it), NameEditDialog::FullName ); | 2435 | fName = NameEditDialog::formattedName( (*it), NameEditDialog::FullName ); |
2436 | else if ( setpref.reverse->isChecked() ) | 2436 | else if ( setpref.reverse->isChecked() ) |
2437 | fName = NameEditDialog::formattedName( (*it), NameEditDialog::ReverseName ); | 2437 | fName = NameEditDialog::formattedName( (*it), NameEditDialog::ReverseName ); |
2438 | else | 2438 | else |
2439 | fName = (*it).organization(); | 2439 | fName = (*it).organization(); |
2440 | if ( setpref.setCompany->isChecked() ) | 2440 | if ( setpref.setCompany->isChecked() ) |
2441 | if ( fName.isEmpty() || fName =="," ) | 2441 | if ( fName.isEmpty() || fName =="," ) |
2442 | fName = (*it).organization(); | 2442 | fName = (*it).organization(); |
2443 | (*it).setFormattedName( fName ); | 2443 | (*it).setFormattedName( fName ); |
2444 | } | 2444 | } |
2445 | } | 2445 | } |
2446 | message(i18n("Refreshing view...") ); | 2446 | message(i18n("Refreshing view...") ); |
2447 | qApp->processEvents(); | 2447 | qApp->processEvents(); |
2448 | mViewManager->refreshView( "" ); | 2448 | mViewManager->refreshView( "" ); |
2449 | Addressee add; | 2449 | Addressee add; |
2450 | mDetails->setAddressee( add ); | 2450 | mDetails->setAddressee( add ); |
2451 | message(i18n("Setting formatted name completed!") ); | 2451 | message(i18n("Setting formatted name completed!") ); |
2452 | } | 2452 | } |
2453 | 2453 | ||
2454 | void KABCore::clipboardDataChanged() | 2454 | void KABCore::clipboardDataChanged() |
2455 | { | 2455 | { |
2456 | 2456 | ||
2457 | if ( mReadWrite ) | 2457 | if ( mReadWrite ) |
2458 | mActionPaste->setEnabled( !QApplication::clipboard()->text().isEmpty() ); | 2458 | mActionPaste->setEnabled( !QApplication::clipboard()->text().isEmpty() ); |
2459 | 2459 | ||
2460 | } | 2460 | } |
2461 | 2461 | ||
2462 | void KABCore::updateActionMenu() | 2462 | void KABCore::updateActionMenu() |
2463 | { | 2463 | { |
2464 | UndoStack *undo = UndoStack::instance(); | 2464 | UndoStack *undo = UndoStack::instance(); |
2465 | RedoStack *redo = RedoStack::instance(); | 2465 | RedoStack *redo = RedoStack::instance(); |
2466 | 2466 | ||
2467 | if ( undo->isEmpty() ) | 2467 | if ( undo->isEmpty() ) |
2468 | mActionUndo->setText( i18n( "Undo" ) ); | 2468 | mActionUndo->setText( i18n( "Undo" ) ); |
2469 | else | 2469 | else |
2470 | mActionUndo->setText( i18n( "Undo %1" ).arg( undo->top()->name() ) ); | 2470 | mActionUndo->setText( i18n( "Undo %1" ).arg( undo->top()->name() ) ); |
2471 | 2471 | ||
2472 | mActionUndo->setEnabled( !undo->isEmpty() ); | 2472 | mActionUndo->setEnabled( !undo->isEmpty() ); |
2473 | 2473 | ||
2474 | if ( !redo->top() ) | 2474 | if ( !redo->top() ) |
2475 | mActionRedo->setText( i18n( "Redo" ) ); | 2475 | mActionRedo->setText( i18n( "Redo" ) ); |
2476 | else | 2476 | else |
2477 | mActionRedo->setText( i18n( "Redo %1" ).arg( redo->top()->name() ) ); | 2477 | mActionRedo->setText( i18n( "Redo %1" ).arg( redo->top()->name() ) ); |
2478 | 2478 | ||
2479 | mActionRedo->setEnabled( !redo->isEmpty() ); | 2479 | mActionRedo->setEnabled( !redo->isEmpty() ); |
2480 | } | 2480 | } |
2481 | 2481 | ||
2482 | void KABCore::configureKeyBindings() | 2482 | void KABCore::configureKeyBindings() |
2483 | { | 2483 | { |
2484 | #ifndef KAB_EMBEDDED | 2484 | #ifndef KAB_EMBEDDED |
2485 | KKeyDialog::configure( actionCollection(), true ); | 2485 | KKeyDialog::configure( actionCollection(), true ); |
2486 | #else //KAB_EMBEDDED | 2486 | #else //KAB_EMBEDDED |
2487 | qDebug("KABCore::configureKeyBindings() not implemented"); | 2487 | qDebug("KABCore::configureKeyBindings() not implemented"); |
2488 | #endif //KAB_EMBEDDED | 2488 | #endif //KAB_EMBEDDED |
2489 | } | 2489 | } |
2490 | 2490 | ||
2491 | #ifdef KAB_EMBEDDED | 2491 | #ifdef KAB_EMBEDDED |
2492 | void KABCore::configureResources() | 2492 | void KABCore::configureResources() |
2493 | { | 2493 | { |
2494 | KRES::KCMKResources dlg( this, "" , 0 ); | 2494 | KRES::KCMKResources dlg( this, "" , 0 ); |
2495 | 2495 | ||
2496 | if ( !dlg.exec() ) | 2496 | if ( !dlg.exec() ) |
2497 | return; | 2497 | return; |
2498 | KMessageBox::information( this, i18n("Please restart to get the \nchanged resources (re)loaded!\n") ); | 2498 | KMessageBox::information( this, i18n("Please restart to get the \nchanged resources (re)loaded!\n") ); |
2499 | } | 2499 | } |
2500 | #endif //KAB_EMBEDDED | 2500 | #endif //KAB_EMBEDDED |
2501 | 2501 | ||
2502 | 2502 | ||
2503 | /* this method will be called through the QCop interface from Ko/Pi to select addresses | 2503 | /* this method will be called through the QCop interface from Ko/Pi to select addresses |
2504 | * for the attendees list of an event. | 2504 | * for the attendees list of an event. |
2505 | */ | 2505 | */ |
2506 | void KABCore::requestForNameEmailUidList(const QString& sourceChannel, const QString& uid) | 2506 | void KABCore::requestForNameEmailUidList(const QString& sourceChannel, const QString& uid) |
2507 | { | 2507 | { |
2508 | QStringList nameList; | 2508 | QStringList nameList; |
2509 | QStringList emailList; | 2509 | QStringList emailList; |
2510 | QStringList uidList; | 2510 | QStringList uidList; |
2511 | bool ok = false; | 2511 | bool ok = false; |
2512 | int wid = uid.toInt( &ok ); | 2512 | int wid = uid.toInt( &ok ); |
2513 | if ( ok ) { | 2513 | if ( ok ) { |
2514 | if ( wid != QApplication::desktop()->width() ) { | 2514 | if ( wid != QApplication::desktop()->width() ) { |
2515 | qDebug("KA/Pi: Request from different desktop geometry. Resizing ..."); | 2515 | qDebug("KA/Pi: Request from different desktop geometry. Resizing ..."); |
2516 | message( i18n("Resizing, please wait...") ); | ||
2516 | raise(); | 2517 | raise(); |
2517 | qApp->processEvents(); | 2518 | qApp->processEvents(); |
2518 | } | 2519 | } |
2519 | 2520 | ||
2520 | } else { | 2521 | } else { |
2521 | qDebug("KABCore::requestForNameEmailUidList:: Got invalid uid "); | 2522 | qDebug("KABCore::requestForNameEmailUidList:: Got invalid uid "); |
2522 | } | 2523 | } |
2523 | 2524 | ||
2524 | KABC::Addressee::List list = KABC::AddresseeDialog::getAddressees(this); | 2525 | KABC::Addressee::List list = KABC::AddresseeDialog::getAddressees(this); |
2525 | uint i=0; | 2526 | uint i=0; |
2526 | for (i=0; i < list.count(); i++) | 2527 | for (i=0; i < list.count(); i++) |
2527 | { | 2528 | { |
2528 | nameList.append(list[i].realName()); | 2529 | nameList.append(list[i].realName()); |
2529 | emailList.append(list[i].preferredEmail()); | 2530 | emailList.append(list[i].preferredEmail()); |
2530 | uidList.append(list[i].uid()); | 2531 | uidList.append(list[i].uid()); |
2531 | } | 2532 | } |
2532 | //qDebug("%s %s ", sourceChannel.latin1(), uid.latin1()); | 2533 | //qDebug("%s %s ", sourceChannel.latin1(), uid.latin1()); |
2533 | bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI(sourceChannel, uid, nameList, emailList, uidList); | 2534 | bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI(sourceChannel, uid, nameList, emailList, uidList); |
2534 | 2535 | ||
2535 | } | 2536 | } |
2536 | 2537 | ||
2537 | /* this method will be called through the QCop interface from Ko/Pi to select birthdays | 2538 | /* this method will be called through the QCop interface from Ko/Pi to select birthdays |
2538 | * to put them into the calendar. | 2539 | * to put them into the calendar. |
2539 | */ | 2540 | */ |
2540 | void KABCore::requestForBirthdayList(const QString& sourceChannel, const QString& uid) | 2541 | void KABCore::requestForBirthdayList(const QString& sourceChannel, const QString& uid) |
2541 | { | 2542 | { |
2542 | // qDebug("KABCore::requestForBirthdayList"); | 2543 | // qDebug("KABCore::requestForBirthdayList"); |
2543 | QStringList birthdayList; | 2544 | QStringList birthdayList; |
2544 | QStringList anniversaryList; | 2545 | QStringList anniversaryList; |
2545 | QStringList realNameList; | 2546 | QStringList realNameList; |
2546 | QStringList preferredEmailList; | 2547 | QStringList preferredEmailList; |
2547 | QStringList assembledNameList; | 2548 | QStringList assembledNameList; |
2548 | QStringList uidList; | 2549 | QStringList uidList; |
2549 | 2550 | ||
2550 | KABC::AddressBook::Iterator it; | 2551 | KABC::AddressBook::Iterator it; |
2551 | 2552 | ||
2552 | int count = 0; | 2553 | int count = 0; |
2553 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { | 2554 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) { |
2554 | ++count; | 2555 | ++count; |
2555 | } | 2556 | } |
2556 | QProgressBar bar(count,0 ); | 2557 | QProgressBar bar(count,0 ); |
2557 | int w = 300; | 2558 | int w = 300; |
2558 | if ( QApplication::desktop()->width() < 320 ) | 2559 | if ( QApplication::desktop()->width() < 320 ) |
2559 | w = 220; | 2560 | w = 220; |
2560 | int h = bar.sizeHint().height() ; | 2561 | int h = bar.sizeHint().height() ; |
2561 | int dw = QApplication::desktop()->width(); | 2562 | int dw = QApplication::desktop()->width(); |
2562 | int dh = QApplication::desktop()->height(); | 2563 | int dh = QApplication::desktop()->height(); |
2563 | bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); | 2564 | bar.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); |
2564 | bar.show(); | 2565 | bar.show(); |
2565 | bar.setCaption (i18n("Collecting birthdays - close to abort!") ); | 2566 | bar.setCaption (i18n("Collecting birthdays - close to abort!") ); |
2566 | qApp->processEvents(); | 2567 | qApp->processEvents(); |
2567 | 2568 | ||
2568 | QDate bday; | 2569 | QDate bday; |
2569 | QString anni; | 2570 | QString anni; |
2570 | QString formattedbday; | 2571 | QString formattedbday; |
2571 | 2572 | ||
2572 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) | 2573 | for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) |
2573 | { | 2574 | { |
2574 | if ( ! bar.isVisible() ) | 2575 | if ( ! bar.isVisible() ) |
2575 | return; | 2576 | return; |
2576 | bar.setProgress( count++ ); | 2577 | bar.setProgress( count++ ); |
2577 | qApp->processEvents(); | 2578 | qApp->processEvents(); |
2578 | bday = (*it).birthday().date(); | 2579 | bday = (*it).birthday().date(); |
2579 | anni = (*it).custom("KADDRESSBOOK", "X-Anniversary" ); | 2580 | anni = (*it).custom("KADDRESSBOOK", "X-Anniversary" ); |
2580 | 2581 | ||
2581 | if ( bday.isValid() || !anni.isEmpty()) | 2582 | if ( bday.isValid() || !anni.isEmpty()) |
2582 | { | 2583 | { |
2583 | if (bday.isValid()) | 2584 | if (bday.isValid()) |
2584 | formattedbday = KGlobal::locale()->formatDate(bday, true, KLocale::ISODate); | 2585 | formattedbday = KGlobal::locale()->formatDate(bday, true, KLocale::ISODate); |
2585 | else | 2586 | else |
2586 | formattedbday = "NOTVALID"; | 2587 | formattedbday = "NOTVALID"; |
2587 | if (anni.isEmpty()) | 2588 | if (anni.isEmpty()) |
2588 | anni = "INVALID"; | 2589 | anni = "INVALID"; |
2589 | 2590 | ||
2590 | birthdayList.append(formattedbday); | 2591 | birthdayList.append(formattedbday); |
2591 | anniversaryList.append(anni); //should be ISODate | 2592 | anniversaryList.append(anni); //should be ISODate |
2592 | realNameList.append((*it).realName()); | 2593 | realNameList.append((*it).realName()); |
2593 | preferredEmailList.append((*it).preferredEmail()); | 2594 | preferredEmailList.append((*it).preferredEmail()); |
2594 | assembledNameList.append((*it).assembledName()); | 2595 | assembledNameList.append((*it).assembledName()); |
2595 | uidList.append((*it).uid()); | 2596 | uidList.append((*it).uid()); |
2596 | 2597 | ||
2597 | //qDebug("found birthday in KA/Pi: %s,%s,%s,%s: %s, %s", (*it).realName().latin1(), (*it).preferredEmail().latin1(), (*it).assembledName().latin1(), (*it).uid().latin1(), formattedbday.latin1(), anni.latin1() ); | 2598 | //qDebug("found birthday in KA/Pi: %s,%s,%s,%s: %s, %s", (*it).realName().latin1(), (*it).preferredEmail().latin1(), (*it).assembledName().latin1(), (*it).uid().latin1(), formattedbday.latin1(), anni.latin1() ); |
2598 | } | 2599 | } |
2599 | } | 2600 | } |
2600 | 2601 | ||
2601 | bool res = ExternalAppHandler::instance()->returnBirthdayListFromKAPI(sourceChannel, uid, birthdayList, anniversaryList, realNameList, preferredEmailList, assembledNameList, uidList); | 2602 | bool res = ExternalAppHandler::instance()->returnBirthdayListFromKAPI(sourceChannel, uid, birthdayList, anniversaryList, realNameList, preferredEmailList, assembledNameList, uidList); |
2602 | 2603 | ||
2603 | } | 2604 | } |
2604 | 2605 | ||
2605 | /* this method will be called through the QCop interface from other apps to show details of a contact. | 2606 | /* this method will be called through the QCop interface from other apps to show details of a contact. |
2606 | */ | 2607 | */ |
2607 | void KABCore::requestForDetails(const QString& sourceChannel, const QString& sessionuid, const QString& name, const QString& email, const QString& uid) | 2608 | void KABCore::requestForDetails(const QString& sourceChannel, const QString& sessionuid, const QString& name, const QString& email, const QString& uid) |
2608 | { | 2609 | { |
2609 | //qDebug("KABCore::requestForDetails %s %s %s %s %s", sourceChannel.latin1(), sessionuid.latin1(), name.latin1(), email.latin1(), uid.latin1()); | 2610 | //qDebug("KABCore::requestForDetails %s %s %s %s %s", sourceChannel.latin1(), sessionuid.latin1(), name.latin1(), email.latin1(), uid.latin1()); |
2610 | 2611 | ||
2611 | QString foundUid = QString::null; | 2612 | QString foundUid = QString::null; |
2612 | if ( ! uid.isEmpty() ) { | 2613 | if ( ! uid.isEmpty() ) { |
2613 | Addressee adrr = mAddressBook->findByUid( uid ); | 2614 | Addressee adrr = mAddressBook->findByUid( uid ); |
2614 | if ( !adrr.isEmpty() ) { | 2615 | if ( !adrr.isEmpty() ) { |
2615 | foundUid = uid; | 2616 | foundUid = uid; |
2616 | } | 2617 | } |
2617 | if ( email == "sendbacklist" ) { | 2618 | if ( email == "sendbacklist" ) { |
2618 | //qDebug("ssssssssssssssssssssssend "); | 2619 | //qDebug("ssssssssssssssssssssssend "); |
2619 | QStringList nameList; | 2620 | QStringList nameList; |
2620 | QStringList emailList; | 2621 | QStringList emailList; |
2621 | QStringList uidList; | 2622 | QStringList uidList; |
2622 | nameList.append(adrr.realName()); | 2623 | nameList.append(adrr.realName()); |
2623 | emailList = adrr.emails(); | 2624 | emailList = adrr.emails(); |
2624 | uidList.append( adrr.preferredEmail()); | 2625 | uidList.append( adrr.preferredEmail()); |
2625 | bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); | 2626 | bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); |
2626 | return; | 2627 | return; |
2627 | } | 2628 | } |
2628 | 2629 | ||
2629 | } | 2630 | } |
2630 | 2631 | ||
2631 | if ( email == "sendbacklist" ) | 2632 | if ( email == "sendbacklist" ) |
2632 | return; | 2633 | return; |
2633 | if (foundUid.isEmpty()) | 2634 | if (foundUid.isEmpty()) |
2634 | { | 2635 | { |
2635 | //find the uid of the person first | 2636 | //find the uid of the person first |
2636 | Addressee::List namelist; | 2637 | Addressee::List namelist; |
2637 | Addressee::List emaillist; | 2638 | Addressee::List emaillist; |
2638 | 2639 | ||
2639 | if (!name.isEmpty()) | 2640 | if (!name.isEmpty()) |
2640 | namelist = mAddressBook->findByName( name ); | 2641 | namelist = mAddressBook->findByName( name ); |
2641 | 2642 | ||
2642 | if (!email.isEmpty()) | 2643 | if (!email.isEmpty()) |
2643 | emaillist = mAddressBook->findByEmail( email ); | 2644 | emaillist = mAddressBook->findByEmail( email ); |
2644 | //qDebug("count %d %d ", namelist.count(),emaillist.count() ); | 2645 | //qDebug("count %d %d ", namelist.count(),emaillist.count() ); |
2645 | //check if we have a match in Namelist and Emaillist | 2646 | //check if we have a match in Namelist and Emaillist |
2646 | if ((namelist.count() == 0) && (emaillist.count() > 0)) { | 2647 | if ((namelist.count() == 0) && (emaillist.count() > 0)) { |
2647 | foundUid = emaillist[0].uid(); | 2648 | foundUid = emaillist[0].uid(); |
2648 | } | 2649 | } |
2649 | else if ((namelist.count() > 0) && (emaillist.count() == 0)) | 2650 | else if ((namelist.count() > 0) && (emaillist.count() == 0)) |
2650 | foundUid = namelist[0].uid(); | 2651 | foundUid = namelist[0].uid(); |
2651 | else | 2652 | else |
2652 | { | 2653 | { |
2653 | for (int i = 0; i < namelist.count(); i++) | 2654 | for (int i = 0; i < namelist.count(); i++) |
2654 | { | 2655 | { |
2655 | for (int j = 0; j < emaillist.count(); j++) | 2656 | for (int j = 0; j < emaillist.count(); j++) |
2656 | { | 2657 | { |
2657 | if (namelist[i] == emaillist[j]) | 2658 | if (namelist[i] == emaillist[j]) |
2658 | { | 2659 | { |
2659 | foundUid = namelist[i].uid(); | 2660 | foundUid = namelist[i].uid(); |
2660 | } | 2661 | } |
2661 | } | 2662 | } |
2662 | } | 2663 | } |
2663 | } | 2664 | } |
2664 | } | 2665 | } |
2665 | else | 2666 | else |
2666 | { | 2667 | { |
2667 | foundUid = uid; | 2668 | foundUid = uid; |
2668 | } | 2669 | } |
2669 | 2670 | ||
2670 | if (!foundUid.isEmpty()) | 2671 | if (!foundUid.isEmpty()) |
2671 | { | 2672 | { |
2672 | 2673 | ||
2673 | // raise Ka/Pi if it is in the background | 2674 | // raise Ka/Pi if it is in the background |
2674 | #ifndef DESKTOP_VERSION | 2675 | #ifndef DESKTOP_VERSION |
2675 | #ifndef KORG_NODCOP | 2676 | #ifndef KORG_NODCOP |
2676 | //QCopEnvelope e("QPE/Application/kapi", "raise()"); | 2677 | //QCopEnvelope e("QPE/Application/kapi", "raise()"); |
2677 | #endif | 2678 | #endif |
2678 | #endif | 2679 | #endif |
2679 | 2680 | ||
2680 | mMainWindow->showMaximized(); | 2681 | mMainWindow->showMaximized(); |
2681 | mMainWindow-> raise(); | 2682 | mMainWindow-> raise(); |
2682 | 2683 | ||
2683 | mViewManager->setSelected( "", false); | 2684 | mViewManager->setSelected( "", false); |
2684 | mViewManager->refreshView( "" ); | 2685 | mViewManager->refreshView( "" ); |
2685 | mViewManager->setSelected( foundUid, true ); | 2686 | mViewManager->setSelected( foundUid, true ); |
2686 | mViewManager->refreshView( foundUid ); | 2687 | mViewManager->refreshView( foundUid ); |
2687 | 2688 | ||
2688 | if ( !mMultipleViewsAtOnce ) | 2689 | if ( !mMultipleViewsAtOnce ) |
2689 | { | 2690 | { |
2690 | setDetailsVisible( true ); | 2691 | setDetailsVisible( true ); |
2691 | mActionDetails->setChecked(true); | 2692 | mActionDetails->setChecked(true); |
2692 | } | 2693 | } |
2693 | } | 2694 | } |
2694 | } | 2695 | } |
2695 | 2696 | ||
2696 | void KABCore::whatsnew() | 2697 | void KABCore::whatsnew() |
2697 | { | 2698 | { |
2698 | KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); | 2699 | KApplication::showFile( "KDE-Pim/Pi Version Info", "kdepim/WhatsNew.txt" ); |
2699 | } | 2700 | } |
2700 | void KABCore::synchowto() | 2701 | void KABCore::synchowto() |
2701 | { | 2702 | { |
2702 | KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); | 2703 | KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/SyncHowto.txt" ); |
2703 | } | 2704 | } |
2704 | void KABCore::kdesynchowto() | 2705 | void KABCore::kdesynchowto() |
2705 | { | 2706 | { |
2706 | KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" ); | 2707 | KApplication::showFile( "KDE-Pim/Pi Synchronization HowTo", "kdepim/Zaurus-KDE_syncHowTo.txt" ); |
2707 | } | 2708 | } |
diff --git a/libkdepim/externalapphandler.cpp b/libkdepim/externalapphandler.cpp index 7200da9..f8f4c8a 100644 --- a/libkdepim/externalapphandler.cpp +++ b/libkdepim/externalapphandler.cpp | |||
@@ -963,239 +963,242 @@ bool ExternalAppHandler::callByFax( const QString& faxnumber ) | |||
963 | channel = KPimGlobalPrefs::instance()->mFaxOtherChannel; | 963 | channel = KPimGlobalPrefs::instance()->mFaxOtherChannel; |
964 | message = KPimGlobalPrefs::instance()->mFaxOtherMessage; | 964 | message = KPimGlobalPrefs::instance()->mFaxOtherMessage; |
965 | parameters = KPimGlobalPrefs::instance()->mFaxOtherMessageParameters; | 965 | parameters = KPimGlobalPrefs::instance()->mFaxOtherMessageParameters; |
966 | } | 966 | } |
967 | else | 967 | else |
968 | { | 968 | { |
969 | DefaultAppItem* dai = ExternalAppHandler::getDefaultItem(FAX, client); | 969 | DefaultAppItem* dai = ExternalAppHandler::getDefaultItem(FAX, client); |
970 | if (!dai) | 970 | if (!dai) |
971 | { | 971 | { |
972 | qDebug("could not find configured fax application."); | 972 | qDebug("could not find configured fax application."); |
973 | return false; | 973 | return false; |
974 | } | 974 | } |
975 | channel = dai->_channel; | 975 | channel = dai->_channel; |
976 | message = dai->_message; | 976 | message = dai->_message; |
977 | parameters = dai->_parameters; | 977 | parameters = dai->_parameters; |
978 | } | 978 | } |
979 | 979 | ||
980 | 980 | ||
981 | //first check if one of the mailers need the emails right in the message. | 981 | //first check if one of the mailers need the emails right in the message. |
982 | message = translateMessage(message, faxnumber, ""); | 982 | message = translateMessage(message, faxnumber, ""); |
983 | 983 | ||
984 | 984 | ||
985 | #ifdef DEBUG_EXT_APP_HANDLER | 985 | #ifdef DEBUG_EXT_APP_HANDLER |
986 | qDebug("9Using QCopEnvelope e(\"%s\",\"%s\")", channel.latin1(), message.latin1()); | 986 | qDebug("9Using QCopEnvelope e(\"%s\",\"%s\")", channel.latin1(), message.latin1()); |
987 | qDebug("passing faxnumber(%s) as parameter in the form %s to QCopEnvelope", faxnumber.latin1(), parameters.latin1()); | 987 | qDebug("passing faxnumber(%s) as parameter in the form %s to QCopEnvelope", faxnumber.latin1(), parameters.latin1()); |
988 | #endif | 988 | #endif |
989 | 989 | ||
990 | QCopEnvelope e(channel.latin1(), message.latin1()); | 990 | QCopEnvelope e(channel.latin1(), message.latin1()); |
991 | //US we need no names in the To field. The emailadresses are enough | 991 | //US we need no names in the To field. The emailadresses are enough |
992 | 992 | ||
993 | passParameters(&e, parameters, faxnumber, ""); | 993 | passParameters(&e, parameters, faxnumber, ""); |
994 | 994 | ||
995 | 995 | ||
996 | #else | 996 | #else |
997 | KMessageBox::sorry( 0, i18n( "This version does not support the sending of faxes." ) ); | 997 | KMessageBox::sorry( 0, i18n( "This version does not support the sending of faxes." ) ); |
998 | #endif | 998 | #endif |
999 | 999 | ||
1000 | 1000 | ||
1001 | return true; | 1001 | return true; |
1002 | } | 1002 | } |
1003 | 1003 | ||
1004 | /************************************************************************** | 1004 | /************************************************************************** |
1005 | * | 1005 | * |
1006 | **************************************************************************/ | 1006 | **************************************************************************/ |
1007 | 1007 | ||
1008 | //calls the sipapplication with the number | 1008 | //calls the sipapplication with the number |
1009 | bool ExternalAppHandler::callBySIP( const QString& sipnumber ) | 1009 | bool ExternalAppHandler::callBySIP( const QString& sipnumber ) |
1010 | { | 1010 | { |
1011 | #ifndef DESKTOP_VERSION | 1011 | #ifndef DESKTOP_VERSION |
1012 | QString channel; | 1012 | QString channel; |
1013 | QString message; | 1013 | QString message; |
1014 | QString parameters; | 1014 | QString parameters; |
1015 | 1015 | ||
1016 | 1016 | ||
1017 | int client = KPimGlobalPrefs::instance()->mSipClient; | 1017 | int client = KPimGlobalPrefs::instance()->mSipClient; |
1018 | if (client == KPimGlobalPrefs::OTHER_SIC) | 1018 | if (client == KPimGlobalPrefs::OTHER_SIC) |
1019 | { | 1019 | { |
1020 | channel = KPimGlobalPrefs::instance()->mSipOtherChannel; | 1020 | channel = KPimGlobalPrefs::instance()->mSipOtherChannel; |
1021 | message = KPimGlobalPrefs::instance()->mSipOtherMessage; | 1021 | message = KPimGlobalPrefs::instance()->mSipOtherMessage; |
1022 | parameters = KPimGlobalPrefs::instance()->mSipOtherMessageParameters; | 1022 | parameters = KPimGlobalPrefs::instance()->mSipOtherMessageParameters; |
1023 | } | 1023 | } |
1024 | else | 1024 | else |
1025 | { | 1025 | { |
1026 | DefaultAppItem* dai = ExternalAppHandler::getDefaultItem(SIP, client); | 1026 | DefaultAppItem* dai = ExternalAppHandler::getDefaultItem(SIP, client); |
1027 | if (!dai) | 1027 | if (!dai) |
1028 | { | 1028 | { |
1029 | qDebug("could not find configured sip application."); | 1029 | qDebug("could not find configured sip application."); |
1030 | return false; | 1030 | return false; |
1031 | } | 1031 | } |
1032 | channel = dai->_channel; | 1032 | channel = dai->_channel; |
1033 | message = dai->_message; | 1033 | message = dai->_message; |
1034 | parameters = dai->_parameters; | 1034 | parameters = dai->_parameters; |
1035 | } | 1035 | } |
1036 | 1036 | ||
1037 | 1037 | ||
1038 | //first check if one of the sip apps need the emails right in the message. | 1038 | //first check if one of the sip apps need the emails right in the message. |
1039 | message = translateMessage(message, sipnumber, ""); | 1039 | message = translateMessage(message, sipnumber, ""); |
1040 | 1040 | ||
1041 | 1041 | ||
1042 | #ifdef DEBUG_EXT_APP_HANDLER | 1042 | #ifdef DEBUG_EXT_APP_HANDLER |
1043 | qDebug("10Using QCopEnvelope e(\"%s\",\"%s\")", channel.latin1(), message.latin1()); | 1043 | qDebug("10Using QCopEnvelope e(\"%s\",\"%s\")", channel.latin1(), message.latin1()); |
1044 | qDebug("passing sipnumber(%s) as parameter in the form %s to QCopEnvelope", sipnumber.latin1(), parameters.latin1()); | 1044 | qDebug("passing sipnumber(%s) as parameter in the form %s to QCopEnvelope", sipnumber.latin1(), parameters.latin1()); |
1045 | #endif | 1045 | #endif |
1046 | 1046 | ||
1047 | QCopEnvelope e(channel.latin1(), message.latin1()); | 1047 | QCopEnvelope e(channel.latin1(), message.latin1()); |
1048 | //US we need no names in the To field. The emailadresses are enough | 1048 | //US we need no names in the To field. The emailadresses are enough |
1049 | 1049 | ||
1050 | passParameters(&e, parameters, sipnumber, ""); | 1050 | passParameters(&e, parameters, sipnumber, ""); |
1051 | 1051 | ||
1052 | 1052 | ||
1053 | #else | 1053 | #else |
1054 | KMessageBox::sorry( 0, i18n( "This version does not support sip." ) ); | 1054 | KMessageBox::sorry( 0, i18n( "This version does not support sip." ) ); |
1055 | #endif | 1055 | #endif |
1056 | 1056 | ||
1057 | 1057 | ||
1058 | return true; | 1058 | return true; |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | 1061 | ||
1062 | /************************************************************************** | 1062 | /************************************************************************** |
1063 | * | 1063 | * |
1064 | **************************************************************************/ | 1064 | **************************************************************************/ |
1065 | 1065 | ||
1066 | 1066 | ||
1067 | QString& ExternalAppHandler::translateMessage(QString& message, const QString& param1, const QString& param2 ) const | 1067 | QString& ExternalAppHandler::translateMessage(QString& message, const QString& param1, const QString& param2 ) const |
1068 | { | 1068 | { |
1069 | message = message.replace( QRegExp("%1"), param1 ); | 1069 | message = message.replace( QRegExp("%1"), param1 ); |
1070 | return message.replace( QRegExp("%2"), param2 ); | 1070 | return message.replace( QRegExp("%2"), param2 ); |
1071 | } | 1071 | } |
1072 | 1072 | ||
1073 | /************************************************************************** | 1073 | /************************************************************************** |
1074 | * | 1074 | * |
1075 | **************************************************************************/ | 1075 | **************************************************************************/ |
1076 | 1076 | ||
1077 | void ExternalAppHandler::passParameters(QCopEnvelope* e, const QString& parameters, const QString& param1 , const QString& param2) const | 1077 | void ExternalAppHandler::passParameters(QCopEnvelope* e, const QString& parameters, const QString& param1 , const QString& param2) const |
1078 | { | 1078 | { |
1079 | #ifndef DESKTOP_VERSION | 1079 | #ifndef DESKTOP_VERSION |
1080 | QMap<QString, QString> valmap; | 1080 | QMap<QString, QString> valmap; |
1081 | bool useValMap = false; | 1081 | bool useValMap = false; |
1082 | 1082 | ||
1083 | // first extract all parts of the parameters. | 1083 | // first extract all parts of the parameters. |
1084 | QStringList paramlist = QStringList::split(";", parameters); | 1084 | QStringList paramlist = QStringList::split(";", parameters); |
1085 | 1085 | ||
1086 | //Now check how many parts we have. | 1086 | //Now check how many parts we have. |
1087 | //=0 :no params to pass | 1087 | //=0 :no params to pass |
1088 | //>0 :parameters to pass | 1088 | //>0 :parameters to pass |
1089 | for ( QStringList::Iterator it = paramlist.begin(); it != paramlist.end(); ++it ) | 1089 | for ( QStringList::Iterator it = paramlist.begin(); it != paramlist.end(); ++it ) |
1090 | { | 1090 | { |
1091 | QString param = (*it); | 1091 | QString param = (*it); |
1092 | QStringList keyvallist = QStringList::split("=", param); | 1092 | QStringList keyvallist = QStringList::split("=", param); |
1093 | 1093 | ||
1094 | //if we have keyvalue pairs, we assume that we pass a map to the envelope | 1094 | //if we have keyvalue pairs, we assume that we pass a map to the envelope |
1095 | QStringList::Iterator it2 = keyvallist.begin(); | 1095 | QStringList::Iterator it2 = keyvallist.begin(); |
1096 | QString key = (*it2); | 1096 | QString key = (*it2); |
1097 | key = key.replace( QRegExp("%1"), param1 ); | 1097 | key = key.replace( QRegExp("%1"), param1 ); |
1098 | key = key.replace( QRegExp("%2"), param2 ); | 1098 | key = key.replace( QRegExp("%2"), param2 ); |
1099 | ++it2; | 1099 | ++it2; |
1100 | 1100 | ||
1101 | if(it2 != keyvallist.end()) | 1101 | if(it2 != keyvallist.end()) |
1102 | { | 1102 | { |
1103 | QString value = (*it2); | 1103 | QString value = (*it2); |
1104 | value = value.replace( QRegExp("%1"), param1 ); | 1104 | value = value.replace( QRegExp("%1"), param1 ); |
1105 | value = value.replace( QRegExp("%2"), param2 ); | 1105 | value = value.replace( QRegExp("%2"), param2 ); |
1106 | 1106 | ||
1107 | valmap.insert(key, value); | 1107 | valmap.insert(key, value); |
1108 | useValMap = true; | 1108 | useValMap = true; |
1109 | } | 1109 | } |
1110 | else | 1110 | else |
1111 | { | 1111 | { |
1112 | // qDebug("pass parameter << %s", key.latin1()); | 1112 | // qDebug("pass parameter << %s", key.latin1()); |
1113 | (*e) << key; | 1113 | (*e) << key; |
1114 | } | 1114 | } |
1115 | } | 1115 | } |
1116 | 1116 | ||
1117 | if (useValMap == true) | 1117 | if (useValMap == true) |
1118 | (*e) << valmap; | 1118 | (*e) << valmap; |
1119 | 1119 | ||
1120 | #endif | 1120 | #endif |
1121 | 1121 | ||
1122 | } | 1122 | } |
1123 | 1123 | ||
1124 | 1124 | ||
1125 | 1125 | ||
1126 | /************************************************************************** | 1126 | /************************************************************************** |
1127 | * | 1127 | * |
1128 | **************************************************************************/ | 1128 | **************************************************************************/ |
1129 | 1129 | ||
1130 | void ExternalAppHandler::appMessage( const QCString& cmsg, const QByteArray& data ) | 1130 | void ExternalAppHandler::appMessage( const QCString& cmsg, const QByteArray& data ) |
1131 | { | 1131 | { |
1132 | 1132 | ||
1133 | if ( cmsg == "nextView()" ) { | 1133 | if ( cmsg == "nextView()" ) { |
1134 | qDebug("nextView()"); | 1134 | qDebug("nextView()"); |
1135 | emit nextView(); | 1135 | emit nextView(); |
1136 | return; | 1136 | return; |
1137 | } | 1137 | } |
1138 | 1138 | ||
1139 | bool res = mNameEmailUidListFromKAPITransfer->appMessage( cmsg, data ); | 1139 | bool res = mNameEmailUidListFromKAPITransfer->appMessage( cmsg, data ); |
1140 | if (!res) | 1140 | if (!res) |
1141 | res = mBirthdayListFromKAPITransfer->appMessage( cmsg, data ); | 1141 | res = mBirthdayListFromKAPITransfer->appMessage( cmsg, data ); |
1142 | 1142 | ||
1143 | if (!res) | 1143 | if (!res) |
1144 | res = mDisplayDetails->appMessage( cmsg, data ); | 1144 | res = mDisplayDetails->appMessage( cmsg, data ); |
1145 | 1145 | ||
1146 | // if (!res) | 1146 | // if (!res) |
1147 | // res = mNameEmailUidListFromKAPITransfer->appMessage( cmsg, data ); | 1147 | // res = mNameEmailUidListFromKAPITransfer->appMessage( cmsg, data ); |
1148 | } | 1148 | } |
1149 | 1149 | ||
1150 | 1150 | ||
1151 | 1151 | ||
1152 | bool ExternalAppHandler::requestNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& sessionuid) | 1152 | bool ExternalAppHandler::requestNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& sessionuid) |
1153 | { | 1153 | { |
1154 | mNameEmailUidListFromKAPITransfer->setSourceChannel(sourceChannel); | 1154 | mNameEmailUidListFromKAPITransfer->setSourceChannel(sourceChannel); |
1155 | return mNameEmailUidListFromKAPITransfer->sendMessageToTarget(sessionuid); | 1155 | // maybe we are sending to KA/Pi fom a different worldd... |
1156 | // it may be that the QAplication::desktop()->width() values in KA/Pi are not the same as in our application | ||
1157 | // for that reason we send the current QApplication::desktop()->width() to KA/Pi | ||
1158 | return mNameEmailUidListFromKAPITransfer->sendMessageToTarget(QString::number ( QApplication::desktop()->width() )); | ||
1156 | } | 1159 | } |
1157 | 1160 | ||
1158 | bool ExternalAppHandler::returnNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QStringList& list1, const QStringList& list2, const QStringList& list3) | 1161 | bool ExternalAppHandler::returnNameEmailUidListFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QStringList& list1, const QStringList& list2, const QStringList& list3) |
1159 | { | 1162 | { |
1160 | QStringList list4, list5, list6; | 1163 | QStringList list4, list5, list6; |
1161 | 1164 | ||
1162 | mNameEmailUidListFromKAPITransfer->setSourceChannel(sourceChannel); | 1165 | mNameEmailUidListFromKAPITransfer->setSourceChannel(sourceChannel); |
1163 | return mNameEmailUidListFromKAPITransfer->sendMessageToSource(sessionuid, list1, list2, list3, list4, list5, list6); | 1166 | return mNameEmailUidListFromKAPITransfer->sendMessageToSource(sessionuid, list1, list2, list3, list4, list5, list6); |
1164 | } | 1167 | } |
1165 | 1168 | ||
1166 | bool ExternalAppHandler::requestFindByEmailFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QString& email) | 1169 | bool ExternalAppHandler::requestFindByEmailFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QString& email) |
1167 | { | 1170 | { |
1168 | mFindByEmailFromKAPITransfer->setSourceChannel(sourceChannel); | 1171 | mFindByEmailFromKAPITransfer->setSourceChannel(sourceChannel); |
1169 | return mFindByEmailFromKAPITransfer->sendMessageToTarget(sessionuid, email); | 1172 | return mFindByEmailFromKAPITransfer->sendMessageToTarget(sessionuid, email); |
1170 | } | 1173 | } |
1171 | 1174 | ||
1172 | bool ExternalAppHandler::returnFindByEmailFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QStringList& list1, const QStringList& list2, const QStringList& list3) | 1175 | bool ExternalAppHandler::returnFindByEmailFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QStringList& list1, const QStringList& list2, const QStringList& list3) |
1173 | { | 1176 | { |
1174 | QStringList list4, list5, list6; | 1177 | QStringList list4, list5, list6; |
1175 | 1178 | ||
1176 | mFindByEmailFromKAPITransfer->setSourceChannel(sourceChannel); | 1179 | mFindByEmailFromKAPITransfer->setSourceChannel(sourceChannel); |
1177 | return mFindByEmailFromKAPITransfer->sendMessageToSource(sessionuid, list1, list2, list3, list4, list5, list6); | 1180 | return mFindByEmailFromKAPITransfer->sendMessageToSource(sessionuid, list1, list2, list3, list4, list5, list6); |
1178 | } | 1181 | } |
1179 | 1182 | ||
1180 | bool ExternalAppHandler::requestDetailsFromKAPI(const QString& name, const QString& email, const QString& uid) | 1183 | bool ExternalAppHandler::requestDetailsFromKAPI(const QString& name, const QString& email, const QString& uid) |
1181 | { | 1184 | { |
1182 | mDisplayDetails->setSourceChannel(""); | 1185 | mDisplayDetails->setSourceChannel(""); |
1183 | return mDisplayDetails->sendMessageToTarget("", name, email, uid); | 1186 | return mDisplayDetails->sendMessageToTarget("", name, email, uid); |
1184 | } | 1187 | } |
1185 | 1188 | ||
1186 | bool ExternalAppHandler::requestBirthdayListFromKAPI(const QString& sourceChannel, const QString& sessionuid) | 1189 | bool ExternalAppHandler::requestBirthdayListFromKAPI(const QString& sourceChannel, const QString& sessionuid) |
1187 | { | 1190 | { |
1188 | mBirthdayListFromKAPITransfer->setSourceChannel(sourceChannel); | 1191 | mBirthdayListFromKAPITransfer->setSourceChannel(sourceChannel); |
1189 | return mBirthdayListFromKAPITransfer->sendMessageToTarget(sessionuid); | 1192 | return mBirthdayListFromKAPITransfer->sendMessageToTarget(sessionuid); |
1190 | } | 1193 | } |
1191 | 1194 | ||
1192 | bool ExternalAppHandler::returnBirthdayListFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QStringList& list1, const QStringList& list2, const QStringList& list3, const QStringList& list4, const QStringList& list5, const QStringList& list6) | 1195 | bool ExternalAppHandler::returnBirthdayListFromKAPI(const QString& sourceChannel, const QString& sessionuid, const QStringList& list1, const QStringList& list2, const QStringList& list3, const QStringList& list4, const QStringList& list5, const QStringList& list6) |
1193 | { | 1196 | { |
1194 | mBirthdayListFromKAPITransfer->setSourceChannel(sourceChannel); | 1197 | mBirthdayListFromKAPITransfer->setSourceChannel(sourceChannel); |
1195 | return mBirthdayListFromKAPITransfer->sendMessageToSource(sessionuid, list1, list2, list3, list4, list5, list6); | 1198 | return mBirthdayListFromKAPITransfer->sendMessageToSource(sessionuid, list1, list2, list3, list4, list5, list6); |
1196 | } | 1199 | } |
1197 | 1200 | ||
1198 | 1201 | ||
1199 | 1202 | ||
1200 | 1203 | ||
1201 | 1204 | ||