summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-04-02 14:07:31 (UTC)
committer zautrix <zautrix>2005-04-02 14:07:31 (UTC)
commitb0d17f8f2ef9b09b7d8b8aa0f6cc34f400f8fddd (patch) (unidiff)
tree942bcf89b35cf165e9147c1e4a5efa817c48007f
parent997e7660a81baa2b8aeb1b66a3cc3ebe54e00ebe (diff)
downloadkdepimpi-b0d17f8f2ef9b09b7d8b8aa0f6cc34f400f8fddd.zip
kdepimpi-b0d17f8f2ef9b09b7d8b8aa0f6cc34f400f8fddd.tar.gz
kdepimpi-b0d17f8f2ef9b09b7d8b8aa0f6cc34f400f8fddd.tar.bz2
fixes
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/korganizer/germantranslation.txt10
-rw-r--r--korganizer/koeventviewer.cpp14
-rw-r--r--korganizer/kolistview.cpp14
-rw-r--r--korganizer/kotodoview.cpp26
-rw-r--r--libkcal/alarm.cpp24
-rw-r--r--libkcal/alarm.h1
-rw-r--r--libkcal/kincidenceformatter.cpp14
7 files changed, 83 insertions, 20 deletions
diff --git a/bin/kdepim/korganizer/germantranslation.txt b/bin/kdepim/korganizer/germantranslation.txt
index fbab7dd..6b739ba 100644
--- a/bin/kdepim/korganizer/germantranslation.txt
+++ b/bin/kdepim/korganizer/germantranslation.txt
@@ -947,397 +947,397 @@
947{ "Write back synced data","Schreibe gesyncte Daten zurück" }, 947{ "Write back synced data","Schreibe gesyncte Daten zurück" },
948{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" }, 948{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" },
949{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" }, 949{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" },
950{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " }, 950{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " },
951{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" }, 951{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" },
952{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" }, 952{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" },
953{ "Help...","Hilfe..." }, 953{ "Help...","Hilfe..." },
954{ "Local file Cal:","Lokale Datei Kal:" }, 954{ "Local file Cal:","Lokale Datei Kal:" },
955{ "Local file ABook:","Lokale Datei ABuch:" }, 955{ "Local file ABook:","Lokale Datei ABuch:" },
956{ "Local file PWMgr:","Lokale Datei PWMgr:" }, 956{ "Local file PWMgr:","Lokale Datei PWMgr:" },
957{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" }, 957{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" },
958{ "Calendar:","Kalender:" }, 958{ "Calendar:","Kalender:" },
959{ "AddressBook:","AdressBuch:" }, 959{ "AddressBook:","AdressBuch:" },
960{ "PWManager:","PWManager:" }, 960{ "PWManager:","PWManager:" },
961{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" }, 961{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" },
962{ "ssh/scp","ssh/scp" }, 962{ "ssh/scp","ssh/scp" },
963{ "ftp","ftp" }, 963{ "ftp","ftp" },
964{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" }, 964{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" },
965{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" }, 965{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" },
966{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" }, 966{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" },
967{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" }, 967{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" },
968{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" }, 968{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" },
969{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" }, 969{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" },
970{ "KDE-Pim sync config","KDE-Pim sync Konfig" }, 970{ "KDE-Pim sync config","KDE-Pim sync Konfig" },
971{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" }, 971{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" },
972{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" }, 972{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" },
973{ "Port number (Default: %1)","Port Nummer (Default: %1)" }, 973{ "Port number (Default: %1)","Port Nummer (Default: %1)" },
974{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" }, 974{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" },
975{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" }, 975{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" },
976{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" }, 976{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" },
977{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" }, 977{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" },
978{ "Disable Pi-Sync","Schalte Pi-Sync aus" }, 978{ "Disable Pi-Sync","Schalte Pi-Sync aus" },
979{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen \"Multi-Syncen\"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" }, 979{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen \"Multi-Syncen\"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" },
980{ "KDE-Pim Sync","KDE-Pim Sync" }, 980{ "KDE-Pim Sync","KDE-Pim Sync" },
981{ "Multiple profiles","Multi-Sync Profile" }, 981{ "Multiple profiles","Multi-Sync Profile" },
982{ "Device: ","Gerät: " }, 982{ "Device: ","Gerät: " },
983{ "Multiple sync started.","Multi-Sync gestartet." }, 983{ "Multiple sync started.","Multi-Sync gestartet." },
984{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile\nselektiert für Multi-Sync" }, 984{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile\nselektiert für Multi-Sync" },
985{ "Turn filter on","Schalte Filter an" }, 985{ "Turn filter on","Schalte Filter an" },
986{ "Turn filter off","Schalte Filter aus" }, 986{ "Turn filter off","Schalte Filter aus" },
987{ "Key bindings KOrganizer/Pi","Tastatur Belegung KOrganizer/Pi" }, 987{ "Key bindings KOrganizer/Pi","Tastatur Belegung KOrganizer/Pi" },
988{ "<p><b>White</b>: Item readonly</p>\n","<p><b>Weiss</b>: Eintrag schreibgeschützt</p>\n" }, 988{ "<p><b>White</b>: Item readonly</p>\n","<p><b>Weiss</b>: Eintrag schreibgeschützt</p>\n" },
989{ "<p><b>Dark yellow</b>: Event/todo with attendees.</p>\n","<p><b>Dunkelgelb</b>: Termin/Todo mit Teilnehmern.</p>\n" }, 989{ "<p><b>Dark yellow</b>: Event/todo with attendees.</p>\n","<p><b>Dunkelgelb</b>: Termin/Todo mit Teilnehmern.</p>\n" },
990{ "<p><b>Black</b>: Event/todo with attendees. You are the organizer!</p>\n","<p><b>Schwarz</b>: Termin/Todo mit Teilnehmern. Sie sind der Organisator!</p>\n" }, 990{ "<p><b>Black</b>: Event/todo with attendees. You are the organizer!</p>\n","<p><b>Schwarz</b>: Termin/Todo mit Teilnehmern. Sie sind der Organisator!</p>\n" },
991{ "<p><b>Dark green</b>: Information(description) available.([i] in WN view)</p>\n","<p><b>Dunkelgrün</b>: Information(Beschreibung) verfügbar.([i] in WN Ansicht)</p>\n" }, 991{ "<p><b>Dark green</b>: Information(description) available.([i] in WN view)</p>\n","<p><b>Dunkelgrün</b>: Information(Beschreibung) verfügbar.([i] in WN Ansicht)</p>\n" },
992{ "<p><b>Blue</b>: Recurrent event.([r] in Whats'Next view)</p>\n","<p><b>Blau</b>: Wiederholender Termin.([r] in Whats'Next Ansicht)</p>\n" }, 992{ "<p><b>Blue</b>: Recurrent event.([r] in Whats'Next view)</p>\n","<p><b>Blau</b>: Wiederholender Termin.([r] in Whats'Next Ansicht)</p>\n" },
993{ "<p><b>Red</b>: Alarm set.([a] in Whats'Next view)</p>\n","<p><b>Rot</b>: Alarm gesetzt.([a] in Whats'Next Ansicht)</p>\n" }, 993{ "<p><b>Red</b>: Alarm set.([a] in Whats'Next view)</p>\n","<p><b>Rot</b>: Alarm gesetzt.([a] in Whats'Next Ansicht)</p>\n" },
994{ "<p><b>Cross</b>: Item cancelled.([c] in Whats'Next view)</p>\n","<p><b>Kreuz</b>: Eintrag gecancelt.([c] in Whats'Next Ansicht)</p>\n" }, 994{ "<p><b>Cross</b>: Item cancelled.([c] in Whats'Next view)</p>\n","<p><b>Kreuz</b>: Eintrag gecancelt.([c] in Whats'Next Ansicht)</p>\n" },
995{ "<p><b>(for square icons in agenda and month view)</b></p>\n","<p><b>(für quadratische Icons in Agenda und Monats Ansicht)</b></p>\n" }, 995{ "<p><b>(for square icons in agenda and month view)</b></p>\n","<p><b>(für quadratische Icons in Agenda und Monats Ansicht)</b></p>\n" },
996{ "<p><h2>KO/Pi icon colors:</h2></p>\n","<p><h2>KO/Pi Icon Farben:</h2></p>\n" }, 996{ "<p><h2>KO/Pi icon colors:</h2></p>\n","<p><h2>KO/Pi Icon Farben:</h2></p>\n" },
997{ "<p><b>E</b>: Edit item</p>\n","<p><b>E</b>: Editiere Eintrag</p>\n" }, 997{ "<p><b>E</b>: Edit item</p>\n","<p><b>E</b>: Editiere Eintrag</p>\n" },
998{ "<p><b>A</b>: Show agenda view.</p>\n","<p><b>A</b>: Zeige Agenda Ansicht.</p>\n" }, 998{ "<p><b>A</b>: Show agenda view.</p>\n","<p><b>A</b>: Zeige Agenda Ansicht.</p>\n" },
999{ "<p><b>I,C</b>: Close dialog.</p>\n","<p><b>I,C</b>: Schließe Dialog.</p>\n" }, 999{ "<p><b>I,C</b>: Close dialog.</p>\n","<p><b>I,C</b>: Schließe Dialog.</p>\n" },
1000{ "<p><h3>In event/todo viewer:</h3></p>\n","<p><h3>In Termin/Todo Detail-Anzeige:</h3></p>\n" }, 1000{ "<p><h3>In event/todo viewer:</h3></p>\n","<p><h3>In Termin/Todo Detail-Anzeige:</h3></p>\n" },
1001{ "<p><b>shift+up/down</b>: Goto first/last item</p>\n","<p><b>shift+up/down</b>: Gehe zum ersten/letzten Eintrag</p>\n" }, 1001{ "<p><b>shift+up/down</b>: Goto first/last item</p>\n","<p><b>shift+up/down</b>: Gehe zum ersten/letzten Eintrag</p>\n" },
1002{ "<p><b>ctrl+up/down</b>: Goto up/down by 20% of items</p>\n","<p><b>ctrl+up/down</b>: Gehe hoch/runter 20% aller Einträge</p>\n" }, 1002{ "<p><b>ctrl+up/down</b>: Goto up/down by 20% of items</p>\n","<p><b>ctrl+up/down</b>: Gehe hoch/runter 20% aller Einträge</p>\n" },
1003{ "<p><b>up/down</b>: Next/prev item</p>\n","<p><b>up/down</b>: Nächster/vorheriger Eintrag</p>\n" }, 1003{ "<p><b>up/down</b>: Next/prev item</p>\n","<p><b>up/down</b>: Nächster/vorheriger Eintrag</p>\n" },
1004{ "<p><b>return+shift</b>: Deselect item+one step down</p>\n","<p><b>return+shift</b>: Deselektiere Item+Cursor einen Eintrag runter</p>\n" }, 1004{ "<p><b>return+shift</b>: Deselect item+one step down</p>\n","<p><b>return+shift</b>: Deselektiere Item+Cursor einen Eintrag runter</p>\n" },
1005{ "<p><b>return</b>: Select item+one step down</p>\n","<p><b>return</b>: Selektiere Item+Cursor einen Eintrag runter</p>\n" }, 1005{ "<p><b>return</b>: Select item+one step down</p>\n","<p><b>return</b>: Selektiere Item+Cursor einen Eintrag runter</p>\n" },
1006{ "<p><b>I</b>: Show info of current item+one step down.</p>\n","<p><b>I</b>: Zeige Detail-Ansicht vom sel.Eintrag+Cursor einen Eintrag runter.</p>\n" }, 1006{ "<p><b>I</b>: Show info of current item+one step down.</p>\n","<p><b>I</b>: Zeige Detail-Ansicht vom sel.Eintrag+Cursor einen Eintrag runter.</p>\n" },
1007{ "<p><h3>In list view:</h3></p>\n","<p><h3>In Listen Ansicht:</h3></p>\n" }, 1007{ "<p><h3>In list view:</h3></p>\n","<p><h3>In Listen Ansicht:</h3></p>\n" },
1008{ "<p><b>return+shift</b>: Mark item as not completed+one step down</p>\n","<p><b>return+shift</b>: Markiere Todo als nicht erledigt+Cursor einen Eintrag runter</p>\n" }, 1008{ "<p><b>return+shift</b>: Mark item as not completed+one step down</p>\n","<p><b>return+shift</b>: Markiere Todo als nicht erledigt+Cursor einen Eintrag runter</p>\n" },
1009{ "<p><b>return</b>: Mark item as completed+one step down.</p>\n","<p><b>return</b>: Markiere Todo als erledigt+Cursor einen Eintrag runter.</p>\n" }, 1009{ "<p><b>return</b>: Mark item as completed+one step down.</p>\n","<p><b>return</b>: Markiere Todo als erledigt+Cursor einen Eintrag runter.</p>\n" },
1010{ "<p><b>Q</b>: Toggle quick todo line edit.</p>\n","<p><b>Q</b>: Zeige/verstecke Quick Todo Eingabe Zeile.</p>\n" }, 1010{ "<p><b>Q</b>: Toggle quick todo line edit.</p>\n","<p><b>Q</b>: Zeige/verstecke Quick Todo Eingabe Zeile.</p>\n" },
1011{ "<p><b>shift+P</b>: Make new <b>P</b>arent for todo selected with shift+S</p>\n","<p><b>shift+P</b>: Mache Todo zum neuen <b>P</b>arent Todo für das Todo, welches mit shift+Sselektiert wurde.</p>\n" }, 1011{ "<p><b>shift+P</b>: Make new <b>P</b>arent for todo selected with shift+S</p>\n","<p><b>shift+P</b>: Mache Todo zum neuen <b>P</b>arent Todo für das Todo, welches mit shift+Sselektiert wurde.</p>\n" },
1012{ "<p><b>shift+S</b>: Make <b>S</b>ubtodo (reparent todo)</p>\n","<p><b>shift+S</b>: Mache Todo zum <b>S</b>ubtodo</p>\n" }, 1012{ "<p><b>shift+S</b>: Make <b>S</b>ubtodo (reparent todo)</p>\n","<p><b>shift+S</b>: Mache Todo zum <b>S</b>ubtodo</p>\n" },
1013{ "<p><b>shift+U</b>: <b>U</b>nparent todo (make root todo)</p>\n","<p><b>shift+U</b>: <b>U</b>nparent Todo (Mache Sub-Todo zum Toplevel Todo)</p>\n" }, 1013{ "<p><b>shift+U</b>: <b>U</b>nparent todo (make root todo)</p>\n","<p><b>shift+U</b>: <b>U</b>nparent Todo (Mache Sub-Todo zum Toplevel Todo)</p>\n" },
1014{ "<p><h3>In todo view:</h3></p>\n","<p><h3>In Todo Anzige:</h3></p>\n" }, 1014{ "<p><h3>In todo view:</h3></p>\n","<p><h3>In Todo Anzige:</h3></p>\n" },
1015{ "<p><b>ctrl+up/down</b>: Scroll small todo view</p>\n","<p><b>ctrl+up/down</b>: Scrolle kleine Todo Ansicht</p>\n" }, 1015{ "<p><b>ctrl+up/down</b>: Scroll small todo view</p>\n","<p><b>ctrl+up/down</b>: Scrolle kleine Todo Ansicht</p>\n" },
1016{ "<p><b>up/down</b>: Scroll agenda view</p>\n","<p><b>up/down</b>: Scrolle Agenda Ansicht</p>\n" }, 1016{ "<p><b>up/down</b>: Scroll agenda view</p>\n","<p><b>up/down</b>: Scrolle Agenda Ansicht</p>\n" },
1017{ "<p><h3>In agenda view:</h3></p>\n","<p><h3>In Agenda Ansicht:</h3></p>\n" }, 1017{ "<p><h3>In agenda view:</h3></p>\n","<p><h3>In Agenda Ansicht:</h3></p>\n" },
1018{ "<p><b>del,backspace</b>: Delete selected item</p>\n","<p><b>del,backspace</b>: Lösche selektiertes Item</p>\n" }, 1018{ "<p><b>del,backspace</b>: Delete selected item</p>\n","<p><b>del,backspace</b>: Lösche selektiertes Item</p>\n" },
1019{ "<p><b>left</b>: Prev. week | <b>left+ctrl</b>: Prev. month</p>\n","<p><b>left</b>: Vorh. Woche | <b>left+ctrl</b>: Vorh. Monat</p>\n" }, 1019{ "<p><b>left</b>: Prev. week | <b>left+ctrl</b>: Prev. month</p>\n","<p><b>left</b>: Vorh. Woche | <b>left+ctrl</b>: Vorh. Monat</p>\n" },
1020{ "<p><b>right</b>: Next week | <b>right+ctrl</b>: Next month</p>\n","<p><b>right</b>: Nächste Woche | <b>right+ctrl</b>: Nächste Woche</p>\n" }, 1020{ "<p><b>right</b>: Next week | <b>right+ctrl</b>: Next month</p>\n","<p><b>right</b>: Nächste Woche | <b>right+ctrl</b>: Nächste Woche</p>\n" },
1021{ "<p><b>B</b>: Edit description (details) of selected item</p>\n","<p><b>B</b>: Editiere Beschreibung (Details) des selektierten Items</p>\n" }, 1021{ "<p><b>B</b>: Edit description (details) of selected item</p>\n","<p><b>B</b>: Editiere Beschreibung (Details) des selektierten Items</p>\n" },
1022{ "<p><b>C</b>: Show current time in agenda view</p>\n","<p><b>C</b>: Zeige aktuelle Zeit in Agenda Ansicht</p>\n" }, 1022{ "<p><b>C</b>: Show current time in agenda view</p>\n","<p><b>C</b>: Zeige aktuelle Zeit in Agenda Ansicht</p>\n" },
1023{ "<p><b>+,-</b> : Zoom in/out agenda | <b>A</b>: Toggle allday agenda height</p>\n","<p><b>+,-</b> : Zoom rein/raus Agenda | <b>A</b>: Wechsle Ganztag Agenda Höhe</p>\n" }, 1023{ "<p><b>+,-</b> : Zoom in/out agenda | <b>A</b>: Toggle allday agenda height</p>\n","<p><b>+,-</b> : Zoom rein/raus Agenda | <b>A</b>: Wechsle Ganztag Agenda Höhe</p>\n" },
1024{ "<p><b>S+ctrl</b>: Add sub-todo | <b>X+ctrl</b>: Toggle datenavigator</p>\n","<p><b>S+ctrl</b>: Füge Sub-Todo hinzu | <b>X+ctrl</b>: Zeige/verstecke Datumsnavigator</p>\n" }, 1024{ "<p><b>S+ctrl</b>: Add sub-todo | <b>X+ctrl</b>: Toggle datenavigator</p>\n","<p><b>S+ctrl</b>: Füge Sub-Todo hinzu | <b>X+ctrl</b>: Zeige/verstecke Datumsnavigator</p>\n" },
1025{ "<p><b>T</b>: Goto today | <b>T+ctrl</b>: New Todo</p>\n","<p><b>T</b>: Gehe zu Heute | <b>T+ctrl</b>: Neues Todo</p>\n" }, 1025{ "<p><b>T</b>: Goto today | <b>T+ctrl</b>: New Todo</p>\n","<p><b>T</b>: Gehe zu Heute | <b>T+ctrl</b>: Neues Todo</p>\n" },
1026{ "<p><b>E</b>: Edit selected item |<b> E+ctrl</b>: New Event</p>\n","<p><b>E</b>: Editiere selektiertes Item |<b> E+ctrl</b>: Neuer Termin</p>\n" }, 1026{ "<p><b>E</b>: Edit selected item |<b> E+ctrl</b>: New Event</p>\n","<p><b>E</b>: Editiere selektiertes Item |<b> E+ctrl</b>: Neuer Termin</p>\n" },
1027{ "<p><b>D</b>: One day view | <b>M</b>: Month view</p>\n","<p><b>D</b>: Ein-Tages Ansicht | <b>M</b>: Monatsansicht</p>\n" }, 1027{ "<p><b>D</b>: One day view | <b>M</b>: Month view</p>\n","<p><b>D</b>: Ein-Tages Ansicht | <b>M</b>: Monatsansicht</p>\n" },
1028{ "<p><b>Z,Y</b>: Work week view | <b>U</b>: Week view</p>\n","<p><b>Z,Y</b>: Arbeitswochenansicht | <b>U</b>: Wochenansicht</p>\n" }, 1028{ "<p><b>Z,Y</b>: Work week view | <b>U</b>: Week view</p>\n","<p><b>Z,Y</b>: Arbeitswochenansicht | <b>U</b>: Wochenansicht</p>\n" },
1029{ "<p><b>V</b>: Todo view | <b>L</b>: Event list view</p>\n","<p><b>V</b>: Todo Ansicht | <b>L</b>: Termin Listen Ansicht</p>\n" }, 1029{ "<p><b>V</b>: Todo view | <b>L</b>: Event list view</p>\n","<p><b>V</b>: Todo Ansicht | <b>L</b>: Termin Listen Ansicht</p>\n" },
1030{ "<p><b>X</b>: Next X days view| <b>W</b>: What's next view\n ","<p><b>X</b>: Nächste-X-Tage Ansicht | <b>W</b>: What's Next Ansicht\n " }, 1030{ "<p><b>X</b>: Next X days view| <b>W</b>: What's next view\n ","<p><b>X</b>: Nächste-X-Tage Ansicht | <b>W</b>: What's Next Ansicht\n " },
1031{ "<p><b>1-0</b> (+<b>ctrl</b>): Select filter 1-10 (11-20)</p>\n","<p><b>1-0</b> (+<b>ctrl</b>): Selektiere Filter 1-10 (11-20)</p>\n" }, 1031{ "<p><b>1-0</b> (+<b>ctrl</b>): Select filter 1-10 (11-20)</p>\n","<p><b>1-0</b> (+<b>ctrl</b>): Selektiere Filter 1-10 (11-20)</p>\n" },
1032{ "<p><b>O</b>: Filter On/Off | <b>J</b>: Journal view</p>\n","<p><b>O</b>: Filter An/Aus | <b>J</b>: Journal Ansicht</p>\n" }, 1032{ "<p><b>O</b>: Filter On/Off | <b>J</b>: Journal view</p>\n","<p><b>O</b>: Filter An/Aus | <b>J</b>: Journal Ansicht</p>\n" },
1033{ "<p><b>F</b>: Toggle filterview |<b>F+ctrl</b>: Edit filter </p>\n","<p><b>F</b>: Zeige/verstecke Filter Ansicht |<b>F+ctrl</b>: Editiere Filter </p>\n" }, 1033{ "<p><b>F</b>: Toggle filterview |<b>F+ctrl</b>: Edit filter </p>\n","<p><b>F</b>: Zeige/verstecke Filter Ansicht |<b>F+ctrl</b>: Editiere Filter </p>\n" },
1034{ "<p><b>Space</b>: Toggle fullscreen | <b>P</b>: Date picker</p>\n","<p><b>Space</b>: Zeige fullscreen | <b>P</b>: Datums Picker</p>\n" }, 1034{ "<p><b>Space</b>: Toggle fullscreen | <b>P</b>: Date picker</p>\n","<p><b>Space</b>: Zeige fullscreen | <b>P</b>: Datums Picker</p>\n" },
1035{ "<p><b>I</b>: Show info for selected event/todo</p>\n","<p><b>I</b>: Zeige Info (Details) für selektiertes Item</p>\n" }, 1035{ "<p><b>I</b>: Show info for selected event/todo</p>\n","<p><b>I</b>: Zeige Info (Details) für selektiertes Item</p>\n" },
1036{ "<p><b>H</b>: This help dialog | <b>S</b>: Search dialog</p>\n","<p><b>H</b>: Dieser Hilfe Dialog | <b>S</b>: Such Dialog</p>\n" }, 1036{ "<p><b>H</b>: This help dialog | <b>S</b>: Search dialog</p>\n","<p><b>H</b>: Dieser Hilfe Dialog | <b>S</b>: Such Dialog</p>\n" },
1037{ "<p><h2>KO/Pi key shortcuts:</h2></p>\n","<p><h2>KO/Pi Tastatur Kurzbefehle:</h2></p>\n" }, 1037{ "<p><h2>KO/Pi key shortcuts:</h2></p>\n","<p><h2>KO/Pi Tastatur Kurzbefehle:</h2></p>\n" },
1038{ "After changing something, the data is\nautomatically saved to the file\n~/kdepim/apps/korganizer/mycalendar.ics\nafter (configurable) three minutes.\nFor safety reasons there is one autosaving\nafter 10 minutes (of idle time) again. The \ndata is saved automatically when closing KO/Pi\nYou can create a backup file \nwith: File - Save Calendar Backup\n","Nachdem etwas geändert wurde, werden die\nDaten automatisch in die Datei abgespeichert\n~/kdepim/apps/korganizer/mycalendar.ics\nnach (konfigurierbar) drei Minuten.\nAus Sicherheitsgründen wird noch einmal\nnach 10 Min. abgespeichert, wenn keine\nÄnderungen vorgenommen wurden. Die \nDaten werden automatisch gespeichert,\nwenn KO/Pi beendet wird.\nSie können eine Backup-Datei erstellen im\nMenu: Datei - Speichere Kalender Backup\n" }, 1038{ "After changing something, the data is\nautomatically saved to the file\n~/kdepim/apps/korganizer/mycalendar.ics\nafter (configurable) three minutes.\nFor safety reasons there is one autosaving\nafter 10 minutes (of idle time) again. The \ndata is saved automatically when closing KO/Pi\nYou can create a backup file \nwith: File - Save Calendar Backup\n","Nachdem etwas geändert wurde, werden die\nDaten automatisch in die Datei abgespeichert\n~/kdepim/apps/korganizer/mycalendar.ics\nnach (konfigurierbar) drei Minuten.\nAus Sicherheitsgründen wird noch einmal\nnach 10 Min. abgespeichert, wenn keine\nÄnderungen vorgenommen wurden. Die \nDaten werden automatisch gespeichert,\nwenn KO/Pi beendet wird.\nSie können eine Backup-Datei erstellen im\nMenu: Datei - Speichere Kalender Backup\n" },
1039{ "Auto Saving in KOrganizer/Pi","Auto Speichern in KOrganizer/Pi" }, 1039{ "Auto Saving in KOrganizer/Pi","Auto Speichern in KOrganizer/Pi" },
1040{ "\nhttp://sourceforge.net/projects/kdepimpi\n","\nhttp://sourceforge.net/projects/kdepimpi\n" }, 1040{ "\nhttp://sourceforge.net/projects/kdepimpi\n","\nhttp://sourceforge.net/projects/kdepimpi\n" },
1041{ "\nor report them in the bugtracker on\n","\noder trage sie in dem Bugtracker ein auf\n" }, 1041{ "\nor report them in the bugtracker on\n","\noder trage sie in dem Bugtracker ein auf\n" },
1042{ "\nPlease report unexpected behaviour to\nlutz@pi-sync.info\n","\nBitte melde fehlerhaftes Verhalten an\nlutz@pi-sync.info\n" }, 1042{ "\nPlease report unexpected behaviour to\nlutz@pi-sync.info\n","\nBitte melde fehlerhaftes Verhalten an\nlutz@pi-sync.info\n" },
1043{ "2) Audio alarm daemon\nfor Zaurus is available!\nas an additional small application\n","2) Ein Audio Alarm Daemon\nfür den Zaurus ist verfügbar\nals zusätzliche Anwendung\n" }, 1043{ "2) Audio alarm daemon\nfor Zaurus is available!\nas an additional small application\n","2) Ein Audio Alarm Daemon\nfür den Zaurus ist verfügbar\nals zusätzliche Anwendung\n" },
1044{ "1) Importing *.vcs or *.ics files from\nother applications may not work properly,\nif there are events with properties\nKO/Pi does not support.\n","1) Importieren von *.vcs oder *.ics Dateien von\nanderen Anwendungen kann möglicherweise\n nicht richtig funktionieren,\nwenn die Termine Eigenschaften haben,\ndie KO/Pi nicht unterstützt.\n" }, 1044{ "1) Importing *.vcs or *.ics files from\nother applications may not work properly,\nif there are events with properties\nKO/Pi does not support.\n","1) Importieren von *.vcs oder *.ics Dateien von\nanderen Anwendungen kann möglicherweise\n nicht richtig funktionieren,\nwenn die Termine Eigenschaften haben,\ndie KO/Pi nicht unterstützt.\n" },
1045{ "Known Problems in KOrganizer/Pi","Bekannte Probleme in KOrganizer/Pi" }, 1045{ "Known Problems in KOrganizer/Pi","Bekannte Probleme in KOrganizer/Pi" },
1046{ "KO/Pi FAQ","KO/Pi FAQ" }, 1046{ "KO/Pi FAQ","KO/Pi FAQ" },
1047{ "PDA-Edition\nfor: Zaurus 5x00/7x0/860/3000/6000\n","PDA-Edition\nfür: Zaurus 5x00/7x0/860/3000/6000\n" }, 1047{ "PDA-Edition\nfor: Zaurus 5x00/7x0/860/3000/6000\n","PDA-Edition\nfür: Zaurus 5x00/7x0/860/3000/6000\n" },
1048{ "KOrganizer/Platform-independent\n","KOrganizer/Platform-independent\n" }, 1048{ "KOrganizer/Platform-independent\n","KOrganizer/Platform-independent\n" },
1049{ "About KOrganizer/Pi","Über KOrganizer/Pi" }, 1049{ "About KOrganizer/Pi","Über KOrganizer/Pi" },
1050{ "From: ","Von: " }, 1050{ "From: ","Von: " },
1051{ "Remove sync info","Entferne Sync Info" }, 1051{ "Remove sync info","Entferne Sync Info" },
1052{ "For all profiles","Für alle Profile" }, 1052{ "For all profiles","Für alle Profile" },
1053{ "Hide not Running","Verstecke nicht Laufende" }, 1053{ "Hide not Running","Verstecke nicht Laufende" },
1054{ "ME","ME" }, 1054{ "ME","ME" },
1055{ "Toolbar","Toolbar" }, 1055{ "Toolbar","Toolbar" },
1056{ "Undo Delete...","Löschen rückgängig machen..." }, 1056{ "Undo Delete...","Löschen rückgängig machen..." },
1057{ "Undo Delete","Löschen rückgängig machen" }, 1057{ "Undo Delete","Löschen rückgängig machen" },
1058{ "KDE Sync HowTo...","KDE Sync HowTo..." }, 1058{ "KDE Sync HowTo...","KDE Sync HowTo..." },
1059{ "Multi Sync HowTo...","Multi Sync HowTo..." }, 1059{ "Multi Sync HowTo...","Multi Sync HowTo..." },
1060{ "Januar","Januar" }, 1060{ "Januar","Januar" },
1061{ "KO/Pi Keys + Colors","KO/Pi Tasten + Farben" }, 1061{ "KO/Pi Keys + Colors","KO/Pi Tasten + Farben" },
1062{ "No Filter","Kein Filter" }, 1062{ "No Filter","Kein Filter" },
1063{ "Multiple Sync options","Multi Sync Optionen" }, 1063{ "Multiple Sync options","Multi Sync Optionen" },
1064{ "Sync algo options","Sync Ablauf Optionen" }, 1064{ "Sync algo options","Sync Ablauf Optionen" },
1065{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" }, 1065{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" },
1066{ "Incoming calendar filter:","Eingehender Kalender Filter:" }, 1066{ "Incoming calendar filter:","Eingehender Kalender Filter:" },
1067{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" }, 1067{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" },
1068{ "Write back options","Optionen zum Zurückschreiben" }, 1068{ "Write back options","Optionen zum Zurückschreiben" },
1069{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" }, 1069{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" },
1070{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" }, 1070{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" },
1071{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" }, 1071{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" },
1072{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" }, 1072{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" },
1073{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" }, 1073{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" },
1074{ "Time period","Zeitspanne" }, 1074{ "Time period","Zeitspanne" },
1075{ "From ","Von " }, 1075{ "From ","Von " },
1076{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " }, 1076{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " },
1077{ " weeks in the future "," Wochen in der Zukunft " }, 1077{ " weeks in the future "," Wochen in der Zukunft " },
1078{ "Profile kind specific settings","Profil Art abhängige Einstellungen" }, 1078{ "Profile kind specific settings","Profil Art abhängige Einstellungen" },
1079{ "Local temp file:","Lokale temp Datei:" }, 1079{ "Local temp file:","Lokale temp Datei:" },
1080{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" }, 1080{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" },
1081{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" }, 1081{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" },
1082{ "Language","Sprache" }, 1082{ "Language","Sprache" },
1083{ "Time Format","Zeit Format" }, 1083{ "Time Format","Zeit Format" },
1084{ "Time Zone","Zeit Zone" }, 1084{ "Time Zone","Zeit Zone" },
1085{ "%1 groups subscribed","%1 Guppen abboniert" }, 1085{ "%1 groups subscribed","%1 Guppen abboniert" },
1086{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" }, 1086{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" },
1087{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" }, 1087{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" },
1088{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" }, 1088{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" },
1089{ "Save settings","Speichere Einstellungen" }, 1089{ "Save settings","Speichere Einstellungen" },
1090{ "Save standard","Speichere Standard" }, 1090{ "Save standard","Speichere Standard" },
1091{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" }, 1091{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" },
1092{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" }, 1092{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" },
1093{ "Data storage path","Daten Speicherpfad" }, 1093{ "Data storage path","Daten Speicherpfad" },
1094{ "Language","Sprache" }, 1094{ "Language","Sprache" },
1095{ "Show time in agenda items","Zeige Zeit in Agenda Items" }, 1095{ "Show time in agenda items","Zeige Zeit in Agenda Items" },
1096{ "Color for Sundays + category "Holiday"","Farbe für Sonntags + Kategorie "Feiertag"" }, 1096{ "Color for Sundays + category "Holiday"","Farbe für Sonntags + Kategorie "Feiertag"" },
1097{ "Show events, that are done in \nWhat's Next view","Zeige abgelaufene Termine in\nWhat's Next Ansicht" }, 1097{ "Show events, that are done in \nWhat's Next view","Zeige abgelaufene Termine in\nWhat's Next Ansicht" },
1098{ "Hide not running Todos in To-do view","Verstecke nicht laufende Todos" }, 1098{ "Hide not running Todos in To-do view","Verstecke nicht laufende Todos" },
1099{ "+01:00 Europe/Oslo(CET)","+01:00 Europe/Oslo(CET)" }, 1099{ "+01:00 Europe/Oslo(CET)","+01:00 Europe/Oslo(CET)" },
1100{ "KO/Pi","KO/Pi" }, 1100{ "KO/Pi","KO/Pi" },
1101{ "There is nothing to undo!","Es gibt nichts zum\nRückgängigmachen!" }, 1101{ "There is nothing to undo!","Es gibt nichts zum\nRückgängigmachen!" },
1102{ "Recreating edit dialog. Please wait...","Recreating edit dialog. Please wait..." }, 1102{ "Recreating edit dialog. Please wait...","Recreating edit dialog. Please wait..." },
1103{ "Sound.Al.: ","Sound.Al.: " }, 1103{ "Sound.Al.: ","Sound.Al.: " },
1104{ "From: %1 To: %2 %3","Von: %1 Bis: %2 %3" }, 1104{ "From: %1 To: %2 %3","Von: %1 Bis: %2 %3" },
1105{ "Restore","Wiederherstellen" }, 1105{ "Restore","Wiederherstellen" },
1106{ "\nAre you sure you want\nto restore this?","\nMöchten Sie das wirklicht\nwiederherstellen?" }, 1106{ "\nAre you sure you want\nto restore this?","\nMöchten Sie das wirklicht\nwiederherstellen?" },
1107{ "% completed","% erledigt" }, 1107{ "% completed","% erledigt" },
1108{ "%d item(s) found.","%d Item(s) gefunden." }, 1108{ "%d item(s) found.","%d Item(s) gefunden." },
1109{ "Set complete","Setze auf erledigt" }, 1109{ "Set complete","Setze auf erledigt" },
1110{ "(cancelled)","(gecancelt)" }, 1110{ "(cancelled)","(gecancelt)" },
1111{ "Click on the week number to\nshow week in agenda view","Klicke auf die Wochennummer\num die Woche in der Agenda anzuzeigen" }, 1111{ "Click on the week number to\nshow week in agenda view","Klicke auf die Wochennummer\num die Woche in der Agenda anzuzeigen" },
1112{ " Local time "," Locale Zeit " }, 1112{ " Local time "," Locale Zeit " },
1113{ "Form2","Form2" }, 1113{ "Form2","Form2" },
1114{ "Filter enabled","Filter angeschaltet" }, 1114{ "Filter enabled","Filter angeschaltet" },
1115{ "Edit Filters","Ändere Filter" }, 1115{ "Edit Filters","Ändere Filter" },
1116{ "Print What's Next View...","Drucke What's Next Ansicht..." }, 1116{ "Print What's Next View...","Drucke What's Next Ansicht..." },
1117{ "Agenda","Agenda" }, 1117{ "Agenda","Agenda" },
1118{ " ("," (" }, 1118{ " ("," (" },
1119{ "<p><b>Due on:</b> %1</p>","<p><b>Fällig am:</b> %1</p>" }, 1119{ "<p><b>Due on:</b> %1</p>","<p><b>Fällig am:</b> %1</p>" },
1120{ "Print","Print" }, 1120{ "Print","Print" },
1121{ "&Setup Printer...","Drucker &Setup..." }, 1121{ "&Setup Printer...","Drucker &Setup..." },
1122{ "View Type","Zeige Typ" }, 1122{ "View Type","Zeige Typ" },
1123{ "Page &orientation:","Seiten Ausrichtung:" }, 1123{ "Page &orientation:","Seiten Ausrichtung:" },
1124{ "Use Default of Selected Style","Default des selektierten Stils" }, 1124{ "Use Default of Selected Style","Default des selektierten Stils" },
1125{ "Use Default Setting of Printer","Default Einstellung des Druckers" }, 1125{ "Use Default Setting of Printer","Default Einstellung des Druckers" },
1126{ "Portrait","Portrait" }, 1126{ "Portrait","Portrait" },
1127{ "Landscape","Landschaft" }, 1127{ "Landscape","Landschaft" },
1128{ "Print day","Drucke Tag" }, 1128{ "Print day","Drucke Tag" },
1129{ "CalPrintDay_Base","CalPrintDay_Base" }, 1129{ "CalPrintDay_Base","CalPrintDay_Base" },
1130{ "Date && Time Range","Datum && Zeitspanne" }, 1130{ "Date && Time Range","Datum && Zeitspanne" },
1131{ "&End date:","&Enddatum:" }, 1131{ "&End date:","&Enddatum:" },
1132{ "&Start date:","&Startdatum:" }, 1132{ "&Start date:","&Startdatum:" },
1133{ "Start &time:","Startzeit:" }, 1133{ "Start &time:","Startzeit:" },
1134{ "End ti&me:","Endzeit:" }, 1134{ "End ti&me:","Endzeit:" },
1135{ "E&xtend time range to include all events","Erweitere Zeitspanne um alle Termine einzuschliessen" }, 1135{ "E&xtend time range to include all events","Erweitere Zeitspanne um alle Termine einzuschliessen" },
1136{ "Include to&dos that are due on the printed day(s)","Inclusive To&dos, die an den selektierten Tagen fällig sind" }, 1136{ "Include to&dos that are due on the printed day(s)","Inclusive To&dos, die an den selektierten Tagen fällig sind" },
1137{ "Alt+D","Alt+D" }, 1137{ "Alt+D","Alt+D" },
1138{ "&Use colors","Nutze Farben" }, 1138{ "&Use colors","Nutze Farben" },
1139{ "Alt+U","Alt+U" }, 1139{ "Alt+U","Alt+U" },
1140{ "Print week","Drucke Woche" }, 1140{ "Print week","Drucke Woche" },
1141{ "CalPrintWeek_Base","CalPrintWeek_Base" }, 1141{ "CalPrintWeek_Base","CalPrintWeek_Base" },
1142{ "Use &colors","Nutze Farben" }, 1142{ "Use &colors","Nutze Farben" },
1143{ "Type of View","Typ der Ansicht" }, 1143{ "Type of View","Typ der Ansicht" },
1144{ "Print as &Filofax page","Drucke als &Filofax Seite" }, 1144{ "Print as &Filofax page","Drucke als &Filofax Seite" },
1145{ "Alt+F","Alt+F" }, 1145{ "Alt+F","Alt+F" },
1146{ "Print as &timetable view:","Drucke als Zeittabelle:" }, 1146{ "Print as &timetable view:","Drucke als Zeittabelle:" },
1147{ "Alt+T","Alt+T" }, 1147{ "Alt+T","Alt+T" },
1148{ "Print as split week view","Drucke als gesplittete Wochenansicht" }, 1148{ "Print as split week view","Drucke als gesplittete Wochenansicht" },
1149{ "Print month","Drucke Monat" }, 1149{ "Print month","Drucke Monat" },
1150{ "CalPrintMonth_Base","CalPrintMonth_Base" }, 1150{ "CalPrintMonth_Base","CalPrintMonth_Base" },
1151{ "&Start month:","&Startmonat:" }, 1151{ "&Start month:","&Startmonat:" },
1152{ "&End month:","&Endmonat:" }, 1152{ "&End month:","&Endmonat:" },
1153{ "Print week &numbers","Drucke Wochen Nummer(n)" }, 1153{ "Print week &numbers","Drucke Wochen Nummer(n)" },
1154{ "Print todos","Drucke Todos" }, 1154{ "Print todos","Drucke Todos" },
1155{ "CalPrintTodoConfig_Base","CalPrintTodoConfig_Base" }, 1155{ "CalPrintTodoConfig_Base","CalPrintTodoConfig_Base" },
1156{ "Include &description of the item","Inclusive Itembeschreibung" }, 1156{ "Include &description of the item","Inclusive Itembeschreibung" },
1157{ "Include d&ue date of the item","Inclusive Fälligkeitsdatum des Items" }, 1157{ "Include d&ue date of the item","Inclusive Fälligkeitsdatum des Items" },
1158{ "Include &priority of the item","Inclusive Priorität des Items" }, 1158{ "Include &priority of the item","Inclusive Priorität des Items" },
1159{ "Items to Print","Zu druckende Items" }, 1159{ "Items to Print","Zu druckende Items" },
1160{ "&From:","Von:" }, 1160{ "&From:","Von:" },
1161{ "&To:","Bis:" }, 1161{ "&To:","Bis:" },
1162{ "Print &all todo items","Drucke alle Todo Items" }, 1162{ "Print &all todo items","Drucke alle Todo Items" },
1163{ "Print only &uncompleted items","Drucke nur nicht erledigte Todos" }, 1163{ "Print only &uncompleted items","Drucke nur nicht erledigte Todos" },
1164{ "Only items due in the &range:","Nur Items in dem Zeitraum:" }, 1164{ "Only items due in the &range:","Nur Items in dem Zeitraum:" },
1165{ "Todo List","Todo Liste" }, 1165{ "Todo List","Todo Liste" },
1166{ "&Title:","&Titel:" }, 1166{ "&Title:","&Titel:" },
1167{ "Co&nnect subtodos with its parent","Verbinde Unter-Todos mit ihren Ober-Todos" }, 1167{ "Co&nnect subtodos with its parent","Verbinde Unter-Todos mit ihren Ober-Todos" },
1168{ "Todo list","Todo Liste" }, 1168{ "Todo list","Todo Liste" },
1169{ "&Print...","Drucke..." }, 1169{ "&Print...","Drucke..." },
1170{ "<qt>Printing on printer <b>%1</b></qt>","<qt>Drucke auf Drucker <b>%1</b></qt>" }, 1170{ "<qt>Printing on printer <b>%1</b></qt>","<qt>Drucke auf Drucker <b>%1</b></qt>" },
1171{ "[Unconfigured]","[Unkonfiguriert]" }, 1171{ "[Unconfigured]","[Unkonfiguriert]" },
1172{ "OK","OK" }, 1172{ "OK","OK" },
1173{ "FilterEditor","FilterEditor" }, 1173{ "FilterEditor","FilterEditor" },
1174{ "Include","Inclusive" }, 1174{ "Include","Inclusive" },
1175{ "Exclude","Exclusive" }, 1175{ "Exclude","Exclusive" },
1176{ "Edit Selection...","Editiere Auswahl" }, 1176{ "Edit Selection...","Editiere Auswahl" },
1177{ "recurring events","wiederholende Termine" }, 1177{ "recurring events","wiederholende Termine" },
1178{ "recurr. events","wiederh.Termine" }, 1178{ "recurr. events","wiederh.Termine" },
1179{ "completed to-dos","erledigte Todos" }, 1179{ "completed to-dos","erledigte Todos" },
1180{ "events","Termine" }, 1180{ "events","Termine" },
1181{ "todos","Todos" }, 1181{ "todos","Todos" },
1182{ "journals","Journale" }, 1182{ "journals","Journale" },
1183{ "public","öffentl." }, 1183{ "public","öffentl." },
1184{ "private","privat" }, 1184{ "private","privat" },
1185{ "confidential","vertraul." }, 1185{ "confidential","vertraul." },
1186{ "\nhas sub-todos.\nAll completed sub-todos\nwill be deleted as well!","\nhat Unter-Todos.\nAlle erledigten Unter-Todos\nwerden auch gelöscht!" }, 1186{ "\nhas sub-todos.\nAll completed sub-todos\nwill be deleted as well!","\nhat Unter-Todos.\nAlle erledigten Unter-Todos\nwerden auch gelöscht!" },
1187{ "Yesterday","Gestern" }, 1187{ "Yesterday","Gestern" },
1188{ "Day after tomorrow","Übermorgen" }, 1188{ "Day after tomorrow","Übermorgen" },
1189{ "Tomorrow","Morgen" }, 1189{ "Tomorrow","Morgen" },
1190{ "Day before yesterday","Vorgestern" }, 1190{ "Day before yesterday","Vorgestern" },
1191{ "Size %1","Größe %1" }, 1191{ "Size %1","Größe %1" },
1192{ "New Agendasize: %1","Neue Agendagröße: %1" }, 1192{ "New Agendasize: %1","Neue Agendagröße: %1" },
1193{ " (%1 y.)"," (%1 J.)" }, 1193{ " (%1 y.)"," (%1 J.)" },
1194{ "Allday:","Ganztägig:" }, 1194{ "Allday:","Ganztägig:" },
1195{ "compl.todos","erled.Todos" }, 1195{ "compl.todos","erled.Todos" },
1196{ "Day view","Tagesansicht" }, 1196{ "Day view","Tagesansicht" },
1197{ "Next days","Nächste Tage" }, 1197{ "Next days","Nächste Tage" },
1198{ "Next week","Nächste Woche" }, 1198{ "Next week","Nächste Woche" },
1199{ "Next two weeks","Nächste zwei Wochen" }, 1199{ "Next two weeks","Nächste zwei Wochen" },
1200{ "This month","Dieser Monat" }, 1200{ "This month","Dieser Monat" },
1201{ "Journal view","Journal" }, 1201{ "Journal view","Journal" },
1202{ "Display all opened","Zeige alle geöffnet" }, 1202{ "Display all opened","Zeige alle geöffnet" },
1203{ "Display all closed","Zeige alle geschlossen" }, 1203{ "Display all closed","Zeige alle geschlossen" },
1204{ "Display all flat","Zeige alle flach" }, 1204{ "Display all flat","Zeige alle flach" },
1205{ "<p><i>Completed on %1</i></p>","<p><i>Erledigt am %1</i></p>" }, 1205{ "<p><i>Completed on %1</i></p>","<p><i>Erledigt am %1</i></p>" },
1206{ "Default todo done color:","Standard Todo erledigt Farbe" }, 1206{ "Default todo done color:","Standard Todo erledigt Farbe" },
1207{ "Select week %1-%2","Wähle Woche %1-%2" }, 1207{ "Select week %1-%2","Wähle Woche %1-%2" },
1208{ "Select Week","Wähle Woche" }, 1208{ "Select Week","Wähle Woche" },
1209{ "Set alarm for selected...","Setze Alarm für Selekt..." }, 1209{ "Set alarm for selected...","Setze Alarm für Selekt..." },
1210{ "Set Alarm!","Setze Alarm!" }, 1210{ "Set Alarm!","Setze Alarm!" },
1211{ "Canged alarm for %1 items","Alarm für %1 Items geändert" }, 1211{ "Canged alarm for %1 items","Alarm für %1 Items geändert" },
1212{ " and "," und " }, 1212{ " and "," und " },
1213{ "<IMG src="%1"> only )","nur <IMG src="%1"> )" }, 1213{ "<IMG src="%1"> only )","nur <IMG src="%1"> )" },
1214{ "Mail to selected","Mail an Ausgewählte" }, 1214{ "Mail to selected","Mail an Ausgewählte" },
1215{ "Mail to all","Mail an Alle" }, 1215{ "Mail to all","Mail an Alle" },
1216{ "Week view mode uses bigger font","Wochenansicht Modus nutzt größeren Font" }, 1216{ "Week view mode uses bigger font","Wochenansicht Modus nutzt größeren Font" },
1217{ "Set reminder ON with offset to:","Alarm AN mit Offset auf:" }, 1217{ "Set reminder ON with offset to:","Alarm AN mit Offset auf:" },
1218{ " on"," am" }, 1218{ " on"," am" },
1219{ " completed on "," erledigt am " }, 1219{ " completed on "," erledigt am " },
1220{ "Save as Event template","Speichere als Vorlage" }, 1220{ "Save as Event template","Speichere als Vorlage" },
1221{ "Load Event template","Lade Termin Vorlage" }, 1221{ "Load Event template","Lade Termin Vorlage" },
1222{ "Save as Journal template","Speichere als Journal Vorlage" }, 1222{ "Save as Journal template","Speichere als Journal Vorlage" },
1223{ "Insert Journal template","Füge Journal Vorlage ein" }, 1223{ "Insert Journal template","Füge Journal Vorlage ein" },
1224{ "Sub todos:<br>","Unter Todos:<br>" }, 1224{ "Sub todos:<br>","Unter Todos:<br>" },
1225{ "Parent todo:<br>","Über Todo:<br>" }, 1225{ "Parent todo:<br>","Über Todo:<br>" },
1226{ "Set current as color category","Setze Gewählte als Farbkategorie" }, 1226{ "Set current as color category","Setze Gewählte als Farbkategorie" },
1227{ " completed"," erledigt" }, 1227{ " completed"," erledigt" },
1228{ "(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi is based on KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) and the KDE team.\nKOrganizer/Pi is licensed under the GPL.\nKO/Pi can be compiled for\nLinux, Zaurus-PDA and Windows\nwww.pi-sync.info --- www.korganizer.org\nSpecial thanks to Michael and Ben\nfor intensive testing!","(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi basiert auf KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) und das KDE Team.\nKOrganizer/Pi ist lizensiert unter der GPL.\nKO/Pi kann kompiliert werden für\nLinux, Zaurus-PDA und Windows\nwww.pi-sync.info --- www.korganizer.org\nBesonderen Dank an Michael und Ben\nfür intensives Testen!" }, 1228{ "(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi is based on KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) and the KDE team.\nKOrganizer/Pi is licensed under the GPL.\nKO/Pi can be compiled for\nLinux, Zaurus-PDA and Windows\nwww.pi-sync.info --- www.korganizer.org\nSpecial thanks to Michael and Ben\nfor intensive testing!","(c)2004 Lutz Rogowski (rogowski@kde.org)\nKO/Pi basiert auf KOrganizer\n(c)2002,2003 Cornelius Schumacher\n(schumacher@kde.org) und das KDE Team.\nKOrganizer/Pi ist lizensiert unter der GPL.\nKO/Pi kann kompiliert werden für\nLinux, Zaurus-PDA und Windows\nwww.pi-sync.info --- www.korganizer.org\nBesonderen Dank an Michael und Ben\nfür intensives Testen!" },
1229{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." }, 1229{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." },
1230{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." }, 1230{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." },
1231{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." }, 1231{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." },
1232{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" }, 1232{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" },
1233{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." }, 1233{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." },
1234{ "Error","Fehler" }, 1234{ "Error","Fehler" },
1235{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." }, 1235{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." },
1236{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." }, 1236{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." },
1237{ "Warning","Warnung" }, 1237{ "Warning","Warnung" },
1238{ "Select week number","Wähle Wochen Nummer" }, 1238{ "Select week number","Wähle Wochen Nummer" },
1239{ "Februar","Februar" }, 1239{ "Februar","Februar" },
1240{ "Click on the week number to\nshow week zoomed","Klicke auf die Wochennummer\num die Woche groß zu zeigen" }, 1240{ "Click on the week number to\nshow week zoomed","Klicke auf die Wochennummer\num die Woche groß zu zeigen" },
1241{ "W","W" }, 1241{ "W","W" },
1242{ "Click on this to\nselect week number","Klicke hierauf um\ndie Woche auszuwählen" }, 1242{ "Click on this to\nselect week number","Klicke hierauf um\ndie Woche auszuwählen" },
1243{ "T: %1","T: %1" }, 1243{ "T: %1","T: %1" },
1244{ "Start: ","Start: " }, 1244{ "Start: ","Start: " },
1245{ "Pi-Sync options for device: ","Pi-Sync Einstellungen für Gerät: " }, 1245{ "Pi-Sync options for device: ","Pi-Sync Einstellungen für Gerät: " },
1246{ "Password for remote access:","Passwort für fernen Zugriff:" }, 1246{ "Password for remote access:","Passwort für fernen Zugriff:" },
1247{ "Remote IP address:","Ferne IP Adresse:" }, 1247{ "Remote IP address:","Ferne IP Adresse:" },
1248{ "Remote port number:","Ferne Port Nummer:" }, 1248{ "Remote port number:","Ferne Port Nummer:" },
1249{ "Remote file saved to temp file.","Ferne Daten in temp Datei gespeichert." }, 1249{ "Remote file saved to temp file.","Ferne Daten in temp Datei gespeichert." },
1250{ "Remote from: ","Fern von: " }, 1250{ "Remote from: ","Fern von: " },
1251{ "Local from: ","Lokal von: " }, 1251{ "Local from: ","Lokal von: " },
1252{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n","Synchronisationsübersicht:\n\n %d lokal hinzugefügt\n %d fern hinzugefügt\n %d lokal geändert\n %d fern geändert\n %d lokal gelöscht\n %d fern gelöscht\n %d eingehende ausgefiltert\n %d ausgehende ausgefiltert\n" }, 1252{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n","Synchronisationsübersicht:\n\n %d lokal hinzugefügt\n %d fern hinzugefügt\n %d lokal geändert\n %d fern geändert\n %d lokal gelöscht\n %d fern gelöscht\n %d eingehende ausgefiltert\n %d ausgehende ausgefiltert\n" },
1253{ "Local calendar changed!\n","Lokaler Kalender geändert!\n" }, 1253{ "Local calendar changed!\n","Lokaler Kalender geändert!\n" },
1254{ "Write back","Schreibe zurück" }, 1254{ "Write back","Schreibe zurück" },
1255{ "KO/Pi Synchronization","KO/Pi Synchronisation" }, 1255{ "KO/Pi Synchronization","KO/Pi Synchronisation" },
1256{ "Pi-Sync succesful!","Pi-Sync erfolgreich!" }, 1256{ "Pi-Sync succesful!","Pi-Sync erfolgreich!" },
1257{ "Received sync request","Sync Anfrage erhalten" }, 1257{ "Received sync request","Sync Anfrage erhalten" },
1258{ "Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog.","Ferne Synchronisation ...\n\nBenutze diese Anwendung nicht!\n\nWenn das Syncen fehlschlägt kann\ndieser Dialog geschlossen werden." }, 1258{ "Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog.","Ferne Synchronisation ...\n\nBenutze diese Anwendung nicht!\n\nWenn das Syncen fehlschlägt kann\ndieser Dialog geschlossen werden." },
1259{ "Saving Data to temp file ...","Speichere Daten in temp Datei..." }, 1259{ "Saving Data to temp file ...","Speichere Daten in temp Datei..." },
1260{ "Data saved to temp file!","Daten in temp Datei gespeichert!" }, 1260{ "Data saved to temp file!","Daten in temp Datei gespeichert!" },
1261{ "Sending file...","Sende Datei..." }, 1261{ "Sending file...","Sende Datei..." },
1262{ "Waiting for synced file...","Warte auf gesyncte Daten..." }, 1262{ "Waiting for synced file...","Warte auf gesyncte Daten..." },
1263{ "Receiving synced file...","Gesyncte Daten erhalten..." }, 1263{ "Receiving synced file...","Gesyncte Daten erhalten..." },
1264{ "Received %1 bytes","%1 Bytes erhalten" }, 1264{ "Received %1 bytes","%1 Bytes erhalten" },
1265{ "Writing file to disk...","Speichere Datei..." }, 1265{ "Writing file to disk...","Speichere Datei..." },
1266{ "Pi-Sync successful!","Pi-Sync erfolgreich!" }, 1266{ "Pi-Sync successful!","Pi-Sync erfolgreich!" },
1267{ "Clock skew of\nsyncing devices\nis %1 seconds!","Uhrzeitunterschied der\nsyncenden Geräte\nist %1 Sekunden!" }, 1267{ "Clock skew of\nsyncing devices\nis %1 seconds!","Uhrzeitunterschied der\nsyncenden Geräte\nist %1 Sekunden!" },
1268{ "Synchronize!","Synchronisiere!" }, 1268{ "Synchronize!","Synchronisiere!" },
1269{ "High clock skew!","Großer Uhrzeitunterschied!" }, 1269{ "High clock skew!","Großer Uhrzeitunterschied!" },
1270{ "ADJUST\nYOUR\nCLOCKS!","JUSTIERE\nDIE\nUHREN!" }, 1270{ "ADJUST\nYOUR\nCLOCKS!","JUSTIERE\nDIE\nUHREN!" },
1271{ "The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!","Die Uhren der syncenden Geräte\nhaben einen Unterschied von\nmehr als 5 Minuten. Bitte die\nUhrzeiten anpassen. Sie können\nfalsche Sync-Resultate erhalten!\nBitte das Syncen bestätigen!" }, 1271{ "The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!","Die Uhren der syncenden Geräte\nhaben einen Unterschied von\nmehr als 5 Minuten. Bitte die\nUhrzeiten anpassen. Sie können\nfalsche Sync-Resultate erhalten!\nBitte das Syncen bestätigen!" },
1272{ "This is a %1 recurring todo.","Das ist eine %1 wiederholende Aufgabe." }, 1272{ "This is a %1 recurring todo.","Das ist eine %1 wiederholende Aufgabe." },
1273{ "<p><b>Start on:</b> %1</p>","<p><b>Start am:</b> %1</p>" }, 1273{ "<p><b>Start on:</b> %1</p>","<p><b>Start am:</b> %1</p>" },
1274{ "List week view","Listenwochenansicht" }, 1274{ "List week view","Listenwochenansicht" },
1275{ "List week","Listenwochenansicht" }, 1275{ "List week","Listenwochenansicht" },
1276{ "Next Week","Nächste Woche" }, 1276{ "Next Week","Nächste Woche" },
1277{ "Previous Week","Vorherige Woche" }, 1277{ "Previous Week","Vorherige Woche" },
1278{ "No items were found matching\nyour search expression.\nUse the wildcard characters\n'*' and '?' where needed.","Keine Einträge gefunden die\ndem Suchausdruck entsprechen.\nBenutze Platzhalter Zeichen\n'*' und '?' wo benötigt." }, 1278{ "No items were found matching\nyour search expression.\nUse the wildcard characters\n'*' and '?' where needed.","Keine Einträge gefunden die\ndem Suchausdruck entsprechen.\nBenutze Platzhalter Zeichen\n'*' und '?' wo benötigt." },
1279{ "Show in todo/event viewer:","Zeige in Termin/Todo Anzeige:" }, 1279{ "Show in todo/event viewer:","Zeige in Termin/Todo Anzeige:" },
1280{ "Details","Details" }, 1280{ "Details","Details" },
1281{ "Created time","Erstellt Zeit" }, 1281{ "Created time","Erstellt Zeit" },
1282{ "Last modified time","Geändert Zeit" }, 1282{ "Last modified time","Geändert Zeit" },
1283{ "Show in What'sThis quick overview:","Zeige in What'sThis Schnellübersicht:" }, 1283{ "Show in What'sThis quick overview:","Zeige in What'sThis Schnellübersicht:" },
1284{ "View Options","Anzeige Optionen" }, 1284{ "View Options","Anzeige Optionen" },
1285{ "<b>Created: ","<b>Erstellt am: " }, 1285{ "<b>Created: ","<b>Erstellt am: " },
1286{ "<b>Last modified: ","<b>Zuletzt geändert am: " }, 1286{ "<b>Last modified: ","<b>Zuletzt geändert am: " },
1287{ "Journal: ","Journal: " }, 1287{ "Journal: ","Journal: " },
1288{ "yearly","jährlich" }, 1288{ "yearly","jährlich" },
1289{ "(%1) ","%1-" }, 1289{ "(%1) ","%1-" },
1290{ "<p><b>K</b>: Week view in Month view syle</p>\n","<p><b>K</b>: Wochenansicht in Art der Monatsansicht</p>\n" }, 1290{ "<p><b>K</b>: Week view in Month view syle</p>\n","<p><b>K</b>: Wochenansicht in Art der Monatsansicht</p>\n" },
1291{ "Enable tooltips displaying summary of ev.","Titel-Tooltips anzeigen" }, 1291{ "Enable tooltips displaying summary of ev.","Titel-Tooltips anzeigen" },
1292{ "Enable scrollbars in month view cells","Scrollbar in Zellen anzeigen" }, 1292{ "Enable scrollbars in month view cells","Scrollbar in Zellen anzeigen" },
1293{ "Summary/Loc.","Titel/Ort" }, 1293{ "Summary/Loc.","Titel/Ort" },
1294{ "No items found. Use '*' and '?' where needed.","Nichts gefunden. Benutze '*' and '?' wo benötigt." }, 1294{ "No items found. Use '*' and '?' where needed.","Nichts gefunden. Benutze '*' and '?' wo benötigt." },
1295{ "Week Number","Wochennummer" }, 1295{ "Week Number","Wochennummer" },
1296{ "Import","Importiere" }, 1296{ "Import","Importiere" },
1297{ "Export","Exportiere" }, 1297{ "Export","Exportiere" },
1298{ "Beam","Beame" }, 1298{ "Beam","Beame" },
1299{ "Export selected","Exportiere Selektierte" }, 1299{ "Export selected","Exportiere Selektierte" },
1300{ "As iCal (ics) file...","Als iCal (ics) Datei..." }, 1300{ "As iCal (ics) file...","Als iCal (ics) Datei..." },
1301{ "As vCal (vcs) file...","Als vCal (vcs) Datei..." }, 1301{ "As vCal (vcs) file...","Als vCal (vcs) Datei..." },
1302{ "Journal/Details...","Journale/Details..." }, 1302{ "Journal/Details...","Journale/Details..." },
1303{ "Agenda View","Agenda Ansicht" }, 1303{ "Agenda View","Agenda Ansicht" },
1304{ "Show current time","Zeige aktuelle Zeit" }, 1304{ "Show current time","Zeige aktuelle Zeit" },
1305{ "Edit new item","Bearbeite neuen Eintrag" }, 1305{ "Edit new item","Bearbeite neuen Eintrag" },
1306{ "Please select at least one\nof the types to search for:\n\nEvents\nTodos\nJournals","Bitte wählen Sie mindestens\neinen dieser Typen\num darin zu suchen:\n\nTermine\nTodos\nJournale" }, 1306{ "Please select at least one\nof the types to search for:\n\nEvents\nTodos\nJournals","Bitte wählen Sie mindestens\neinen dieser Typen\num darin zu suchen:\n\nTermine\nTodos\nJournale" },
1307{ "There is no next alarm.","Es gibt keinen nächsten Alarm." }, 1307{ "There is no next alarm.","Es gibt keinen nächsten Alarm." },
1308{ "%1 %2 - %3 (next event/todo with alarm)","%1 %2 - %3 (nächster Termin/Todo mit Alarm)" }, 1308{ "%1 %2 - %3 (next event/todo with alarm)","%1 %2 - %3 (nächster Termin/Todo mit Alarm)" },
1309{ "The next alarm is in:\n","Der nächste Alarm ist in:\n" }, 1309{ "The next alarm is in:\n","Der nächste Alarm ist in:\n" },
1310{ "%1 days\n","%1 Tagen\n" }, 1310{ "%1 days\n","%1 Tagen\n" },
1311{ "1 day\n","1 Tag\n" }, 1311{ "1 day\n","1 Tag\n" },
1312{ "%1 hours\n","%1 Stunden\n" }, 1312{ "%1 hours\n","%1 Stunden\n" },
1313{ "1 hour\n","1 Stunde\n" }, 1313{ "1 hour\n","1 Stunde\n" },
1314{ "%1 minutes\n","%1 Minuten\n" }, 1314{ "%1 minutes\n","%1 Minuten\n" },
1315{ "1 minute\n","1 Minute\n" }, 1315{ "1 minute\n","1 Minute\n" },
1316{ "Only one toolbar","Nur eine Toolbar" }, 1316{ "Only one toolbar","Nur eine Toolbar" },
1317{ "Print","Drucke" }, 1317{ "Print","Drucke" },
1318{ "Print selected event / todo...","Drucke ausgewählten Termin / Todo..." }, 1318{ "Print selected event / todo...","Drucke ausgewählten Termin / Todo..." },
1319{ "There is nothing selected!","Es ist nichts ausgewählt!" }, 1319{ "There is nothing selected!","Es ist nichts ausgewählt!" },
1320{ "\n\nDo you really want to print this item?","\n\nMöchten Sie wirklich diesen Eintrag ausdrucken? " }, 1320{ "\n\nDo you really want to print this item?","\n\nMöchten Sie wirklich diesen Eintrag ausdrucken? " },
1321{ "KO/Pi Print Confirmation","KO/Pi Druckbestätigung" }, 1321{ "KO/Pi Print Confirmation","KO/Pi Druckbestätigung" },
1322{ "This prints the view as you see it.\n(With the complete content, of course.)\nYou may change the print layout by resizing the view.\nPrint unscaled may print several pages\ndepending on the amount of data.\nPrint scaled down will print all on one page.\nPrint scaled up/down will print all on one page,\nbut will scale up the text to page boundaries,\nif the text is smaller than the page.\nYou can select page geometry setup in the next dialog.\n","Dies druckt die Ansicht wie man sie sieht.\n(Mit dem kompletten Inhalt natürlich.)\nMan kann das Layout ändern durch ändern der Fenstergröße.\nDrucke unskaliert druckt ggf. mehrere Seiten\nabhängig von der Menge der Daten.\nDrucke runterskaliert um auf eine Seite zu passen\ndruckt alles auf eine Seite.\nDrucke hoch/runterskaliert um genau auf eine Seite zu passen\nvergrößert den Text gegebenenfalls.\nDas Seitenlayout kann im nächsten Dialog gewählt werden.\n" }, 1322{ "This prints the view as you see it.\n(With the complete content, of course.)\nYou may change the print layout by resizing the view.\nPrint unscaled may print several pages\ndepending on the amount of data.\nPrint scaled down will print all on one page.\nPrint scaled up/down will print all on one page,\nbut will scale up the text to page boundaries,\nif the text is smaller than the page.\nYou can select page geometry setup in the next dialog.\n","Dies druckt die Ansicht wie man sie sieht.\n(Mit dem kompletten Inhalt natürlich.)\nMan kann das Layout ändern durch ändern der Fenstergröße.\nDrucke unskaliert druckt ggf. mehrere Seiten\nabhängig von der Menge der Daten.\nDrucke runterskaliert um auf eine Seite zu passen\ndruckt alles auf eine Seite.\nDrucke hoch/runterskaliert um genau auf eine Seite zu passen\nvergrößert den Text gegebenenfalls.\nDas Seitenlayout kann im nächsten Dialog gewählt werden.\n" },
1323{ "KO/Pi Printout","KO/Pi Ausdruck" }, 1323{ "KO/Pi Printout","KO/Pi Ausdruck" },
1324{ "Print unscaled","Drucke unskaliert" }, 1324{ "Print unscaled","Drucke unskaliert" },
1325{ "Print scaled down to fit one page","Drucke runterskaliert um auf eine Seite zu passen." }, 1325{ "Print scaled down to fit one page","Drucke runterskaliert um auf eine Seite zu passen." },
1326{ "Print scaled up/down to fit one page","Drucke hoch/runterskaliert um genau auf eine Seite zu passen." }, 1326{ "Print scaled up/down to fit one page","Drucke hoch/runterskaliert um genau auf eine Seite zu passen." },
1327{ "Printout Mode","Druck Modus" }, 1327{ "Printout Mode","Druck Modus" },
1328{ "Filter menu icon","Filtermenu Icon" }, 1328{ "Filter menu icon","Filtermenu Icon" },
1329{ "<p><b>A+(shift or ctrl)</b>: Show occurence of next alarm</p>\n","<p><b>A+(shift oder ctrl)</b>: Zeige Zeit bis zum nächsten Alarm</p>\n" }, 1329{ "<p><b>A+(shift or ctrl)</b>: Show occurence of next alarm</p>\n","<p><b>A+(shift oder ctrl)</b>: Zeige Zeit bis zum nächsten Alarm</p>\n" },
1330{ "<p><b>N</b>: Switch to next view which has a toolbar icon</p>\n","<p><b>N</b>: Wechsle zur nächsten Ansicht, die ein Icon in der Toolbar hat</p>\n" }, 1330{ "<p><b>N</b>: Switch to next view which has a toolbar icon</p>\n","<p><b>N</b>: Wechsle zur nächsten Ansicht, die ein Icon in der Toolbar hat</p>\n" },
1331{ "%1d","%1t" },
1332{ "%1h","%1std" },
1333{ "%1min","%1min" },
1334{ "( %1 before )","( %1 vorher )" },
1331{ "","" }, 1335{ "","" },
1332{ "","" }, 1336{ "","" },
1333{ "","" }, 1337{ "","" },
1334{ "","" }, 1338{ "","" },
1335{ "","" }, 1339{ "","" },
1336{ "","" }, 1340{ "","" },
1337{ "","" }, 1341{ "","" },
1338{ "","" }, 1342{ "","" },
1339{ "","" }, 1343{ "","" } \ No newline at end of file
1340{ "","" },
1341{ "","" },
1342{ "","" },
1343{ "","" }, \ No newline at end of file
diff --git a/korganizer/koeventviewer.cpp b/korganizer/koeventviewer.cpp
index dbe0668..bdad248 100644
--- a/korganizer/koeventviewer.cpp
+++ b/korganizer/koeventviewer.cpp
@@ -1,761 +1,771 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18*/ 18*/
19 19
20#include <qcstring.h> 20#include <qcstring.h>
21#include <qwhatsthis.h> 21#include <qwhatsthis.h>
22#include <qdialog.h> 22#include <qdialog.h>
23#include <qapplication.h> 23#include <qapplication.h>
24#include <qlabel.h> 24#include <qlabel.h>
25#include <qlayout.h> 25#include <qlayout.h>
26 26
27#include <klocale.h> 27#include <klocale.h>
28#include <kapplication.h> 28#include <kapplication.h>
29#include <libkcal/event.h> 29#include <libkcal/event.h>
30#include <libkcal/todo.h> 30#include <libkcal/todo.h>
31#include <kdebug.h> 31#include <kdebug.h>
32#include <kiconloader.h> 32#include <kiconloader.h>
33#include <krun.h> 33#include <krun.h>
34#include <kglobal.h> 34#include <kglobal.h>
35#include <kprocess.h> 35#include <kprocess.h>
36#include "koprefs.h" 36#include "koprefs.h"
37 37
38#include <kabc/stdaddressbook.h> 38#include <kabc/stdaddressbook.h>
39 39
40#ifndef KORG_NODCOP 40#ifndef KORG_NODCOP
41#include <dcopclient.h> 41#include <dcopclient.h>
42#include "korganizer.h" 42#include "korganizer.h"
43#include "koprefs.h" 43#include "koprefs.h"
44#include "actionmanager.h" 44#include "actionmanager.h"
45#endif 45#endif
46 46
47#include "koeventviewer.h" 47#include "koeventviewer.h"
48//#ifndef KORG_NOKABC 48//#ifndef KORG_NOKABC
49//#include <kabc/stdaddressbook.h> 49//#include <kabc/stdaddressbook.h>
50//#define size count 50//#define size count
51//#endif 51//#endif
52 52
53#ifdef DESKTOP_VERSION 53#ifdef DESKTOP_VERSION
54#include <kabc/addresseedialog.h> 54#include <kabc/addresseedialog.h>
55#include <kabc/addresseeview.h> 55#include <kabc/addresseeview.h>
56#include <qprinter.h> 56#include <qprinter.h>
57#include <qpainter.h> 57#include <qpainter.h>
58#include <qpaintdevicemetrics.h> 58#include <qpaintdevicemetrics.h>
59#else //DESKTOP_VERSION 59#else //DESKTOP_VERSION
60#include <externalapphandler.h> 60#include <externalapphandler.h>
61#include <qtopia/qcopenvelope_qws.h> 61#include <qtopia/qcopenvelope_qws.h>
62#endif //DESKTOP_VERSION 62#endif //DESKTOP_VERSION
63 63
64KOEventViewer::KOEventViewer(QWidget *parent,const char *name) 64KOEventViewer::KOEventViewer(QWidget *parent,const char *name)
65 : QTextBrowser(parent,name) 65 : QTextBrowser(parent,name)
66{ 66{
67 mSyncMode = false; 67 mSyncMode = false;
68 mColorMode = 0; 68 mColorMode = 0;
69} 69}
70 70
71KOEventViewer::~KOEventViewer() 71KOEventViewer::~KOEventViewer()
72{ 72{
73} 73}
74 74
75void KOEventViewer::printMe() 75void KOEventViewer::printMe()
76{ 76{
77#ifdef DESKTOP_VERSION 77#ifdef DESKTOP_VERSION
78 78
79 KOPrintPrefs pp ( this ); 79 KOPrintPrefs pp ( this );
80 if (!pp.exec() ) 80 if (!pp.exec() )
81 return; 81 return;
82 int scaleval = pp.printMode() ; 82 int scaleval = pp.printMode() ;
83 83
84 QPrinter printer; 84 QPrinter printer;
85 if (!printer.setup() ) 85 if (!printer.setup() )
86 return; 86 return;
87 QPainter p; 87 QPainter p;
88 p.begin ( &printer ); 88 p.begin ( &printer );
89 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer ); 89 QPaintDeviceMetrics m = QPaintDeviceMetrics ( &printer );
90 float dx, dy; 90 float dx, dy;
91 int wid = (m.width() * 9)/10; 91 int wid = (m.width() * 9)/10;
92 dx = (float) wid/(float)contentsWidth (); 92 dx = (float) wid/(float)contentsWidth ();
93 dy = (float)(m.height()) / (float)contentsHeight (); 93 dy = (float)(m.height()) / (float)contentsHeight ();
94 float scale; 94 float scale;
95 // scale to fit the width or height of the paper 95 // scale to fit the width or height of the paper
96 if ( dx < dy ) 96 if ( dx < dy )
97 scale = dx; 97 scale = dx;
98 else 98 else
99 scale = dy; 99 scale = dy;
100 100
101 p.translate( m.width()/10,0 ); 101 p.translate( m.width()/10,0 );
102 qDebug("Scale: %f ", scale ); 102 qDebug("Scale: %f ", scale );
103 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) { 103 if ( scaleval == 2 || scaleval == 1 && scale < 1.0 ) {
104 qDebug("SCALE "); 104 qDebug("SCALE ");
105 p.scale( scale, scale ); 105 p.scale( scale, scale );
106 } 106 }
107 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () ); 107 drawContents ( &p, 0,0, contentsWidth (), contentsHeight () );
108 p.end(); 108 p.end();
109#endif 109#endif
110 110
111} 111}
112void KOEventViewer::setSource(const QString& n) 112void KOEventViewer::setSource(const QString& n)
113{ 113{
114 114
115 if ( n.left(3) == "uid" ) 115 if ( n.left(3) == "uid" )
116#ifdef DESKTOP_VERSION 116#ifdef DESKTOP_VERSION
117 { 117 {
118 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 118 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
119 KABC::AddressBook::Iterator it; 119 KABC::AddressBook::Iterator it;
120 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) { 120 for( it = AddressBook->begin(); it != AddressBook->end(); ++it ) {
121 // LR I do not understand, why the uid string is different on zaurus and desktop 121 // LR I do not understand, why the uid string is different on zaurus and desktop
122 QString uid = "uid://"+(*it).uid(); 122 QString uid = "uid://"+(*it).uid();
123 123
124 //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1()); 124 //qDebug("for *%s* +%s+ ", n.latin1(), uid.latin1());
125 if (n == uid ) { 125 if (n == uid ) {
126 //qDebug("found %s ",(*it).mobileHomePhone().latin1() ); 126 //qDebug("found %s ",(*it).mobileHomePhone().latin1() );
127 QDialog dia( this,"dia123", true ); 127 QDialog dia( this,"dia123", true );
128 dia.setCaption( i18n("Details of attendee") ); 128 dia.setCaption( i18n("Details of attendee") );
129 QVBoxLayout lay ( &dia ); 129 QVBoxLayout lay ( &dia );
130 KABC::AddresseeView av ( &dia ); 130 KABC::AddresseeView av ( &dia );
131 av.setAddressee( (*it) ); 131 av.setAddressee( (*it) );
132 lay.addWidget( &av ); 132 lay.addWidget( &av );
133 if ( QApplication::desktop()->width() < 480 ) 133 if ( QApplication::desktop()->width() < 480 )
134 dia.resize( 220, 240); 134 dia.resize( 220, 240);
135 else { 135 else {
136 dia.resize( 400,400); 136 dia.resize( 400,400);
137 } 137 }
138 dia.exec(); 138 dia.exec();
139 break; 139 break;
140 } 140 }
141 } 141 }
142 return; 142 return;
143 } 143 }
144#else 144#else
145 { 145 {
146 if ( "uid:organizer" == n ) { 146 if ( "uid:organizer" == n ) {
147 ExternalAppHandler::instance()->requestDetailsFromKAPI("", mCurrentIncidence->organizer(),""); 147 ExternalAppHandler::instance()->requestDetailsFromKAPI("", mCurrentIncidence->organizer(),"");
148 return; 148 return;
149 } 149 }
150 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 150 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
151 if (attendees.count()) { 151 if (attendees.count()) {
152 Attendee *a; 152 Attendee *a;
153 for(a=attendees.first();a;a=attendees.next()) { 153 for(a=attendees.first();a;a=attendees.next()) {
154 if ( "uid:"+a->uid() == n ) { 154 if ( "uid:"+a->uid() == n ) {
155 bool res = ExternalAppHandler::instance()->requestDetailsFromKAPI(a->name(), a->email(), a->uid()); 155 bool res = ExternalAppHandler::instance()->requestDetailsFromKAPI(a->name(), a->email(), a->uid());
156 return; 156 return;
157 } 157 }
158 } 158 }
159 } 159 }
160 return; 160 return;
161 } 161 }
162 //requestNameEmailUidListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/); 162 //requestNameEmailUidListFromKAPI("QPE/Application/kopi", this->name() /* name is here the unique uid*/);
163 // the result should now arrive through method insertAttendees 163 // the result should now arrive through method insertAttendees
164 //QString uid = "uid:"+(*it).uid(); 164 //QString uid = "uid:"+(*it).uid();
165#endif 165#endif
166 if ( n.left(6) == "mailto" ) { 166 if ( n.left(6) == "mailto" ) {
167 // qDebug("KOEventViewer::setSource %s ", n.mid(7).latin1()); 167 // qDebug("KOEventViewer::setSource %s ", n.mid(7).latin1());
168#ifndef DESKTOP_VERSION 168#ifndef DESKTOP_VERSION
169 if ( n.mid(7,3) == "ALL" ) { 169 if ( n.mid(7,3) == "ALL" ) {
170 qDebug("all "); 170 qDebug("all ");
171 mailToAttendees( true ); 171 mailToAttendees( true );
172 } else if ( n.mid(7,4) == "RSVP" ) { 172 } else if ( n.mid(7,4) == "RSVP" ) {
173 mailToAttendees( false ); 173 mailToAttendees( false );
174 qDebug("rsvp "); 174 qDebug("rsvp ");
175 } else { 175 } else {
176 QCopEnvelope e("QPE/Application/ompi", "newMail(QString)" ); 176 QCopEnvelope e("QPE/Application/ompi", "newMail(QString)" );
177 e << n.mid(7); 177 e << n.mid(7);
178 } 178 }
179#endif 179#endif
180 180
181 } 181 }
182 182
183 183
184#ifndef KORG_NODCOP 184#ifndef KORG_NODCOP
185 kdDebug() << "KOEventViewer::setSource(): " << n << endl; 185 kdDebug() << "KOEventViewer::setSource(): " << n << endl;
186 QString tmpStr; 186 QString tmpStr;
187 if (n.startsWith("mailto:")) { 187 if (n.startsWith("mailto:")) {
188 KApplication::kApplication()->invokeMailer(n.mid(7),QString::null); 188 KApplication::kApplication()->invokeMailer(n.mid(7),QString::null);
189 //emit showIncidence(n); 189 //emit showIncidence(n);
190 return; 190 return;
191 } else if (n.startsWith("uid:")) { 191 } else if (n.startsWith("uid:")) {
192 DCOPClient *client = KApplication::kApplication()->dcopClient(); 192 DCOPClient *client = KApplication::kApplication()->dcopClient();
193 const QByteArray noParamData; 193 const QByteArray noParamData;
194 const QByteArray paramData; 194 const QByteArray paramData;
195 QByteArray replyData; 195 QByteArray replyData;
196 QCString replyTypeStr; 196 QCString replyTypeStr;
197#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData)) 197#define PING_ABBROWSER (client->call("kaddressbook", "KAddressBookIface", "interfaces()", noParamData, replyTypeStr, replyData))
198 bool foundAbbrowser = PING_ABBROWSER; 198 bool foundAbbrowser = PING_ABBROWSER;
199 199
200 if (foundAbbrowser) { 200 if (foundAbbrowser) {
201 //KAddressbook is already running, so just DCOP to it to bring up the contact editor 201 //KAddressbook is already running, so just DCOP to it to bring up the contact editor
202 //client->send("kaddressbook","KAddressBookIface", 202 //client->send("kaddressbook","KAddressBookIface",
203 QDataStream arg(paramData, IO_WriteOnly); 203 QDataStream arg(paramData, IO_WriteOnly);
204 arg << n.mid(6); 204 arg << n.mid(6);
205 client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData); 205 client->send("kaddressbook", "KAddressBookIface", "showContactEditor( QString )", paramData);
206 return; 206 return;
207 } else { 207 } else {
208 /* 208 /*
209 KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater. 209 KaddressBook is not already running. Pass it the UID of the contact via the command line while starting it - its neater.
210 We start it without its main interface 210 We start it without its main interface
211 */ 211 */
212 KIconLoader* iconLoader = new KIconLoader(); 212 KIconLoader* iconLoader = new KIconLoader();
213 QString iconPath = iconLoader->iconPath("go",KIcon::Small); 213 QString iconPath = iconLoader->iconPath("go",KIcon::Small);
214 ActionManager::setStartedKAddressBook(true); 214 ActionManager::setStartedKAddressBook(true);
215 tmpStr = "kaddressbook --editor-only --uid "; 215 tmpStr = "kaddressbook --editor-only --uid ";
216 tmpStr += KProcess::quote(n.mid(6)); 216 tmpStr += KProcess::quote(n.mid(6));
217 KRun::runCommand(tmpStr,"KAddressBook",iconPath); 217 KRun::runCommand(tmpStr,"KAddressBook",iconPath);
218 return; 218 return;
219 } 219 }
220 } else { 220 } else {
221 //QTextBrowser::setSource(n); 221 //QTextBrowser::setSource(n);
222 } 222 }
223#endif 223#endif
224} 224}
225void KOEventViewer::mailToAttendees( bool all ) 225void KOEventViewer::mailToAttendees( bool all )
226{ 226{
227 QPtrList<Attendee> attendees = mCurrentIncidence->attendees(); 227 QPtrList<Attendee> attendees = mCurrentIncidence->attendees();
228 if (attendees.count() == 0) return; 228 if (attendees.count() == 0) return;
229 QStringList nameList; 229 QStringList nameList;
230 QStringList emailList; 230 QStringList emailList;
231 QStringList uidList; 231 QStringList uidList;
232 Attendee* a; 232 Attendee* a;
233 for(a=attendees.first();a;a=attendees.next()) { 233 for(a=attendees.first();a;a=attendees.next()) {
234 if ( !all && !a->RSVP() ) continue; 234 if ( !all && !a->RSVP() ) continue;
235 if (!a->email().isEmpty()) { 235 if (!a->email().isEmpty()) {
236 nameList.append (a->name() ); 236 nameList.append (a->name() );
237 emailList.append (a->email() ); 237 emailList.append (a->email() );
238 uidList.append (a->uid() ); 238 uidList.append (a->uid() );
239 } 239 }
240 } 240 }
241 QString uid = "ComposeMailUIpick2"+mMailSubject; 241 QString uid = "ComposeMailUIpick2"+mMailSubject;
242#ifndef DESKTOP_VERSION 242#ifndef DESKTOP_VERSION
243 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList); 243 bool res = ExternalAppHandler::instance()->returnNameEmailUidListFromKAPI("QPE/Application/ompi", uid, nameList, emailList, uidList);
244#endif 244#endif
245 245
246} 246}
247void KOEventViewer::addTag(const QString & tag,const QString & text) 247void KOEventViewer::addTag(const QString & tag,const QString & text)
248{ 248{
249 int number=text.contains("\n"); 249 int number=text.contains("\n");
250 QString str = "<" + tag + ">"; 250 QString str = "<" + tag + ">";
251 QString tmpText=text; 251 QString tmpText=text;
252 QString tmpStr=str; 252 QString tmpStr=str;
253 if(number !=-1) 253 if(number !=-1)
254 { 254 {
255 if (number > 0) { 255 if (number > 0) {
256 int pos=0; 256 int pos=0;
257 QString tmp; 257 QString tmp;
258 for(int i=0;i<=number;i++) { 258 for(int i=0;i<=number;i++) {
259 pos=tmpText.find("\n"); 259 pos=tmpText.find("\n");
260 tmp=tmpText.left(pos); 260 tmp=tmpText.left(pos);
261 tmpText=tmpText.right(tmpText.length()-pos-1); 261 tmpText=tmpText.right(tmpText.length()-pos-1);
262 tmpStr+=tmp+"<br>"; 262 tmpStr+=tmp+"<br>";
263 } 263 }
264 } 264 }
265 else tmpStr += tmpText; 265 else tmpStr += tmpText;
266 tmpStr+="</" + tag + ">"; 266 tmpStr+="</" + tag + ">";
267 mText.append(tmpStr); 267 mText.append(tmpStr);
268 } 268 }
269 else 269 else
270 { 270 {
271 str += text + "</" + tag + ">"; 271 str += text + "</" + tag + ">";
272 mText.append(str); 272 mText.append(str);
273 } 273 }
274} 274}
275 275
276void KOEventViewer::setColorMode( int m ) 276void KOEventViewer::setColorMode( int m )
277{ 277{
278 mColorMode = m; 278 mColorMode = m;
279} 279}
280void KOEventViewer::appendEvent(Event *event, int mode ) 280void KOEventViewer::appendEvent(Event *event, int mode )
281{ 281{
282 mMailSubject = ""; 282 mMailSubject = "";
283 mCurrentIncidence = event; 283 mCurrentIncidence = event;
284 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 284 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
285 topLevelWidget()->setCaption(i18n("Event Viewer")); 285 topLevelWidget()->setCaption(i18n("Event Viewer"));
286 if ( mode == 0 ) { 286 if ( mode == 0 ) {
287 addTag("h2",deTag(event->summary())); 287 addTag("h2",deTag(event->summary()));
288 } 288 }
289 else { 289 else {
290 if ( mColorMode == 1 ) { 290 if ( mColorMode == 1 ) {
291 mText +="<font color=\"#00A000\">"; 291 mText +="<font color=\"#00A000\">";
292 } 292 }
293 if ( mColorMode == 2 ) { 293 if ( mColorMode == 2 ) {
294 mText +="<font color=\"#C00000\">"; 294 mText +="<font color=\"#C00000\">";
295 } 295 }
296 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 296 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
297 if ( mode == 1 ) { 297 if ( mode == 1 ) {
298 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 298 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
299 } else { 299 } else {
300 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 300 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
301 } 301 }
302 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 302 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
303 if ( mColorMode ) 303 if ( mColorMode )
304 mText += "</font>"; 304 mText += "</font>";
305 } 305 }
306 mMailSubject += i18n( "Meeting " )+ event->summary(); 306 mMailSubject += i18n( "Meeting " )+ event->summary();
307 if (event->cancelled ()) { 307 if (event->cancelled ()) {
308 mText +="<font color=\"#B00000\">"; 308 mText +="<font color=\"#B00000\">";
309 addTag("i",i18n("This event has been cancelled!")); 309 addTag("i",i18n("This event has been cancelled!"));
310 mText.append("<br>"); 310 mText.append("<br>");
311 mText += "</font>"; 311 mText += "</font>";
312 mMailSubject += i18n("(cancelled)"); 312 mMailSubject += i18n("(cancelled)");
313 } 313 }
314 if (!event->location().isEmpty()) { 314 if (!event->location().isEmpty()) {
315 addTag("b",i18n("Location: ")); 315 addTag("b",i18n("Location: "));
316 mText.append(deTag(event->location())+"<br>"); 316 mText.append(deTag(event->location())+"<br>");
317 mMailSubject += i18n(" at ") + event->location(); 317 mMailSubject += i18n(" at ") + event->location();
318 } 318 }
319 if (event->doesFloat()) { 319 if (event->doesFloat()) {
320 if (event->isMultiDay()) { 320 if (event->isMultiDay()) {
321 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 321 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
322 .arg(event->dtStartDateStr(shortDate)) 322 .arg(event->dtStartDateStr(shortDate))
323 .arg(event->dtEndDateStr(shortDate))); 323 .arg(event->dtEndDateStr(shortDate)));
324 } else { 324 } else {
325 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 325 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
326 } 326 }
327 } else { 327 } else {
328 if (event->isMultiDay()) { 328 if (event->isMultiDay()) {
329 mText.append(i18n("<p><b>From:</b> %1</p> ") 329 mText.append(i18n("<p><b>From:</b> %1</p> ")
330 .arg(event->dtStartStr( shortDate))); 330 .arg(event->dtStartStr( shortDate)));
331 mText.append(i18n("<p><b>To:</b> %1</p>") 331 mText.append(i18n("<p><b>To:</b> %1</p>")
332 .arg(event->dtEndStr(shortDate))); 332 .arg(event->dtEndStr(shortDate)));
333 } else { 333 } else {
334 mText.append(i18n("<p><b>On:</b> %1</p> ") 334 mText.append(i18n("<p><b>On:</b> %1</p> ")
335 .arg(event->dtStartDateStr( shortDate ))); 335 .arg(event->dtStartDateStr( shortDate )));
336 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 336 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
337 .arg(event->dtStartTimeStr()) 337 .arg(event->dtStartTimeStr())
338 .arg(event->dtEndTimeStr())); 338 .arg(event->dtEndTimeStr()));
339 } 339 }
340 } 340 }
341 341
342 if (event->recurrence()->doesRecur()) { 342 if (event->recurrence()->doesRecur()) {
343 343
344 QString recurText = event->recurrence()->recurrenceText(); 344 QString recurText = event->recurrence()->recurrenceText();
345 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 345 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
346 bool ok; 346 bool ok;
347 QDate start = QDate::currentDate(); 347 QDate start = QDate::currentDate();
348 QDateTime next; 348 QDateTime next;
349 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok ); 349 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
350 if ( ok ) { 350 if ( ok ) {
351 addTag("p",i18n("<b>Next recurrence is on:</b>") ); 351 addTag("p",i18n("<b>Next recurrence is on:</b>") );
352 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate )); 352 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
353 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true ); 353 mMailSubject += i18n(" - " )+ KGlobal::locale()->formatDateTime( next, true );
354 354
355 } else { 355 } else {
356 bool last; 356 bool last;
357 QDate nextd; 357 QDate nextd;
358 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last ); 358 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
359 if ( last ) { 359 if ( last ) {
360 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 360 addTag("p",i18n("<b>Last recurrence was on:</b>") );
361 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate )); 361 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
362 } 362 }
363 } 363 }
364 } else { 364 } else {
365 mMailSubject += i18n(" - " )+event->dtStartStr( true ); 365 mMailSubject += i18n(" - " )+event->dtStartStr( true );
366 366
367 } 367 }
368 368
369 369
370 if (event->isAlarmEnabled()) { 370 if (event->isAlarmEnabled()) {
371 Alarm *alarm =event->alarms().first() ; 371 Alarm *alarm =event->alarms().first() ;
372 QDateTime t = alarm->time(); 372 QDateTime t = alarm->time();
373 int min = t.secsTo( event->dtStart() )/60; 373 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
374 QString s =i18n("( %1 min before )").arg( min );
375 addTag("p",i18n("<b>Alarm on: ") + s +" </b>"); 374 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
376 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 375 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
377 //addTag("p",s); 376 //addTag("p",s);
378 } 377 }
379 378
380 addTag("b",i18n("Access: ")); 379 addTag("b",i18n("Access: "));
381 mText.append(event->secrecyStr()+"<br>"); 380 mText.append(event->secrecyStr()+"<br>");
382 381
383 382
384 if ( KOPrefs::instance()->mEVshowDetails ) { 383 if ( KOPrefs::instance()->mEVshowDetails ) {
385 if (!event->description().isEmpty()) { 384 if (!event->description().isEmpty()) {
386 addTag("p",i18n("<b>Details: </b>")); 385 addTag("p",i18n("<b>Details: </b>"));
387 addTag("p",deTag(event->description())); 386 addTag("p",deTag(event->description()));
388 } 387 }
389 } 388 }
390 formatCategories(event); 389 formatCategories(event);
391 390
392 formatReadOnly(event); 391 formatReadOnly(event);
393 formatAttendees(event); 392 formatAttendees(event);
394 393
395 if ( KOPrefs::instance()->mEVshowCreated ) { 394 if ( KOPrefs::instance()->mEVshowCreated ) {
396 addTag("p",i18n("<b>Created: ") +" </b>"); 395 addTag("p",i18n("<b>Created: ") +" </b>");
397 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 396 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
398 397
399 } 398 }
400 if ( KOPrefs::instance()->mEVshowChanged ) { 399 if ( KOPrefs::instance()->mEVshowChanged ) {
401 addTag("p",i18n("<b>Last modified: ") +" </b>"); 400 addTag("p",i18n("<b>Last modified: ") +" </b>");
402 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 401 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
403 402
404 } 403 }
405 setText(mText); 404 setText(mText);
406 //QWhatsThis::add(this,mText); 405 //QWhatsThis::add(this,mText);
407 406
408} 407}
409 408
410void KOEventViewer::appendTodo(Todo *event, int mode ) 409void KOEventViewer::appendTodo(Todo *event, int mode )
411{ 410{
412 mMailSubject = ""; 411 mMailSubject = "";
413 mCurrentIncidence = event; 412 mCurrentIncidence = event;
414 topLevelWidget()->setCaption(i18n("Todo Viewer")); 413 topLevelWidget()->setCaption(i18n("Todo Viewer"));
415 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 414 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
416 if (mode == 0 ) 415 if (mode == 0 )
417 addTag("h2",deTag(event->summary())); 416 addTag("h2",deTag(event->summary()));
418 else { 417 else {
419 if ( mColorMode == 1 ) { 418 if ( mColorMode == 1 ) {
420 mText +="<font color=\"#00A000\">"; 419 mText +="<font color=\"#00A000\">";
421 } 420 }
422 if ( mColorMode == 2 ) { 421 if ( mColorMode == 2 ) {
423 mText +="<font color=\"#B00000\">"; 422 mText +="<font color=\"#B00000\">";
424 } 423 }
425 if ( mode == 1 ) { 424 if ( mode == 1 ) {
426 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 425 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
427 } else { 426 } else {
428 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 427 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
429 } 428 }
430 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 429 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
431 if ( mColorMode ) 430 if ( mColorMode )
432 mText += "</font>"; 431 mText += "</font>";
433 } 432 }
434 mMailSubject += i18n( "Todo " )+ event->summary(); 433 mMailSubject += i18n( "Todo " )+ event->summary();
435 434
436 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 435 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
437 mText +="<font color=\"#B00000\">"; 436 mText +="<font color=\"#B00000\">";
438 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) ); 437 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(KOPrefs::instance()->mShortDateInViewer) ) );
439 mText += "</font>"; 438 mText += "</font>";
440 } else { 439 } else {
441 mText.append(i18n("<p><i>%1 % completed</i></p>") 440 mText.append(i18n("<p><i>%1 % completed</i></p>")
442 .arg(event->percentComplete())); 441 .arg(event->percentComplete()));
443 } 442 }
444 443
445 if (event->cancelled ()) { 444 if (event->cancelled ()) {
446 mText +="<font color=\"#B00000\">"; 445 mText +="<font color=\"#B00000\">";
447 addTag("i",i18n("This todo has been cancelled!")); 446 addTag("i",i18n("This todo has been cancelled!"));
448 mText.append("<br>"); 447 mText.append("<br>");
449 mText += "</font>"; 448 mText += "</font>";
450 mMailSubject += i18n("(cancelled)"); 449 mMailSubject += i18n("(cancelled)");
451 } 450 }
452 451
453 if (!event->location().isEmpty()) { 452 if (!event->location().isEmpty()) {
454 addTag("b",i18n("Location: ")); 453 addTag("b",i18n("Location: "));
455 mText.append(deTag(event->location())+"<br>"); 454 mText.append(deTag(event->location())+"<br>");
456 mMailSubject += i18n(" at ") + event->location(); 455 mMailSubject += i18n(" at ") + event->location();
457 } 456 }
458 457
459 if (event->recurrence()->doesRecur()) { 458 if (event->recurrence()->doesRecur()) {
460 459
461 QString recurText = event->recurrence()->recurrenceText(); 460 QString recurText = event->recurrence()->recurrenceText();
462 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>"); 461 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>");
463 462
464 } 463 }
465 if (event->hasStartDate()) { 464 if (event->hasStartDate()) {
466 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer))); 465 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(KOPrefs::instance()->mShortDateInViewer)));
467 } 466 }
468 if (event->hasDueDate()) { 467 if (event->hasDueDate()) {
469 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer))); 468 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(KOPrefs::instance()->mShortDateInViewer)));
470 mMailSubject += i18n(" - " )+event->dtDueStr( true ); 469 mMailSubject += i18n(" - " )+event->dtDueStr( true );
471 } 470 }
471
472
473 if (event->isAlarmEnabled()) {
474 Alarm *alarm =event->alarms().first() ;
475 QDateTime t = alarm->time();
476 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
477 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
478 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
479 //addTag("p",s);
480 }
481
472 addTag("b",i18n("Access: ")); 482 addTag("b",i18n("Access: "));
473 mText.append(event->secrecyStr()+"<br>"); 483 mText.append(event->secrecyStr()+"<br>");
474 if ( KOPrefs::instance()->mEVshowDetails ) { 484 if ( KOPrefs::instance()->mEVshowDetails ) {
475 if (!event->description().isEmpty()) { 485 if (!event->description().isEmpty()) {
476 addTag("p",i18n("<b>Details: </b>")); 486 addTag("p",i18n("<b>Details: </b>"));
477 addTag("p",deTag(event->description())); 487 addTag("p",deTag(event->description()));
478 } 488 }
479 } 489 }
480 490
481 formatCategories(event); 491 formatCategories(event);
482 492
483 mText.append(i18n("<p><b>Priority:</b> %2</p>") 493 mText.append(i18n("<p><b>Priority:</b> %2</p>")
484 .arg(QString::number(event->priority()))); 494 .arg(QString::number(event->priority())));
485 495
486 formatReadOnly(event); 496 formatReadOnly(event);
487 formatAttendees(event); 497 formatAttendees(event);
488 if ( event->relatedTo() ) { 498 if ( event->relatedTo() ) {
489 addTag("b",i18n("Parent todo:<br>")); 499 addTag("b",i18n("Parent todo:<br>"));
490 mText.append(deTag(event->relatedTo()->summary())+" [" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] <br>"); 500 mText.append(deTag(event->relatedTo()->summary())+" [" +QString::number(event->relatedTo()->priority()) + "/" + QString::number(((Todo*)event->relatedTo())->percentComplete())+"%] <br>");
491 } 501 }
492 QPtrList<Incidence> Relations = event->relations(); 502 QPtrList<Incidence> Relations = event->relations();
493 Incidence *to; 503 Incidence *to;
494 if ( Relations.first() ) 504 if ( Relations.first() )
495 addTag("b",i18n("Sub todos:<br>")); 505 addTag("b",i18n("Sub todos:<br>"));
496 for (to=Relations.first();to;to=Relations.next()) { 506 for (to=Relations.first();to;to=Relations.next()) {
497 mText.append( deTag(to->summary())+" [" +QString::number(to->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%]<br>"); 507 mText.append( deTag(to->summary())+" [" +QString::number(to->priority()) + "/" + QString::number(((Todo*)to)->percentComplete())+"%]<br>");
498 508
499 } 509 }
500 if ( KOPrefs::instance()->mEVshowCreated ) { 510 if ( KOPrefs::instance()->mEVshowCreated ) {
501 addTag("p",i18n("<b>Created: ") +" </b>"); 511 addTag("p",i18n("<b>Created: ") +" </b>");
502 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 512 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
503 513
504 } 514 }
505 if ( KOPrefs::instance()->mEVshowChanged ) { 515 if ( KOPrefs::instance()->mEVshowChanged ) {
506 addTag("p",i18n("<b>Last modified: ") +" </b>"); 516 addTag("p",i18n("<b>Last modified: ") +" </b>");
507 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 517 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
508 518
509 } 519 }
510 setText(mText); 520 setText(mText);
511} 521}
512 522
513void KOEventViewer::formatCategories(Incidence *event) 523void KOEventViewer::formatCategories(Incidence *event)
514{ 524{
515 if (!event->categoriesStr().isEmpty()) { 525 if (!event->categoriesStr().isEmpty()) {
516 if (event->categories().count() == 1) { 526 if (event->categories().count() == 1) {
517 addTag("h3",i18n("Category")); 527 addTag("h3",i18n("Category"));
518 } else { 528 } else {
519 addTag("h3",i18n("Categories")); 529 addTag("h3",i18n("Categories"));
520 } 530 }
521 addTag("p",event->categoriesStr()); 531 addTag("p",event->categoriesStr());
522 } 532 }
523} 533}
524void KOEventViewer::formatAttendees(Incidence *event) 534void KOEventViewer::formatAttendees(Incidence *event)
525{ 535{
526 QPtrList<Attendee> attendees = event->attendees(); 536 QPtrList<Attendee> attendees = event->attendees();
527 if (attendees.count()) { 537 if (attendees.count()) {
528 538
529 539
530 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); 540 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small);
531 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small); 541 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small);
532 addTag("h3",i18n("Organizer")); 542 addTag("h3",i18n("Organizer"));
533 mText.append("<ul><li>"); 543 mText.append("<ul><li>");
534#ifndef KORG_NOKABC 544#ifndef KORG_NOKABC
535 545
536#ifdef DESKTOP_VERSION 546#ifdef DESKTOP_VERSION
537 KABC::AddressBook *add_book = KABC::StdAddressBook::self(); 547 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
538 KABC::Addressee::List addressList; 548 KABC::Addressee::List addressList;
539 addressList = add_book->findByEmail(event->organizer()); 549 addressList = add_book->findByEmail(event->organizer());
540 KABC::Addressee o = addressList.first(); 550 KABC::Addressee o = addressList.first();
541 if (!o.isEmpty() && addressList.size()<2) { 551 if (!o.isEmpty() && addressList.size()<2) {
542 mText += "<a href=\"uid:" + o.uid() + "\">"; 552 mText += "<a href=\"uid:" + o.uid() + "\">";
543 mText += o.formattedName(); 553 mText += o.formattedName();
544 mText += "</a>\n"; 554 mText += "</a>\n";
545 } else { 555 } else {
546 mText.append(event->organizer()); 556 mText.append(event->organizer());
547 } 557 }
548#else //DESKTOP_VERSION 558#else //DESKTOP_VERSION
549 mText += "<a href=\"uid:organizer\">"; 559 mText += "<a href=\"uid:organizer\">";
550 mText += event->organizer(); 560 mText += event->organizer();
551 mText += "</a>\n"; 561 mText += "</a>\n";
552#endif //DESKTOP_VERSION 562#endif //DESKTOP_VERSION
553 563
554 564
555#else 565#else
556 mText.append(event->organizer()); 566 mText.append(event->organizer());
557#endif 567#endif
558 568
559 if (iconPath) { 569 if (iconPath) {
560 mText += " <a href=\"mailto:" + event->organizer() + "\">"; 570 mText += " <a href=\"mailto:" + event->organizer() + "\">";
561 mText += "<IMG src=\"" + iconPath + "\">"; 571 mText += "<IMG src=\"" + iconPath + "\">";
562 mText += "</a>\n"; 572 mText += "</a>\n";
563 } 573 }
564 mText.append("</li></ul>"); 574 mText.append("</li></ul>");
565 575
566 addTag("h3",i18n("Attendees")); 576 addTag("h3",i18n("Attendees"));
567 Attendee *a; 577 Attendee *a;
568 mText.append("<ul>"); 578 mText.append("<ul>");
569 int a_count = 0; 579 int a_count = 0;
570 int a_count_nr = 0; 580 int a_count_nr = 0;
571 581
572 for(a=attendees.first();a;a=attendees.next()) { 582 for(a=attendees.first();a;a=attendees.next()) {
573#ifndef KORG_NOKABC 583#ifndef KORG_NOKABC
574#ifdef DESKTOP_VERSION 584#ifdef DESKTOP_VERSION
575 if (a->name().isEmpty()) { 585 if (a->name().isEmpty()) {
576 addressList = add_book->findByEmail(a->email()); 586 addressList = add_book->findByEmail(a->email());
577 KABC::Addressee o = addressList.first(); 587 KABC::Addressee o = addressList.first();
578 if (!o.isEmpty() && addressList.size()<2) { 588 if (!o.isEmpty() && addressList.size()<2) {
579 mText += "<a href=\"uid:" + o.uid() + "\">"; 589 mText += "<a href=\"uid:" + o.uid() + "\">";
580 mText += o.formattedName(); 590 mText += o.formattedName();
581 mText += "</a>\n"; 591 mText += "</a>\n";
582 } else { 592 } else {
583 mText += "<li>"; 593 mText += "<li>";
584 mText.append(a->email()); 594 mText.append(a->email());
585 mText += "\n"; 595 mText += "\n";
586 } 596 }
587 } else { 597 } else {
588 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 598 mText += "<li><a href=\"uid:" + a->uid() + "\">";
589 if (!a->name().isEmpty()) mText += a->name(); 599 if (!a->name().isEmpty()) mText += a->name();
590 else mText += a->email(); 600 else mText += a->email();
591 mText += "</a>\n"; 601 mText += "</a>\n";
592 } 602 }
593#else //DESKTOP_VERSION 603#else //DESKTOP_VERSION
594 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 604 mText += "<li><a href=\"uid:" + a->uid() + "\">";
595 if (!a->name().isEmpty()) mText += a->name(); 605 if (!a->name().isEmpty()) mText += a->name();
596 else mText += a->email(); 606 else mText += a->email();
597 mText += "</a>\n"; 607 mText += "</a>\n";
598#endif //DESKTOP_VERSION 608#endif //DESKTOP_VERSION
599#else 609#else
600 //qDebug("nokabc "); 610 //qDebug("nokabc ");
601 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 611 mText += "<li><a href=\"uid:" + a->uid() + "\">";
602 if (!a->name().isEmpty()) mText += a->name(); 612 if (!a->name().isEmpty()) mText += a->name();
603 else mText += a->email(); 613 else mText += a->email();
604 mText += "</a>\n"; 614 mText += "</a>\n";
605#endif 615#endif
606 616
607 617
608 if (!a->email().isEmpty()) { 618 if (!a->email().isEmpty()) {
609 if (iconPath) { 619 if (iconPath) {
610 mText += "<a href=\"mailto:" + a->name() +" <" + a->email() + ">:" + mMailSubject + "\">"; 620 mText += "<a href=\"mailto:" + a->name() +" <" + a->email() + ">:" + mMailSubject + "\">";
611 if ( a->RSVP() ) { 621 if ( a->RSVP() ) {
612 ++a_count_nr; 622 ++a_count_nr;
613 mText += "<IMG src=\"" + iconPath + "\">"; 623 mText += "<IMG src=\"" + iconPath + "\">";
614 } 624 }
615 else { 625 else {
616 ++a_count; 626 ++a_count;
617 mText += "<IMG src=\"" + NOiconPath + "\">"; 627 mText += "<IMG src=\"" + NOiconPath + "\">";
618 } 628 }
619 mText += "</a>\n"; 629 mText += "</a>\n";
620 } 630 }
621 } 631 }
622 if (a->status() != Attendee::NeedsAction ) 632 if (a->status() != Attendee::NeedsAction )
623 mText +="[" + a->statusStr() + "] "; 633 mText +="[" + a->statusStr() + "] ";
624 if (a->role() == Attendee::Chair ) 634 if (a->role() == Attendee::Chair )
625 mText +="(" + a->roleStr().left(1) + ".)"; 635 mText +="(" + a->roleStr().left(1) + ".)";
626 } 636 }
627 mText.append("</li></ul>"); 637 mText.append("</li></ul>");
628 if ( (a_count+a_count_nr) > 1 ) { 638 if ( (a_count+a_count_nr) > 1 ) {
629 mText += "<a href=\"mailto:ALL\">"; 639 mText += "<a href=\"mailto:ALL\">";
630 mText += i18n( "Mail to all" ); 640 mText += i18n( "Mail to all" );
631 mText += "</a> ( "; 641 mText += "</a> ( ";
632 mText += "<IMG src=\"" + iconPath + "\">"; 642 mText += "<IMG src=\"" + iconPath + "\">";
633 mText += i18n( " and " ); 643 mText += i18n( " and " );
634 mText += "<IMG src=\"" + NOiconPath + "\"> )"; 644 mText += "<IMG src=\"" + NOiconPath + "\"> )";
635 mText += "<br>\n"; 645 mText += "<br>\n";
636 646
637 647
638 } 648 }
639 if ( a_count_nr > 1 ) { 649 if ( a_count_nr > 1 ) {
640 mText += "<a href=\"mailto:RSVP\">"; 650 mText += "<a href=\"mailto:RSVP\">";
641 mText += i18n( "Mail to selected" ); 651 mText += i18n( "Mail to selected" );
642 mText += "</a> ( "; 652 mText += "</a> ( ";
643 mText += i18n( "<IMG src=\"%1\"> only )").arg ( iconPath ); 653 mText += i18n( "<IMG src=\"%1\"> only )").arg ( iconPath );
644 mText += "<br>\n"; 654 mText += "<br>\n";
645 } 655 }
646 } 656 }
647 657
648} 658}
649void KOEventViewer::appendJournal(Journal *jour, int mode ) 659void KOEventViewer::appendJournal(Journal *jour, int mode )
650{ 660{
651 bool shortDate = KOPrefs::instance()->mShortDateInViewer; 661 bool shortDate = KOPrefs::instance()->mShortDateInViewer;
652 if (mode == 0 ) { 662 if (mode == 0 ) {
653 addTag("h2",i18n("Journal from: ")); 663 addTag("h2",i18n("Journal from: "));
654 } 664 }
655 else { 665 else {
656 if ( mode == 1 ) { 666 if ( mode == 1 ) {
657 addTag("h2",i18n( "Local: " ) +i18n("Journal from: ")); 667 addTag("h2",i18n( "Local: " ) +i18n("Journal from: "));
658 } else { 668 } else {
659 addTag("h2",i18n( "Remote: " ) +i18n("Journal from: ")); 669 addTag("h2",i18n( "Remote: " ) +i18n("Journal from: "));
660 } 670 }
661 } 671 }
662 topLevelWidget()->setCaption("Journal Viewer"); 672 topLevelWidget()->setCaption("Journal Viewer");
663 mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer))); 673 mText.append(i18n("<h3> %1 </h3> ").arg(jour->dtStartDateStr(KOPrefs::instance()->mShortDateInViewer)));
664 addTag("b",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) ); 674 addTag("b",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(jour->lastModified(),shortDate ) );
665 if (!jour->description().isEmpty()) { 675 if (!jour->description().isEmpty()) {
666 addTag("p",deTag(jour->description())); 676 addTag("p",deTag(jour->description()));
667 } 677 }
668 setText(mText); 678 setText(mText);
669} 679}
670 680
671void KOEventViewer::formatReadOnly(Incidence *event) 681void KOEventViewer::formatReadOnly(Incidence *event)
672{ 682{
673 if (event->isReadOnly()) { 683 if (event->isReadOnly()) {
674 addTag("p","<em>(" + i18n("read-only") + ")</em>"); 684 addTag("p","<em>(" + i18n("read-only") + ")</em>");
675 } 685 }
676} 686}
677void KOEventViewer::setSyncMode( bool b ) 687void KOEventViewer::setSyncMode( bool b )
678{ 688{
679 mSyncMode = b; 689 mSyncMode = b;
680} 690}
681 691
682void KOEventViewer::setTodo(Todo *event, bool clearV ) 692void KOEventViewer::setTodo(Todo *event, bool clearV )
683{ 693{
684 if ( clearV ) 694 if ( clearV )
685 clearEvents(); 695 clearEvents();
686 if ( mSyncMode ) { 696 if ( mSyncMode ) {
687 if ( clearV ) 697 if ( clearV )
688 appendTodo(event,1 ); 698 appendTodo(event,1 );
689 else 699 else
690 appendTodo(event,2); 700 appendTodo(event,2);
691 } else 701 } else
692 appendTodo(event); 702 appendTodo(event);
693} 703}
694void KOEventViewer::setJournal(Journal *event, bool clearV ) 704void KOEventViewer::setJournal(Journal *event, bool clearV )
695{ 705{
696 if ( clearV ) 706 if ( clearV )
697 clearEvents(); 707 clearEvents();
698 if ( mSyncMode ) { 708 if ( mSyncMode ) {
699 if ( clearV ) 709 if ( clearV )
700 appendJournal(event, 1); 710 appendJournal(event, 1);
701 else 711 else
702 appendJournal(event, 2); 712 appendJournal(event, 2);
703 } else 713 } else
704 appendJournal(event); 714 appendJournal(event);
705} 715}
706 716
707void KOEventViewer::setEvent(Event *event) 717void KOEventViewer::setEvent(Event *event)
708{ 718{
709 clearEvents(); 719 clearEvents();
710 if ( mSyncMode ) 720 if ( mSyncMode )
711 appendEvent(event, 1); 721 appendEvent(event, 1);
712 else 722 else
713 appendEvent(event); 723 appendEvent(event);
714} 724}
715 725
716void KOEventViewer::addEvent(Event *event) 726void KOEventViewer::addEvent(Event *event)
717{ 727{
718 if ( mSyncMode ) 728 if ( mSyncMode )
719 appendEvent(event, 2); 729 appendEvent(event, 2);
720 else 730 else
721 appendEvent(event); 731 appendEvent(event);
722} 732}
723 733
724void KOEventViewer::clearEvents(bool now) 734void KOEventViewer::clearEvents(bool now)
725{ 735{
726 mText = ""; 736 mText = "";
727 if (now) setText(mText); 737 if (now) setText(mText);
728} 738}
729 739
730void KOEventViewer::addText(QString text) 740void KOEventViewer::addText(QString text)
731{ 741{
732 mText.append(text); 742 mText.append(text);
733 setText(mText); 743 setText(mText);
734} 744}
735QString KOEventViewer::deTag(QString text) 745QString KOEventViewer::deTag(QString text)
736{ 746{
737#if QT_VERSION >= 0x030000 747#if QT_VERSION >= 0x030000
738 text.replace( '<' , "&lt;" ); 748 text.replace( '<' , "&lt;" );
739 text.replace( '>' , "&gt;" ); 749 text.replace( '>' , "&gt;" );
740#else 750#else
741 if ( text.find ('<') >= 0 ) { 751 if ( text.find ('<') >= 0 ) {
742 text.replace( QRegExp("<") , "&lt;" ); 752 text.replace( QRegExp("<") , "&lt;" );
743 } 753 }
744 if ( text.find ('>') >= 0 ) { 754 if ( text.find ('>') >= 0 ) {
745 text.replace( QRegExp(">") , "&gt;" ); 755 text.replace( QRegExp(">") , "&gt;" );
746 } 756 }
747#endif 757#endif
748 return text; 758 return text;
749} 759}
750void KOEventViewer::keyPressEvent ( QKeyEvent * e ) 760void KOEventViewer::keyPressEvent ( QKeyEvent * e )
751{ 761{
752 switch ( e->key() ) { 762 switch ( e->key() ) {
753 case Qt::Key_Return: 763 case Qt::Key_Return:
754 case Qt::Key_Enter : 764 case Qt::Key_Enter :
755 e->ignore(); 765 e->ignore();
756 break; 766 break;
757 default: 767 default:
758 QTextBrowser::keyPressEvent ( e ); 768 QTextBrowser::keyPressEvent ( e );
759 break; 769 break;
760 } 770 }
761} 771}
diff --git a/korganizer/kolistview.cpp b/korganizer/kolistview.cpp
index 15e094d..e0e138e 100644
--- a/korganizer/kolistview.cpp
+++ b/korganizer/kolistview.cpp
@@ -1,542 +1,550 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 1999 Preston Brown 3 Copyright (c) 1999 Preston Brown
4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This program is free software; you can redistribute it and/or modify 6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by 7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or 8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version. 9 (at your option) any later version.
10 10
11 This program is distributed in the hope that it will be useful, 11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details. 14 GNU General Public License for more details.
15 15
16 You should have received a copy of the GNU General Public License 16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software 17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 19
20 As a special exception, permission is given to link this program 20 As a special exception, permission is given to link this program
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source code for Qt in the source distribution. 22 without including the source code for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qlistview.h> 25#include <qlistview.h>
26#include <qlayout.h> 26#include <qlayout.h>
27#include <qlabel.h> 27#include <qlabel.h>
28#include <qpopupmenu.h> 28#include <qpopupmenu.h>
29#include <qprogressbar.h> 29#include <qprogressbar.h>
30#include <qfileinfo.h> 30#include <qfileinfo.h>
31#include <qmessagebox.h> 31#include <qmessagebox.h>
32#include <qdialog.h> 32#include <qdialog.h>
33#include <qtextstream.h> 33#include <qtextstream.h>
34#include <qdir.h> 34#include <qdir.h>
35#include <qwhatsthis.h> 35#include <qwhatsthis.h>
36#include <qregexp.h> 36#include <qregexp.h>
37 37
38#include <klocale.h> 38#include <klocale.h>
39#include <kdebug.h> 39#include <kdebug.h>
40#include <kiconloader.h> 40#include <kiconloader.h>
41#include <kglobal.h> 41#include <kglobal.h>
42 42
43#include <libkdepim/kpimglobalprefs.h> 43#include <libkdepim/kpimglobalprefs.h>
44#include <libkcal/calendar.h> 44#include <libkcal/calendar.h>
45#include <libkcal/calendarlocal.h> 45#include <libkcal/calendarlocal.h>
46#include <libkcal/icalformat.h> 46#include <libkcal/icalformat.h>
47#include <libkcal/vcalformat.h> 47#include <libkcal/vcalformat.h>
48#include <libkcal/recurrence.h> 48#include <libkcal/recurrence.h>
49#include <libkcal/filestorage.h> 49#include <libkcal/filestorage.h>
50#include <libkdepim/categoryselectdialog.h> 50#include <libkdepim/categoryselectdialog.h>
51#include <libkcal/kincidenceformatter.h> 51#include <libkcal/kincidenceformatter.h>
52#ifndef DESKTOP_VERSION 52#ifndef DESKTOP_VERSION
53#include <qpe/qpeapplication.h> 53#include <qpe/qpeapplication.h>
54#else 54#else
55#include <qapplication.h> 55#include <qapplication.h>
56#endif 56#endif
57 57
58#ifndef KORG_NOPRINTER 58#ifndef KORG_NOPRINTER
59#include "calprinter.h" 59#include "calprinter.h"
60#endif 60#endif
61#include "koglobals.h" 61#include "koglobals.h"
62#include "koprefs.h" 62#include "koprefs.h"
63#include "kfiledialog.h" 63#include "kfiledialog.h"
64 64
65#include "kolistview.h" 65#include "kolistview.h"
66 66
67 67
68 68
69 69
70class KOListViewWhatsThis :public QWhatsThis 70class KOListViewWhatsThis :public QWhatsThis
71{ 71{
72public: 72public:
73 KOListViewWhatsThis( QWidget *wid, KOListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; 73 KOListViewWhatsThis( QWidget *wid, KOListView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { };
74 74
75protected: 75protected:
76 virtual QString text( const QPoint& p) 76 virtual QString text( const QPoint& p)
77 { 77 {
78 return _view->getWhatsThisText(p) ; 78 return _view->getWhatsThisText(p) ;
79 } 79 }
80private: 80private:
81 QWidget* _wid; 81 QWidget* _wid;
82 KOListView * _view; 82 KOListView * _view;
83}; 83};
84 84
85 85
86ListItemVisitor::ListItemVisitor(KOListViewItem *item, QDate date ) 86ListItemVisitor::ListItemVisitor(KOListViewItem *item, QDate date )
87{ 87{
88 mItem = item; 88 mItem = item;
89 mDate = date; 89 mDate = date;
90} 90}
91 91
92ListItemVisitor::~ListItemVisitor() 92ListItemVisitor::~ListItemVisitor()
93{ 93{
94} 94}
95 95
96bool ListItemVisitor::visit(Event *e) 96bool ListItemVisitor::visit(Event *e)
97{ 97{
98 98
99 bool ok = false; 99 bool ok = false;
100 QString start, end; 100 QString start, end;
101 QDate ds, de; 101 QDate ds, de;
102 if ( e->doesRecur() ) { 102 if ( e->doesRecur() ) {
103 ds = e->getNextOccurence( QDateTime( mDate, QTime(0,0,0)), &ok ).date(); 103 ds = e->getNextOccurence( QDateTime( mDate, QTime(0,0,0)), &ok ).date();
104 if ( ok ) { 104 if ( ok ) {
105 int days = e->dtStart().date().daysTo(e->dtEnd().date() ); 105 int days = e->dtStart().date().daysTo(e->dtEnd().date() );
106 start = KGlobal::locale()->formatDate(ds,true); 106 start = KGlobal::locale()->formatDate(ds,true);
107 de = ds.addDays( days); 107 de = ds.addDays( days);
108 end = KGlobal::locale()->formatDate(de,true); 108 end = KGlobal::locale()->formatDate(de,true);
109 } 109 }
110 110
111 } 111 }
112 if ( ! ok ) { 112 if ( ! ok ) {
113 start =e->dtStartDateStr(); 113 start =e->dtStartDateStr();
114 end = e->dtEndDateStr(); 114 end = e->dtEndDateStr();
115 ds = e->dtStart().date(); 115 ds = e->dtStart().date();
116 de = e->dtEnd().date(); 116 de = e->dtEnd().date();
117 } 117 }
118 mItem->setText(0,e->summary()); 118 mItem->setText(0,e->summary());
119 mItem->setText(1,start); 119 mItem->setText(1,start);
120 mItem->setText(2,e->dtStartTimeStr()); 120 mItem->setText(2,e->dtStartTimeStr());
121 mItem->setText(3,end); 121 mItem->setText(3,end);
122 mItem->setText(4,e->dtEndTimeStr()); 122 mItem->setText(4,e->dtEndTimeStr());
123 mItem->setText(5,e->isAlarmEnabled() ? i18n("Yes") : i18n("No")); 123 if ( e->isAlarmEnabled() ) {
124 mItem->setText(5,e->alarms().first()->offsetText() );
125 } else {
126 mItem->setText(5, i18n("No"));
127 }
124 mItem->setText(6, e->recurrence()->recurrenceText()); 128 mItem->setText(6, e->recurrence()->recurrenceText());
125 mItem->setText(7,"---"); 129 mItem->setText(7,"---");
126 mItem->setText(8,"---"); 130 mItem->setText(8,"---");
127 mItem->setText(9, e->cancelled() ? i18n("Yes") : i18n("No")); 131 mItem->setText(9, e->cancelled() ? i18n("Yes") : i18n("No"));
128 mItem->setText(10,e->categoriesStr()); 132 mItem->setText(10,e->categoriesStr());
129 133
130 QString key; 134 QString key;
131 QTime t = e->doesFloat() ? QTime(0,0) : e->dtStart().time(); 135 QTime t = e->doesFloat() ? QTime(0,0) : e->dtStart().time();
132 key.sprintf("%04d%02d%02d%02d%02d",ds.year(),ds.month(),ds.day(),t.hour(),t.minute()); 136 key.sprintf("%04d%02d%02d%02d%02d",ds.year(),ds.month(),ds.day(),t.hour(),t.minute());
133 mItem->setSortKey(1,key); 137 mItem->setSortKey(1,key);
134 138
135 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time(); 139 t = e->doesFloat() ? QTime(0,0) : e->dtEnd().time();
136 key.sprintf("%04d%02d%02d%02d%02d",de.year(),de.month(),de.day(),t.hour(),t.minute()); 140 key.sprintf("%04d%02d%02d%02d%02d",de.year(),de.month(),de.day(),t.hour(),t.minute());
137 mItem->setSortKey(3,key); 141 mItem->setSortKey(3,key);
138 142
139 return true; 143 return true;
140} 144}
141 145
142bool ListItemVisitor::visit(Todo *t) 146bool ListItemVisitor::visit(Todo *t)
143{ 147{
144 mItem->setText(0,i18n("Todo: %1").arg(t->summary())); 148 mItem->setText(0,i18n("Todo: %1").arg(t->summary()));
145 if (t->hasStartDate()) { 149 if (t->hasStartDate()) {
146 mItem->setText(1,t->dtStartDateStr()); 150 mItem->setText(1,t->dtStartDateStr());
147 if (t->doesFloat()) { 151 if (t->doesFloat()) {
148 mItem->setText(2,"---"); 152 mItem->setText(2,"---");
149 } else { 153 } else {
150 mItem->setText(2,t->dtStartTimeStr()); 154 mItem->setText(2,t->dtStartTimeStr());
151 } 155 }
152 } else { 156 } else {
153 mItem->setText(1,"---"); 157 mItem->setText(1,"---");
154 mItem->setText(2,"---"); 158 mItem->setText(2,"---");
155 } 159 }
156 mItem->setText(3,"---"); 160 mItem->setText(3,"---");
157 mItem->setText(4,"---"); 161 mItem->setText(4,"---");
158 mItem->setText(5,t->isAlarmEnabled() ? i18n("Yes") : i18n("No")); 162 if ( t->isAlarmEnabled() ) {
163 mItem->setText(5,t->alarms().first()->offsetText() );
164 } else {
165 mItem->setText(5, i18n("No"));
166 }
159 mItem->setText(6, t->recurrence()->recurrenceText()); 167 mItem->setText(6, t->recurrence()->recurrenceText());
160 if (t->hasDueDate()) { 168 if (t->hasDueDate()) {
161 mItem->setText(7,t->dtDueDateStr()); 169 mItem->setText(7,t->dtDueDateStr());
162 if (t->doesFloat()) { 170 if (t->doesFloat()) {
163 mItem->setText(8,"---"); 171 mItem->setText(8,"---");
164 } else { 172 } else {
165 mItem->setText(8,t->dtDueTimeStr()); 173 mItem->setText(8,t->dtDueTimeStr());
166 } 174 }
167 } else { 175 } else {
168 mItem->setText(7,"---"); 176 mItem->setText(7,"---");
169 mItem->setText(8,"---"); 177 mItem->setText(8,"---");
170 } 178 }
171 mItem->setText(9, t->cancelled() ? i18n("Yes") : i18n("No")); 179 mItem->setText(9, t->cancelled() ? i18n("Yes") : i18n("No"));
172 mItem->setText(10,t->categoriesStr()); 180 mItem->setText(10,t->categoriesStr());
173 181
174 QString key; 182 QString key;
175 QDate d; 183 QDate d;
176 if (t->hasDueDate()) { 184 if (t->hasDueDate()) {
177 d = t->dtDue().date(); 185 d = t->dtDue().date();
178 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time(); 186 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtDue().time();
179 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute()); 187 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
180 mItem->setSortKey(7,key); 188 mItem->setSortKey(7,key);
181 } 189 }
182 if ( t->hasStartDate() ) { 190 if ( t->hasStartDate() ) {
183 d = t->dtStart().date(); 191 d = t->dtStart().date();
184 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtStart().time(); 192 QTime tm = t->doesFloat() ? QTime(0,0) : t->dtStart().time();
185 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute()); 193 key.sprintf("%04d%02d%02d%02d%02d",d.year(),d.month(),d.day(),tm.hour(),tm.minute());
186 mItem->setSortKey(1,key); 194 mItem->setSortKey(1,key);
187 } 195 }
188 return true; 196 return true;
189} 197}
190 198
191bool ListItemVisitor::visit(Journal * j) 199bool ListItemVisitor::visit(Journal * j)
192{ 200{
193 QString des = j->description().left(30); 201 QString des = j->description().left(30);
194 des = des.simplifyWhiteSpace (); 202 des = des.simplifyWhiteSpace ();
195 des.replace (QRegExp ("\\n"),"" ); 203 des.replace (QRegExp ("\\n"),"" );
196 des.replace (QRegExp ("\\r"),"" ); 204 des.replace (QRegExp ("\\r"),"" );
197 mItem->setText(0,i18n("Journal: ")+des.left(25)); 205 mItem->setText(0,i18n("Journal: ")+des.left(25));
198 mItem->setText(1,j->dtStartDateStr()); 206 mItem->setText(1,j->dtStartDateStr());
199 mItem->setText(2,"---"); 207 mItem->setText(2,"---");
200 mItem->setText(3,"---"); 208 mItem->setText(3,"---");
201 mItem->setText(4,"---"); 209 mItem->setText(4,"---");
202 mItem->setText(5,"---"); 210 mItem->setText(5,"---");
203 mItem->setText(6,"---"); 211 mItem->setText(6,"---");
204 mItem->setText(7,j->dtStartDateStr()); 212 mItem->setText(7,j->dtStartDateStr());
205 mItem->setText(8,"---"); 213 mItem->setText(8,"---");
206 mItem->setText(9,"---"); 214 mItem->setText(9,"---");
207 mItem->setText(10,i18n("Last Modified: ")+ KGlobal::locale()->formatDateTime( j->lastModified() , true) ); 215 mItem->setText(10,i18n("Last Modified: ")+ KGlobal::locale()->formatDateTime( j->lastModified() , true) );
208 216
209 QString key; 217 QString key;
210 QDate d = j->dtStart().date(); 218 QDate d = j->dtStart().date();
211 key.sprintf("%04d%02d%02d",d.year(),d.month(),d.day()); 219 key.sprintf("%04d%02d%02d",d.year(),d.month(),d.day());
212 mItem->setSortKey(1,key); 220 mItem->setSortKey(1,key);
213 mItem->setSortKey(7,key); 221 mItem->setSortKey(7,key);
214 222
215 return true; 223 return true;
216} 224}
217 225
218KOListView::KOListView(Calendar *calendar, QWidget *parent, 226KOListView::KOListView(Calendar *calendar, QWidget *parent,
219 const char *name) 227 const char *name)
220 : KOEventView(calendar, parent, name) 228 : KOEventView(calendar, parent, name)
221{ 229{
222 mActiveItem = 0; 230 mActiveItem = 0;
223 mListView = new KOListViewListView(this); 231 mListView = new KOListViewListView(this);
224 mListView->addColumn(i18n("Summary")); 232 mListView->addColumn(i18n("Summary"));
225 mListView->addColumn(i18n("Start Date")); 233 mListView->addColumn(i18n("Start Date"));
226 mListView->addColumn(i18n("Start Time")); 234 mListView->addColumn(i18n("Start Time"));
227 mListView->addColumn(i18n("End Date")); 235 mListView->addColumn(i18n("End Date"));
228 mListView->addColumn(i18n("End Time")); 236 mListView->addColumn(i18n("End Time"));
229 mListView->addColumn(i18n("Alarm")); // alarm set? 237 mListView->addColumn(i18n("Alarm")); // alarm set?
230 mListView->addColumn(i18n("Recurs")); // recurs? 238 mListView->addColumn(i18n("Recurs")); // recurs?
231 mListView->addColumn(i18n("Due Date")); 239 mListView->addColumn(i18n("Due Date"));
232 mListView->addColumn(i18n("Due Time")); 240 mListView->addColumn(i18n("Due Time"));
233 mListView->addColumn(i18n("Cancelled")); 241 mListView->addColumn(i18n("Cancelled"));
234 mListView->addColumn(i18n("Categories")); 242 mListView->addColumn(i18n("Categories"));
235 243
236 mListView->setColumnAlignment(0,AlignLeft); 244 mListView->setColumnAlignment(0,AlignLeft);
237 mListView->setColumnAlignment(1,AlignLeft); 245 mListView->setColumnAlignment(1,AlignLeft);
238 mListView->setColumnAlignment(2,AlignHCenter); 246 mListView->setColumnAlignment(2,AlignHCenter);
239 mListView->setColumnAlignment(3,AlignLeft); 247 mListView->setColumnAlignment(3,AlignLeft);
240 mListView->setColumnAlignment(4,AlignHCenter); 248 mListView->setColumnAlignment(4,AlignHCenter);
241 mListView->setColumnAlignment(5,AlignLeft); 249 mListView->setColumnAlignment(5,AlignLeft);
242 mListView->setColumnAlignment(6,AlignLeft); 250 mListView->setColumnAlignment(6,AlignLeft);
243 mListView->setColumnAlignment(7,AlignLeft); 251 mListView->setColumnAlignment(7,AlignLeft);
244 mListView->setColumnAlignment(8,AlignLeft); 252 mListView->setColumnAlignment(8,AlignLeft);
245 mListView->setColumnAlignment(9,AlignLeft); 253 mListView->setColumnAlignment(9,AlignLeft);
246 mListView->setColumnAlignment(10,AlignLeft); 254 mListView->setColumnAlignment(10,AlignLeft);
247 mListView->setColumnWidthMode(10, QListView::Manual); 255 mListView->setColumnWidthMode(10, QListView::Manual);
248 new KOListViewWhatsThis(mListView->viewport(),this); 256 new KOListViewWhatsThis(mListView->viewport(),this);
249 257
250 int iii = 0; 258 int iii = 0;
251 for ( iii = 0; iii< 10 ; ++iii ) 259 for ( iii = 0; iii< 10 ; ++iii )
252 mListView->setColumnWidthMode( iii, QListView::Manual ); 260 mListView->setColumnWidthMode( iii, QListView::Manual );
253 261
254 QBoxLayout *layoutTop = new QVBoxLayout(this); 262 QBoxLayout *layoutTop = new QVBoxLayout(this);
255 layoutTop->addWidget(mListView); 263 layoutTop->addWidget(mListView);
256 mListView->setFont ( KOPrefs::instance()->mListViewFont ); 264 mListView->setFont ( KOPrefs::instance()->mListViewFont );
257 mPopupMenu = eventPopup(); 265 mPopupMenu = eventPopup();
258 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 266 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
259 i18n("Select all"),this, 267 i18n("Select all"),this,
260 SLOT(allSelection()),true); 268 SLOT(allSelection()),true);
261 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 269 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
262 i18n("Deselect all"),this, 270 i18n("Deselect all"),this,
263 SLOT(clearSelection()),true); 271 SLOT(clearSelection()),true);
264 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 272 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
265 i18n("Delete all selected"),this, 273 i18n("Delete all selected"),this,
266 SLOT(deleteAll()),true); 274 SLOT(deleteAll()),true);
267 mPopupMenu->insertSeparator(); 275 mPopupMenu->insertSeparator();
268 QPopupMenu * exportPO = new QPopupMenu ( this ); 276 QPopupMenu * exportPO = new QPopupMenu ( this );
269 mPopupMenu->insertItem( i18n("Export selected"), exportPO ); 277 mPopupMenu->insertItem( i18n("Export selected"), exportPO );
270 exportPO->insertItem( i18n("As iCal (ics) file..."),this, 278 exportPO->insertItem( i18n("As iCal (ics) file..."),this,
271 SLOT(saveToFile())); 279 SLOT(saveToFile()));
272 exportPO->insertItem( i18n("As vCal (vcs) file..."),this, 280 exportPO->insertItem( i18n("As vCal (vcs) file..."),this,
273 SLOT(saveToFileVCS())); 281 SLOT(saveToFileVCS()));
274 exportPO->insertItem( i18n("Journal/Details..."),this, 282 exportPO->insertItem( i18n("Journal/Details..."),this,
275 SLOT(saveDescriptionToFile())); 283 SLOT(saveDescriptionToFile()));
276 // mPopupMenu->insertSeparator(); 284 // mPopupMenu->insertSeparator();
277 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 285 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
278 i18n("Add Categ. to selected..."),this, 286 i18n("Add Categ. to selected..."),this,
279 SLOT(addCat()),true); 287 SLOT(addCat()),true);
280 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 288 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
281 i18n("Set Categ. for selected..."),this, 289 i18n("Set Categ. for selected..."),this,
282 SLOT(setCat()),true); 290 SLOT(setCat()),true);
283 //mPopupMenu->insertSeparator(); 291 //mPopupMenu->insertSeparator();
284 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 292 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
285 i18n("Set alarm for selected..."),this, 293 i18n("Set alarm for selected..."),this,
286 SLOT(setAlarm()),true); 294 SLOT(setAlarm()),true);
287 295
288 296
289#ifndef DESKTOP_VERSION 297#ifndef DESKTOP_VERSION
290 mPopupMenu->insertSeparator(); 298 mPopupMenu->insertSeparator();
291 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()), 299 mPopupMenu->addAdditionalItem(QIconSet(QPixmap()),
292 i18n("Beam selected via IR"),this, 300 i18n("Beam selected via IR"),this,
293 SLOT(beamSelected()),true); 301 SLOT(beamSelected()),true);
294#endif 302#endif
295 /* 303 /*
296 mPopupMenu = new QPopupMenu; 304 mPopupMenu = new QPopupMenu;
297 mPopupMenu->insertItem(i18n("Edit Event"), this, 305 mPopupMenu->insertItem(i18n("Edit Event"), this,
298 SLOT (editEvent())); 306 SLOT (editEvent()));
299 mPopupMenu->insertItem(SmallIcon("delete"), i18n("Delete Event"), this, 307 mPopupMenu->insertItem(SmallIcon("delete"), i18n("Delete Event"), this,
300 SLOT (deleteEvent())); 308 SLOT (deleteEvent()));
301 mPopupMenu->insertSeparator(); 309 mPopupMenu->insertSeparator();
302 mPopupMenu->insertItem(i18n("Show Dates"), this, 310 mPopupMenu->insertItem(i18n("Show Dates"), this,
303 SLOT(showDates())); 311 SLOT(showDates()));
304 mPopupMenu->insertItem(i18n("Hide Dates"), this, 312 mPopupMenu->insertItem(i18n("Hide Dates"), this,
305 SLOT(hideDates())); 313 SLOT(hideDates()));
306 */ 314 */
307 QObject::connect(mListView,SIGNAL( newEvent()), 315 QObject::connect(mListView,SIGNAL( newEvent()),
308 this,SIGNAL(signalNewEvent())); 316 this,SIGNAL(signalNewEvent()));
309 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)), 317 QObject::connect(mListView,SIGNAL(doubleClicked(QListViewItem *)),
310 this,SLOT(defaultItemAction(QListViewItem *))); 318 this,SLOT(defaultItemAction(QListViewItem *)));
311 QObject::connect(mListView,SIGNAL(rightButtonPressed( QListViewItem *, 319 QObject::connect(mListView,SIGNAL(rightButtonPressed( QListViewItem *,
312 const QPoint &, int )), 320 const QPoint &, int )),
313 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int))); 321 this,SLOT(popupMenu(QListViewItem *,const QPoint &,int)));
314 QObject::connect(mListView,SIGNAL(currentChanged(QListViewItem *)), 322 QObject::connect(mListView,SIGNAL(currentChanged(QListViewItem *)),
315 SLOT(processSelectionChange(QListViewItem *))); 323 SLOT(processSelectionChange(QListViewItem *)));
316 QObject::connect(mListView,SIGNAL(showIncidence(Incidence *)), 324 QObject::connect(mListView,SIGNAL(showIncidence(Incidence *)),
317 SIGNAL(showIncidenceSignal(Incidence *)) ); 325 SIGNAL(showIncidenceSignal(Incidence *)) );
318 326
319 readSettings(KOGlobals::config(),"KOListView Layout"); 327 readSettings(KOGlobals::config(),"KOListView Layout");
320} 328}
321 329
322KOListView::~KOListView() 330KOListView::~KOListView()
323{ 331{
324 delete mPopupMenu; 332 delete mPopupMenu;
325} 333}
326QString KOListView::getWhatsThisText(QPoint p) 334QString KOListView::getWhatsThisText(QPoint p)
327{ 335{
328 KOListViewItem* item = ( KOListViewItem* ) mListView->itemAt( p ); 336 KOListViewItem* item = ( KOListViewItem* ) mListView->itemAt( p );
329 if ( item ) 337 if ( item )
330 return KIncidenceFormatter::instance()->getFormattedText( item->data(), 338 return KIncidenceFormatter::instance()->getFormattedText( item->data(),
331 KOPrefs::instance()->mWTshowDetails, 339 KOPrefs::instance()->mWTshowDetails,
332 KOPrefs::instance()->mWTshowCreated, 340 KOPrefs::instance()->mWTshowCreated,
333 KOPrefs::instance()->mWTshowChanged); 341 KOPrefs::instance()->mWTshowChanged);
334 return i18n("That is the list view" ); 342 return i18n("That is the list view" );
335 343
336} 344}
337 345
338void KOListView::updateList() 346void KOListView::updateList()
339{ 347{
340 // qDebug(" KOListView::updateList() "); 348 // qDebug(" KOListView::updateList() ");
341 349
342} 350}
343 351
344void KOListView::addCat( ) 352void KOListView::addCat( )
345{ 353{
346 setCategories( false ); 354 setCategories( false );
347} 355}
348void KOListView::setCat() 356void KOListView::setCat()
349{ 357{
350 setCategories( true ); 358 setCategories( true );
351} 359}
352void KOListView::setAlarm() 360void KOListView::setAlarm()
353{ 361{
354 KOAlarmPrefs kap( this); 362 KOAlarmPrefs kap( this);
355 if ( !kap.exec() ) 363 if ( !kap.exec() )
356 return; 364 return;
357 365
358 366
359 QStringList itemList; 367 QStringList itemList;
360 QPtrList<KOListViewItem> sel ; 368 QPtrList<KOListViewItem> sel ;
361 QListViewItem *qitem = mListView->firstChild (); 369 QListViewItem *qitem = mListView->firstChild ();
362 while ( qitem ) { 370 while ( qitem ) {
363 if ( qitem->isSelected() ) { 371 if ( qitem->isSelected() ) {
364 Incidence* inc = ((KOListViewItem *) qitem)->data(); 372 Incidence* inc = ((KOListViewItem *) qitem)->data();
365 if ( inc->type() != "Journal" ) { 373 if ( inc->type() != "Journal" ) {
366 if ( inc->type() == "Todo" ) { 374 if ( inc->type() == "Todo" ) {
367 if ( ((Todo*)inc)->hasDueDate() ) 375 if ( ((Todo*)inc)->hasDueDate() )
368 sel.append(((KOListViewItem *)qitem)); 376 sel.append(((KOListViewItem *)qitem));
369 } else 377 } else
370 sel.append(((KOListViewItem *)qitem)); 378 sel.append(((KOListViewItem *)qitem));
371 } 379 }
372 } 380 }
373 qitem = qitem->nextSibling(); 381 qitem = qitem->nextSibling();
374 } 382 }
375 int count = 0; 383 int count = 0;
376 KOListViewItem * item, *temp; 384 KOListViewItem * item, *temp;
377 item = sel.first(); 385 item = sel.first();
378 Incidence* inc; 386 Incidence* inc;
379 while ( item ) { 387 while ( item ) {
380 inc = item->data(); 388 inc = item->data();
381 ++count; 389 ++count;
382 if (kap.mAlarmButton->isChecked()) { 390 if (kap.mAlarmButton->isChecked()) {
383 if (inc->alarms().count() == 0) 391 if (inc->alarms().count() == 0)
384 inc->newAlarm(); 392 inc->newAlarm();
385 QPtrList<Alarm> alarms = inc->alarms(); 393 QPtrList<Alarm> alarms = inc->alarms();
386 Alarm *alarm; 394 Alarm *alarm;
387 for (alarm = alarms.first(); alarm; alarm = alarms.next() ) { 395 for (alarm = alarms.first(); alarm; alarm = alarms.next() ) {
388 alarm->setEnabled(true); 396 alarm->setEnabled(true);
389 int j = kap.mAlarmTimeEdit->value()* -60; 397 int j = kap.mAlarmTimeEdit->value()* -60;
390 if (kap.mAlarmIncrCombo->currentItem() == 1) 398 if (kap.mAlarmIncrCombo->currentItem() == 1)
391 j = j * 60; 399 j = j * 60;
392 else if (kap.mAlarmIncrCombo->currentItem() == 2) 400 else if (kap.mAlarmIncrCombo->currentItem() == 2)
393 j = j * (60 * 24); 401 j = j * (60 * 24);
394 alarm->setStartOffset( j ); 402 alarm->setStartOffset( j );
395 403
396 if (!kap.mAlarmProgram.isEmpty() && kap.mAlarmProgramButton->isOn()) { 404 if (!kap.mAlarmProgram.isEmpty() && kap.mAlarmProgramButton->isOn()) {
397 alarm->setProcedureAlarm(kap.mAlarmProgram); 405 alarm->setProcedureAlarm(kap.mAlarmProgram);
398 } 406 }
399 else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn()) 407 else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn())
400 alarm->setAudioAlarm(kap.mAlarmSound); 408 alarm->setAudioAlarm(kap.mAlarmSound);
401 else 409 else
402 alarm->setType(Alarm::Invalid); 410 alarm->setType(Alarm::Invalid);
403 //alarm->setAudioAlarm("default"); 411 //alarm->setAudioAlarm("default");
404 // TODO: Deal with multiple alarms 412 // TODO: Deal with multiple alarms
405 break; // For now, stop after the first alarm 413 break; // For now, stop after the first alarm
406 } 414 }
407 } else { 415 } else {
408 Alarm* alarm = inc->alarms().first(); 416 Alarm* alarm = inc->alarms().first();
409 if ( alarm ) { 417 if ( alarm ) {
410 alarm->setEnabled(false); 418 alarm->setEnabled(false);
411 alarm->setType(Alarm::Invalid); 419 alarm->setType(Alarm::Invalid);
412 } 420 }
413 } 421 }
414 temp = item; 422 temp = item;
415 item = sel.next(); 423 item = sel.next();
416 mUidDict.remove( inc->uid() ); 424 mUidDict.remove( inc->uid() );
417 delete temp;; 425 delete temp;;
418 addIncidence( inc ); 426 addIncidence( inc );
419 } 427 }
420 topLevelWidget()->setCaption( i18n("Canged alarm for %1 items").arg( count ) ); 428 topLevelWidget()->setCaption( i18n("Canged alarm for %1 items").arg( count ) );
421 qDebug("KO: Set alarm for %d items", count); 429 qDebug("KO: Set alarm for %d items", count);
422 calendar()->reInitAlarmSettings(); 430 calendar()->reInitAlarmSettings();
423} 431}
424void KOListView::setCategories( bool removeOld ) 432void KOListView::setCategories( bool removeOld )
425{ 433{
426 434
427 KPIM::CategorySelectDialog* csd = new KPIM::CategorySelectDialog( KOPrefs::instance(), 0 ); 435 KPIM::CategorySelectDialog* csd = new KPIM::CategorySelectDialog( KOPrefs::instance(), 0 );
428 if (! csd->exec()) { 436 if (! csd->exec()) {
429 delete csd; 437 delete csd;
430 return; 438 return;
431 } 439 }
432 QStringList catList = csd->selectedCategories(); 440 QStringList catList = csd->selectedCategories();
433 delete csd; 441 delete csd;
434 // if ( catList.count() == 0 ) 442 // if ( catList.count() == 0 )
435 // return; 443 // return;
436 catList.sort(); 444 catList.sort();
437 QString categoriesStr = catList.join(","); 445 QString categoriesStr = catList.join(",");
438 int i; 446 int i;
439 QStringList itemList; 447 QStringList itemList;
440 QPtrList<KOListViewItem> sel ; 448 QPtrList<KOListViewItem> sel ;
441 QListViewItem *qitem = mListView->firstChild (); 449 QListViewItem *qitem = mListView->firstChild ();
442 while ( qitem ) { 450 while ( qitem ) {
443 if ( qitem->isSelected() ) { 451 if ( qitem->isSelected() ) {
444 sel.append(((KOListViewItem *)qitem)); 452 sel.append(((KOListViewItem *)qitem));
445 } 453 }
446 qitem = qitem->nextSibling(); 454 qitem = qitem->nextSibling();
447 } 455 }
448 KOListViewItem * item, *temp; 456 KOListViewItem * item, *temp;
449 item = sel.first(); 457 item = sel.first();
450 Incidence* inc; 458 Incidence* inc;
451 while ( item ) { 459 while ( item ) {
452 inc = item->data(); 460 inc = item->data();
453 if ( removeOld ) { 461 if ( removeOld ) {
454 inc->setCategories( categoriesStr ); 462 inc->setCategories( categoriesStr );
455 } else { 463 } else {
456 itemList = QStringList::split (",", inc->categoriesStr() ); 464 itemList = QStringList::split (",", inc->categoriesStr() );
457 for( i = 0; i< catList.count(); ++i ) { 465 for( i = 0; i< catList.count(); ++i ) {
458 if ( !itemList.contains (catList[i])) 466 if ( !itemList.contains (catList[i]))
459 itemList.append( catList[i] ); 467 itemList.append( catList[i] );
460 } 468 }
461 itemList.sort(); 469 itemList.sort();
462 inc->setCategories( itemList.join(",") ); 470 inc->setCategories( itemList.join(",") );
463 } 471 }
464 temp = item; 472 temp = item;
465 item = sel.next(); 473 item = sel.next();
466 mUidDict.remove( inc->uid() ); 474 mUidDict.remove( inc->uid() );
467 delete temp;; 475 delete temp;;
468 addIncidence( inc ); 476 addIncidence( inc );
469 } 477 }
470} 478}
471 479
472void KOListView::beamSelected() 480void KOListView::beamSelected()
473{ 481{
474 int icount = 0; 482 int icount = 0;
475 QPtrList<Incidence> delSel ; 483 QPtrList<Incidence> delSel ;
476 QListViewItem *item = mListView->firstChild (); 484 QListViewItem *item = mListView->firstChild ();
477 while ( item ) { 485 while ( item ) {
478 if ( item->isSelected() ) { 486 if ( item->isSelected() ) {
479 delSel.append(((KOListViewItem *)item)->data()); 487 delSel.append(((KOListViewItem *)item)->data());
480 ++icount; 488 ++icount;
481 } 489 }
482 490
483 item = item->nextSibling(); 491 item = item->nextSibling();
484 } 492 }
485 if ( icount ) { 493 if ( icount ) {
486 emit beamIncidenceList( delSel ); 494 emit beamIncidenceList( delSel );
487 return; 495 return;
488 QString fn ; 496 QString fn ;
489 fn = QDir::homeDirPath()+"/kopitempbeamfile.vcs"; 497 fn = QDir::homeDirPath()+"/kopitempbeamfile.vcs";
490 QString mes; 498 QString mes;
491 bool createbup = true; 499 bool createbup = true;
492 if ( createbup ) { 500 if ( createbup ) {
493 QString description = "\n"; 501 QString description = "\n";
494 CalendarLocal* cal = new CalendarLocal(); 502 CalendarLocal* cal = new CalendarLocal();
495 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId); 503 cal->setTimeZoneId(KPimGlobalPrefs::instance()->mTimeZoneId);
496 Incidence *incidence = delSel.first(); 504 Incidence *incidence = delSel.first();
497 while ( incidence ) { 505 while ( incidence ) {
498 Incidence *in = incidence->clone(); 506 Incidence *in = incidence->clone();
499 description += in->summary() + "\n"; 507 description += in->summary() + "\n";
500 cal->addIncidence( in ); 508 cal->addIncidence( in );
501 incidence = delSel.next(); 509 incidence = delSel.next();
502 } 510 }
503 FileStorage storage( cal, fn, new VCalFormat ); 511 FileStorage storage( cal, fn, new VCalFormat );
504 storage.save(); 512 storage.save();
505 delete cal; 513 delete cal;
506 mes = i18n("KO/Pi: Ready for beaming"); 514 mes = i18n("KO/Pi: Ready for beaming");
507 topLevelWidget()->setCaption(mes); 515 topLevelWidget()->setCaption(mes);
508 516
509#ifndef DESKTOP_VERSION 517#ifndef DESKTOP_VERSION
510 Ir *ir = new Ir( this ); 518 Ir *ir = new Ir( this );
511 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) ); 519 connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
512 ir->send( fn, description, "text/x-vCalendar" ); 520 ir->send( fn, description, "text/x-vCalendar" );
513#endif 521#endif
514 } 522 }
515 } 523 }
516} 524}
517void KOListView::beamDone( Ir *ir ) 525void KOListView::beamDone( Ir *ir )
518{ 526{
519#ifndef DESKTOP_VERSION 527#ifndef DESKTOP_VERSION
520 delete ir; 528 delete ir;
521#endif 529#endif
522 topLevelWidget()->setCaption(i18n("KO/Pi:Beaming done")); 530 topLevelWidget()->setCaption(i18n("KO/Pi:Beaming done"));
523} 531}
524 532
525void KOListView::saveDescriptionToFile() 533void KOListView::saveDescriptionToFile()
526{ 534{
527 535
528 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"), 536 int result = QMessageBox::warning( this, i18n("KO/Pi: Information!"),
529 i18n("This saves the text/details of selected\nJournals and Events/Todos\nto a text file."), 537 i18n("This saves the text/details of selected\nJournals and Events/Todos\nto a text file."),
530 i18n("Continue"), i18n("Cancel"), 0, 538 i18n("Continue"), i18n("Cancel"), 0,
531 0, 1 ); 539 0, 1 );
532 if ( result != 0 ) { 540 if ( result != 0 ) {
533 return; 541 return;
534 } 542 }
535 int icount = 0; 543 int icount = 0;
536 QPtrList<Incidence> delSel ; 544 QPtrList<Incidence> delSel ;
537 QListViewItem *item = mListView->firstChild (); 545 QListViewItem *item = mListView->firstChild ();
538 while ( item ) { 546 while ( item ) {
539 if ( item->isSelected() ) { 547 if ( item->isSelected() ) {
540 delSel.append(((KOListViewItem *)item)->data()); 548 delSel.append(((KOListViewItem *)item)->data());
541 ++icount; 549 ++icount;
542 } 550 }
diff --git a/korganizer/kotodoview.cpp b/korganizer/kotodoview.cpp
index 0a315cb..01cf0ff 100644
--- a/korganizer/kotodoview.cpp
+++ b/korganizer/kotodoview.cpp
@@ -1,1413 +1,1423 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#include <qlayout.h> 24#include <qlayout.h>
25#include <qheader.h> 25#include <qheader.h>
26#include <qcursor.h> 26#include <qcursor.h>
27#include <qwhatsthis.h> 27#include <qwhatsthis.h>
28 28
29#include <qvbox.h> 29#include <qvbox.h>
30#include <kdebug.h> 30#include <kdebug.h>
31#include "koprefs.h" 31#include "koprefs.h"
32#include <klocale.h> 32#include <klocale.h>
33#include <kglobal.h> 33#include <kglobal.h>
34#include <kiconloader.h> 34#include <kiconloader.h>
35#include <kmessagebox.h> 35#include <kmessagebox.h>
36 36
37#include <libkcal/icaldrag.h> 37#include <libkcal/icaldrag.h>
38#include <libkcal/vcaldrag.h> 38#include <libkcal/vcaldrag.h>
39#include <libkcal/calfilter.h> 39#include <libkcal/calfilter.h>
40#include <libkcal/dndfactory.h> 40#include <libkcal/dndfactory.h>
41#include <libkcal/calendarresources.h> 41#include <libkcal/calendarresources.h>
42#include <libkcal/resourcecalendar.h> 42#include <libkcal/resourcecalendar.h>
43#include <kresources/resourceselectdialog.h> 43#include <kresources/resourceselectdialog.h>
44#include <libkcal/kincidenceformatter.h> 44#include <libkcal/kincidenceformatter.h>
45#ifndef DESKTOP_VERSION 45#ifndef DESKTOP_VERSION
46#include <qpe/qpeapplication.h> 46#include <qpe/qpeapplication.h>
47#else 47#else
48#include <qapplication.h> 48#include <qapplication.h>
49#endif 49#endif
50#ifndef KORG_NOPRINTER 50#ifndef KORG_NOPRINTER
51#include "calprinter.h" 51#include "calprinter.h"
52#endif 52#endif
53#include "docprefs.h" 53#include "docprefs.h"
54 54
55#include "kotodoview.h" 55#include "kotodoview.h"
56using namespace KOrg; 56using namespace KOrg;
57 57
58 58
59class KOTodoViewWhatsThis :public QWhatsThis 59class KOTodoViewWhatsThis :public QWhatsThis
60{ 60{
61public: 61public:
62 KOTodoViewWhatsThis( QWidget *wid, KOTodoView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { }; 62 KOTodoViewWhatsThis( QWidget *wid, KOTodoView* view ) : QWhatsThis( wid ), _wid(wid),_view (view) { };
63 63
64protected: 64protected:
65 virtual QString text( const QPoint& p) 65 virtual QString text( const QPoint& p)
66 { 66 {
67 return _view->getWhatsThisText(p) ; 67 return _view->getWhatsThisText(p) ;
68 } 68 }
69private: 69private:
70 QWidget* _wid; 70 QWidget* _wid;
71 KOTodoView * _view; 71 KOTodoView * _view;
72}; 72};
73 73
74KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent, 74KOTodoListView::KOTodoListView(Calendar *calendar,QWidget *parent,
75 const char *name) : 75 const char *name) :
76 KListView(parent,name) 76 KListView(parent,name)
77{ 77{
78 mName = QString ( name ); 78 mName = QString ( name );
79 mCalendar = calendar; 79 mCalendar = calendar;
80#ifndef DESKTOP_VERSION 80#ifndef DESKTOP_VERSION
81 QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold ); 81 QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold );
82#endif 82#endif
83 mOldCurrent = 0; 83 mOldCurrent = 0;
84 mMousePressed = false; 84 mMousePressed = false;
85 85
86 setAcceptDrops(true); 86 setAcceptDrops(true);
87 viewport()->setAcceptDrops(true); 87 viewport()->setAcceptDrops(true);
88 int size = 16; 88 int size = 16;
89 if (qApp->desktop()->width() < 300 ) 89 if (qApp->desktop()->width() < 300 )
90 size = 12; 90 size = 12;
91 setTreeStepSize( size + 6 ); 91 setTreeStepSize( size + 6 );
92 92
93} 93}
94 94
95void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e) 95void KOTodoListView::contentsDragEnterEvent(QDragEnterEvent *e)
96{ 96{
97#ifndef KORG_NODND 97#ifndef KORG_NODND
98// kdDebug() << "KOTodoListView::contentsDragEnterEvent" << endl; 98// kdDebug() << "KOTodoListView::contentsDragEnterEvent" << endl;
99 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 99 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
100 !QTextDrag::canDecode( e ) ) { 100 !QTextDrag::canDecode( e ) ) {
101 e->ignore(); 101 e->ignore();
102 return; 102 return;
103 } 103 }
104 104
105 mOldCurrent = currentItem(); 105 mOldCurrent = currentItem();
106#endif 106#endif
107} 107}
108 108
109 109
110void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e) 110void KOTodoListView::contentsDragMoveEvent(QDragMoveEvent *e)
111{ 111{
112#ifndef KORG_NODND 112#ifndef KORG_NODND
113// kdDebug() << "KOTodoListView::contentsDragMoveEvent" << endl; 113// kdDebug() << "KOTodoListView::contentsDragMoveEvent" << endl;
114 114
115 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 115 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
116 !QTextDrag::canDecode( e ) ) { 116 !QTextDrag::canDecode( e ) ) {
117 e->ignore(); 117 e->ignore();
118 return; 118 return;
119 } 119 }
120 120
121 e->accept(); 121 e->accept();
122#endif 122#endif
123} 123}
124 124
125void KOTodoListView::contentsDragLeaveEvent(QDragLeaveEvent *) 125void KOTodoListView::contentsDragLeaveEvent(QDragLeaveEvent *)
126{ 126{
127#ifndef KORG_NODND 127#ifndef KORG_NODND
128// kdDebug() << "KOTodoListView::contentsDragLeaveEvent" << endl; 128// kdDebug() << "KOTodoListView::contentsDragLeaveEvent" << endl;
129 129
130 setCurrentItem(mOldCurrent); 130 setCurrentItem(mOldCurrent);
131 setSelected(mOldCurrent,true); 131 setSelected(mOldCurrent,true);
132#endif 132#endif
133} 133}
134 134
135void KOTodoListView::contentsDropEvent(QDropEvent *e) 135void KOTodoListView::contentsDropEvent(QDropEvent *e)
136{ 136{
137#ifndef KORG_NODND 137#ifndef KORG_NODND
138// kdDebug() << "KOTodoListView::contentsDropEvent" << endl; 138// kdDebug() << "KOTodoListView::contentsDropEvent" << endl;
139 139
140 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && 140 if ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) &&
141 !QTextDrag::canDecode( e ) ) { 141 !QTextDrag::canDecode( e ) ) {
142 e->ignore(); 142 e->ignore();
143 return; 143 return;
144 } 144 }
145 145
146 DndFactory factory( mCalendar ); 146 DndFactory factory( mCalendar );
147 Todo *todo = factory.createDropTodo(e); 147 Todo *todo = factory.createDropTodo(e);
148 148
149 if (todo) { 149 if (todo) {
150 e->acceptAction(); 150 e->acceptAction();
151 151
152 KOTodoViewItem *destination = 152 KOTodoViewItem *destination =
153 (KOTodoViewItem *)itemAt(contentsToViewport(e->pos())); 153 (KOTodoViewItem *)itemAt(contentsToViewport(e->pos()));
154 Todo *destinationEvent = 0; 154 Todo *destinationEvent = 0;
155 if (destination) destinationEvent = destination->todo(); 155 if (destination) destinationEvent = destination->todo();
156 156
157 Todo *existingTodo = mCalendar->todo(todo->uid()); 157 Todo *existingTodo = mCalendar->todo(todo->uid());
158 158
159 if(existingTodo) { 159 if(existingTodo) {
160 Incidence *to = destinationEvent; 160 Incidence *to = destinationEvent;
161 while(to) { 161 while(to) {
162 if (to->uid() == todo->uid()) { 162 if (to->uid() == todo->uid()) {
163 KMessageBox::sorry(this, 163 KMessageBox::sorry(this,
164 i18n("Cannot move To-Do to itself\nor a child of itself"), 164 i18n("Cannot move To-Do to itself\nor a child of itself"),
165 i18n("Drop To-Do")); 165 i18n("Drop To-Do"));
166 delete todo; 166 delete todo;
167 return; 167 return;
168 } 168 }
169 to = to->relatedTo(); 169 to = to->relatedTo();
170 } 170 }
171 internalDrop = true; 171 internalDrop = true;
172 if ( destinationEvent ) 172 if ( destinationEvent )
173 reparentTodoSignal( destinationEvent, existingTodo ); 173 reparentTodoSignal( destinationEvent, existingTodo );
174 else 174 else
175 unparentTodoSignal(existingTodo); 175 unparentTodoSignal(existingTodo);
176 delete todo; 176 delete todo;
177 } else { 177 } else {
178 mCalendar->addTodo(todo); 178 mCalendar->addTodo(todo);
179 emit todoDropped(todo, KOGlobals::EVENTADDED); 179 emit todoDropped(todo, KOGlobals::EVENTADDED);
180 if ( destinationEvent ) 180 if ( destinationEvent )
181 reparentTodoSignal( destinationEvent, todo ); 181 reparentTodoSignal( destinationEvent, todo );
182 } 182 }
183 } 183 }
184 else { 184 else {
185 QString text; 185 QString text;
186 if (QTextDrag::decode(e,text)) { 186 if (QTextDrag::decode(e,text)) {
187 //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) ); 187 //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) );
188 KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) )); 188 KOTodoViewItem *todoi = static_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) ));
189 qDebug("Dropped : " + text); 189 qDebug("Dropped : " + text);
190 QStringList emails = QStringList::split(",",text); 190 QStringList emails = QStringList::split(",",text);
191 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { 191 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
192 int pos = (*it).find("<"); 192 int pos = (*it).find("<");
193 QString name = (*it).left(pos); 193 QString name = (*it).left(pos);
194 QString email = (*it).mid(pos); 194 QString email = (*it).mid(pos);
195 if (!email.isEmpty() && todoi) { 195 if (!email.isEmpty() && todoi) {
196 todoi->todo()->addAttendee(new Attendee(name,email)); 196 todoi->todo()->addAttendee(new Attendee(name,email));
197 } 197 }
198 } 198 }
199 } 199 }
200 else { 200 else {
201 qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable "); 201 qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable ");
202 e->ignore(); 202 e->ignore();
203 } 203 }
204 } 204 }
205#endif 205#endif
206} 206}
207 207
208void KOTodoListView::contentsMousePressEvent(QMouseEvent* e) 208void KOTodoListView::contentsMousePressEvent(QMouseEvent* e)
209{ 209{
210 210
211 QPoint p(contentsToViewport(e->pos())); 211 QPoint p(contentsToViewport(e->pos()));
212 QListViewItem *i = itemAt(p); 212 QListViewItem *i = itemAt(p);
213 bool rootClicked = true; 213 bool rootClicked = true;
214 if (i) { 214 if (i) {
215 // if the user clicked into the root decoration of the item, don't 215 // if the user clicked into the root decoration of the item, don't
216 // try to start a drag! 216 // try to start a drag!
217 int X = p.x(); 217 int X = p.x();
218 //qDebug("%d %d %d", X, header()->sectionPos(0), treeStepSize() ); 218 //qDebug("%d %d %d", X, header()->sectionPos(0), treeStepSize() );
219 if (X > header()->sectionPos(0) + 219 if (X > header()->sectionPos(0) +
220 treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) + 220 treeStepSize() * (i->depth() + (rootIsDecorated() ? 1 : 0)) +
221 itemMargin() || 221 itemMargin() +i->height()||
222 X < header()->sectionPos(0)) { 222 X < header()->sectionPos(0)) {
223 rootClicked = false; 223 rootClicked = false;
224 } 224 }
225 } else {
226 rootClicked = false;
225 } 227 }
226#ifndef KORG_NODND 228#ifndef KORG_NODND
227 mMousePressed = false; 229 mMousePressed = false;
228 if (! rootClicked ) { 230 if (! rootClicked ) {
229 mPressPos = e->pos(); 231 mPressPos = e->pos();
230 mMousePressed = true; 232 mMousePressed = true;
231 } 233 }
232#endif 234#endif
233 //qDebug("KOTodoListView::contentsMousePressEvent %d", rootClicked); 235 //qDebug("KOTodoListView::contentsMousePressEvent %d", rootClicked);
234#ifndef DESKTOP_VERSION 236#ifndef DESKTOP_VERSION
235 if (!( e->button() == RightButton && rootClicked) ) 237 if (!( e->button() == RightButton && rootClicked) )
236 QListView::contentsMousePressEvent(e); 238 QListView::contentsMousePressEvent(e);
237#else 239#else
238 QListView::contentsMousePressEvent(e); 240 QListView::contentsMousePressEvent(e);
239#endif 241#endif
240} 242}
241void KOTodoListView::paintEvent(QPaintEvent* e) 243void KOTodoListView::paintEvent(QPaintEvent* e)
242{ 244{
243 emit paintNeeded(); 245 emit paintNeeded();
244 QListView::paintEvent( e); 246 QListView::paintEvent( e);
245} 247}
246void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e) 248void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e)
247{ 249{
248 250
249#ifndef KORG_NODND 251#ifndef KORG_NODND
250 //QListView::contentsMouseMoveEvent(e); 252 //QListView::contentsMouseMoveEvent(e);
251 if (mMousePressed && (mPressPos - e->pos()).manhattanLength() > 253 if (mMousePressed && (mPressPos - e->pos()).manhattanLength() >
252 QApplication::startDragDistance()*3) { 254 QApplication::startDragDistance()*3) {
253 mMousePressed = false; 255 mMousePressed = false;
254 QListViewItem *item = itemAt(contentsToViewport(mPressPos)); 256 QListViewItem *item = itemAt(contentsToViewport(mPressPos));
255 if (item) { 257 if (item) {
256 DndFactory factory( mCalendar ); 258 DndFactory factory( mCalendar );
257 ICalDrag *vd = factory.createDrag( 259 ICalDrag *vd = factory.createDrag(
258 ((KOTodoViewItem *)item)->todo(),viewport()); 260 ((KOTodoViewItem *)item)->todo(),viewport());
259 internalDrop = false; 261 internalDrop = false;
260 // we cannot do any senseful here, because the DnD is still broken in Qt 262 // we cannot do any senseful here, because the DnD is still broken in Qt
261 if (vd->drag()) { 263 if (vd->drag()) {
262 if ( !internalDrop ) { 264 if ( !internalDrop ) {
263 //emit deleteTodo( ((KOTodoViewItem *)item)->todo() ); 265 //emit deleteTodo( ((KOTodoViewItem *)item)->todo() );
264 qDebug("Dnd: External move: Delete drag source "); 266 qDebug("Dnd: External move: Delete drag source ");
265 } else 267 } else
266 qDebug("Dnd: Internal move "); 268 qDebug("Dnd: Internal move ");
267 269
268 } else { 270 } else {
269 if ( !internalDrop ) { 271 if ( !internalDrop ) {
270 qDebug("Dnd: External Copy"); 272 qDebug("Dnd: External Copy");
271 } else 273 } else
272 qDebug("DnD: Internal copy: Copy pending"); 274 qDebug("DnD: Internal copy: Copy pending");
273 } 275 }
274 } 276 }
275 } 277 }
276#endif 278#endif
277} 279}
278void KOTodoListView::keyReleaseEvent ( QKeyEvent *e ) 280void KOTodoListView::keyReleaseEvent ( QKeyEvent *e )
279{ 281{
280 if ( !e->isAutoRepeat() ) { 282 if ( !e->isAutoRepeat() ) {
281 mFlagKeyPressed = false; 283 mFlagKeyPressed = false;
282 } 284 }
283} 285}
284 286
285 287
286void KOTodoListView::keyPressEvent ( QKeyEvent * e ) 288void KOTodoListView::keyPressEvent ( QKeyEvent * e )
287{ 289{
288 qApp->processEvents(); 290 qApp->processEvents();
289 if ( e->isAutoRepeat() && !mFlagKeyPressed ) { 291 if ( e->isAutoRepeat() && !mFlagKeyPressed ) {
290 e->ignore(); 292 e->ignore();
291 // qDebug(" ignore %d",e->isAutoRepeat() ); 293 // qDebug(" ignore %d",e->isAutoRepeat() );
292 return; 294 return;
293 } 295 }
294 if (! e->isAutoRepeat() ) 296 if (! e->isAutoRepeat() )
295 mFlagKeyPressed = true; 297 mFlagKeyPressed = true;
296 QListViewItem* cn; 298 QListViewItem* cn;
297 if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) { 299 if ( e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter ) {
298 cn = currentItem(); 300 cn = currentItem();
299 if ( cn ) { 301 if ( cn ) {
300 KOTodoViewItem* ci = (KOTodoViewItem*)( cn ); 302 KOTodoViewItem* ci = (KOTodoViewItem*)( cn );
301 if ( ci ){ 303 if ( ci ){
302 if ( e->state() == ShiftButton ) 304 if ( e->state() == ShiftButton )
303 ci->setOn( false ); 305 ci->setOn( false );
304 else 306 else
305 ci->setOn( true ); 307 ci->setOn( true );
306 cn = cn->itemBelow(); 308 cn = cn->itemBelow();
307 if ( cn ) { 309 if ( cn ) {
308 setCurrentItem ( cn ); 310 setCurrentItem ( cn );
309 ensureItemVisible ( cn ); 311 ensureItemVisible ( cn );
310 } 312 }
311 313
312 } 314 }
313 } 315 }
314 316
315 return; 317 return;
316 } 318 }
317 319
318 if ( e->state() == Qt::ControlButton || e->state() == Qt::ShiftButton || mName != "todolistsmall" ) { 320 if ( e->state() == Qt::ControlButton || e->state() == Qt::ShiftButton || mName != "todolistsmall" ) {
319 switch ( e->key() ) { 321 switch ( e->key() ) {
320 case Qt::Key_Down: 322 case Qt::Key_Down:
321 case Qt::Key_Up: 323 case Qt::Key_Up:
322 QListView::keyPressEvent ( e ); 324 QListView::keyPressEvent ( e );
323 break; 325 break;
324 case Qt::Key_Left: 326 case Qt::Key_Left:
325 case Qt::Key_Right: 327 case Qt::Key_Right:
326 QListView::keyPressEvent ( e ); 328 QListView::keyPressEvent ( e );
327 e->accept(); 329 e->accept();
328 return; 330 return;
329 break; 331 break;
330 default: 332 default:
331 e->ignore(); 333 e->ignore();
332 break; 334 break;
333 } 335 }
334 return; 336 return;
335 } 337 }
336 e->ignore(); 338 e->ignore();
337} 339}
338void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e) 340void KOTodoListView::contentsMouseReleaseEvent(QMouseEvent *e)
339{ 341{
340 QListView::contentsMouseReleaseEvent(e); 342 QListView::contentsMouseReleaseEvent(e);
341 mMousePressed = false; 343 mMousePressed = false;
342} 344}
343 345
344void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e) 346void KOTodoListView::contentsMouseDoubleClickEvent(QMouseEvent *e)
345{ 347{
346 if (!e) return; 348 if (!e) return;
347 349
348 QPoint vp = contentsToViewport(e->pos()); 350 QPoint vp = contentsToViewport(e->pos());
349 351
350 QListViewItem *item = itemAt(vp); 352 QListViewItem *item = itemAt(vp);
351 353
352 emit double_Clicked(item); 354 emit double_Clicked(item);
353 if (!item) return; 355 if (!item) return;
354 356
355 emit doubleClicked(item,vp,0); 357 emit doubleClicked(item,vp,0);
356} 358}
357 359
358///////////////////////////////////////////////////////////////////////////// 360/////////////////////////////////////////////////////////////////////////////
359 361
360KOQuickTodo::KOQuickTodo(QWidget *parent) : 362KOQuickTodo::KOQuickTodo(QWidget *parent) :
361 QLineEdit(parent) 363 QLineEdit(parent)
362{ 364{
363 setText(i18n("Click to add a new Todo")); 365 setText(i18n("Click to add a new Todo"));
364} 366}
365 367
366void KOQuickTodo::focusInEvent(QFocusEvent *ev) 368void KOQuickTodo::focusInEvent(QFocusEvent *ev)
367{ 369{
368 if ( text()==i18n("Click to add a new Todo") ) 370 if ( text()==i18n("Click to add a new Todo") )
369 setText(""); 371 setText("");
370 QLineEdit::focusInEvent(ev); 372 QLineEdit::focusInEvent(ev);
371} 373}
372 374
373void KOQuickTodo::focusOutEvent(QFocusEvent *ev) 375void KOQuickTodo::focusOutEvent(QFocusEvent *ev)
374{ 376{
375 setText(i18n("Click to add a new Todo")); 377 setText(i18n("Click to add a new Todo"));
376 QLineEdit::focusOutEvent(ev); 378 QLineEdit::focusOutEvent(ev);
377} 379}
378 380
379///////////////////////////////////////////////////////////////////////////// 381/////////////////////////////////////////////////////////////////////////////
380 382
381KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) : 383KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) :
382 KOrg::BaseView(calendar,parent,name) 384 KOrg::BaseView(calendar,parent,name)
383{ 385{
384 mPendingUpdateBeforeRepaint = false; 386 mPendingUpdateBeforeRepaint = false;
385 isFlatDisplay = false; 387 isFlatDisplay = false;
386 mNavigator = 0; 388 mNavigator = 0;
387 QBoxLayout *topLayout = new QVBoxLayout(this); 389 QBoxLayout *topLayout = new QVBoxLayout(this);
388 mName = QString ( name ); 390 mName = QString ( name );
389 mBlockUpdate = false; 391 mBlockUpdate = false;
390 mQuickAdd = new KOQuickTodo(this); 392 mQuickAdd = new KOQuickTodo(this);
391 topLayout->addWidget(mQuickAdd); 393 topLayout->addWidget(mQuickAdd);
392 394
393 if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide(); 395 if ( !KOPrefs::instance()->mEnableQuickTodo ) mQuickAdd->hide();
394 396
395 mTodoListView = new KOTodoListView(calendar,this, name ); 397 mTodoListView = new KOTodoListView(calendar,this, name );
396 topLayout->addWidget(mTodoListView); 398 topLayout->addWidget(mTodoListView);
397 //mTodoListView->header()->setMaximumHeight(30); 399 //mTodoListView->header()->setMaximumHeight(30);
398 mTodoListView->setRootIsDecorated(true); 400 mTodoListView->setRootIsDecorated(true);
399 mTodoListView->setAllColumnsShowFocus(true); 401 mTodoListView->setAllColumnsShowFocus(true);
400 402
401 mTodoListView->setShowSortIndicator(true); 403 mTodoListView->setShowSortIndicator(true);
402 404
403 mTodoListView->addColumn(i18n("Todo")); 405 mTodoListView->addColumn(i18n("Todo"));
404 mTodoListView->addColumn(i18n("Prio")); 406 mTodoListView->addColumn(i18n("Prio"));
405 mTodoListView->setColumnAlignment(1,AlignHCenter); 407 mTodoListView->setColumnAlignment(1,AlignHCenter);
406 mTodoListView->addColumn(i18n("Complete")); 408 mTodoListView->addColumn(i18n("Complete"));
407 mTodoListView->setColumnAlignment(2,AlignCenter); 409 mTodoListView->setColumnAlignment(2,AlignCenter);
408 410
409 mTodoListView->addColumn(i18n("Due Date")); 411 mTodoListView->addColumn(i18n("Due Date"));
410 mTodoListView->setColumnAlignment(3,AlignLeft); 412 mTodoListView->setColumnAlignment(3,AlignLeft);
411 mTodoListView->addColumn(i18n("Due Time")); 413 mTodoListView->addColumn(i18n("Due Time"));
412 mTodoListView->setColumnAlignment(4,AlignHCenter); 414 mTodoListView->setColumnAlignment(4,AlignHCenter);
413 415
414 mTodoListView->addColumn(i18n("Start Date")); 416 mTodoListView->addColumn(i18n("Start Date"));
415 mTodoListView->setColumnAlignment(5,AlignLeft); 417 mTodoListView->setColumnAlignment(5,AlignLeft);
416 mTodoListView->addColumn(i18n("Start Time")); 418 mTodoListView->addColumn(i18n("Start Time"));
417 mTodoListView->setColumnAlignment(6,AlignHCenter); 419 mTodoListView->setColumnAlignment(6,AlignHCenter);
418 420
419 mTodoListView->addColumn(i18n("Cancelled")); 421 mTodoListView->addColumn(i18n("Cancelled"));
420 mTodoListView->addColumn(i18n("Categories")); 422 mTodoListView->addColumn(i18n("Categories"));
421#if 0 423#if 0
422 mTodoListView->addColumn(i18n("Sort Id")); 424 mTodoListView->addColumn(i18n("Sort Id"));
423 mTodoListView->setColumnAlignment(4,AlignHCenter); 425 mTodoListView->setColumnAlignment(4,AlignHCenter);
424#endif 426#endif
425 427
426 mTodoListView->setMinimumHeight( 60 ); 428 mTodoListView->setMinimumHeight( 60 );
427 mTodoListView->setItemsRenameable( true ); 429 mTodoListView->setItemsRenameable( true );
428 mTodoListView->setRenameable( 0 ); 430 mTodoListView->setRenameable( 0 );
429 mTodoListView->setColumnWidth( 0, 120 ); 431 mTodoListView->setColumnWidth( 0, 120 );
430 mTodoListView->setColumnWidthMode(0, QListView::Manual); 432 mTodoListView->setColumnWidthMode(0, QListView::Manual);
431 mTodoListView->setColumnWidthMode(1, QListView::Manual); 433 mTodoListView->setColumnWidthMode(1, QListView::Manual);
432 mTodoListView->setColumnWidthMode(2, QListView::Manual); 434 mTodoListView->setColumnWidthMode(2, QListView::Manual);
433 mTodoListView->setColumnWidthMode(3, QListView::Manual); 435 mTodoListView->setColumnWidthMode(3, QListView::Manual);
434 mTodoListView->setColumnWidthMode(4, QListView::Manual); 436 mTodoListView->setColumnWidthMode(4, QListView::Manual);
435 mTodoListView->setColumnWidthMode(5, QListView::Manual); 437 mTodoListView->setColumnWidthMode(5, QListView::Manual);
436 mTodoListView->setColumnWidthMode(6, QListView::Manual); 438 mTodoListView->setColumnWidthMode(6, QListView::Manual);
437 mTodoListView->setColumnWidthMode(7, QListView::Manual); 439 mTodoListView->setColumnWidthMode(7, QListView::Manual);
438 mTodoListView->setColumnWidthMode(8, QListView::Manual); 440 mTodoListView->setColumnWidthMode(8, QListView::Manual);
439 441
440 442
441 mKOTodoViewWhatsThis = new KOTodoViewWhatsThis(mTodoListView->viewport(),this); 443 mKOTodoViewWhatsThis = new KOTodoViewWhatsThis(mTodoListView->viewport(),this);
442 444
443 mPriorityPopupMenu = new QPopupMenu(this); 445 mPriorityPopupMenu = new QPopupMenu(this);
444 for (int i = 1; i <= 5; i++) { 446 for (int i = 1; i <= 5; i++) {
445 QString label = QString ("%1").arg (i); 447 QString label = QString ("%1").arg (i);
446 mPriority[mPriorityPopupMenu->insertItem (label)] = i; 448 mPriority[mPriorityPopupMenu->insertItem (label)] = i;
447 } 449 }
448 connect (mPriorityPopupMenu, SIGNAL(activated (int)), SLOT (setNewPriority(int))); 450 connect (mPriorityPopupMenu, SIGNAL(activated (int)), SLOT (setNewPriority(int)));
449 451
450 mPercentageCompletedPopupMenu = new QPopupMenu(this); 452 mPercentageCompletedPopupMenu = new QPopupMenu(this);
451 for (int i = 0; i <= 100; i+=20) { 453 for (int i = 0; i <= 100; i+=20) {
452 QString label = QString ("%1 %").arg (i); 454 QString label = QString ("%1 %").arg (i);
453 mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i; 455 mPercentage[mPercentageCompletedPopupMenu->insertItem (label)] = i;
454 } 456 }
455 connect (mPercentageCompletedPopupMenu, SIGNAL (activated (int)), SLOT (setNewPercentage (int))); 457 connect (mPercentageCompletedPopupMenu, SIGNAL (activated (int)), SLOT (setNewPercentage (int)));
456 458
457 459
458 460
459 mItemPopupMenu = new QPopupMenu(this); 461 mItemPopupMenu = new QPopupMenu(this);
460 mItemPopupMenu->insertItem(i18n("Show..."), this, 462 mItemPopupMenu->insertItem(i18n("Show..."), this,
461 SLOT (showTodo())); 463 SLOT (showTodo()));
462 mItemPopupMenu->insertItem(i18n("Edit..."), this, 464 mItemPopupMenu->insertItem(i18n("Edit..."), this,
463 SLOT (editTodo())); 465 SLOT (editTodo()));
464 mItemPopupMenu->insertItem( i18n("Delete"), this, 466 mItemPopupMenu->insertItem( i18n("Delete"), this,
465 SLOT (deleteTodo())); 467 SLOT (deleteTodo()));
466 mItemPopupMenu->insertItem( i18n("Clone..."), this, 468 mItemPopupMenu->insertItem( i18n("Clone..."), this,
467 SLOT (cloneTodo())); 469 SLOT (cloneTodo()));
468 mItemPopupMenu->insertItem( i18n("Move..."), this, 470 mItemPopupMenu->insertItem( i18n("Move..."), this,
469 SLOT (moveTodo())); 471 SLOT (moveTodo()));
470 mItemPopupMenu->insertItem( i18n("Beam..."), this, 472 mItemPopupMenu->insertItem( i18n("Beam..."), this,
471 SLOT (beamTodo())); 473 SLOT (beamTodo()));
472 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this, 474 mItemPopupMenu->insertItem( i18n("Toggle Cancel"), this,
473 SLOT (cancelTodo())); 475 SLOT (cancelTodo()));
474 mItemPopupMenu->insertSeparator(); 476 mItemPopupMenu->insertSeparator();
475 477
476 mItemPopupMenu->insertItem( i18n("New Todo..."), this, 478 mItemPopupMenu->insertItem( i18n("New Todo..."), this,
477 SLOT (newTodo())); 479 SLOT (newTodo()));
478 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this, 480 mItemPopupMenu->insertItem(i18n("New Sub-Todo..."), this,
479 SLOT (newSubTodo())); 481 SLOT (newSubTodo()));
480 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this, 482 mItemPopupMenu->insertItem(i18n("Unparent Todo"), this,
481 SLOT (unparentTodo()),0,21); 483 SLOT (unparentTodo()),0,21);
482 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this, 484 mItemPopupMenu->insertItem(i18n("Reparent Todo"), this,
483 SLOT (reparentTodo()),0,22); 485 SLOT (reparentTodo()),0,22);
484 mItemPopupMenu->insertSeparator(); 486 mItemPopupMenu->insertSeparator();
485#if 0 487#if 0
486 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"), 488 mItemPopupMenu->insertItem(i18n("Delete completed To-Dos","Purge Completed"),
487 this, SLOT( purgeCompleted() ) ); 489 this, SLOT( purgeCompleted() ) );
488 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"), 490 mItemPopupMenu->insertItem(i18n("toggle completed To-Dos","Show Completed"),
489 this, SLOT( toggleCompleted() ),0, 33 ); 491 this, SLOT( toggleCompleted() ),0, 33 );
490 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 492 mItemPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
491 this, SLOT( toggleQuickTodo() ),0, 34 ); 493 this, SLOT( toggleQuickTodo() ),0, 34 );
492 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 494 mItemPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
493 this, SLOT( toggleRunning() ),0, 35 ); 495 this, SLOT( toggleRunning() ),0, 35 );
494 496
495#endif 497#endif
496 mPopupMenu = new QPopupMenu(this); 498 mPopupMenu = new QPopupMenu(this);
497 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this, 499 mPopupMenu->insertItem(SmallIconSet("todo"), i18n("New Todo..."), this,
498 SLOT (newTodo()),0,1); 500 SLOT (newTodo()),0,1);
499 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"), 501 mPopupMenu->insertItem(i18n("delete completed To-Dos","Purge Completed"),
500 this, SLOT(purgeCompleted()),0,2); 502 this, SLOT(purgeCompleted()),0,2);
501 mPopupMenu->insertItem(i18n("Show Completed"), 503 mPopupMenu->insertItem(i18n("Show Completed"),
502 this, SLOT( toggleCompleted() ),0,3 ); 504 this, SLOT( toggleCompleted() ),0,3 );
503 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"), 505 mPopupMenu->insertItem(i18n("toggle quick todo","Show Quick Todo"),
504 this, SLOT( toggleQuickTodo() ),0,4 ); 506 this, SLOT( toggleQuickTodo() ),0,4 );
505 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"), 507 mPopupMenu->insertItem(i18n("toggle running todo","Hide not Running"),
506 this, SLOT( toggleRunning() ),0,5 ); 508 this, SLOT( toggleRunning() ),0,5 );
507 mPopupMenu->insertItem(i18n(" set all open","Display all opened"), 509 mPopupMenu->insertItem(i18n(" set all open","Display all opened"),
508 this, SLOT( setAllOpen() ),0,6 ); 510 this, SLOT( setAllOpen() ),0,6 );
509 mPopupMenu->insertItem(i18n(" set all close","Display all closed"), 511 mPopupMenu->insertItem(i18n(" set all close","Display all closed"),
510 this, SLOT( setAllClose() ),0,7 ); 512 this, SLOT( setAllClose() ),0,7 );
511 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"), 513 mPopupMenu->insertItem(i18n(" set all flat","Display all flat"),
512 this, SLOT( setAllFlat() ),0,8 ); 514 this, SLOT( setAllFlat() ),0,8 );
513 mDocPrefs = new DocPrefs( name ); 515 mDocPrefs = new DocPrefs( name );
514 516
515 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu ); 517 mItemPopupMenu->insertItem(i18n("Todo View"),mPopupMenu );
516 mPopupMenu->setCheckable( true ); 518 mPopupMenu->setCheckable( true );
517 mItemPopupMenu->setCheckable( true ); 519 mItemPopupMenu->setCheckable( true );
518 520
519 521
520 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 522 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
521 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 523 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
522 524
523 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 525 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
524 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 526 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
525 527
526 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 528 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
527 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 529 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
528 530
529 531
530 // Double clicking conflicts with opening/closing the subtree 532 // Double clicking conflicts with opening/closing the subtree
531 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ), 533 connect( mTodoListView, SIGNAL( doubleClicked( QListViewItem *) ),
532 SLOT( editItem( QListViewItem *) ) ); 534 SLOT( editItem( QListViewItem *) ) );
533 /* 535 /*
534 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *, 536 connect( mTodoListView, SIGNAL( rightButtonClicked ( QListViewItem *,
535 const QPoint &,int ) ), 537 const QPoint &,int ) ),
536 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 538 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
537 */ 539 */
538 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *, 540 connect( mTodoListView, SIGNAL( contextRequest ( QListViewItem *,
539 const QPoint &,int ) ), 541 const QPoint &,int ) ),
540 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) ); 542 SLOT( popupMenu( QListViewItem *, const QPoint & ,int) ) );
541 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ), 543 connect( mTodoListView, SIGNAL( clicked( QListViewItem * ) ),
542 SLOT( itemClicked( QListViewItem * ) ) ); 544 SLOT( itemClicked( QListViewItem * ) ) );
543 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ), 545 connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ),
544 SLOT( itemDoubleClicked( QListViewItem * ) ) ); 546 SLOT( itemDoubleClicked( QListViewItem * ) ) );
545 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 547 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
546 SLOT( updateView() ) ); 548 SLOT( updateView() ) );
547 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), 549 connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ),
548 SLOT( todoModified(Todo *, int) ) ); 550 SLOT( todoModified(Todo *, int) ) );
549 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ), 551 connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ),
550 SLOT( itemStateChanged( QListViewItem * ) ) ); 552 SLOT( itemStateChanged( QListViewItem * ) ) );
551 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ), 553 connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ),
552 SLOT( itemStateChanged( QListViewItem * ) ) ); 554 SLOT( itemStateChanged( QListViewItem * ) ) );
553 connect( mTodoListView, SIGNAL( paintNeeded() ), 555 connect( mTodoListView, SIGNAL( paintNeeded() ),
554 SLOT( paintNeeded()) ); 556 SLOT( paintNeeded()) );
555 557
556#if 0 558#if 0
557 connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)), 559 connect(mTodoListView,SIGNAL(selectionChanged(QListViewItem *)),
558 SLOT(selectionChanged(QListViewItem *))); 560 SLOT(selectionChanged(QListViewItem *)));
559 connect(mTodoListView,SIGNAL(clicked(QListViewItem *)), 561 connect(mTodoListView,SIGNAL(clicked(QListViewItem *)),
560 SLOT(selectionChanged(QListViewItem *))); 562 SLOT(selectionChanged(QListViewItem *)));
561 connect(mTodoListView,SIGNAL(pressed(QListViewItem *)), 563 connect(mTodoListView,SIGNAL(pressed(QListViewItem *)),
562 SLOT(selectionChanged(QListViewItem *))); 564 SLOT(selectionChanged(QListViewItem *)));
563#endif 565#endif
564 566
565 connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) )); 567 connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) ));
566 connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) )); 568 connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) ));
567 connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) )); 569 connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) ));
568 570
569 connect( mTodoListView, SIGNAL(selectionChanged() ), 571 connect( mTodoListView, SIGNAL(selectionChanged() ),
570 SLOT( processSelectionChange() ) ); 572 SLOT( processSelectionChange() ) );
571 connect( mQuickAdd, SIGNAL( returnPressed () ), 573 connect( mQuickAdd, SIGNAL( returnPressed () ),
572 SLOT( addQuickTodo() ) ); 574 SLOT( addQuickTodo() ) );
573 575
574} 576}
575 577
576KOTodoView::~KOTodoView() 578KOTodoView::~KOTodoView()
577{ 579{
578 // delete mKOTodoViewWhatsThis; 580 // delete mKOTodoViewWhatsThis;
579 delete mDocPrefs; 581 delete mDocPrefs;
580} 582}
581QString KOTodoView::getWhatsThisText(QPoint p) 583QString KOTodoView::getWhatsThisText(QPoint p)
582{ 584{
583 KOTodoViewItem* item = ( KOTodoViewItem* ) mTodoListView->itemAt( p ); 585 KOTodoViewItem* item = ( KOTodoViewItem* ) mTodoListView->itemAt( p );
584 if ( item ) 586 if ( item )
585 return KIncidenceFormatter::instance()->getFormattedText( item->todo(), 587 return KIncidenceFormatter::instance()->getFormattedText( item->todo(),
586 KOPrefs::instance()->mWTshowDetails, 588 KOPrefs::instance()->mWTshowDetails,
587 KOPrefs::instance()->mWTshowCreated, 589 KOPrefs::instance()->mWTshowCreated,
588 KOPrefs::instance()->mWTshowChanged); 590 KOPrefs::instance()->mWTshowChanged);
589 return i18n("That is the todo view" ); 591 return i18n("That is the todo view" );
590 592
591} 593}
592 594
593void KOTodoView::jumpToDate () 595void KOTodoView::jumpToDate ()
594{ 596{
595 // if (mActiveItem) { 597 // if (mActiveItem) {
596// mActiveItem->todo()); 598// mActiveItem->todo());
597// if ( mActiveItem->todo()->hasDueDate() ) 599// if ( mActiveItem->todo()->hasDueDate() )
598// emit mActiveItem->todo()jumpToTime( mTodo->dtDue().date() ); 600// emit mActiveItem->todo()jumpToTime( mTodo->dtDue().date() );
599} 601}
600void KOTodoView::paintNeeded() 602void KOTodoView::paintNeeded()
601{ 603{
602 if ( mPendingUpdateBeforeRepaint ) { 604 if ( mPendingUpdateBeforeRepaint ) {
603 updateView(); 605 updateView();
604 mPendingUpdateBeforeRepaint = false; 606 mPendingUpdateBeforeRepaint = false;
605 } 607 }
606} 608}
607void KOTodoView::paintEvent(QPaintEvent * pevent) 609void KOTodoView::paintEvent(QPaintEvent * pevent)
608{ 610{
609 if ( mPendingUpdateBeforeRepaint ) { 611 if ( mPendingUpdateBeforeRepaint ) {
610 updateView(); 612 updateView();
611 mPendingUpdateBeforeRepaint = false; 613 mPendingUpdateBeforeRepaint = false;
612 } 614 }
613 KOrg::BaseView::paintEvent( pevent); 615 KOrg::BaseView::paintEvent( pevent);
614} 616}
615 617
616void KOTodoView::updateView() 618void KOTodoView::updateView()
617{ 619{
618 pendingSubtodo = 0; 620 pendingSubtodo = 0;
619 if ( mBlockUpdate ) { 621 if ( mBlockUpdate ) {
620 return; 622 return;
621 } 623 }
622 if ( !isVisible() ) { 624 if ( !isVisible() ) {
623 mPendingUpdateBeforeRepaint = true; 625 mPendingUpdateBeforeRepaint = true;
624 return; 626 return;
625 } 627 }
626 storeCurrentItem(); 628 storeCurrentItem();
627 //qDebug("KOTodoView::updateView() %x", this); 629 //qDebug("KOTodoView::updateView() %x", this);
628 if ( isFlatDisplay ) { 630 if ( isFlatDisplay ) {
629 displayAllFlat(); 631 displayAllFlat();
630 resetCurrentItem(); 632 resetCurrentItem();
631 return; 633 return;
632 } 634 }
633 //qDebug("update "); 635 //qDebug("update ");
634// kdDebug() << "KOTodoView::updateView()" << endl; 636// kdDebug() << "KOTodoView::updateView()" << endl;
635 QFont fo = KOPrefs::instance()->mTodoViewFont; 637 QFont fo = KOPrefs::instance()->mTodoViewFont;
636 638
637 639
638 mTodoListView->clear(); 640 mTodoListView->clear();
639 if ( mName == "todolistsmall" ) { 641 if ( mName == "todolistsmall" ) {
640 if ( KOPrefs::instance()->mTodoViewUsesSmallFont ) { 642 if ( KOPrefs::instance()->mTodoViewUsesSmallFont ) {
641 int ps = fo.pointSize() -2; 643 int ps = fo.pointSize() -2;
642 if ( ps > 12 ) 644 if ( ps > 12 )
643 ps -= 2; 645 ps -= 2;
644 fo.setPointSize( ps ); 646 fo.setPointSize( ps );
645 } 647 }
646 } 648 }
647 649
648 mTodoListView->setFont( fo ); 650 mTodoListView->setFont( fo );
649 // QFontMetrics fm ( KOPrefs::instance()->mTodoViewFont ); 651 // QFontMetrics fm ( KOPrefs::instance()->mTodoViewFont );
650 //mTodoListView->header()->setMaximumHeight(fm.height()); 652 //mTodoListView->header()->setMaximumHeight(fm.height());
651 QPtrList<Todo> todoList = calendar()->todos(); 653 QPtrList<Todo> todoList = calendar()->todos();
652 654
653/* 655/*
654 kdDebug() << "KOTodoView::updateView(): Todo List:" << endl; 656 kdDebug() << "KOTodoView::updateView(): Todo List:" << endl;
655 Event *t; 657 Event *t;
656 for(t = todoList.first(); t; t = todoList.next()) { 658 for(t = todoList.first(); t; t = todoList.next()) {
657 kdDebug() << " " << t->getSummary() << endl; 659 kdDebug() << " " << t->getSummary() << endl;
658 660
659 if (t->getRelatedTo()) { 661 if (t->getRelatedTo()) {
660 kdDebug() << " (related to " << t->getRelatedTo()->getSummary() << ")" << endl; 662 kdDebug() << " (related to " << t->getRelatedTo()->getSummary() << ")" << endl;
661 } 663 }
662 664
663 QPtrList<Event> l = t->getRelations(); 665 QPtrList<Event> l = t->getRelations();
664 Event *c; 666 Event *c;
665 for(c=l.first();c;c=l.next()) { 667 for(c=l.first();c;c=l.next()) {
666 kdDebug() << " - relation: " << c->getSummary() << endl; 668 kdDebug() << " - relation: " << c->getSummary() << endl;
667 } 669 }
668 } 670 }
669*/ 671*/
670 672
671 // Put for each Event a KOTodoViewItem in the list view. Don't rely on a 673 // Put for each Event a KOTodoViewItem in the list view. Don't rely on a
672 // specific order of events. That means that we have to generate parent items 674 // specific order of events. That means that we have to generate parent items
673 // recursively for proper hierarchical display of Todos. 675 // recursively for proper hierarchical display of Todos.
674 mTodoMap.clear(); 676 mTodoMap.clear();
675 Todo *todo; 677 Todo *todo;
676 todo = todoList.first();// todo; todo = todoList.next()) { 678 todo = todoList.first();// todo; todo = todoList.next()) {
677 while ( todo ) { 679 while ( todo ) {
678 bool next = true; 680 bool next = true;
679 // qDebug("todo %s ", todo->summary().latin1()); 681 // qDebug("todo %s ", todo->summary().latin1());
680 Incidence *incidence = todo->relatedTo(); 682 Incidence *incidence = todo->relatedTo();
681 while ( incidence ) { 683 while ( incidence ) {
682 if ( incidence->type() == "Todo") { 684 if ( incidence->type() == "Todo") {
683 //qDebug("related %s ",incidence->summary().latin1() ); 685 //qDebug("related %s ",incidence->summary().latin1() );
684 if ( !(todoList.contains ( ((Todo* )incidence ) ) )) { 686 if ( !(todoList.contains ( ((Todo* )incidence ) ) )) {
685 //qDebug("related not found "); 687 //qDebug("related not found ");
686 todoList.remove( ); 688 todoList.remove( );
687 todo = todoList.current(); 689 todo = todoList.current();
688 next = false; 690 next = false;
689 incidence = 0; 691 incidence = 0;
690 692
691 } else { 693 } else {
692 //qDebug("related found "); 694 //qDebug("related found ");
693 incidence = incidence->relatedTo(); 695 incidence = incidence->relatedTo();
694 } 696 }
695 } else 697 } else
696 incidence = 0; 698 incidence = 0;
697 } 699 }
698 if ( next ) 700 if ( next )
699 todo = todoList.next(); 701 todo = todoList.next();
700 } 702 }
701// qDebug("again .... "); 703// qDebug("again .... ");
702// for(todo = todoList.first(); todo; todo = todoList.next()) { 704// for(todo = todoList.first(); todo; todo = todoList.next()) {
703 705
704// qDebug("yytodo %s ", todo->summary().latin1()); 706// qDebug("yytodo %s ", todo->summary().latin1());
705// } 707// }
706 //qDebug("for "); 708 //qDebug("for ");
707 for(todo = todoList.first(); todo; todo = todoList.next()) { 709 for(todo = todoList.first(); todo; todo = todoList.next()) {
708 if (!mTodoMap.contains(todo) && checkTodo( todo ) ) 710 if (!mTodoMap.contains(todo) && checkTodo( todo ) )
709 { 711 {
710 insertTodoItem(todo); 712 insertTodoItem(todo);
711 } 713 }
712 } 714 }
713 //qDebug("for end "); 715 //qDebug("for end ");
714 // Restore opened/closed state 716 // Restore opened/closed state
715 mTodoListView->blockSignals( true ); 717 mTodoListView->blockSignals( true );
716 if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() ); 718 if( mDocPrefs ) restoreItemState( mTodoListView->firstChild() );
717 mTodoListView->blockSignals( false ); 719 mTodoListView->blockSignals( false );
718 resetCurrentItem(); 720 resetCurrentItem();
719 processSelectionChange(); 721 processSelectionChange();
720} 722}
721 723
722void KOTodoView::storeCurrentItem() 724void KOTodoView::storeCurrentItem()
723{ 725{
724 mCurItem = 0; 726 mCurItem = 0;
725 mCurItemRootParent = 0; 727 mCurItemRootParent = 0;
726 mCurItemAbove = 0; 728 mCurItemAbove = 0;
727 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 729 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
728 if (mActiveItem) { 730 if (mActiveItem) {
729 mCurItem = mActiveItem->todo(); 731 mCurItem = mActiveItem->todo();
730 KOTodoViewItem* activeItemAbove = (KOTodoViewItem*)mActiveItem->itemAbove (); 732 KOTodoViewItem* activeItemAbove = (KOTodoViewItem*)mActiveItem->itemAbove ();
731 if ( activeItemAbove ) 733 if ( activeItemAbove )
732 mCurItemAbove = activeItemAbove->todo(); 734 mCurItemAbove = activeItemAbove->todo();
733 while ( mActiveItem->parent() != 0 ) 735 mCurItemRootParent = mCurItem;
734 mActiveItem = (KOTodoViewItem*)mActiveItem->parent(); 736 while ( mCurItemRootParent->relatedTo() != 0 )
735 mCurItemRootParent = mActiveItem->todo(); 737 mCurItemRootParent = mCurItemRootParent->relatedTo();
736 } 738 }
737 mActiveItem = 0; 739 mActiveItem = 0;
738} 740}
739 741
740void KOTodoView::resetCurrentItem() 742void KOTodoView::resetCurrentItem()
741{ 743{
742 mTodoListView->setFocus(); 744 mTodoListView->setFocus();
743 KOTodoViewItem* foundItem = 0; 745 KOTodoViewItem* foundItem = 0;
744 KOTodoViewItem* foundItemRoot = 0; 746 KOTodoViewItem* foundItemRoot = 0;
745 KOTodoViewItem* foundItemAbove = 0; 747 KOTodoViewItem* foundItemAbove = 0;
746 if ( mTodoListView->firstChild () ) { 748 if ( mTodoListView->firstChild () ) {
747 if ( mCurItem ) { 749 if ( mCurItem ) {
748 KOTodoViewItem* item = (KOTodoViewItem*)mTodoListView->firstChild (); 750 KOTodoViewItem* item = (KOTodoViewItem*)mTodoListView->firstChild ();
749 while ( item ) { 751 while ( item ) {
750 if ( item->todo() == mCurItem ) { 752 if ( item->todo() == mCurItem ) {
751 foundItem = item; 753 foundItem = item;
752 break; 754 break;
753 } else if ( item->todo() == mCurItemAbove ) { 755 } else if ( item->todo() == mCurItemAbove ) {
754 foundItemAbove = item; 756 foundItemAbove = item;
755 757
756 } else if ( item->todo() == mCurItemRootParent ) { 758 } else if ( item->todo() == mCurItemRootParent ) {
757 foundItemRoot = item; 759 foundItemRoot = item;
758 } 760 }
759 item = (KOTodoViewItem*)item->itemBelow(); 761 item = (KOTodoViewItem*)item->itemBelow();
760 } 762 }
761 if ( ! foundItem ) { 763 if ( ! foundItem ) {
762 if ( foundItemAbove ) 764 if ( foundItemRoot )
763 foundItem = foundItemAbove;
764 else
765 foundItem = foundItemRoot; 765 foundItem = foundItemRoot;
766 else
767 foundItem = foundItemAbove;
766 } 768 }
767 } 769 }
768 if ( foundItem ) { 770 if ( foundItem ) {
769 mTodoListView->setCurrentItem( foundItem ); 771 mTodoListView->setCurrentItem( foundItem );
770 mTodoListView->ensureItemVisible( foundItem ); 772 mTodoListView->ensureItemVisible( foundItem );
771 } else { 773 } else {
772 mTodoListView->setCurrentItem( mTodoListView->firstChild () ); 774 mTodoListView->setCurrentItem( mTodoListView->firstChild () );
773 } 775 }
774 } 776 }
775 mTodoListView->setFocus(); 777 mTodoListView->setFocus();
776} 778}
777//Incidence * mCurItem, *mCurItemRootParent,*mCurItemAbove; 779//Incidence * mCurItem, *mCurItemRootParent,*mCurItemAbove;
778bool KOTodoView::checkTodo( Todo * todo ) 780bool KOTodoView::checkTodo( Todo * todo )
779{ 781{
780 782
781 if ( !KOPrefs::instance()->mShowCompletedTodo && todo->isCompleted() ) 783 if ( !KOPrefs::instance()->mShowCompletedTodo && todo->isCompleted() )
782 return false; 784 return false;
783 if ( !todo->isCompleted() ) { 785 if ( !todo->isCompleted() ) {
784 if ( todo->hasDueDate() && todo->dtDue().date() <= QDate::currentDate() ) 786 if ( todo->hasDueDate() && todo->dtDue().date() <= QDate::currentDate() )
785 return true; 787 return true;
786 } 788 }
787 if ( KOPrefs::instance()->mHideNonStartedTodos && mNavigator ) { 789 if ( KOPrefs::instance()->mHideNonStartedTodos && mNavigator ) {
788 if ( todo->hasStartDate() ) 790 if ( todo->hasStartDate() )
789 if ( mNavigator->selectedDates().last() < todo->dtStart().date() ) 791 if ( mNavigator->selectedDates().last() < todo->dtStart().date() )
790 return false; 792 return false;
791 if ( todo->hasDueDate() ) 793 if ( todo->hasDueDate() )
792 if ( mNavigator->selectedDates().first() > todo->dtDue().date() ) 794 if ( mNavigator->selectedDates().first() > todo->dtDue().date() )
793 return false; 795 return false;
794 } 796 }
795 return true; 797 return true;
796} 798}
797 799
798void KOTodoView::restoreItemState( QListViewItem *item ) 800void KOTodoView::restoreItemState( QListViewItem *item )
799{ 801{
800 pendingSubtodo = 0; 802 pendingSubtodo = 0;
801 while( item ) { 803 while( item ) {
802 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 804 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
803 todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) ); 805 todoItem->setOpen( mDocPrefs->readBoolEntry( todoItem->todo()->uid() ) );
804 if( item->childCount() > 0 ) restoreItemState( item->firstChild() ); 806 if( item->childCount() > 0 ) restoreItemState( item->firstChild() );
805 item = item->nextSibling(); 807 item = item->nextSibling();
806 } 808 }
807} 809}
808 810
809 811
810QMap<Todo *,KOTodoViewItem *>::ConstIterator 812QMap<Todo *,KOTodoViewItem *>::ConstIterator
811 KOTodoView::insertTodoItem(Todo *todo) 813 KOTodoView::insertTodoItem(Todo *todo)
812{ 814{
813 815
814// kdDebug() << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl; 816// kdDebug() << "KOTodoView::insertTodoItem(): " << todo->getSummary() << endl;
815 // TODO: Check, if dynmaic cast is necessary 817 // TODO: Check, if dynmaic cast is necessary
816 818
817 pendingSubtodo = 0; 819 pendingSubtodo = 0;
818 Incidence *incidence = todo->relatedTo(); 820 Incidence *incidence = todo->relatedTo();
819 if (incidence && incidence->type() == "Todo") { 821 if (incidence && incidence->type() == "Todo") {
820 Todo *relatedTodo = static_cast<Todo *>(incidence); 822 Todo *relatedTodo = static_cast<Todo *>(incidence);
821 823
822// kdDebug() << " has Related" << endl; 824// kdDebug() << " has Related" << endl;
823 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator; 825 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
824 itemIterator = mTodoMap.find(relatedTodo); 826 itemIterator = mTodoMap.find(relatedTodo);
825 if (itemIterator == mTodoMap.end()) { 827 if (itemIterator == mTodoMap.end()) {
826// kdDebug() << " related not yet in list" << endl; 828// kdDebug() << " related not yet in list" << endl;
827 itemIterator = insertTodoItem (relatedTodo); 829 itemIterator = insertTodoItem (relatedTodo);
828 } 830 }
829 // isn't this pretty stupid? We give one Todo to the KOTodoViewItem 831 // isn't this pretty stupid? We give one Todo to the KOTodoViewItem
830 // and one into the map. Sure finding is more easy but why? -zecke 832 // and one into the map. Sure finding is more easy but why? -zecke
831 KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this); 833 KOTodoViewItem *todoItem = new KOTodoViewItem(*itemIterator,todo,this);
832 return mTodoMap.insert(todo,todoItem); 834 return mTodoMap.insert(todo,todoItem);
833 } else { 835 } else {
834// kdDebug() << " no Related" << endl; 836// kdDebug() << " no Related" << endl;
835 // see above -zecke 837 // see above -zecke
836 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 838 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
837 return mTodoMap.insert(todo,todoItem); 839 return mTodoMap.insert(todo,todoItem);
838 } 840 }
839} 841}
840 842
841 843
842void KOTodoView::updateConfig() 844void KOTodoView::updateConfig()
843{ 845{
844 updateView(); 846 updateView();
845 mTodoListView->repaintContents(); 847 mTodoListView->repaintContents();
846} 848}
847 849
848QPtrList<Incidence> KOTodoView::selectedIncidences() 850QPtrList<Incidence> KOTodoView::selectedIncidences()
849{ 851{
850 QPtrList<Incidence> selected; 852 QPtrList<Incidence> selected;
851 853
852 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem()); 854 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
853// if (!item) item = mActiveItem; 855// if (!item) item = mActiveItem;
854 if (item) selected.append(item->todo()); 856 if (item) selected.append(item->todo());
855 857
856 return selected; 858 return selected;
857} 859}
858 860
859QPtrList<Todo> KOTodoView::selectedTodos() 861QPtrList<Todo> KOTodoView::selectedTodos()
860{ 862{
861 QPtrList<Todo> selected; 863 QPtrList<Todo> selected;
862 864
863 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem()); 865 KOTodoViewItem *item = (KOTodoViewItem *)(mTodoListView->selectedItem());
864// if (!item) item = mActiveItem; 866// if (!item) item = mActiveItem;
865 if (item) selected.append(item->todo()); 867 if (item) selected.append(item->todo());
866 868
867 return selected; 869 return selected;
868} 870}
869 871
870void KOTodoView::changeEventDisplay(Event *, int) 872void KOTodoView::changeEventDisplay(Event *, int)
871{ 873{
872 updateView(); 874 updateView();
873} 875}
874 876
875void KOTodoView::showDates(const QDate &, const QDate &) 877void KOTodoView::showDates(const QDate &, const QDate &)
876{ 878{
877} 879}
878 880
879void KOTodoView::showEvents(QPtrList<Event>) 881void KOTodoView::showEvents(QPtrList<Event>)
880{ 882{
881 kdDebug() << "KOTodoView::selectEvents(): not yet implemented" << endl; 883 kdDebug() << "KOTodoView::selectEvents(): not yet implemented" << endl;
882} 884}
883 885
884void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd, 886void KOTodoView::printPreview(CalPrinter *calPrinter, const QDate &fd,
885 const QDate &td) 887 const QDate &td)
886{ 888{
887#ifndef KORG_NOPRINTER 889#ifndef KORG_NOPRINTER
888 calPrinter->preview(CalPrinter::Todolist, fd, td); 890 calPrinter->preview(CalPrinter::Todolist, fd, td);
889#endif 891#endif
890} 892}
891 893
892void KOTodoView::editItem(QListViewItem *item ) 894void KOTodoView::editItem(QListViewItem *item )
893{ 895{
894 // qDebug("editItem(QListViewItem *item ) "); 896 // qDebug("editItem(QListViewItem *item ) ");
895 emit editTodoSignal(((KOTodoViewItem *)item)->todo()); 897 emit editTodoSignal(((KOTodoViewItem *)item)->todo());
896} 898}
897 899
898void KOTodoView::showItem(QListViewItem *item,const QPoint &,int) 900void KOTodoView::showItem(QListViewItem *item,const QPoint &,int)
899{ 901{
900 emit showTodoSignal(((KOTodoViewItem *)item)->todo()); 902 emit showTodoSignal(((KOTodoViewItem *)item)->todo());
901} 903}
902 904
903void KOTodoView::popupMenu(QListViewItem *item,const QPoint &p,int column) 905void KOTodoView::popupMenu(QListViewItem *item,const QPoint &p,int column)
904{ 906{
905 pendingSubtodo = 0; 907 pendingSubtodo = 0;
906 mActiveItem = (KOTodoViewItem *)item; 908 mActiveItem = (KOTodoViewItem *)item;
907 if (item) { 909 if (item) {
908 switch (column){ 910 switch (column){
909 case 1: 911 case 1:
910 mPriorityPopupMenu->popup(QCursor::pos ()); break; 912 mPriorityPopupMenu->popup(QCursor::pos ()); break;
911 case 2: 913 case 2:
912 mPercentageCompletedPopupMenu->popup(QCursor::pos ()); break; 914 mPercentageCompletedPopupMenu->popup(QCursor::pos ()); break;
913 case 3: 915 case 3:
914 moveTodo(); 916 moveTodo();
915 break; 917 break;
916 case 8: 918 case 8:
917 getCategoryPopupMenu((KOTodoViewItem *)item)->popup(QCursor::pos ()); break; 919 getCategoryPopupMenu((KOTodoViewItem *)item)->popup(QCursor::pos ()); break;
918 default: 920 default:
919 mItemPopupMenu->popup(QCursor::pos()); 921 mItemPopupMenu->popup(QCursor::pos());
920 } 922 }
921 } else mPopupMenu->popup(QCursor::pos()); 923 } else mPopupMenu->popup(QCursor::pos());
922} 924}
923void KOTodoView::newTodo() 925void KOTodoView::newTodo()
924{ 926{
925 emit newTodoSignal(); 927 emit newTodoSignal();
926} 928}
927 929
928void KOTodoView::newSubTodo() 930void KOTodoView::newSubTodo()
929{ 931{
930 if (mActiveItem) { 932 if (mActiveItem) {
931 emit newSubTodoSignal(mActiveItem->todo()); 933 emit newSubTodoSignal(mActiveItem->todo());
932 } 934 }
933} 935}
934void KOTodoView::unparentTodo() 936void KOTodoView::unparentTodo()
935{ 937{
936 if (mActiveItem) { 938 if (mActiveItem) {
937 emit unparentTodoSignal(mActiveItem->todo()); 939 emit unparentTodoSignal(mActiveItem->todo());
938 } 940 }
939} 941}
940 942
941void KOTodoView::reparentTodo() 943void KOTodoView::reparentTodo()
942{ 944{
943 if (mActiveItem) { 945 if (mActiveItem) {
944 qDebug("KOTodoView::reparentTodo() "); 946 qDebug("KOTodoView::reparentTodo() ");
945 topLevelWidget()->setCaption(i18n("Click on new parent item")); 947 topLevelWidget()->setCaption(i18n("Click on new parent item"));
946 pendingSubtodo = mActiveItem; 948 pendingSubtodo = mActiveItem;
947 } 949 }
948} 950}
949void KOTodoView::editTodo() 951void KOTodoView::editTodo()
950{ 952{
951 if (mActiveItem) { 953 if (mActiveItem) {
952 emit editTodoSignal(mActiveItem->todo()); 954 emit editTodoSignal(mActiveItem->todo());
953 } 955 }
954} 956}
955void KOTodoView::cloneTodo() 957void KOTodoView::cloneTodo()
956{ 958{
957 if (mActiveItem) { 959 if (mActiveItem) {
958 emit cloneTodoSignal((Incidence*)mActiveItem->todo()); 960 emit cloneTodoSignal((Incidence*)mActiveItem->todo());
959 } 961 }
960} 962}
961void KOTodoView::cancelTodo() 963void KOTodoView::cancelTodo()
962{ 964{
963 if (mActiveItem) { 965 if (mActiveItem) {
964 emit cancelTodoSignal((Incidence*)mActiveItem->todo()); 966 emit cancelTodoSignal((Incidence*)mActiveItem->todo());
965 } 967 }
966} 968}
967void KOTodoView::moveTodo() 969void KOTodoView::moveTodo()
968{ 970{
969 if (mActiveItem) { 971 if (mActiveItem) {
970 emit moveTodoSignal((Incidence*)mActiveItem->todo()); 972 emit moveTodoSignal((Incidence*)mActiveItem->todo());
971 } 973 }
972} 974}
973void KOTodoView::beamTodo() 975void KOTodoView::beamTodo()
974{ 976{
975 if (mActiveItem) { 977 if (mActiveItem) {
976 emit beamTodoSignal((Incidence*)mActiveItem->todo()); 978 emit beamTodoSignal((Incidence*)mActiveItem->todo());
977 } 979 }
978} 980}
979 981
980 982
981void KOTodoView::showTodo() 983void KOTodoView::showTodo()
982{ 984{
983 if (mActiveItem) { 985 if (mActiveItem) {
984 emit showTodoSignal(mActiveItem->todo()); 986 emit showTodoSignal(mActiveItem->todo());
985 } 987 }
986} 988}
987 989
988void KOTodoView::deleteTodo() 990void KOTodoView::deleteTodo()
989{ 991{
990 if (mActiveItem) { 992 if (mActiveItem) {
991 emit deleteTodoSignal(mActiveItem->todo()); 993 emit deleteTodoSignal(mActiveItem->todo());
992 } 994 }
993} 995}
994 996
995void KOTodoView::setNewPriority(int index) 997void KOTodoView::setNewPriority(int index)
996{ 998{
997 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 999 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
998 mActiveItem->todo()->setPriority(mPriority[index]); 1000 mActiveItem->todo()->setPriority(mPriority[index]);
999 mActiveItem->construct(); 1001 mActiveItem->construct();
1000 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED); 1002 todoModified (mActiveItem->todo(), KOGlobals::PRIORITY_MODIFIED);
1001 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1003 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1002 } 1004 }
1003} 1005}
1004 1006
1005void KOTodoView::setNewPercentage(int index) 1007void KOTodoView::setNewPercentage(int index)
1006{ 1008{
1007 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1009 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1008 1010
1009 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) { 1011 if ( mPercentage[index] == 100 && !mActiveItem->isOn() ) {
1010 mActiveItem->setOn( true ); 1012 mActiveItem->setOn( true );
1011 return; 1013 return;
1012 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) { 1014 } else if ( mPercentage[index] != 100 && mActiveItem->isOn() ) {
1013 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent())); 1015 KOTodoViewItem* par = (static_cast<KOTodoViewItem*>(mActiveItem->parent()));
1014 if ( par && par->isOn() ) 1016 if ( par && par->isOn() )
1015 par->setOn( false ); 1017 par->setOn( false );
1016 } 1018 }
1017 if (mPercentage[index] == 100) { 1019 if (mPercentage[index] == 100) {
1018 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime()); 1020 mActiveItem->todo()->setCompleted(QDateTime::currentDateTime());
1019 } else { 1021 } else {
1020 mActiveItem->todo()->setCompleted(false); 1022 mActiveItem->todo()->setCompleted(false);
1021 } 1023 }
1022 mActiveItem->todo()->setPercentComplete(mPercentage[index]); 1024 mActiveItem->todo()->setPercentComplete(mPercentage[index]);
1023 mActiveItem->construct(); 1025 mActiveItem->construct();
1024 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED); 1026 todoModified (mActiveItem->todo (), KOGlobals::COMPLETION_MODIFIED);
1025 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1027 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1026 } 1028 }
1027} 1029}
1028 1030
1029 1031
1030QPopupMenu * KOTodoView::getCategoryPopupMenu (KOTodoViewItem *todoItem) 1032QPopupMenu * KOTodoView::getCategoryPopupMenu (KOTodoViewItem *todoItem)
1031{ 1033{
1032 QPopupMenu* tempMenu = new QPopupMenu (this); 1034 QPopupMenu* tempMenu = new QPopupMenu (this);
1033 QStringList checkedCategories = todoItem->todo()->categories (); 1035 QStringList checkedCategories = todoItem->todo()->categories ();
1034 1036
1035 tempMenu->setCheckable (true); 1037 tempMenu->setCheckable (true);
1036 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin (); 1038 for (QStringList::Iterator it = KOPrefs::instance()->mCustomCategories.begin ();
1037 it != KOPrefs::instance()->mCustomCategories.end (); 1039 it != KOPrefs::instance()->mCustomCategories.end ();
1038 ++it) { 1040 ++it) {
1039 int index = tempMenu->insertItem (*it); 1041 int index = tempMenu->insertItem (*it);
1040 mCategory[index] = *it; 1042 mCategory[index] = *it;
1041 if (checkedCategories.find (*it) != checkedCategories.end ()) tempMenu->setItemChecked (index, true); 1043 if (checkedCategories.find (*it) != checkedCategories.end ()) tempMenu->setItemChecked (index, true);
1042 } 1044 }
1043 1045
1044 connect (tempMenu, SIGNAL (activated (int)), SLOT (changedCategories (int))); 1046 connect (tempMenu, SIGNAL (activated (int)), SLOT (changedCategories (int)));
1045 return tempMenu; 1047 return tempMenu;
1046 1048
1047 1049
1048} 1050}
1049void KOTodoView::changedCategories(int index) 1051void KOTodoView::changedCategories(int index)
1050{ 1052{
1051 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) { 1053 if (mActiveItem && !mActiveItem->todo()->isReadOnly ()) {
1052 QStringList categories = mActiveItem->todo()->categories (); 1054 QStringList categories = mActiveItem->todo()->categories ();
1053 QString colcat = categories.first(); 1055 QString colcat = categories.first();
1054 if (categories.find (mCategory[index]) != categories.end ()) 1056 if (categories.find (mCategory[index]) != categories.end ())
1055 categories.remove (mCategory[index]); 1057 categories.remove (mCategory[index]);
1056 else 1058 else
1057 categories.insert (categories.end(), mCategory[index]); 1059 categories.insert (categories.end(), mCategory[index]);
1058 categories.sort (); 1060 categories.sort ();
1059 if ( !colcat.isEmpty() ) { 1061 if ( !colcat.isEmpty() ) {
1060 if ( categories.find ( colcat ) != categories.end () ) { 1062 if ( categories.find ( colcat ) != categories.end () ) {
1061 categories.remove( colcat ); 1063 categories.remove( colcat );
1062 categories.prepend( colcat ); 1064 categories.prepend( colcat );
1063 } 1065 }
1064 } 1066 }
1065 mActiveItem->todo()->setCategories (categories); 1067 mActiveItem->todo()->setCategories (categories);
1066 mActiveItem->construct(); 1068 mActiveItem->construct();
1067 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 ); 1069 mActiveItem->todo()->setRevision( mActiveItem->todo()->revision()+1 );
1068 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED); 1070 todoModified (mActiveItem->todo (), KOGlobals::CATEGORY_MODIFIED);
1069 } 1071 }
1070} 1072}
1071void KOTodoView::itemDoubleClicked(QListViewItem *item) 1073void KOTodoView::itemDoubleClicked(QListViewItem *item)
1072{ 1074{
1073 if ( pendingSubtodo != 0 ) { 1075 if ( pendingSubtodo != 0 ) {
1074 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1076 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1075 } 1077 }
1076 pendingSubtodo = 0; 1078 pendingSubtodo = 0;
1077 int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() ); 1079 int row = mTodoListView->header()->sectionAt ( mTodoListView->header()->mapFromGlobal( QCursor::pos()).x() );
1078 //qDebug("ROW %d ", row); 1080 //qDebug("ROW %d ", row);
1079 if (!item) { 1081 if (!item) {
1080 newTodo(); 1082 newTodo();
1081 return; 1083 return;
1082 } else { 1084 } else {
1083 if ( row == 1 ) { 1085 if ( row == 1 ) {
1084 mActiveItem = (KOTodoViewItem *) item; 1086 mActiveItem = (KOTodoViewItem *) item;
1085 newSubTodo(); 1087 newSubTodo();
1086 return; 1088 return;
1087 } 1089 }
1088 } 1090 }
1089 if ( KOPrefs::instance()->mEditOnDoubleClick ) 1091 if ( KOPrefs::instance()->mEditOnDoubleClick )
1090 editItem( item ); 1092 editItem( item );
1091 else 1093 else
1092 showItem( item , QPoint(), 0 ); 1094 showItem( item , QPoint(), 0 );
1093} 1095}
1094void KOTodoView::itemClicked(QListViewItem *item) 1096void KOTodoView::itemClicked(QListViewItem *item)
1095{ 1097{
1096 //qDebug("KOTodoView::itemClicked %d", item); 1098 //qDebug("KOTodoView::itemClicked %d", item);
1097 if (!item) { 1099 if (!item) {
1098 if ( pendingSubtodo != 0 ) { 1100 if ( pendingSubtodo != 0 ) {
1099 topLevelWidget()->setCaption(i18n("Reparenting aborted!")); 1101 topLevelWidget()->setCaption(i18n("Reparenting aborted!"));
1100 } 1102 }
1101 pendingSubtodo = 0; 1103 pendingSubtodo = 0;
1102 return; 1104 return;
1103 } 1105 }
1104 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1106 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1105 if ( pendingSubtodo != 0 ) { 1107 if ( pendingSubtodo != 0 ) {
1106 bool allowReparent = true; 1108 bool allowReparent = true;
1107 QListViewItem *par = item; 1109 QListViewItem *par = item;
1108 while ( par ) { 1110 while ( par ) {
1109 if ( par == pendingSubtodo ) { 1111 if ( par == pendingSubtodo ) {
1110 allowReparent = false; 1112 allowReparent = false;
1111 break; 1113 break;
1112 } 1114 }
1113 par = par->parent(); 1115 par = par->parent();
1114 } 1116 }
1115 if ( !allowReparent ) { 1117 if ( !allowReparent ) {
1116 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!")); 1118 topLevelWidget()->setCaption(i18n("Recursive reparenting not possible!"));
1117 qDebug("Recursive reparenting not possible "); 1119 qDebug("Recursive reparenting not possible ");
1118 pendingSubtodo = 0; 1120 pendingSubtodo = 0;
1119 } else { 1121 } else {
1120 Todo* newParent = todoItem->todo(); 1122 Todo* newParent = todoItem->todo();
1121 Todo* newSub = pendingSubtodo->todo(); 1123 Todo* newSub = pendingSubtodo->todo();
1122 pendingSubtodo = 0; 1124 pendingSubtodo = 0;
1123 emit reparentTodoSignal( newParent,newSub ); 1125 emit reparentTodoSignal( newParent,newSub );
1124 return; 1126 return;
1125 } 1127 }
1126 } 1128 }
1127#if 0 1129#if 0
1128 // handled by the item itself 1130 // handled by the item itself
1129 bool completed = todoItem->todo()->isCompleted(); // Completed or not? 1131 bool completed = todoItem->todo()->isCompleted(); // Completed or not?
1130 qDebug("com %d ",completed ); 1132 qDebug("com %d ",completed );
1131 qDebug("itemclicked "); 1133 qDebug("itemclicked ");
1132 if (todoItem->isOn()) { 1134 if (todoItem->isOn()) {
1133 qDebug("on "); 1135 qDebug("on ");
1134 if (!completed) { 1136 if (!completed) {
1135 qDebug("set true "); 1137 qDebug("set true ");
1136 todoItem->todo()->setCompleted(QDateTime::currentDateTime()); 1138 todoItem->todo()->setCompleted(QDateTime::currentDateTime());
1137 } 1139 }
1138 } else { 1140 } else {
1139 qDebug("not on "); 1141 qDebug("not on ");
1140 if (completed) { 1142 if (completed) {
1141 qDebug("set false "); 1143 qDebug("set false ");
1142 todoItem->todo()->setCompleted(false); 1144 todoItem->todo()->setCompleted(false);
1143 } 1145 }
1144 } 1146 }
1145#endif 1147#endif
1146} 1148}
1147 1149
1148void KOTodoView::setDocumentId( const QString &id ) 1150void KOTodoView::setDocumentId( const QString &id )
1149{ 1151{
1150 kdDebug() << "KOTodoView::setDocumentId()" << endl; 1152 kdDebug() << "KOTodoView::setDocumentId()" << endl;
1151 1153
1152 mDocPrefs->setDoc( id ); 1154 mDocPrefs->setDoc( id );
1153} 1155}
1154 1156
1155void KOTodoView::itemStateChanged( QListViewItem *item ) 1157void KOTodoView::itemStateChanged( QListViewItem *item )
1156{ 1158{
1157 if (!item) return; 1159 if (!item) return;
1158 1160
1159 KOTodoViewItem *todoItem = (KOTodoViewItem *)item; 1161 KOTodoViewItem *todoItem = (KOTodoViewItem *)item;
1160 1162
1161// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl; 1163// kdDebug() << "KOTodoView::itemStateChanged(): " << todoItem->todo()->summary() << endl;
1162 1164
1163 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() ); 1165 if( mDocPrefs ) mDocPrefs->writeEntry( todoItem->todo()->uid(), todoItem->isOpen() );
1164} 1166}
1165 1167
1166void KOTodoView::saveLayout(KConfig *config, const QString &group) const 1168void KOTodoView::saveLayout(KConfig *config, const QString &group) const
1167{ 1169{
1168 mTodoListView->saveLayout(config,group); 1170 mTodoListView->saveLayout(config,group);
1169} 1171}
1170 1172
1171void KOTodoView::restoreLayout(KConfig *config, const QString &group) 1173void KOTodoView::restoreLayout(KConfig *config, const QString &group)
1172{ 1174{
1173 mTodoListView->restoreLayout(config,group); 1175 mTodoListView->restoreLayout(config,group);
1174} 1176}
1175 1177
1176void KOTodoView::processSelectionChange() 1178void KOTodoView::processSelectionChange()
1177{ 1179{
1178// kdDebug() << "KOTodoView::processSelectionChange()" << endl; 1180// kdDebug() << "KOTodoView::processSelectionChange()" << endl;
1179 1181
1180 KOTodoViewItem *item = 1182 KOTodoViewItem *item =
1181 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() ); 1183 static_cast<KOTodoViewItem *>( mTodoListView->selectedItem() );
1182 1184
1183 if ( !item ) { 1185 if ( !item ) {
1184 emit incidenceSelected( 0 ); 1186 emit incidenceSelected( 0 );
1185 } else { 1187 } else {
1186 emit incidenceSelected( item->todo() ); 1188 emit incidenceSelected( item->todo() );
1187 } 1189 }
1188} 1190}
1189 1191
1190void KOTodoView::modified(bool b) 1192void KOTodoView::modified(bool b)
1191{ 1193{
1192 emit isModified(b); 1194 emit isModified(b);
1193} 1195}
1194void KOTodoView::setTodoModified( Todo* todo ) 1196void KOTodoView::setTodoModified( Todo* todo )
1195{ 1197{
1196 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED ); 1198 todoModified( todo, KOGlobals::UNKNOWN_MODIFIED );
1197} 1199}
1198void KOTodoView::clearSelection() 1200void KOTodoView::clearSelection()
1199{ 1201{
1200 mTodoListView->selectAll( false ); 1202 mTodoListView->selectAll( false );
1201} 1203}
1202void KOTodoView::setAllOpen() 1204void KOTodoView::setAllOpen()
1203{ 1205{
1204 if ( isFlatDisplay ) { 1206 if ( isFlatDisplay ) {
1205 isFlatDisplay = false; 1207 isFlatDisplay = false;
1206 mPopupMenu->setItemChecked( 8,false ); 1208 mPopupMenu->setItemChecked( 8,false );
1207 updateView(); 1209 updateView();
1210 } else {
1211 storeCurrentItem();
1208 } 1212 }
1209 setOpen(mTodoListView->firstChild(), true); 1213 setOpen(mTodoListView->firstChild(), true);
1214 resetCurrentItem();
1210} 1215}
1211void KOTodoView::setAllClose() 1216void KOTodoView::setAllClose()
1212{ 1217{
1213 if ( isFlatDisplay ) { 1218 if ( isFlatDisplay ) {
1214 isFlatDisplay = false; 1219 isFlatDisplay = false;
1215 mPopupMenu->setItemChecked( 8,false ); 1220 mPopupMenu->setItemChecked( 8,false );
1216 updateView(); 1221 updateView();
1222 } else {
1223 storeCurrentItem();
1217 } 1224 }
1218 setOpen(mTodoListView->firstChild(), false); 1225 setOpen(mTodoListView->firstChild(), false);
1226 resetCurrentItem();
1219} 1227}
1220void KOTodoView::setOpen( QListViewItem* item, bool setOpenI) 1228void KOTodoView::setOpen( QListViewItem* item, bool setOpenI)
1221{ 1229{
1222 1230
1223 while ( item ) { 1231 while ( item ) {
1224 setOpen( item->firstChild(), setOpenI ); 1232 setOpen( item->firstChild(), setOpenI );
1225 item->setOpen( setOpenI ); 1233 item->setOpen( setOpenI );
1226 item = item->nextSibling(); 1234 item = item->nextSibling();
1227 } 1235 }
1228} 1236}
1229 1237
1230void KOTodoView::displayAllFlat() 1238void KOTodoView::displayAllFlat()
1231{ 1239{
1232 pendingSubtodo = 0; 1240 pendingSubtodo = 0;
1233 if ( mBlockUpdate ) { 1241 if ( mBlockUpdate ) {
1234 return; 1242 return;
1235 } 1243 }
1236 mPopupMenu->setItemChecked( 8,true ); 1244 mPopupMenu->setItemChecked( 8,true );
1237 isFlatDisplay = true; 1245 isFlatDisplay = true;
1238 QPtrList<Todo> todoList = calendar()->todos(); 1246 QPtrList<Todo> todoList = calendar()->todos();
1239 mTodoMap.clear(); 1247 mTodoMap.clear();
1240 mTodoListView->clear(); 1248 mTodoListView->clear();
1241 Todo *todo; 1249 Todo *todo;
1242 for(todo = todoList.first(); todo; todo = todoList.next()) { 1250 for(todo = todoList.first(); todo; todo = todoList.next()) {
1243 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this); 1251 KOTodoViewItem *todoItem = new KOTodoViewItem(mTodoListView,todo,this);
1244 mTodoMap.insert(todo,todoItem); 1252 mTodoMap.insert(todo,todoItem);
1245 } 1253 }
1246 mTodoListView->setFocus(); 1254 mTodoListView->setFocus();
1247 processSelectionChange(); 1255 processSelectionChange();
1248} 1256}
1249 1257
1250void KOTodoView::setAllFlat() 1258void KOTodoView::setAllFlat()
1251{ 1259{
1252 if ( isFlatDisplay ) { 1260 if ( isFlatDisplay ) {
1253 isFlatDisplay = false; 1261 isFlatDisplay = false;
1254 mPopupMenu->setItemChecked( 8,false ); 1262 mPopupMenu->setItemChecked( 8,false );
1255 updateView(); 1263 updateView();
1256 return; 1264 return;
1257 } 1265 }
1266 storeCurrentItem();
1258 displayAllFlat(); 1267 displayAllFlat();
1268 resetCurrentItem();
1259} 1269}
1260 1270
1261void KOTodoView::purgeCompleted() 1271void KOTodoView::purgeCompleted()
1262{ 1272{
1263 emit purgeCompletedSignal(); 1273 emit purgeCompletedSignal();
1264} 1274}
1265void KOTodoView::toggleQuickTodo() 1275void KOTodoView::toggleQuickTodo()
1266{ 1276{
1267 if ( mQuickAdd->isVisible() ) { 1277 if ( mQuickAdd->isVisible() ) {
1268 mQuickAdd->hide(); 1278 mQuickAdd->hide();
1269 KOPrefs::instance()->mEnableQuickTodo = false; 1279 KOPrefs::instance()->mEnableQuickTodo = false;
1270 } 1280 }
1271 else { 1281 else {
1272 mQuickAdd->show(); 1282 mQuickAdd->show();
1273 KOPrefs::instance()->mEnableQuickTodo = true; 1283 KOPrefs::instance()->mEnableQuickTodo = true;
1274 } 1284 }
1275 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo); 1285 mPopupMenu->setItemChecked(4,KOPrefs::instance()->mEnableQuickTodo);
1276 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo ); 1286 mItemPopupMenu->setItemChecked( 34 , KOPrefs::instance()->mEnableQuickTodo );
1277} 1287}
1278 1288
1279void KOTodoView::toggleRunning() 1289void KOTodoView::toggleRunning()
1280{ 1290{
1281 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos; 1291 KOPrefs::instance()->mHideNonStartedTodos = !KOPrefs::instance()->mHideNonStartedTodos;
1282 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos); 1292 mPopupMenu->setItemChecked(5,KOPrefs::instance()->mHideNonStartedTodos);
1283 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos ); 1293 mItemPopupMenu->setItemChecked( 35 , KOPrefs::instance()->mHideNonStartedTodos );
1284 updateView(); 1294 updateView();
1285} 1295}
1286 1296
1287void KOTodoView::toggleCompleted() 1297void KOTodoView::toggleCompleted()
1288{ 1298{
1289 KOPrefs::instance()->mShowCompletedTodo = !KOPrefs::instance()->mShowCompletedTodo; 1299 KOPrefs::instance()->mShowCompletedTodo = !KOPrefs::instance()->mShowCompletedTodo;
1290 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo ); 1300 mPopupMenu->setItemChecked( 3,KOPrefs::instance()->mShowCompletedTodo );
1291 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo ); 1301 mItemPopupMenu->setItemChecked( 33 , KOPrefs::instance()->mShowCompletedTodo );
1292 updateView(); 1302 updateView();
1293} 1303}
1294 1304
1295void KOTodoView::addQuickTodo() 1305void KOTodoView::addQuickTodo()
1296{ 1306{
1297 Todo *todo = new Todo(); 1307 Todo *todo = new Todo();
1298 todo->setSummary(mQuickAdd->text()); 1308 todo->setSummary(mQuickAdd->text());
1299 todo->setOrganizer(KOPrefs::instance()->email()); 1309 todo->setOrganizer(KOPrefs::instance()->email());
1300 CalFilter * cf = mCalendar->filter(); 1310 CalFilter * cf = mCalendar->filter();
1301 if ( cf ) { 1311 if ( cf ) {
1302 if ( cf->isEnabled()&& cf->showCategories()) { 1312 if ( cf->isEnabled()&& cf->showCategories()) {
1303 todo->setCategories(cf->categoryList()); 1313 todo->setCategories(cf->categoryList());
1304 } 1314 }
1305 if ( cf->isEnabled() ) 1315 if ( cf->isEnabled() )
1306 todo->setSecrecy( cf->getSecrecy()); 1316 todo->setSecrecy( cf->getSecrecy());
1307 } 1317 }
1308 mCalendar->addTodo(todo); 1318 mCalendar->addTodo(todo);
1309 mQuickAdd->setText(""); 1319 mQuickAdd->setText("");
1310 todoModified (todo, KOGlobals::EVENTADDED ); 1320 todoModified (todo, KOGlobals::EVENTADDED );
1311 updateView(); 1321 updateView();
1312} 1322}
1313 1323
1314void KOTodoView::keyPressEvent ( QKeyEvent * e ) 1324void KOTodoView::keyPressEvent ( QKeyEvent * e )
1315{ 1325{
1316 // e->ignore(); 1326 // e->ignore();
1317 //return; 1327 //return;
1318 //qDebug("KOTodoView::keyPressEvent "); 1328 //qDebug("KOTodoView::keyPressEvent ");
1319 switch ( e->key() ) { 1329 switch ( e->key() ) {
1320 case Qt::Key_Down: 1330 case Qt::Key_Down:
1321 case Qt::Key_Up: 1331 case Qt::Key_Up:
1322 QWidget::keyPressEvent ( e ); 1332 QWidget::keyPressEvent ( e );
1323 break; 1333 break;
1324 1334
1325 case Qt::Key_Q: 1335 case Qt::Key_Q:
1326 toggleQuickTodo(); 1336 toggleQuickTodo();
1327 break; 1337 break;
1328 case Qt::Key_U: 1338 case Qt::Key_U:
1329 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) { 1339 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) {
1330 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1340 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1331 unparentTodo(); 1341 unparentTodo();
1332 e->accept(); 1342 e->accept();
1333 } else 1343 } else
1334 e->ignore(); 1344 e->ignore();
1335 break; 1345 break;
1336 case Qt::Key_S: 1346 case Qt::Key_S:
1337 if ( e->state() == Qt::ControlButton ) { 1347 if ( e->state() == Qt::ControlButton ) {
1338 e->ignore(); 1348 e->ignore();
1339 break; 1349 break;
1340 } 1350 }
1341 if ( e->state() == Qt::ShiftButton ) { 1351 if ( e->state() == Qt::ShiftButton ) {
1342 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1352 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1343 reparentTodo(); 1353 reparentTodo();
1344 e->accept(); 1354 e->accept();
1345 } else 1355 } else
1346 e->ignore(); 1356 e->ignore();
1347 break; 1357 break;
1348 case Qt::Key_P: 1358 case Qt::Key_P:
1349 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) { 1359 if ( e->state() == Qt::ControlButton|| e->state() == Qt::ShiftButton ) {
1350 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem(); 1360 mActiveItem = (KOTodoViewItem*)mTodoListView->currentItem();
1351 if ( pendingSubtodo ) 1361 if ( pendingSubtodo )
1352 itemClicked(mActiveItem); 1362 itemClicked(mActiveItem);
1353 e->accept(); 1363 e->accept();
1354 } else 1364 } else
1355 e->ignore(); 1365 e->ignore();
1356 break; 1366 break;
1357 case Qt::Key_Escape: 1367 case Qt::Key_Escape:
1358 if ( pendingSubtodo ) { 1368 if ( pendingSubtodo ) {
1359 itemClicked(0); 1369 itemClicked(0);
1360 e->accept(); 1370 e->accept();
1361 } else 1371 } else
1362 e->ignore(); 1372 e->ignore();
1363 break; 1373 break;
1364 default: 1374 default:
1365 e->ignore(); 1375 e->ignore();
1366 } 1376 }
1367 1377
1368 if ( true ) { 1378 if ( true ) {
1369 if ( e->key() == Qt::Key_I ) { 1379 if ( e->key() == Qt::Key_I ) {
1370 KOTodoViewItem*cn = (KOTodoViewItem*)mTodoListView->currentItem(); 1380 KOTodoViewItem*cn = (KOTodoViewItem*)mTodoListView->currentItem();
1371 if ( cn ) { 1381 if ( cn ) {
1372 mActiveItem = cn; 1382 mActiveItem = cn;
1373 KOTodoViewItem* ci = (KOTodoViewItem*)( cn ); 1383 KOTodoViewItem* ci = (KOTodoViewItem*)( cn );
1374 if ( ci ){ 1384 if ( ci ){
1375 showTodo(); 1385 showTodo();
1376 cn = (KOTodoViewItem*)cn->itemBelow(); 1386 cn = (KOTodoViewItem*)cn->itemBelow();
1377 if ( cn ) { 1387 if ( cn ) {
1378 mTodoListView->setCurrentItem ( cn ); 1388 mTodoListView->setCurrentItem ( cn );
1379 mTodoListView->ensureItemVisible ( cn ); 1389 mTodoListView->ensureItemVisible ( cn );
1380 } 1390 }
1381 1391
1382 } 1392 }
1383 } 1393 }
1384 e->accept(); 1394 e->accept();
1385 1395
1386 } 1396 }
1387 1397
1388 } 1398 }
1389 1399
1390} 1400}
1391void KOTodoView::updateTodo( Todo * t, int type ) 1401void KOTodoView::updateTodo( Todo * t, int type )
1392{ 1402{
1393 if ( mBlockUpdate) 1403 if ( mBlockUpdate)
1394 return; 1404 return;
1395 1405
1396 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator; 1406 QMap<Todo *,KOTodoViewItem *>::ConstIterator itemIterator;
1397 itemIterator = mTodoMap.find(t); 1407 itemIterator = mTodoMap.find(t);
1398 if (itemIterator != mTodoMap.end()) { 1408 if (itemIterator != mTodoMap.end()) {
1399 (*itemIterator)->construct(); 1409 (*itemIterator)->construct();
1400 } else { 1410 } else {
1401 if ( type == KOGlobals::EVENTADDED ) { 1411 if ( type == KOGlobals::EVENTADDED ) {
1402 insertTodoItem( t ); 1412 insertTodoItem( t );
1403 } 1413 }
1404 } 1414 }
1405 1415
1406} 1416}
1407 1417
1408void KOTodoView::todoModified(Todo * t , int p ) 1418void KOTodoView::todoModified(Todo * t , int p )
1409{ 1419{
1410 mBlockUpdate = true; 1420 mBlockUpdate = true;
1411 emit todoModifiedSignal ( t, p ); 1421 emit todoModifiedSignal ( t, p );
1412 mBlockUpdate = false; 1422 mBlockUpdate = false;
1413} 1423}
diff --git a/libkcal/alarm.cpp b/libkcal/alarm.cpp
index 1fc7169..d8f15b5 100644
--- a/libkcal/alarm.cpp
+++ b/libkcal/alarm.cpp
@@ -1,457 +1,481 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 1998 Preston Brown 3 Copyright (c) 1998 Preston Brown
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <kdebug.h> 22#include <kdebug.h>
23#include <klocale.h>
23 24
24#include "incidence.h" 25#include "incidence.h"
25#include "todo.h" 26#include "todo.h"
26 27
27#include "alarm.h" 28#include "alarm.h"
28 29
29using namespace KCal; 30using namespace KCal;
30#include <qwidget.h> 31#include <qwidget.h>
31Alarm::Alarm(Incidence *parent) 32Alarm::Alarm(Incidence *parent)
32 : mParent(parent), 33 : mParent(parent),
33 mType(Audio), 34 mType(Audio),
34 mDescription(""), // to make operator==() not fail 35 mDescription(""), // to make operator==() not fail
35 mFile(""), // to make operator==() not fail 36 mFile(""), // to make operator==() not fail
36 mMailSubject(""), // to make operator==() not fail 37 mMailSubject(""), // to make operator==() not fail
37 mAlarmSnoozeTime(5), 38 mAlarmSnoozeTime(5),
38 mAlarmRepeatCount(0), 39 mAlarmRepeatCount(0),
39 mEndOffset(false), 40 mEndOffset(false),
40 mHasTime(false), 41 mHasTime(false),
41 mAlarmEnabled(false) 42 mAlarmEnabled(false)
42{ 43{
43 44
44} 45}
45 46
46Alarm::~Alarm() 47Alarm::~Alarm()
47{ 48{
48} 49}
49 50
50bool Alarm::operator==( const Alarm& rhs ) const 51bool Alarm::operator==( const Alarm& rhs ) const
51{ 52{
52 53
53 if ( mType != rhs.mType || 54 if ( mType != rhs.mType ||
54 mAlarmSnoozeTime != rhs.mAlarmSnoozeTime || 55 mAlarmSnoozeTime != rhs.mAlarmSnoozeTime ||
55 mAlarmRepeatCount != rhs.mAlarmRepeatCount || 56 mAlarmRepeatCount != rhs.mAlarmRepeatCount ||
56 mAlarmEnabled != rhs.mAlarmEnabled || 57 mAlarmEnabled != rhs.mAlarmEnabled ||
57 mHasTime != rhs.mHasTime) 58 mHasTime != rhs.mHasTime)
58 return false; 59 return false;
59 60
60#if 0 61#if 0
61 if ( mType != rhs.mType ) { 62 if ( mType != rhs.mType ) {
62 63
63 qDebug("aaa1 "); 64 qDebug("aaa1 ");
64 return false; 65 return false;
65 } 66 }
66 67
67 if ( mAlarmSnoozeTime != rhs.mAlarmSnoozeTime ) { 68 if ( mAlarmSnoozeTime != rhs.mAlarmSnoozeTime ) {
68 69
69 qDebug("aaa2 "); 70 qDebug("aaa2 ");
70 return false; 71 return false;
71 } 72 }
72 73
73 74
74 if ( mAlarmRepeatCount != rhs.mAlarmRepeatCount ) { 75 if ( mAlarmRepeatCount != rhs.mAlarmRepeatCount ) {
75 76
76 qDebug("aaa3 "); 77 qDebug("aaa3 ");
77 return false; 78 return false;
78 } 79 }
79 80
80 if ( mAlarmEnabled != rhs.mAlarmEnabled ) { 81 if ( mAlarmEnabled != rhs.mAlarmEnabled ) {
81 82
82 qDebug("aaa4 "); 83 qDebug("aaa4 ");
83 return false; 84 return false;
84 } 85 }
85 86
86 if ( mHasTime != rhs.mHasTime ) { 87 if ( mHasTime != rhs.mHasTime ) {
87 88
88 qDebug("aaa5 "); 89 qDebug("aaa5 ");
89 return false; 90 return false;
90 } 91 }
91#endif 92#endif
92 93
93 94
94 if (mHasTime) { 95 if (mHasTime) {
95 if (mAlarmTime != rhs.mAlarmTime) 96 if (mAlarmTime != rhs.mAlarmTime)
96 return false; 97 return false;
97 } else { 98 } else {
98 if (mOffset != rhs.mOffset || 99 if (mOffset != rhs.mOffset ||
99 mEndOffset != rhs.mEndOffset) 100 mEndOffset != rhs.mEndOffset)
100 return false; 101 return false;
101 } 102 }
102 switch (mType) { 103 switch (mType) {
103 case Display: 104 case Display:
104 return mDescription == rhs.mDescription; 105 return mDescription == rhs.mDescription;
105 106
106 case Email: 107 case Email:
107 return mDescription == rhs.mDescription && 108 return mDescription == rhs.mDescription &&
108 mMailAttachFiles == rhs.mMailAttachFiles && 109 mMailAttachFiles == rhs.mMailAttachFiles &&
109 mMailAddresses == rhs.mMailAddresses && 110 mMailAddresses == rhs.mMailAddresses &&
110 mMailSubject == rhs.mMailSubject; 111 mMailSubject == rhs.mMailSubject;
111 112
112 case Procedure: 113 case Procedure:
113 return mFile == rhs.mFile && 114 return mFile == rhs.mFile &&
114 mDescription == rhs.mDescription; 115 mDescription == rhs.mDescription;
115 116
116 case Audio: 117 case Audio:
117 return mFile == rhs.mFile; 118 return mFile == rhs.mFile;
118 119
119 case Invalid: 120 case Invalid:
120 break; 121 break;
121 } 122 }
122 return false; 123 return false;
123} 124}
124 125
125void Alarm::setType(Alarm::Type type) 126void Alarm::setType(Alarm::Type type)
126{ 127{
127 if (type == mType) 128 if (type == mType)
128 return; 129 return;
129 130
130 switch (type) { 131 switch (type) {
131 case Display: 132 case Display:
132 mDescription = ""; 133 mDescription = "";
133 break; 134 break;
134 case Procedure: 135 case Procedure:
135 mFile = mDescription = ""; 136 mFile = mDescription = "";
136 break; 137 break;
137 case Audio: 138 case Audio:
138 mFile = ""; 139 mFile = "";
139 break; 140 break;
140 case Email: 141 case Email:
141 mMailSubject = mDescription = ""; 142 mMailSubject = mDescription = "";
142 mMailAddresses.clear(); 143 mMailAddresses.clear();
143 mMailAttachFiles.clear(); 144 mMailAttachFiles.clear();
144 break; 145 break;
145 case Invalid: 146 case Invalid:
146 break; 147 break;
147 default: 148 default:
148 return; 149 return;
149 } 150 }
150 mType = type; 151 mType = type;
151 mParent->updated(); 152 mParent->updated();
152} 153}
153 154
154Alarm::Type Alarm::type() const 155Alarm::Type Alarm::type() const
155{ 156{
156 return mType; 157 return mType;
157} 158}
158 159
159void Alarm::setAudioAlarm(const QString &audioFile) 160void Alarm::setAudioAlarm(const QString &audioFile)
160{ 161{
161 mType = Audio; 162 mType = Audio;
162 mFile = audioFile; 163 mFile = audioFile;
163 mParent->updated(); 164 mParent->updated();
164} 165}
165 166
166void Alarm::setAudioFile(const QString &audioFile) 167void Alarm::setAudioFile(const QString &audioFile)
167{ 168{
168 if (mType == Audio) { 169 if (mType == Audio) {
169 mFile = audioFile; 170 mFile = audioFile;
170 mParent->updated(); 171 mParent->updated();
171 } 172 }
172} 173}
173 174
174QString Alarm::audioFile() const 175QString Alarm::audioFile() const
175{ 176{
176 return (mType == Audio) ? mFile : QString::null; 177 return (mType == Audio) ? mFile : QString::null;
177} 178}
178 179
179void Alarm::setProcedureAlarm(const QString &programFile, const QString &arguments) 180void Alarm::setProcedureAlarm(const QString &programFile, const QString &arguments)
180{ 181{
181 mType = Procedure; 182 mType = Procedure;
182 mFile = programFile; 183 mFile = programFile;
183 mDescription = arguments; 184 mDescription = arguments;
184 mParent->updated(); 185 mParent->updated();
185} 186}
186 187
187void Alarm::setProgramFile(const QString &programFile) 188void Alarm::setProgramFile(const QString &programFile)
188{ 189{
189 if (mType == Procedure) { 190 if (mType == Procedure) {
190 mFile = programFile; 191 mFile = programFile;
191 mParent->updated(); 192 mParent->updated();
192 } 193 }
193} 194}
194 195
195QString Alarm::programFile() const 196QString Alarm::programFile() const
196{ 197{
197 return (mType == Procedure) ? mFile : QString::null; 198 return (mType == Procedure) ? mFile : QString::null;
198} 199}
199 200
200void Alarm::setProgramArguments(const QString &arguments) 201void Alarm::setProgramArguments(const QString &arguments)
201{ 202{
202 if (mType == Procedure) { 203 if (mType == Procedure) {
203 mDescription = arguments; 204 mDescription = arguments;
204 mParent->updated(); 205 mParent->updated();
205 } 206 }
206} 207}
207 208
208QString Alarm::programArguments() const 209QString Alarm::programArguments() const
209{ 210{
210 return (mType == Procedure) ? mDescription : QString::null; 211 return (mType == Procedure) ? mDescription : QString::null;
211} 212}
212 213
213void Alarm::setEmailAlarm(const QString &subject, const QString &text, 214void Alarm::setEmailAlarm(const QString &subject, const QString &text,
214 const QValueList<Person> &addressees, const QStringList &attachments) 215 const QValueList<Person> &addressees, const QStringList &attachments)
215{ 216{
216 mType = Email; 217 mType = Email;
217 mMailSubject = subject; 218 mMailSubject = subject;
218 mDescription = text; 219 mDescription = text;
219 mMailAddresses = addressees; 220 mMailAddresses = addressees;
220 mMailAttachFiles = attachments; 221 mMailAttachFiles = attachments;
221 mParent->updated(); 222 mParent->updated();
222} 223}
223 224
224void Alarm::setMailAddress(const Person &mailAddress) 225void Alarm::setMailAddress(const Person &mailAddress)
225{ 226{
226 if (mType == Email) { 227 if (mType == Email) {
227 mMailAddresses.clear(); 228 mMailAddresses.clear();
228 mMailAddresses += mailAddress; 229 mMailAddresses += mailAddress;
229 mParent->updated(); 230 mParent->updated();
230 } 231 }
231} 232}
232 233
233void Alarm::setMailAddresses(const QValueList<Person> &mailAddresses) 234void Alarm::setMailAddresses(const QValueList<Person> &mailAddresses)
234{ 235{
235 if (mType == Email) { 236 if (mType == Email) {
236 mMailAddresses = mailAddresses; 237 mMailAddresses = mailAddresses;
237 mParent->updated(); 238 mParent->updated();
238 } 239 }
239} 240}
240 241
241void Alarm::addMailAddress(const Person &mailAddress) 242void Alarm::addMailAddress(const Person &mailAddress)
242{ 243{
243 if (mType == Email) { 244 if (mType == Email) {
244 mMailAddresses += mailAddress; 245 mMailAddresses += mailAddress;
245 mParent->updated(); 246 mParent->updated();
246 } 247 }
247} 248}
248 249
249QValueList<Person> Alarm::mailAddresses() const 250QValueList<Person> Alarm::mailAddresses() const
250{ 251{
251 return (mType == Email) ? mMailAddresses : QValueList<Person>(); 252 return (mType == Email) ? mMailAddresses : QValueList<Person>();
252} 253}
253 254
254void Alarm::setMailSubject(const QString &mailAlarmSubject) 255void Alarm::setMailSubject(const QString &mailAlarmSubject)
255{ 256{
256 if (mType == Email) { 257 if (mType == Email) {
257 mMailSubject = mailAlarmSubject; 258 mMailSubject = mailAlarmSubject;
258 mParent->updated(); 259 mParent->updated();
259 } 260 }
260} 261}
261 262
262QString Alarm::mailSubject() const 263QString Alarm::mailSubject() const
263{ 264{
264 return (mType == Email) ? mMailSubject : QString::null; 265 return (mType == Email) ? mMailSubject : QString::null;
265} 266}
266 267
267void Alarm::setMailAttachment(const QString &mailAttachFile) 268void Alarm::setMailAttachment(const QString &mailAttachFile)
268{ 269{
269 if (mType == Email) { 270 if (mType == Email) {
270 mMailAttachFiles.clear(); 271 mMailAttachFiles.clear();
271 mMailAttachFiles += mailAttachFile; 272 mMailAttachFiles += mailAttachFile;
272 mParent->updated(); 273 mParent->updated();
273 } 274 }
274} 275}
275 276
276void Alarm::setMailAttachments(const QStringList &mailAttachFiles) 277void Alarm::setMailAttachments(const QStringList &mailAttachFiles)
277{ 278{
278 if (mType == Email) { 279 if (mType == Email) {
279 mMailAttachFiles = mailAttachFiles; 280 mMailAttachFiles = mailAttachFiles;
280 mParent->updated(); 281 mParent->updated();
281 } 282 }
282} 283}
283 284
284void Alarm::addMailAttachment(const QString &mailAttachFile) 285void Alarm::addMailAttachment(const QString &mailAttachFile)
285{ 286{
286 if (mType == Email) { 287 if (mType == Email) {
287 mMailAttachFiles += mailAttachFile; 288 mMailAttachFiles += mailAttachFile;
288 mParent->updated(); 289 mParent->updated();
289 } 290 }
290} 291}
291 292
292QStringList Alarm::mailAttachments() const 293QStringList Alarm::mailAttachments() const
293{ 294{
294 return (mType == Email) ? mMailAttachFiles : QStringList(); 295 return (mType == Email) ? mMailAttachFiles : QStringList();
295} 296}
296 297
297void Alarm::setMailText(const QString &text) 298void Alarm::setMailText(const QString &text)
298{ 299{
299 if (mType == Email) { 300 if (mType == Email) {
300 mDescription = text; 301 mDescription = text;
301 mParent->updated(); 302 mParent->updated();
302 } 303 }
303} 304}
304 305
305QString Alarm::mailText() const 306QString Alarm::mailText() const
306{ 307{
307 return (mType == Email) ? mDescription : QString::null; 308 return (mType == Email) ? mDescription : QString::null;
308} 309}
309 310
310void Alarm::setDisplayAlarm(const QString &text) 311void Alarm::setDisplayAlarm(const QString &text)
311{ 312{
312 mType = Display; 313 mType = Display;
313 mDescription = text; 314 mDescription = text;
314 mParent->updated(); 315 mParent->updated();
315} 316}
316 317
317void Alarm::setText(const QString &text) 318void Alarm::setText(const QString &text)
318{ 319{
319 if (mType == Display) { 320 if (mType == Display) {
320 mDescription = text; 321 mDescription = text;
321 mParent->updated(); 322 mParent->updated();
322 } 323 }
323} 324}
324 325
325QString Alarm::text() const 326QString Alarm::text() const
326{ 327{
327 return (mType == Display) ? mDescription : QString::null; 328 return (mType == Display) ? mDescription : QString::null;
328} 329}
329 330
330void Alarm::setTime(const QDateTime &alarmTime) 331void Alarm::setTime(const QDateTime &alarmTime)
331{ 332{
332 mAlarmTime = alarmTime; 333 mAlarmTime = alarmTime;
333 mHasTime = true; 334 mHasTime = true;
334 335
335 mParent->updated(); 336 mParent->updated();
336} 337}
337int Alarm::offset() 338int Alarm::offset()
338{ 339{
339 if ( hasTime() ) { 340 if ( hasTime() ) {
340 if (mParent->type()=="Todo") { 341 if (mParent->type()=="Todo") {
341 Todo *t = static_cast<Todo*>(mParent); 342 Todo *t = static_cast<Todo*>(mParent);
342 return t->dtDue().secsTo( mAlarmTime ) ; 343 return t->dtDue().secsTo( mAlarmTime ) ;
343 } else 344 } else
344 return mParent->dtStart().secsTo( mAlarmTime ) ; 345 return mParent->dtStart().secsTo( mAlarmTime ) ;
345 } 346 }
346 else 347 else
347 { 348 {
348 return mOffset.asSeconds(); 349 return mOffset.asSeconds();
349 } 350 }
350 351
351} 352}
353QString Alarm::offsetText()
354{
355 int min = -offset()/60;
356 int hours = min /60;
357 min = min % 60;
358 int days = hours /24;
359 hours = hours % 24;
360 QString message;
361 qDebug("%d %d %d ", days, hours, min );
362 if ( days > 0 )
363 message += i18n("%1d").arg( days );
364 if ( hours > 0 ) {
365 if ( !message.isEmpty() ) message += "/";
366 message += i18n("%1h").arg( hours );
367 }
368 if ( min > 0 ) {
369 if ( !message.isEmpty() ) message += "/";
370 message += i18n("%1min").arg( min );
371 }
372 if ( message.isEmpty() )
373 message = i18n("%1min").arg( 0 );
374 return message;
375}
352 376
353 377
354QDateTime Alarm::time() const 378QDateTime Alarm::time() const
355{ 379{
356 if ( hasTime() ) 380 if ( hasTime() )
357 return mAlarmTime; 381 return mAlarmTime;
358 else 382 else
359 { 383 {
360 if (mParent->type()=="Todo") { 384 if (mParent->type()=="Todo") {
361 Todo *t = static_cast<Todo*>(mParent); 385 Todo *t = static_cast<Todo*>(mParent);
362 return mOffset.end( t->dtDue() ); 386 return mOffset.end( t->dtDue() );
363 } else if (mEndOffset) { 387 } else if (mEndOffset) {
364 return mOffset.end( mParent->dtEnd() ); 388 return mOffset.end( mParent->dtEnd() );
365 } else { 389 } else {
366 return mOffset.end( mParent->dtStart() ); 390 return mOffset.end( mParent->dtStart() );
367 } 391 }
368 } 392 }
369} 393}
370 394
371bool Alarm::hasTime() const 395bool Alarm::hasTime() const
372{ 396{
373 return mHasTime; 397 return mHasTime;
374} 398}
375 399
376void Alarm::setSnoozeTime(int alarmSnoozeTime) 400void Alarm::setSnoozeTime(int alarmSnoozeTime)
377{ 401{
378 mAlarmSnoozeTime = alarmSnoozeTime; 402 mAlarmSnoozeTime = alarmSnoozeTime;
379 mParent->updated(); 403 mParent->updated();
380} 404}
381 405
382int Alarm::snoozeTime() const 406int Alarm::snoozeTime() const
383{ 407{
384 return mAlarmSnoozeTime; 408 return mAlarmSnoozeTime;
385} 409}
386 410
387void Alarm::setRepeatCount(int alarmRepeatCount) 411void Alarm::setRepeatCount(int alarmRepeatCount)
388{ 412{
389 kdDebug(5800) << "Alarm::setRepeatCount(): " << alarmRepeatCount << endl; 413 kdDebug(5800) << "Alarm::setRepeatCount(): " << alarmRepeatCount << endl;
390 414
391 mAlarmRepeatCount = alarmRepeatCount; 415 mAlarmRepeatCount = alarmRepeatCount;
392 mParent->updated(); 416 mParent->updated();
393} 417}
394 418
395int Alarm::repeatCount() const 419int Alarm::repeatCount() const
396{ 420{
397 kdDebug(5800) << "Alarm::repeatCount(): " << mAlarmRepeatCount << endl; 421 kdDebug(5800) << "Alarm::repeatCount(): " << mAlarmRepeatCount << endl;
398 return mAlarmRepeatCount; 422 return mAlarmRepeatCount;
399} 423}
400 424
401void Alarm::toggleAlarm() 425void Alarm::toggleAlarm()
402{ 426{
403 mAlarmEnabled = !mAlarmEnabled; 427 mAlarmEnabled = !mAlarmEnabled;
404 mParent->updated(); 428 mParent->updated();
405} 429}
406 430
407void Alarm::setEnabled(bool enable) 431void Alarm::setEnabled(bool enable)
408{ 432{
409 mAlarmEnabled = enable; 433 mAlarmEnabled = enable;
410 mParent->updated(); 434 mParent->updated();
411} 435}
412 436
413bool Alarm::enabled() const 437bool Alarm::enabled() const
414{ 438{
415 return mAlarmEnabled; 439 return mAlarmEnabled;
416} 440}
417 441
418void Alarm::setStartOffset( const Duration &offset ) 442void Alarm::setStartOffset( const Duration &offset )
419{ 443{
420 mOffset = offset; 444 mOffset = offset;
421 mEndOffset = false; 445 mEndOffset = false;
422 mHasTime = false; 446 mHasTime = false;
423 mParent->updated(); 447 mParent->updated();
424} 448}
425 449
426Duration Alarm::startOffset() const 450Duration Alarm::startOffset() const
427{ 451{
428 return (mHasTime || mEndOffset) ? 0 : mOffset; 452 return (mHasTime || mEndOffset) ? 0 : mOffset;
429} 453}
430 454
431bool Alarm::hasStartOffset() const 455bool Alarm::hasStartOffset() const
432{ 456{
433 return !mHasTime && !mEndOffset; 457 return !mHasTime && !mEndOffset;
434} 458}
435 459
436bool Alarm::hasEndOffset() const 460bool Alarm::hasEndOffset() const
437{ 461{
438 return !mHasTime && mEndOffset; 462 return !mHasTime && mEndOffset;
439} 463}
440 464
441void Alarm::setEndOffset( const Duration &offset ) 465void Alarm::setEndOffset( const Duration &offset )
442{ 466{
443 mOffset = offset; 467 mOffset = offset;
444 mEndOffset = true; 468 mEndOffset = true;
445 mHasTime = false; 469 mHasTime = false;
446 mParent->updated(); 470 mParent->updated();
447} 471}
448 472
449Duration Alarm::endOffset() const 473Duration Alarm::endOffset() const
450{ 474{
451 return (mHasTime || !mEndOffset) ? 0 : mOffset; 475 return (mHasTime || !mEndOffset) ? 0 : mOffset;
452} 476}
453 477
454void Alarm::setParent( Incidence *parent ) 478void Alarm::setParent( Incidence *parent )
455{ 479{
456 mParent = parent; 480 mParent = parent;
457} 481}
diff --git a/libkcal/alarm.h b/libkcal/alarm.h
index 682b626..ac6ea0d 100644
--- a/libkcal/alarm.h
+++ b/libkcal/alarm.h
@@ -1,245 +1,246 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#ifndef KCAL_ALARM_H 21#ifndef KCAL_ALARM_H
22#define KCAL_ALARM_H 22#define KCAL_ALARM_H
23 23
24#include <qstring.h> 24#include <qstring.h>
25#include <qvaluelist.h> 25#include <qvaluelist.h>
26 26
27#include "customproperties.h" 27#include "customproperties.h"
28#include "duration.h" 28#include "duration.h"
29#include "person.h" 29#include "person.h"
30 30
31namespace KCal { 31namespace KCal {
32 32
33class Incidence; 33class Incidence;
34 34
35/** 35/**
36 This class represents an alarm notification. 36 This class represents an alarm notification.
37*/ 37*/
38class Alarm : public CustomProperties 38class Alarm : public CustomProperties
39{ 39{
40 public: 40 public:
41 enum Type { Invalid, Display, Procedure, Email, Audio }; 41 enum Type { Invalid, Display, Procedure, Email, Audio };
42 typedef QValueList<Alarm *> List; 42 typedef QValueList<Alarm *> List;
43 43
44 /** Construct a new alarm with variables initialized to "sane" values. */ 44 /** Construct a new alarm with variables initialized to "sane" values. */
45 explicit Alarm(Incidence *parent); 45 explicit Alarm(Incidence *parent);
46 /** Destruct Alarm object. */ 46 /** Destruct Alarm object. */
47 ~Alarm(); 47 ~Alarm();
48 48
49 /** Compare this alarm with another one. */ 49 /** Compare this alarm with another one. */
50 bool operator==(const Alarm &) const; 50 bool operator==(const Alarm &) const;
51 bool operator!=(const Alarm &a) const { return !operator==(a); } 51 bool operator!=(const Alarm &a) const { return !operator==(a); }
52 52
53 /** Set the type of the alarm. 53 /** Set the type of the alarm.
54 If the specified type is different from the current type of the alarm, 54 If the specified type is different from the current type of the alarm,
55 the alarm's type-specific properties are initialised to null. 55 the alarm's type-specific properties are initialised to null.
56 @param type type of alarm. 56 @param type type of alarm.
57 */ 57 */
58 void setType(Type type); 58 void setType(Type type);
59 /** Return the type of the alarm */ 59 /** Return the type of the alarm */
60 Type type() const; 60 Type type() const;
61 int offset(); 61 int offset();
62 QString offsetText();
62 /** Set the alarm to be a display alarm. 63 /** Set the alarm to be a display alarm.
63 @param text text to display when the alarm is triggered. 64 @param text text to display when the alarm is triggered.
64 */ 65 */
65 void setDisplayAlarm(const QString &text); 66 void setDisplayAlarm(const QString &text);
66 /** Set the text to be displayed when the alarm is triggered. 67 /** Set the text to be displayed when the alarm is triggered.
67 Ignored if the alarm is not a display alarm. 68 Ignored if the alarm is not a display alarm.
68 */ 69 */
69 void setText(const QString &text); 70 void setText(const QString &text);
70 /** Return the text string that displays when the alarm is triggered. */ 71 /** Return the text string that displays when the alarm is triggered. */
71 QString text() const; 72 QString text() const;
72 73
73 /** Set the alarm to be an audio alarm. 74 /** Set the alarm to be an audio alarm.
74 @param audioFile optional file to play when the alarm is triggered. 75 @param audioFile optional file to play when the alarm is triggered.
75 */ 76 */
76 void setAudioAlarm(const QString &audioFile = QString::null); 77 void setAudioAlarm(const QString &audioFile = QString::null);
77 /** Set the file to play when the audio alarm is triggered. 78 /** Set the file to play when the audio alarm is triggered.
78 Ignored if the alarm is not an audio alarm. 79 Ignored if the alarm is not an audio alarm.
79 */ 80 */
80 void setAudioFile(const QString &audioFile); 81 void setAudioFile(const QString &audioFile);
81 /** Return the name of the audio file for the alarm. 82 /** Return the name of the audio file for the alarm.
82 @return The audio file for the alarm, or QString::null if not an audio alarm. 83 @return The audio file for the alarm, or QString::null if not an audio alarm.
83 */ 84 */
84 QString audioFile() const; 85 QString audioFile() const;
85 86
86 /** Set the alarm to be a procedure alarm. 87 /** Set the alarm to be a procedure alarm.
87 @param programFile program to execute when the alarm is triggered. 88 @param programFile program to execute when the alarm is triggered.
88 @param arguments arguments to supply to programFile. 89 @param arguments arguments to supply to programFile.
89 */ 90 */
90 void setProcedureAlarm(const QString &programFile, const QString &arguments = QString::null); 91 void setProcedureAlarm(const QString &programFile, const QString &arguments = QString::null);
91 /** Set the program file to execute when the alarm is triggered. 92 /** Set the program file to execute when the alarm is triggered.
92 Ignored if the alarm is not a procedure alarm. 93 Ignored if the alarm is not a procedure alarm.
93 */ 94 */
94 void setProgramFile(const QString &programFile); 95 void setProgramFile(const QString &programFile);
95 /** Return the name of the program file to execute when the alarm is triggered. 96 /** Return the name of the program file to execute when the alarm is triggered.
96 @return the program file name, or QString::null if not a procedure alarm. 97 @return the program file name, or QString::null if not a procedure alarm.
97 */ 98 */
98 QString programFile() const; 99 QString programFile() const;
99 /** Set the arguments to the program to execute when the alarm is triggered. 100 /** Set the arguments to the program to execute when the alarm is triggered.
100 Ignored if the alarm is not a procedure alarm. 101 Ignored if the alarm is not a procedure alarm.
101 */ 102 */
102 void setProgramArguments(const QString &arguments); 103 void setProgramArguments(const QString &arguments);
103 /** Return the arguments to the program to run when the alarm is triggered. 104 /** Return the arguments to the program to run when the alarm is triggered.
104 @return the program arguments, or QString::null if not a procedure alarm. 105 @return the program arguments, or QString::null if not a procedure alarm.
105 */ 106 */
106 QString programArguments() const; 107 QString programArguments() const;
107 108
108 /** Set the alarm to be an email alarm. 109 /** Set the alarm to be an email alarm.
109 @param subject subject line of email. 110 @param subject subject line of email.
110 @param text body of email. 111 @param text body of email.
111 @param addressees email addresses of recipient(s). 112 @param addressees email addresses of recipient(s).
112 @param attachments optional names of files to attach to the email. 113 @param attachments optional names of files to attach to the email.
113 */ 114 */
114 void setEmailAlarm(const QString &subject, const QString &text, const QValueList<Person> &addressees, 115 void setEmailAlarm(const QString &subject, const QString &text, const QValueList<Person> &addressees,
115 const QStringList &attachments = QStringList()); 116 const QStringList &attachments = QStringList());
116 117
117 /** Send mail to this address when the alarm is triggered. 118 /** Send mail to this address when the alarm is triggered.
118 Ignored if the alarm is not an email alarm. 119 Ignored if the alarm is not an email alarm.
119 */ 120 */
120 void setMailAddress(const Person &mailAlarmAddress); 121 void setMailAddress(const Person &mailAlarmAddress);
121 /** Send mail to these addresses when the alarm is triggered. 122 /** Send mail to these addresses when the alarm is triggered.
122 Ignored if the alarm is not an email alarm. 123 Ignored if the alarm is not an email alarm.
123 */ 124 */
124 void setMailAddresses(const QValueList<Person> &mailAlarmAddresses); 125 void setMailAddresses(const QValueList<Person> &mailAlarmAddresses);
125 /** Add this address to the list of addresses to send mail to when the alarm is triggered. 126 /** Add this address to the list of addresses to send mail to when the alarm is triggered.
126 Ignored if the alarm is not an email alarm. 127 Ignored if the alarm is not an email alarm.
127 */ 128 */
128 void addMailAddress(const Person &mailAlarmAddress); 129 void addMailAddress(const Person &mailAlarmAddress);
129 /** return the addresses to send mail to when an alarm goes off */ 130 /** return the addresses to send mail to when an alarm goes off */
130 QValueList<Person> mailAddresses() const; 131 QValueList<Person> mailAddresses() const;
131 132
132 /** Set the subject line of the mail. 133 /** Set the subject line of the mail.
133 Ignored if the alarm is not an email alarm. 134 Ignored if the alarm is not an email alarm.
134 */ 135 */
135 void setMailSubject(const QString &mailAlarmSubject); 136 void setMailSubject(const QString &mailAlarmSubject);
136 /** return the subject line of the mail */ 137 /** return the subject line of the mail */
137 QString mailSubject() const; 138 QString mailSubject() const;
138 139
139 /** Attach this filename to the email. 140 /** Attach this filename to the email.
140 Ignored if the alarm is not an email alarm. 141 Ignored if the alarm is not an email alarm.
141 */ 142 */
142 void setMailAttachment(const QString &mailAttachFile); 143 void setMailAttachment(const QString &mailAttachFile);
143 /** Attach these filenames to the email. 144 /** Attach these filenames to the email.
144 Ignored if the alarm is not an email alarm. 145 Ignored if the alarm is not an email alarm.
145 */ 146 */
146 void setMailAttachments(const QStringList &mailAttachFiles); 147 void setMailAttachments(const QStringList &mailAttachFiles);
147 /** Add this filename to the list of files to attach to the email. 148 /** Add this filename to the list of files to attach to the email.
148 Ignored if the alarm is not an email alarm. 149 Ignored if the alarm is not an email alarm.
149 */ 150 */
150 void addMailAttachment(const QString &mailAttachFile); 151 void addMailAttachment(const QString &mailAttachFile);
151 /** return the filenames to attach to the email */ 152 /** return the filenames to attach to the email */
152 QStringList mailAttachments() const; 153 QStringList mailAttachments() const;
153 154
154 /** Set the email body text. 155 /** Set the email body text.
155 Ignored if the alarm is not an email alarm. 156 Ignored if the alarm is not an email alarm.
156 */ 157 */
157 void setMailText(const QString &text); 158 void setMailText(const QString &text);
158 /** Return the email body text. 159 /** Return the email body text.
159 @return the body text, or QString::null if not an email alarm. 160 @return the body text, or QString::null if not an email alarm.
160 */ 161 */
161 QString mailText() const; 162 QString mailText() const;
162 163
163 /** set the time to trigger an alarm */ 164 /** set the time to trigger an alarm */
164 void setTime(const QDateTime &alarmTime); 165 void setTime(const QDateTime &alarmTime);
165 /** return the date/time when an alarm goes off */ 166 /** return the date/time when an alarm goes off */
166 QDateTime time() const; 167 QDateTime time() const;
167 /** Return true, if the alarm has an explicit date/time. */ 168 /** Return true, if the alarm has an explicit date/time. */
168 bool hasTime() const; 169 bool hasTime() const;
169 170
170 /** Set offset of alarm in time relative to the start of the event. */ 171 /** Set offset of alarm in time relative to the start of the event. */
171 void setStartOffset(const Duration &); 172 void setStartOffset(const Duration &);
172 /** Return offset of alarm in time relative to the start of the event. 173 /** Return offset of alarm in time relative to the start of the event.
173 * If the alarm's time is not defined in terms of an offset relative 174 * If the alarm's time is not defined in terms of an offset relative
174 * to the start of the event, returns zero. 175 * to the start of the event, returns zero.
175 */ 176 */
176 Duration startOffset() const; 177 Duration startOffset() const;
177 /** Return whether the alarm is defined in terms of an offset relative 178 /** Return whether the alarm is defined in terms of an offset relative
178 * to the start of the event. 179 * to the start of the event.
179 */ 180 */
180 bool hasStartOffset() const; 181 bool hasStartOffset() const;
181 182
182 /** Set offset of alarm in time relative to the end of the event. */ 183 /** Set offset of alarm in time relative to the end of the event. */
183 void setEndOffset(const Duration &); 184 void setEndOffset(const Duration &);
184 /** Return offset of alarm in time relative to the end of the event. 185 /** Return offset of alarm in time relative to the end of the event.
185 * If the alarm's time is not defined in terms of an offset relative 186 * If the alarm's time is not defined in terms of an offset relative
186 * to the end of the event, returns zero. 187 * to the end of the event, returns zero.
187 */ 188 */
188 Duration endOffset() const; 189 Duration endOffset() const;
189 /** Return whether the alarm is defined in terms of an offset relative 190 /** Return whether the alarm is defined in terms of an offset relative
190 * to the end of the event. 191 * to the end of the event.
191 */ 192 */
192 bool hasEndOffset() const; 193 bool hasEndOffset() const;
193 194
194 /** Set the interval between snoozes for the alarm. 195 /** Set the interval between snoozes for the alarm.
195 @param snoozeTime the time in minutes between snoozes. 196 @param snoozeTime the time in minutes between snoozes.
196 */ 197 */
197 void setSnoozeTime(int alarmSnoozeTime); 198 void setSnoozeTime(int alarmSnoozeTime);
198 /** Get how long the alarm snooze interval is. 199 /** Get how long the alarm snooze interval is.
199 @return the number of minutes between snoozes. 200 @return the number of minutes between snoozes.
200 */ 201 */
201 int snoozeTime() const; 202 int snoozeTime() const;
202 203
203 /** set how many times an alarm is to repeat itself (w/snoozes) */ 204 /** set how many times an alarm is to repeat itself (w/snoozes) */
204 void setRepeatCount(int alarmRepeatCount); 205 void setRepeatCount(int alarmRepeatCount);
205 /** get how many times an alarm repeats */ 206 /** get how many times an alarm repeats */
206 int repeatCount() const; 207 int repeatCount() const;
207 208
208 /** toggles the value of alarm to be either on or off. 209 /** toggles the value of alarm to be either on or off.
209 set's the alarm time to be x minutes before dtStart time. */ 210 set's the alarm time to be x minutes before dtStart time. */
210 void toggleAlarm(); 211 void toggleAlarm();
211 212
212 /** set the alarm enabled status */ 213 /** set the alarm enabled status */
213 void setEnabled(bool enable); 214 void setEnabled(bool enable);
214 /** get the alarm enabled status */ 215 /** get the alarm enabled status */
215 bool enabled() const; 216 bool enabled() const;
216 217
217 /** Set the alarm's parent incidence */ 218 /** Set the alarm's parent incidence */
218 void setParent( Incidence * ); 219 void setParent( Incidence * );
219 /** get the alarm's parent incidence */ 220 /** get the alarm's parent incidence */
220 Incidence *parent() const { return mParent; } 221 Incidence *parent() const { return mParent; }
221 222
222 private: 223 private:
223 Incidence *mParent; // the incidence which this alarm belongs to 224 Incidence *mParent; // the incidence which this alarm belongs to
224 Type mType; // type of alarm 225 Type mType; // type of alarm
225 QString mDescription; // text to display/email body/procedure arguments 226 QString mDescription; // text to display/email body/procedure arguments
226 QString mFile; // procedure program to run/optional audio file to play 227 QString mFile; // procedure program to run/optional audio file to play
227 QStringList mMailAttachFiles; // filenames to attach to email 228 QStringList mMailAttachFiles; // filenames to attach to email
228 QValueList<Person> mMailAddresses; // who to mail for reminder 229 QValueList<Person> mMailAddresses; // who to mail for reminder
229 QString mMailSubject; // subject of email 230 QString mMailSubject; // subject of email
230 231
231 int mAlarmSnoozeTime; // number of minutes after alarm to 232 int mAlarmSnoozeTime; // number of minutes after alarm to
232 // snooze before ringing again 233 // snooze before ringing again
233 int mAlarmRepeatCount; // number of times for alarm to repeat 234 int mAlarmRepeatCount; // number of times for alarm to repeat
234 // after the initial time 235 // after the initial time
235 236
236 QDateTime mAlarmTime; // time at which to trigger the alarm 237 QDateTime mAlarmTime; // time at which to trigger the alarm
237 Duration mOffset; // time relative to incidence DTSTART to trigger the alarm 238 Duration mOffset; // time relative to incidence DTSTART to trigger the alarm
238 bool mEndOffset; // if true, mOffset relates to DTEND, not DTSTART 239 bool mEndOffset; // if true, mOffset relates to DTEND, not DTSTART
239 bool mHasTime; // use mAlarmTime, not mOffset 240 bool mHasTime; // use mAlarmTime, not mOffset
240 bool mAlarmEnabled; 241 bool mAlarmEnabled;
241}; 242};
242 243
243} 244}
244 245
245#endif 246#endif
diff --git a/libkcal/kincidenceformatter.cpp b/libkcal/kincidenceformatter.cpp
index e506a96..d67ad52 100644
--- a/libkcal/kincidenceformatter.cpp
+++ b/libkcal/kincidenceformatter.cpp
@@ -1,393 +1,403 @@
1#include "kincidenceformatter.h" 1#include "kincidenceformatter.h"
2#include <kstaticdeleter.h> 2#include <kstaticdeleter.h>
3#include <kglobal.h> 3#include <kglobal.h>
4#include <klocale.h> 4#include <klocale.h>
5#ifdef DEKTOP_VERSION 5#ifdef DEKTOP_VERSION
6#include <kabc/stdaddressbook.h> 6#include <kabc/stdaddressbook.h>
7#define size count 7#define size count
8#endif 8#endif
9 9
10KIncidenceFormatter* KIncidenceFormatter::mInstance = 0; 10KIncidenceFormatter* KIncidenceFormatter::mInstance = 0;
11static KStaticDeleter<KIncidenceFormatter> insd; 11static KStaticDeleter<KIncidenceFormatter> insd;
12 12
13QString KIncidenceFormatter::getFormattedText( Incidence * inc, bool details, bool created , bool modified ) 13QString KIncidenceFormatter::getFormattedText( Incidence * inc, bool details, bool created , bool modified )
14{ 14{
15// #ifndef QT_NO_INPUTDIALOG 15// #ifndef QT_NO_INPUTDIALOG
16// return QInputDialog::getItem( caption, label, items, current, editable ); 16// return QInputDialog::getItem( caption, label, items, current, editable );
17// #else 17// #else
18// return QString::null; 18// return QString::null;
19// #endif 19// #endif
20 mDetails = details; 20 mDetails = details;
21 mCreated = created ; 21 mCreated = created ;
22 mModified = modified; 22 mModified = modified;
23 mText = ""; 23 mText = "";
24 if ( inc->type() == "Event" ) 24 if ( inc->type() == "Event" )
25 setEvent((Event *) inc ); 25 setEvent((Event *) inc );
26 else if ( inc->type() == "Todo" ) 26 else if ( inc->type() == "Todo" )
27 setTodo((Todo *) inc ); 27 setTodo((Todo *) inc );
28 return mText; 28 return mText;
29} 29}
30 30
31KIncidenceFormatter* KIncidenceFormatter::instance() 31KIncidenceFormatter* KIncidenceFormatter::instance()
32{ 32{
33 if (!mInstance) { 33 if (!mInstance) {
34 mInstance = insd.setObject(new KIncidenceFormatter()); 34 mInstance = insd.setObject(new KIncidenceFormatter());
35 } 35 }
36 return mInstance; 36 return mInstance;
37} 37}
38KIncidenceFormatter::~KIncidenceFormatter() 38KIncidenceFormatter::~KIncidenceFormatter()
39{ 39{
40 if (mInstance == this) 40 if (mInstance == this)
41 mInstance = insd.setObject(0); 41 mInstance = insd.setObject(0);
42 //qDebug("KIncidenceFormatter::~KIncidenceFormatter "); 42 //qDebug("KIncidenceFormatter::~KIncidenceFormatter ");
43} 43}
44KIncidenceFormatter::KIncidenceFormatter() 44KIncidenceFormatter::KIncidenceFormatter()
45{ 45{
46 mColorMode = 0; 46 mColorMode = 0;
47} 47}
48void KIncidenceFormatter::setEvent(Event *event) 48void KIncidenceFormatter::setEvent(Event *event)
49{ 49{
50 int mode = 0; 50 int mode = 0;
51 mCurrentIncidence = event; 51 mCurrentIncidence = event;
52 bool shortDate = true; 52 bool shortDate = true;
53 if ( mode == 0 ) { 53 if ( mode == 0 ) {
54 addTag("h3",deTag(event->summary())); 54 addTag("h3",deTag(event->summary()));
55 } 55 }
56 else { 56 else {
57 if ( mColorMode == 1 ) { 57 if ( mColorMode == 1 ) {
58 mText +="<font color=\"#00A000\">"; 58 mText +="<font color=\"#00A000\">";
59 } 59 }
60 if ( mColorMode == 2 ) { 60 if ( mColorMode == 2 ) {
61 mText +="<font color=\"#C00000\">"; 61 mText +="<font color=\"#C00000\">";
62 } 62 }
63 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>"; 63 // mText +="<font color=\"#F00000\">" + i18n("O-due!") + "</font>";
64 if ( mode == 1 ) { 64 if ( mode == 1 ) {
65 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 65 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
66 } else { 66 } else {
67 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 67 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
68 } 68 }
69 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 69 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
70 if ( mColorMode ) 70 if ( mColorMode )
71 mText += "</font>"; 71 mText += "</font>";
72 } 72 }
73 if (event->cancelled ()) { 73 if (event->cancelled ()) {
74 mText +="<font color=\"#B00000\">"; 74 mText +="<font color=\"#B00000\">";
75 addTag("i",i18n("This event has been cancelled!")); 75 addTag("i",i18n("This event has been cancelled!"));
76 mText.append("<br>"); 76 mText.append("<br>");
77 mText += "</font>"; 77 mText += "</font>";
78 } 78 }
79 if (!event->location().isEmpty()) { 79 if (!event->location().isEmpty()) {
80 addTag("b",i18n("Location: ")); 80 addTag("b",i18n("Location: "));
81 mText.append(deTag(event->location())+"<br>"); 81 mText.append(deTag(event->location())+"<br>");
82 } 82 }
83 if (event->doesFloat()) { 83 if (event->doesFloat()) {
84 if (event->isMultiDay()) { 84 if (event->isMultiDay()) {
85 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>") 85 mText.append(i18n("<p><b>From:</b> %1 </p><p><b>To:</b> %2</p>")
86 .arg(event->dtStartDateStr(shortDate)) 86 .arg(event->dtStartDateStr(shortDate))
87 .arg(event->dtEndDateStr(shortDate))); 87 .arg(event->dtEndDateStr(shortDate)));
88 } else { 88 } else {
89 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate ))); 89 mText.append(i18n("<p><b>On:</b> %1</p>").arg(event->dtStartDateStr( shortDate )));
90 } 90 }
91 } else { 91 } else {
92 if (event->isMultiDay()) { 92 if (event->isMultiDay()) {
93 mText.append(i18n("<p><b>From:</b> %1</p> ") 93 mText.append(i18n("<p><b>From:</b> %1</p> ")
94 .arg(event->dtStartStr( shortDate))); 94 .arg(event->dtStartStr( shortDate)));
95 mText.append(i18n("<p><b>To:</b> %1</p>") 95 mText.append(i18n("<p><b>To:</b> %1</p>")
96 .arg(event->dtEndStr(shortDate))); 96 .arg(event->dtEndStr(shortDate)));
97 } else { 97 } else {
98 mText.append(i18n("<p><b>On:</b> %1</p> ") 98 mText.append(i18n("<p><b>On:</b> %1</p> ")
99 .arg(event->dtStartDateStr( shortDate ))); 99 .arg(event->dtStartDateStr( shortDate )));
100 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>") 100 mText.append(i18n("<p><b>From:</b> %1 <b>To:</b> %2</p>")
101 .arg(event->dtStartTimeStr()) 101 .arg(event->dtStartTimeStr())
102 .arg(event->dtEndTimeStr())); 102 .arg(event->dtEndTimeStr()));
103 } 103 }
104 } 104 }
105 105
106 if (event->recurrence()->doesRecur()) { 106 if (event->recurrence()->doesRecur()) {
107 107
108 QString recurText = event->recurrence()->recurrenceText(); 108 QString recurText = event->recurrence()->recurrenceText();
109 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>"); 109 addTag("p","<em>" + i18n("This is a %1 recurring event.").arg(recurText ) + "</em>");
110 110
111 bool ok; 111 bool ok;
112 QDate start = QDate::currentDate(); 112 QDate start = QDate::currentDate();
113 QDateTime next; 113 QDateTime next;
114 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok ); 114 next = event->getNextOccurence( QDateTime::currentDateTime() , &ok );
115 if ( ok ) { 115 if ( ok ) {
116 addTag("p",i18n("<b>Next recurrence is on:</b>") ); 116 addTag("p",i18n("<b>Next recurrence is on:</b>") );
117 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate )); 117 addTag("p", KGlobal::locale()->formatDate( next.date(), shortDate ));
118 118
119 } else { 119 } else {
120 bool last; 120 bool last;
121 QDate nextd; 121 QDate nextd;
122 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last ); 122 nextd = event->recurrence()->getPreviousDate( QDate::currentDate() , &last );
123 if ( last ) { 123 if ( last ) {
124 addTag("p",i18n("<b>Last recurrence was on:</b>") ); 124 addTag("p",i18n("<b>Last recurrence was on:</b>") );
125 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate )); 125 addTag("p", KGlobal::locale()->formatDate( nextd, shortDate ));
126 } 126 }
127 } 127 }
128 } 128 }
129 129
130 130
131 if (event->isAlarmEnabled()) { 131 if (event->isAlarmEnabled()) {
132 Alarm *alarm =event->alarms().first() ; 132 Alarm *alarm =event->alarms().first() ;
133 QDateTime t = alarm->time(); 133 QDateTime t = alarm->time();
134 int min = t.secsTo( event->dtStart() )/60; 134 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
135 QString s =i18n("(%1 min before)").arg( min );
136 addTag("p",i18n("<b>Alarm on: </b>") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate )); 135 addTag("p",i18n("<b>Alarm on: </b>") + s + ": "+KGlobal::locale()->formatDateTime( t, shortDate ));
137 //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate )); 136 //addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
138 //addTag("p",s); 137 //addTag("p",s);
139 } 138 }
140 139
140
141
141 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() ); 142 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() );
142 // mText.append(event->secrecyStr()+"<br>"); 143 // mText.append(event->secrecyStr()+"<br>");
143 formatCategories(event); 144 formatCategories(event);
144 if ( mDetails ) { 145 if ( mDetails ) {
145 if (!event->description().isEmpty()) { 146 if (!event->description().isEmpty()) {
146 addTag("p",i18n("<b>Details: </b>")); 147 addTag("p",i18n("<b>Details: </b>"));
147 addTag("p",deTag(event->description())); 148 addTag("p",deTag(event->description()));
148 } 149 }
149 } 150 }
150 151
151 formatReadOnly(event); 152 formatReadOnly(event);
152 formatAttendees(event); 153 formatAttendees(event);
153 154
154 if ( mCreated ) { 155 if ( mCreated ) {
155 addTag("p",i18n("<b>Created: ") +" </b>"); 156 addTag("p",i18n("<b>Created: ") +" </b>");
156 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 157 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
157 158
158 } 159 }
159 if ( mModified ) { 160 if ( mModified ) {
160 addTag("p",i18n("<b>Last modified: ") +" </b>"); 161 addTag("p",i18n("<b>Last modified: ") +" </b>");
161 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 162 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
162 163
163 } 164 }
164 165
165} 166}
166 167
167void KIncidenceFormatter::setTodo(Todo *event ) 168void KIncidenceFormatter::setTodo(Todo *event )
168{ 169{
169 int mode = 0; 170 int mode = 0;
170 mCurrentIncidence = event; 171 mCurrentIncidence = event;
171 bool shortDate = true; 172 bool shortDate = true;
172 if (mode == 0 ) 173 if (mode == 0 )
173 addTag("h3",deTag(event->summary())); 174 addTag("h3",deTag(event->summary()));
174 else { 175 else {
175 if ( mColorMode == 1 ) { 176 if ( mColorMode == 1 ) {
176 mText +="<font color=\"#00A000\">"; 177 mText +="<font color=\"#00A000\">";
177 } 178 }
178 if ( mColorMode == 2 ) { 179 if ( mColorMode == 2 ) {
179 mText +="<font color=\"#B00000\">"; 180 mText +="<font color=\"#B00000\">";
180 } 181 }
181 if ( mode == 1 ) { 182 if ( mode == 1 ) {
182 addTag("h2",i18n( "Local: " ) +deTag(event->summary())); 183 addTag("h2",i18n( "Local: " ) +deTag(event->summary()));
183 } else { 184 } else {
184 addTag("h2",i18n( "Remote: " ) +deTag(event->summary())); 185 addTag("h2",i18n( "Remote: " ) +deTag(event->summary()));
185 } 186 }
186 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) ); 187 addTag("h3",i18n( "Last modified: " ) + KGlobal::locale()->formatDateTime(event->lastModified(),shortDate, true ) );
187 if ( mColorMode ) 188 if ( mColorMode )
188 mText += "</font>"; 189 mText += "</font>";
189 } 190 }
190 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) { 191 if ( event->percentComplete() == 100 && event->hasCompletedDate() ) {
191 mText +="<font color=\"#B00000\">"; 192 mText +="<font color=\"#B00000\">";
192 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(shortDate) ) ); 193 addTag("i", i18n("<p><i>Completed on %1</i></p>").arg( event->completedStr(shortDate) ) );
193 mText += "</font>"; 194 mText += "</font>";
194 } else { 195 } else {
195 mText.append(i18n("<p><i>%1 % completed</i></p>") 196 mText.append(i18n("<p><i>%1 % completed</i></p>")
196 .arg(event->percentComplete())); 197 .arg(event->percentComplete()));
197 } 198 }
198 if (event->cancelled ()) { 199 if (event->cancelled ()) {
199 mText +="<font color=\"#B00000\">"; 200 mText +="<font color=\"#B00000\">";
200 addTag("i",i18n("This todo has been cancelled!")); 201 addTag("i",i18n("This todo has been cancelled!"));
201 mText.append("<br>"); 202 mText.append("<br>");
202 mText += "</font>"; 203 mText += "</font>";
203 } 204 }
204 205
205 if (!event->location().isEmpty()) { 206 if (!event->location().isEmpty()) {
206 addTag("b",i18n("Location: ")); 207 addTag("b",i18n("Location: "));
207 mText.append(deTag(event->location())+"<br>"); 208 mText.append(deTag(event->location())+"<br>");
208 } 209 }
209 210
210 if (event->recurrence()->doesRecur()) { 211 if (event->recurrence()->doesRecur()) {
211 212
212 QString recurText = event->recurrence()->recurrenceText(); 213 QString recurText = event->recurrence()->recurrenceText();
213 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>"); 214 addTag("p","<em>" + i18n("This is a %1 recurring todo.").arg(recurText ) + "</em>");
214 } 215 }
215 216
216 if (event->hasStartDate()) { 217 if (event->hasStartDate()) {
217 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(shortDate))); 218 mText.append(i18n("<p><b>Start on:</b> %1</p>").arg(event->dtStartStr(shortDate)));
218 } 219 }
219 220
220 221
221 if (event->hasDueDate()) { 222 if (event->hasDueDate()) {
222 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(shortDate))); 223 mText.append(i18n("<p><b>Due on:</b> %1</p>").arg(event->dtDueStr(shortDate)));
223 } 224 }
224 mText.append(i18n("<p><b>Priority:</b> %2</p>") 225 mText.append(i18n("<p><b>Priority:</b> %2</p>")
225 .arg(QString::number(event->priority()))); 226 .arg(QString::number(event->priority())));
226 227
228 if (event->isAlarmEnabled()) {
229 Alarm *alarm =event->alarms().first() ;
230 QDateTime t = alarm->time();
231 QString s =i18n("( %1 before )").arg( alarm->offsetText() );
232 addTag("p",i18n("<b>Alarm on: ") + s +" </b>");
233 addTag("p", KGlobal::locale()->formatDateTime( t, shortDate ));
234 //addTag("p",s);
235 }
236
227 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() ); 237 addTag("p",i18n("<b>Access: </b>") +event->secrecyStr() );
228 formatCategories(event); 238 formatCategories(event);
229 if ( mDetails ) { 239 if ( mDetails ) {
230 if (!event->description().isEmpty()) { 240 if (!event->description().isEmpty()) {
231 addTag("p",i18n("<b>Details: </b>")); 241 addTag("p",i18n("<b>Details: </b>"));
232 addTag("p",deTag(event->description())); 242 addTag("p",deTag(event->description()));
233 } 243 }
234 } 244 }
235 formatReadOnly(event); 245 formatReadOnly(event);
236 formatAttendees(event); 246 formatAttendees(event);
237 if ( mCreated ) { 247 if ( mCreated ) {
238 addTag("p",i18n("<b>Created: ") +" </b>"); 248 addTag("p",i18n("<b>Created: ") +" </b>");
239 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate )); 249 addTag("p", KGlobal::locale()->formatDateTime( event->created(), shortDate ));
240 250
241 } 251 }
242 if ( mModified ) { 252 if ( mModified ) {
243 addTag("p",i18n("<b>Last modified: ") +" </b>"); 253 addTag("p",i18n("<b>Last modified: ") +" </b>");
244 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate )); 254 addTag("p", KGlobal::locale()->formatDateTime( event->lastModified(), shortDate ));
245 255
246 } 256 }
247} 257}
248 258
249void KIncidenceFormatter::setJournal(Journal* ) 259void KIncidenceFormatter::setJournal(Journal* )
250{ 260{
251 261
252} 262}
253 263
254void KIncidenceFormatter::formatCategories(Incidence *event) 264void KIncidenceFormatter::formatCategories(Incidence *event)
255{ 265{
256 if (!event->categoriesStr().isEmpty()) { 266 if (!event->categoriesStr().isEmpty()) {
257 addTag("p",i18n("<b>Categories: </b>")+event->categoriesStr() ); 267 addTag("p",i18n("<b>Categories: </b>")+event->categoriesStr() );
258 //mText.append(event->categoriesStr()); 268 //mText.append(event->categoriesStr());
259 } 269 }
260} 270}
261void KIncidenceFormatter::addTag(const QString & tag,const QString & text) 271void KIncidenceFormatter::addTag(const QString & tag,const QString & text)
262{ 272{
263 int number=text.contains("\n"); 273 int number=text.contains("\n");
264 QString str = "<" + tag + ">"; 274 QString str = "<" + tag + ">";
265 QString tmpText=text; 275 QString tmpText=text;
266 QString tmpStr=str; 276 QString tmpStr=str;
267 if(number !=-1) 277 if(number !=-1)
268 { 278 {
269 if (number > 0) { 279 if (number > 0) {
270 int pos=0; 280 int pos=0;
271 QString tmp; 281 QString tmp;
272 for(int i=0;i<=number;i++) { 282 for(int i=0;i<=number;i++) {
273 pos=tmpText.find("\n"); 283 pos=tmpText.find("\n");
274 tmp=tmpText.left(pos); 284 tmp=tmpText.left(pos);
275 tmpText=tmpText.right(tmpText.length()-pos-1); 285 tmpText=tmpText.right(tmpText.length()-pos-1);
276 tmpStr+=tmp+"<br>"; 286 tmpStr+=tmp+"<br>";
277 } 287 }
278 } 288 }
279 else tmpStr += tmpText; 289 else tmpStr += tmpText;
280 tmpStr+="</" + tag + ">"; 290 tmpStr+="</" + tag + ">";
281 mText.append(tmpStr); 291 mText.append(tmpStr);
282 } 292 }
283 else 293 else
284 { 294 {
285 str += text + "</" + tag + ">"; 295 str += text + "</" + tag + ">";
286 mText.append(str); 296 mText.append(str);
287 } 297 }
288} 298}
289 299
290void KIncidenceFormatter::formatAttendees(Incidence *event) 300void KIncidenceFormatter::formatAttendees(Incidence *event)
291{ 301{
292 QPtrList<Attendee> attendees = event->attendees(); 302 QPtrList<Attendee> attendees = event->attendees();
293 if (attendees.count()) { 303 if (attendees.count()) {
294 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small); 304 QString iconPath = KGlobal::iconLoader()->iconPath("mailappt",KIcon::Small);
295 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small); 305 QString NOiconPath = KGlobal::iconLoader()->iconPath("nomailappt",KIcon::Small);
296 addTag("h3",i18n("Organizer")); 306 addTag("h3",i18n("Organizer"));
297 mText.append("<ul><li>"); 307 mText.append("<ul><li>");
298#if 0 308#if 0
299 //ndef KORG_NOKABC 309 //ndef KORG_NOKABC
300 310
301 KABC::AddressBook *add_book = KABC::StdAddressBook::self(); 311 KABC::AddressBook *add_book = KABC::StdAddressBook::self();
302 KABC::Addressee::List addressList; 312 KABC::Addressee::List addressList;
303 addressList = add_book->findByEmail(event->organizer()); 313 addressList = add_book->findByEmail(event->organizer());
304 KABC::Addressee o = addressList.first(); 314 KABC::Addressee o = addressList.first();
305 if (!o.isEmpty() && addressList.size()<2) { 315 if (!o.isEmpty() && addressList.size()<2) {
306 mText += "<a href=\"uid:" + o.uid() + "\">"; 316 mText += "<a href=\"uid:" + o.uid() + "\">";
307 mText += o.formattedName(); 317 mText += o.formattedName();
308 mText += "</a>\n"; 318 mText += "</a>\n";
309 } else { 319 } else {
310 mText.append(event->organizer()); 320 mText.append(event->organizer());
311 } 321 }
312#else 322#else
313 mText.append(event->organizer()); 323 mText.append(event->organizer());
314#endif 324#endif
315 if (iconPath) { 325 if (iconPath) {
316 mText += " <a href=\"mailto:" + event->organizer() + "\">"; 326 mText += " <a href=\"mailto:" + event->organizer() + "\">";
317 mText += "<IMG src=\"" + iconPath + "\">"; 327 mText += "<IMG src=\"" + iconPath + "\">";
318 mText += "</a>\n"; 328 mText += "</a>\n";
319 } 329 }
320 mText.append("</li></ul>"); 330 mText.append("</li></ul>");
321 331
322 addTag("h3",i18n("Attendees")); 332 addTag("h3",i18n("Attendees"));
323 Attendee *a; 333 Attendee *a;
324 mText.append("<ul>"); 334 mText.append("<ul>");
325 for(a=attendees.first();a;a=attendees.next()) { 335 for(a=attendees.first();a;a=attendees.next()) {
326#if 0 336#if 0
327//ndef KORG_NOKABC 337//ndef KORG_NOKABC
328 if (a->name().isEmpty()) { 338 if (a->name().isEmpty()) {
329 addressList = add_book->findByEmail(a->email()); 339 addressList = add_book->findByEmail(a->email());
330 KABC::Addressee o = addressList.first(); 340 KABC::Addressee o = addressList.first();
331 if (!o.isEmpty() && addressList.size()<2) { 341 if (!o.isEmpty() && addressList.size()<2) {
332 mText += "<a href=\"uid:" + o.uid() + "\">"; 342 mText += "<a href=\"uid:" + o.uid() + "\">";
333 mText += o.formattedName(); 343 mText += o.formattedName();
334 mText += "</a>\n"; 344 mText += "</a>\n";
335 } else { 345 } else {
336 mText += "<li>"; 346 mText += "<li>";
337 mText.append(a->email()); 347 mText.append(a->email());
338 mText += "\n"; 348 mText += "\n";
339 } 349 }
340 } else { 350 } else {
341 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 351 mText += "<li><a href=\"uid:" + a->uid() + "\">";
342 if (!a->name().isEmpty()) mText += a->name(); 352 if (!a->name().isEmpty()) mText += a->name();
343 else mText += a->email(); 353 else mText += a->email();
344 mText += "</a>\n"; 354 mText += "</a>\n";
345 } 355 }
346#else 356#else
347 //qDebug("nokabc "); 357 //qDebug("nokabc ");
348 mText += "<li><a href=\"uid:" + a->uid() + "\">"; 358 mText += "<li><a href=\"uid:" + a->uid() + "\">";
349 if (!a->name().isEmpty()) mText += a->name(); 359 if (!a->name().isEmpty()) mText += a->name();
350 else mText += a->email(); 360 else mText += a->email();
351 mText += "</a>\n"; 361 mText += "</a>\n";
352#endif 362#endif
353 363
354 if (!a->email().isEmpty()) { 364 if (!a->email().isEmpty()) {
355 if (iconPath) { 365 if (iconPath) {
356 mText += "<a href=\"mailto:" + a->name() +" "+ "<" + a->email() + ">" + "\">"; 366 mText += "<a href=\"mailto:" + a->name() +" "+ "<" + a->email() + ">" + "\">";
357 if ( a->RSVP() ) 367 if ( a->RSVP() )
358 mText += "<IMG src=\"" + iconPath + "\">"; 368 mText += "<IMG src=\"" + iconPath + "\">";
359 else 369 else
360 mText += "<IMG src=\"" + NOiconPath + "\">"; 370 mText += "<IMG src=\"" + NOiconPath + "\">";
361 mText += "</a>\n"; 371 mText += "</a>\n";
362 } 372 }
363 } 373 }
364 if (a->status() != Attendee::NeedsAction ) 374 if (a->status() != Attendee::NeedsAction )
365 mText +="[" + a->statusStr() + "] "; 375 mText +="[" + a->statusStr() + "] ";
366 if (a->role() == Attendee::Chair ) 376 if (a->role() == Attendee::Chair )
367 mText +="(" + a->roleStr().left(1) + ".)"; 377 mText +="(" + a->roleStr().left(1) + ".)";
368 } 378 }
369 mText.append("</li></ul>"); 379 mText.append("</li></ul>");
370 } 380 }
371} 381}
372 382
373void KIncidenceFormatter::formatReadOnly(Incidence *event) 383void KIncidenceFormatter::formatReadOnly(Incidence *event)
374{ 384{
375 if (event->isReadOnly()) { 385 if (event->isReadOnly()) {
376 addTag("p","<em>(" + i18n("read-only") + ")</em>"); 386 addTag("p","<em>(" + i18n("read-only") + ")</em>");
377 } 387 }
378} 388}
379QString KIncidenceFormatter::deTag(QString text) 389QString KIncidenceFormatter::deTag(QString text)
380{ 390{
381#if QT_VERSION >= 0x030000 391#if QT_VERSION >= 0x030000
382 text.replace( '<' , "&lt;" ); 392 text.replace( '<' , "&lt;" );
383 text.replace( '>' , "&gt;" ); 393 text.replace( '>' , "&gt;" );
384#else 394#else
385 if ( text.find ('<') >= 0 ) { 395 if ( text.find ('<') >= 0 ) {
386 text.replace( QRegExp("<") , "&lt;" ); 396 text.replace( QRegExp("<") , "&lt;" );
387 } 397 }
388 if ( text.find ('>') >= 0 ) { 398 if ( text.find ('>') >= 0 ) {
389 text.replace( QRegExp(">") , "&gt;" ); 399 text.replace( QRegExp(">") , "&gt;" );
390 } 400 }
391#endif 401#endif
392 return text; 402 return text;
393} 403}