You've already forked lazarus-ccr
tvplanit: Add preview form for ical import of event items.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8376 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -9,7 +9,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 3.1\n"
|
||||
"X-Generator: Poedit 3.1.1\n"
|
||||
|
||||
#: vpsr.rs1day
|
||||
msgid "1 day"
|
||||
@ -47,6 +47,11 @@ msgstr "Fre"
|
||||
msgid "Age:"
|
||||
msgstr "Alter:"
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr "Alarm in %s"
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr "E&rinnerung"
|
||||
@ -97,7 +102,7 @@ msgstr "Die Ende-Zeit darf nicht vor der Start-Zeit liegen."
|
||||
|
||||
#: vpsr.rsbaditemtype
|
||||
msgid "Invalid item type "
|
||||
msgstr "Ungültiger Eintragstyp."
|
||||
msgstr "Ungültiger Eintragstyp "
|
||||
|
||||
#: vpsr.rsbadmeasurement
|
||||
msgid "Invalid measurement"
|
||||
@ -105,7 +110,7 @@ msgstr "Ungültige Messung"
|
||||
|
||||
#: vpsr.rsbadprintformat
|
||||
msgid "Invalid print format "
|
||||
msgstr "Ungültiges Druckformat."
|
||||
msgstr "Ungültiges Druckformat "
|
||||
|
||||
#: vpsr.rsbadtriggerhandle
|
||||
msgid "Invalid trigger handle."
|
||||
@ -455,6 +460,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr "Ereignis"
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr "Alle %d Tage"
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr "Alle %d Monate am %s-ten"
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr "Alle %d Wochen am %s"
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr "Alle %d Jahre am %s"
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr "Konflikte mit einem anderen ausschließenden Ereignis."
|
||||
@ -675,6 +700,11 @@ msgstr "Monatlich, nach Datum"
|
||||
msgid "Monthly by day"
|
||||
msgstr "Monatlich, nach Tag"
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr "Monatlich am Tag %s"
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr "Monate"
|
||||
@ -697,7 +727,7 @@ msgstr "Bitte geben Sie einen Element-Namen an"
|
||||
|
||||
#: vpsr.rsneedformatname
|
||||
msgid "FormatName cannot be blank"
|
||||
msgstr "Der Format-Name muss angegeben sein.."
|
||||
msgstr "Der Format-Name muss angegeben sein"
|
||||
|
||||
#: vpsr.rsnewbtn
|
||||
msgid "New"
|
||||
@ -729,6 +759,10 @@ msgstr "Nächstes Jahr"
|
||||
msgid "N"
|
||||
msgstr "N"
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr "Ohne Alarm"
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr "TCanvas wurde nicht zugewiesen"
|
||||
@ -1088,6 +1122,10 @@ msgstr "Termin-Wiederholung:"
|
||||
msgid "Reminder"
|
||||
msgstr "Erinnerung"
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr "Wiederholung:"
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr "Ausdruck einrichten"
|
||||
@ -1155,6 +1193,10 @@ msgstr "&Später"
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr "Auf \"Später\" klicken, um erinnert zu werden in:"
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr "Alarmton"
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr "Klang-Suche"
|
||||
@ -1328,6 +1370,11 @@ msgstr "Mittwoch"
|
||||
msgid "Weekly"
|
||||
msgstr "Wöchentlich"
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr "Wöchentlich am %s"
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr "Wochen"
|
||||
@ -1385,6 +1432,11 @@ msgstr "Jährlich, nach Datum"
|
||||
msgid "Yearly by day"
|
||||
msgstr "Jährlich, nach Wochentag"
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr "Jährlich am %s"
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr "Jahre"
|
||||
@ -1413,7 +1465,7 @@ msgstr "Attribut %s von Element %s hat keinen ganzzahligen Wert."
|
||||
|
||||
#: vpsr.sbadparamentnesting
|
||||
msgid "Parameter-entity text must be properly nested: "
|
||||
msgstr "Parameter-Entity muss richtig eingebettet sein:"
|
||||
msgstr "Parameter-Entity muss richtig eingebettet sein: "
|
||||
|
||||
#: vpsr.sbadsepinmodel
|
||||
msgid "Bad separator in content model: "
|
||||
|
@ -9,7 +9,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 3.1\n"
|
||||
"X-Generator: Poedit 3.1.1\n"
|
||||
|
||||
#: vpsr.rs1day
|
||||
msgid "1 day"
|
||||
@ -47,6 +47,11 @@ msgstr "Fri"
|
||||
msgid "Age:"
|
||||
msgstr "Age:"
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr "Alarm in %s"
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr "&Reminder"
|
||||
@ -449,6 +454,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr "Event"
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr "Every %d days"
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr "Every %d months on day %s"
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr "Every %d weeks on %s"
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr "Every %d years on %s"
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr "Conflicts with another exclusive event."
|
||||
@ -669,6 +694,11 @@ msgstr "Monthly by date"
|
||||
msgid "Monthly by day"
|
||||
msgstr "Monthly by day"
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr "Months"
|
||||
@ -721,6 +751,10 @@ msgstr "Next year"
|
||||
msgid "N"
|
||||
msgstr "N"
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr "No alarm"
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr "TCanvas not assigned"
|
||||
@ -1074,6 +1108,10 @@ msgstr "Appointment recurrence:"
|
||||
msgid "Reminder"
|
||||
msgstr "Reminder"
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr "Repeat:"
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr "Report setup"
|
||||
@ -1141,6 +1179,10 @@ msgstr "&Snooze"
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr "Click &Snooze to be reminded again in:"
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr "Sound"
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr "Sound Finder"
|
||||
@ -1310,6 +1352,11 @@ msgstr "Wednesday"
|
||||
msgid "Weekly"
|
||||
msgstr "Weekly"
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr "Weekly on %s"
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr "Weeks"
|
||||
@ -1367,6 +1414,11 @@ msgstr "Yearly by date"
|
||||
msgid "Yearly by day"
|
||||
msgstr "Yearly by day"
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr "Yearly on %s"
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr "Years"
|
||||
|
@ -37,6 +37,11 @@ msgstr "Pe"
|
||||
msgid "Age:"
|
||||
msgstr "Ikä:"
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr ""
|
||||
@ -445,6 +450,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr ""
|
||||
@ -666,6 +691,11 @@ msgstr ""
|
||||
msgid "Monthly by day"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr "Kuukaudet"
|
||||
@ -720,6 +750,10 @@ msgstr "Seuraava vuosi"
|
||||
msgid "N"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr ""
|
||||
@ -1079,6 +1113,10 @@ msgstr ""
|
||||
msgid "Reminder"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr ""
|
||||
@ -1146,6 +1184,10 @@ msgstr ""
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr ""
|
||||
@ -1320,6 +1362,11 @@ msgstr "Keskiviikko"
|
||||
msgid "Weekly"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr ""
|
||||
@ -1377,6 +1424,11 @@ msgstr ""
|
||||
msgid "Yearly by day"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr ""
|
||||
|
@ -53,6 +53,11 @@ msgstr "Ven"
|
||||
msgid "Age:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr "&Rappel"
|
||||
@ -461,6 +466,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr "Événement"
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr "Cette événement est en conflit avec une autre événement exclusif"
|
||||
@ -681,6 +706,11 @@ msgstr "Mensuel par date"
|
||||
msgid "Monthly by day"
|
||||
msgstr "Mensuel par jour"
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr ""
|
||||
@ -735,6 +765,10 @@ msgstr ""
|
||||
msgid "N"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr "TCanvas non spécifié"
|
||||
@ -1094,6 +1128,10 @@ msgstr "Rendevous à répéter:"
|
||||
msgid "Reminder"
|
||||
msgstr "Rappel"
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr ""
|
||||
@ -1161,6 +1199,10 @@ msgstr "&Sieste"
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr "Click &Sieste pour être rappelé à nouveau dans :"
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr "Trouver le son"
|
||||
@ -1336,6 +1378,11 @@ msgstr "Mercredi"
|
||||
msgid "Weekly"
|
||||
msgstr "Hebdomadaire"
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr ""
|
||||
@ -1393,6 +1440,11 @@ msgstr "Annuel par date"
|
||||
msgid "Yearly by day"
|
||||
msgstr "Annuel par jour"
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr ""
|
||||
|
@ -47,6 +47,11 @@ msgstr "Vr"
|
||||
msgid "Age:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr "He&rinnering"
|
||||
@ -455,6 +460,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr "Gebeurtenis"
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr "Conflict met een andere gebeurtenis."
|
||||
@ -675,6 +700,11 @@ msgstr "Maandelijks, op Datum"
|
||||
msgid "Monthly by day"
|
||||
msgstr "Maandelijks, op Dag"
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr ""
|
||||
@ -729,6 +759,10 @@ msgstr ""
|
||||
msgid "N"
|
||||
msgstr "N"
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr "TCanvas is niet toegewezen."
|
||||
@ -1088,6 +1122,10 @@ msgstr "Afspraak herhaling:"
|
||||
msgid "Reminder"
|
||||
msgstr "Herinnering"
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr ""
|
||||
@ -1155,6 +1193,10 @@ msgstr "&Uitstellen"
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr "Klik op \"Uitstellen\" om nogmaals herinnerd te worden in:"
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr "Geluid Zoeker"
|
||||
@ -1330,6 +1372,11 @@ msgstr "Woensdag"
|
||||
msgid "Weekly"
|
||||
msgstr "Wekelijks"
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr ""
|
||||
@ -1387,6 +1434,11 @@ msgstr "Jaarlijks, op Datum"
|
||||
msgid "Yearly by day"
|
||||
msgstr "Jaarlijks, op dag"
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr ""
|
||||
|
@ -47,6 +47,11 @@ msgstr "Pią"
|
||||
msgid "Age:"
|
||||
msgstr "Wiek:"
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr "&Przypomnienie"
|
||||
@ -455,6 +460,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr "Wydarzenie"
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr "Konflikt z innym wydarzeniem wyłącznym."
|
||||
@ -675,6 +700,11 @@ msgstr "Mieś. wg daty"
|
||||
msgid "Monthly by day"
|
||||
msgstr "Mieś. wg dnia"
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr "Miesiąc"
|
||||
@ -729,6 +759,10 @@ msgstr "Następny rok"
|
||||
msgid "N"
|
||||
msgstr "N"
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr "TCanvas nie został przypisany."
|
||||
@ -1087,6 +1121,10 @@ msgstr "Częstotliwość:"
|
||||
msgid "Reminder"
|
||||
msgstr "Przypomnienie"
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr "Ustawienia Raportu"
|
||||
@ -1154,6 +1192,10 @@ msgstr "&Drzemka"
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr "Naciśnij \"&Drzemka aby uaktywnić ponownie..."
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr "Wyszukanie dźwięku"
|
||||
@ -1328,6 +1370,11 @@ msgstr "Środa"
|
||||
msgid "Weekly"
|
||||
msgstr "Tygodniowo"
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr "Tygodnie"
|
||||
@ -1385,6 +1432,11 @@ msgstr "Rocz. wg daty"
|
||||
msgid "Yearly by day"
|
||||
msgstr "Rocz. wg dnia"
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr "Lata"
|
||||
|
@ -37,6 +37,11 @@ msgstr ""
|
||||
msgid "Age:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr ""
|
||||
@ -439,6 +444,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr ""
|
||||
@ -659,6 +684,11 @@ msgstr ""
|
||||
msgid "Monthly by day"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr ""
|
||||
@ -711,6 +741,10 @@ msgstr ""
|
||||
msgid "N"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr ""
|
||||
@ -1064,6 +1098,10 @@ msgstr ""
|
||||
msgid "Reminder"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr ""
|
||||
@ -1131,6 +1169,10 @@ msgstr ""
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr ""
|
||||
@ -1300,6 +1342,11 @@ msgstr ""
|
||||
msgid "Weekly"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr ""
|
||||
@ -1357,6 +1404,11 @@ msgstr ""
|
||||
msgid "Yearly by day"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr ""
|
||||
|
@ -47,6 +47,11 @@ msgstr "Пт."
|
||||
msgid "Age:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmin
|
||||
#, object-pascal-format
|
||||
msgid "Alarm in %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsalarmset
|
||||
msgid "&Reminder"
|
||||
msgstr "Напоминание"
|
||||
@ -455,6 +460,26 @@ msgctxt "vpsr.rsevent"
|
||||
msgid "Event"
|
||||
msgstr "Событие"
|
||||
|
||||
#: vpsr.rseverydays
|
||||
#, object-pascal-format
|
||||
msgid "Every %d days"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseverymonthson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d months on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryweekson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d weeks on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rseveryyearson
|
||||
#, object-pascal-format
|
||||
msgid "Every %d years on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsexclusiveeventconflict
|
||||
msgid "Conflicts with another exclusive event."
|
||||
msgstr "Конфликт с другим важным событием."
|
||||
@ -675,6 +700,11 @@ msgstr "Ежемесячно"
|
||||
msgid "Monthly by day"
|
||||
msgstr "Ежемесячную"
|
||||
|
||||
#: vpsr.rsmonthlyon
|
||||
#, object-pascal-format
|
||||
msgid "Monthly on day %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsmonths
|
||||
msgid "Months"
|
||||
msgstr "Месяц"
|
||||
@ -729,6 +759,10 @@ msgstr ""
|
||||
msgid "N"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnoalarm
|
||||
msgid "No alarm"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsnocanvas
|
||||
msgid "TCanvas not assigned"
|
||||
msgstr ""
|
||||
@ -1088,6 +1122,10 @@ msgstr "Повторение встречи:"
|
||||
msgid "Reminder"
|
||||
msgstr "Напоминание"
|
||||
|
||||
#: vpsr.rsrepeat
|
||||
msgid "Repeat:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsreportsetup
|
||||
msgid "Report setup"
|
||||
msgstr ""
|
||||
@ -1155,6 +1193,10 @@ msgstr ""
|
||||
msgid "Click &Snooze to be reminded again in:"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssound
|
||||
msgid "Sound"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rssoundfinder
|
||||
msgid "Sound Finder"
|
||||
msgstr ""
|
||||
@ -1328,6 +1370,11 @@ msgstr "Среда"
|
||||
msgid "Weekly"
|
||||
msgstr "Еженедельно"
|
||||
|
||||
#: vpsr.rsweeklyon
|
||||
#, object-pascal-format
|
||||
msgid "Weekly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsweeks
|
||||
msgid "Weeks"
|
||||
msgstr ""
|
||||
@ -1385,6 +1432,11 @@ msgstr "Ежегодно по дате"
|
||||
msgid "Yearly by day"
|
||||
msgstr "Ежегодно по дню"
|
||||
|
||||
#: vpsr.rsyearlyon
|
||||
#, object-pascal-format
|
||||
msgid "Yearly on %s"
|
||||
msgstr ""
|
||||
|
||||
#: vpsr.rsyears
|
||||
msgid "Years"
|
||||
msgstr ""
|
||||
|
@ -32,7 +32,7 @@ Portions created by TurboPower Software Inc. are Copyright (C) 2002 TurboPower S
|
||||
|
||||
Contributor(s): "/>
|
||||
<Version Major="1" Minor="7"/>
|
||||
<Files Count="62">
|
||||
<Files Count="63">
|
||||
<Item1>
|
||||
<Filename Value="source\vpbase.pas"/>
|
||||
<UnitName Value="VpBase"/>
|
||||
@ -281,6 +281,10 @@ Contributor(s): "/>
|
||||
<Filename Value="source\vpfileds.pas"/>
|
||||
<UnitName Value="VpFileDS"/>
|
||||
</Item62>
|
||||
<Item63>
|
||||
<Filename Value="source\vpicalpreview.pas"/>
|
||||
<UnitName Value="VpIcalPreview"/>
|
||||
</Item63>
|
||||
</Files>
|
||||
<CompatibilityMode Value="True"/>
|
||||
<i18n>
|
||||
|
@ -182,6 +182,7 @@ resourcestring
|
||||
RSOverlayedEvent = 'overlayed';
|
||||
RSOverlayed = 'Overlayed';
|
||||
RSICalFilter = 'iCalendar files (*.ical;*.ics)|*.ical;*.ics';
|
||||
RSRepeat = 'Repeat:';
|
||||
|
||||
{Task Specific}
|
||||
RSConfirmDeleteTask = 'Delete this task from your list?';
|
||||
@ -321,6 +322,16 @@ resourcestring
|
||||
RS1Day = '1 day';
|
||||
RSXDays = '%d days';
|
||||
RS1Week = '1 week';
|
||||
RSEveryYearsOn = 'Every %d years on %s';
|
||||
RSEveryMonthsOn = 'Every %d months on day %s';
|
||||
RSEveryWeeksOn = 'Every %d weeks on %s';
|
||||
RSEveryDays = 'Every %d days';
|
||||
RSYearlyOn = 'Yearly on %s';
|
||||
RSMonthlyOn = 'Monthly on day %s';
|
||||
RSWeeklyOn = 'Weekly on %s';
|
||||
RSAlarmIn = 'Alarm in %s';
|
||||
RSNoAlarm = 'No alarm';
|
||||
RSSound = 'Sound';
|
||||
|
||||
{ Calendar }
|
||||
RSCalendarRevert = 'Revert';
|
||||
|
@ -247,6 +247,7 @@ type
|
||||
function GetColor(AIndex: Integer): TColor;
|
||||
function GetName(AIndex: Integer):string;
|
||||
function GetCategory(AIndex: Integer): TVpCategoryInfo;
|
||||
function GetCategoryName(AIndex: Integer): String;
|
||||
function IndexOfCategory(AName: String): Integer;
|
||||
function IndexOfFirstUnusedCategory: Integer;
|
||||
procedure SetCategoryName(AIndex: Integer; AName: String);
|
||||
@ -741,6 +742,11 @@ begin
|
||||
Result := FCat[AIndex];
|
||||
end;
|
||||
|
||||
function TVpCategoryColorMap.GetCategoryName(AIndex: Integer): string;
|
||||
begin
|
||||
Result := FCat[AIndex].Description;
|
||||
end;
|
||||
|
||||
function TVpCategoryColorMap.IndexOfCategory(AName: String): Integer;
|
||||
var
|
||||
i: Integer;
|
||||
|
@ -313,6 +313,8 @@ type
|
||||
procedure DeleteResource(Res: TVpResource);
|
||||
function FindResource(const AResourceName: String): TVpResource;
|
||||
|
||||
function FindBestCategory(const ACategoryNames: TStrings): String;
|
||||
|
||||
property Connected : boolean read FConnected write SetConnected;
|
||||
property Loading : Boolean read FLoading write FLoading;
|
||||
property Resource: TVpResource read FResource write SetResource;
|
||||
@ -543,7 +545,24 @@ begin
|
||||
Result := FResources.FindResourceByName(AResourceName);
|
||||
end;
|
||||
|
||||
{=====}
|
||||
{ ACategoryNames is a list of category names, e.g. like in ical files.
|
||||
Searches among the datastore's categories whether there is one which matches
|
||||
an element of the category names and returns its name. }
|
||||
function TVpCustomDatastore.FindBestCategory(const ACategoryNames: TStrings): String;
|
||||
var
|
||||
i, j: Integer;
|
||||
begin
|
||||
Result := '';
|
||||
if ACategoryNames.Count > 0 then begin
|
||||
for i := 0 to ACategoryNames.Count-1 do begin
|
||||
j := CategoryColorMap.IndexOfCategory(ACategoryNames[i]);
|
||||
if j <> -1 then begin
|
||||
Result := CategoryColorMap.GetCategoryName(j);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TVpCustomDataStore.DeregisterAllWatchers;
|
||||
var
|
||||
|
@ -37,7 +37,7 @@ interface
|
||||
|
||||
uses
|
||||
LCLProc, LCLType,
|
||||
SysUtils, Classes, Dialogs, Graphics,
|
||||
SysUtils, Classes, Dialogs, Graphics, Forms,
|
||||
VpSR, VpVCard, VpICal;
|
||||
|
||||
type
|
||||
@ -241,7 +241,8 @@ type
|
||||
function EventCountByDay(Value: TDateTime): Integer;
|
||||
procedure EventsByDate(Date: TDateTime; EventList: TList);
|
||||
function GetEvent(Index: Integer): TVpEvent;
|
||||
function ImportICalFile(const AFileName: String; ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
function ImportICalFile(const AFileName: String; APreview: Boolean = false;
|
||||
ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
function RepeatsOn(Event: TVpEvent; Day: TDateTime): Boolean;
|
||||
procedure Sort;
|
||||
property Owner: TVpResource read FOwner;
|
||||
@ -311,8 +312,11 @@ type
|
||||
function CanEdit: Boolean;
|
||||
function CopyToSchedule(ASchedule: TVpSchedule): TVpEvent;
|
||||
function GetResource: TVpResource;
|
||||
class function IsAllDayEvent(AStartTime, AEndTime: TDateTime): Boolean;
|
||||
function IsOverlayed: Boolean;
|
||||
procedure LoadFromICalendar(AEntry: TVpICalEvent);
|
||||
class procedure GetAlarmParams(ATrigger: TDateTime; out AdvTime: Integer;
|
||||
out AdvTimeUnits: TVpAlarmAdvType);
|
||||
property Owner: TVpSchedule read FOwner;
|
||||
property ResourceID: Integer read FResourceID write FResourceID;
|
||||
property Loading : Boolean read FLoading write FLoading;
|
||||
@ -705,7 +709,7 @@ implementation
|
||||
|
||||
uses
|
||||
Math, DateUtils,
|
||||
VpException, VpConst, VpMisc, VpBaseDS;
|
||||
VpException, VpConst, VpMisc, VpBaseDS, VpICalPreview;
|
||||
|
||||
const
|
||||
TIME_EPS = 1.0 / SecondsInDay; // Epsilon for comparing times
|
||||
@ -1333,6 +1337,13 @@ begin
|
||||
Result := FOwner.Owner;
|
||||
end;
|
||||
|
||||
{ Returns whether the event specified by its start and end time is an all-day
|
||||
event. This is true when the time-part is zero in each case. }
|
||||
class function TVpEvent.IsAllDayEvent(AStartTime, AEndTime: TDateTime): Boolean;
|
||||
begin
|
||||
Result := (frac(AStartTime) = 0) and (frac(AEndTime) = 0);
|
||||
end;
|
||||
|
||||
{ The event is overlayed if its ResourceID is different from that of the
|
||||
resource to which it belongs. }
|
||||
function TVpEvent.IsOverlayed: Boolean;
|
||||
@ -1352,9 +1363,27 @@ begin
|
||||
Result := abs(d - round(d)) < Epsilon;
|
||||
end;
|
||||
|
||||
class procedure TVpEvent.GetAlarmParams(ATrigger: TDateTime; out AdvTime: Integer;
|
||||
out AdvTimeUnits: TVpAlarmAdvType);
|
||||
var
|
||||
dt: TDateTime;
|
||||
begin
|
||||
dt := abs(ATrigger);
|
||||
if IsInteger(dt, 1.0 / SecondsInDay) then begin
|
||||
AdvTimeUnits := atDays;
|
||||
AdvTime := round(dt);
|
||||
end else
|
||||
if IsInteger(dt*HoursInDay, HoursInDay / SecondsInDay) then begin
|
||||
AdvTimeUnits := atHours;
|
||||
AdvTime := round(dt * HoursInDay);
|
||||
end else begin
|
||||
AdvTimeUnits := atMinutes;
|
||||
AdvTime := round(dt * MinutesInDay);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TVpEvent.LoadFromICalendar(AEntry: TVpICalEvent);
|
||||
var
|
||||
dt: Double;
|
||||
cat: String;
|
||||
i, j, k: Integer;
|
||||
datastore: TVpCustomDatastore;
|
||||
@ -1392,23 +1421,12 @@ begin
|
||||
end;
|
||||
|
||||
{ All-day event }
|
||||
FAllDayEvent := (frac(FStartTime) = 0) and (frac(FEndTime) = 0);
|
||||
FAllDayEvent := TVpEvent.IsAllDayEvent(FStartTime, FEndTime);
|
||||
|
||||
{ Alarm properties }
|
||||
if AEntry.Alarm <> nil then begin
|
||||
FAlarmSet := true;
|
||||
dt := abs(AEntry.Alarm.Trigger);
|
||||
if IsInteger(dt, 1.0 / SecondsInDay) then begin
|
||||
FAlarmAdvType := atDays;
|
||||
FAlarmAdv := round(dt);
|
||||
end else
|
||||
if IsInteger(dt*HoursInDay, HoursInDay / SecondsInDay) then begin
|
||||
FAlarmAdvType := atHours;
|
||||
FAlarmAdv := round(dt * HoursInDay);
|
||||
end else begin
|
||||
FAlarmAdvType := atMinutes;
|
||||
FAlarmAdv := round(dt * MinutesInDay);
|
||||
end;
|
||||
GetAlarmParams(AEntry.Alarm.Trigger, FAlarmAdv, FAlarmAdvType);
|
||||
FDingPath := AEntry.Alarm.AudioSrc;
|
||||
if not FileExists(FDingPath) then FDingPath := '';
|
||||
end else
|
||||
@ -1723,7 +1741,7 @@ begin
|
||||
end;
|
||||
|
||||
function TVpSchedule.ImportICalFile(const AFileName: String;
|
||||
ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
APreview: Boolean = false; ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
const
|
||||
BLOCK_SIZE = 10;
|
||||
var
|
||||
@ -1734,18 +1752,31 @@ var
|
||||
event: TVpEvent;
|
||||
eventCounter: Integer;
|
||||
datastore: TVpCustomDatastore;
|
||||
previewForm: TVpIcalPreviewForm = nil;
|
||||
begin
|
||||
Result := nil;
|
||||
SetLength(Result, BLOCK_SIZE);
|
||||
eventCounter := 0;
|
||||
|
||||
datastore := Owner.Owner.Owner as TVpCustomDatastore;
|
||||
eventCounter := 0;
|
||||
|
||||
ical := TVpICalendar.Create;
|
||||
try
|
||||
ical.LoadFromFile(AFileName);
|
||||
if APreview then
|
||||
begin
|
||||
previewForm := TVpICalPreviewForm.Create(nil);
|
||||
previewForm.Position := poMainFormCenter;
|
||||
previewForm.Kind := icEvent;
|
||||
previewForm.Calendar := ical;
|
||||
previewForm.Datastore := datastore;
|
||||
if ADefaultCategory <> -1 then
|
||||
previewForm.DefaultCategory := datastore.CategoryColorMap.GetCategoryName(ADefaultCategory);
|
||||
if not previewForm.Execute then
|
||||
exit;
|
||||
end;
|
||||
|
||||
for i := 0 to ical.Count-1 do begin
|
||||
if not (ical[i] is TVpICalEvent) then
|
||||
if ical[i].Skip or (not (ical[i] is TVpICalEvent)) then
|
||||
Continue;
|
||||
startTime := TVpICalEvent(ical[i]).StartTime[false]; // use local times
|
||||
endTime := TVpICalEvent(ical[i]).EndTime[false];
|
||||
@ -1762,8 +1793,10 @@ begin
|
||||
if eventCounter mod BLOCK_SIZE = 0 then
|
||||
SetLength(Result, eventCounter + BLOCK_SIZE);
|
||||
end;
|
||||
SetLength(Result, eventCounter);
|
||||
finally
|
||||
SetLength(Result, eventCounter);
|
||||
if APreview then
|
||||
previewForm.Free;
|
||||
ical.Free;
|
||||
end;
|
||||
end;
|
||||
|
@ -447,7 +447,8 @@ type
|
||||
function BuildEventString(AEvent: TVpEvent; UseAsHint: Boolean): String;
|
||||
procedure DeleteActiveEvent(Verify: Boolean);
|
||||
procedure DragDrop(Source: TObject; X, Y: Integer); override;
|
||||
function ImportICalFile(const AFileName: String; ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
function ImportICalFile(const AFileName: String; APreview: Boolean = false;
|
||||
ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
procedure Invalidate; override;
|
||||
function IsHoliday(ADate: TDate; out AHolidayName: String): Boolean;
|
||||
procedure LoadLanguage;
|
||||
@ -1354,7 +1355,7 @@ begin
|
||||
try
|
||||
Application.ProcessMessages;
|
||||
for fn in dlg.Files do
|
||||
ImportICalFile(fn);
|
||||
ImportICalFile(fn, dlg.Files.Count = 1);
|
||||
finally
|
||||
Screen.Cursor := crDefault;
|
||||
end;
|
||||
@ -2381,16 +2382,14 @@ end;
|
||||
If you are not happy with this category replacement you can iterate over the
|
||||
Result array and change it. }
|
||||
function TVpDayView.ImportICalFile(const AFileName: String;
|
||||
ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
APreview: Boolean = false; ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
begin
|
||||
if ReadOnly or (not CheckCreateResource) or
|
||||
(not Assigned(DataStore)) or (not Assigned(DataStore.Resource))
|
||||
then
|
||||
Exit;
|
||||
Exit(nil);
|
||||
|
||||
Screen.Cursor := crHourglass;
|
||||
try
|
||||
Result := Datastore.Resource.Schedule.ImportICalFile(AFileName, ADefaultCategory);
|
||||
Result := Datastore.Resource.Schedule.ImportICalFile(AFileName, APreview, ADefaultCategory);
|
||||
if Length(Result) > 0 then
|
||||
begin
|
||||
FActiveEvent := Result[High(Result)];
|
||||
@ -2398,9 +2397,6 @@ begin
|
||||
Datastore.NotifyDependents;
|
||||
Invalidate;
|
||||
end;
|
||||
finally
|
||||
Screen.Cursor := crDefault;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TVpDayView.KeyDown(var Key: Word; Shift: TShiftState);
|
||||
|
@ -18,9 +18,11 @@ type
|
||||
TVpICalEntry = class(TVpFileBlock)
|
||||
private
|
||||
FCalendar: TVpICalendar;
|
||||
FSkip: Boolean;
|
||||
public
|
||||
constructor Create(ACalendar: TVpICalendar); virtual;
|
||||
function FindItem(AKey: String): TVpICalItem;
|
||||
property Skip: Boolean read FSkip write FSkip default false;
|
||||
end;
|
||||
|
||||
TVpICalTimeZoneInfo = class(TVpICalEntry)
|
||||
@ -73,6 +75,7 @@ type
|
||||
constructor Create(ACalendar: TVpICalendar); override;
|
||||
destructor Destroy; override;
|
||||
procedure Analyze; override;
|
||||
function Categories: TStrings;
|
||||
procedure UseAlarm;
|
||||
property Summary: String read FSummary; // is "Description" of tvp
|
||||
property Description: String read FDescription; // is "Notes" of tvp
|
||||
@ -389,6 +392,11 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TVpICalEvent.Categories: TStrings;
|
||||
begin
|
||||
Result := FCategories;
|
||||
end;
|
||||
|
||||
function TVpICalEvent.GetCategory(AIndex: Integer): String;
|
||||
begin
|
||||
if (AIndex >= 0) and (AIndex < FCategories.Count) then
|
||||
|
321
components/tvplanit/source/vpicalpreview.pas
Normal file
321
components/tvplanit/source/vpicalpreview.pas
Normal file
@ -0,0 +1,321 @@
|
||||
unit VpIcalPreview;
|
||||
|
||||
{$mode ObjFPC}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses LazLogger,
|
||||
Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
|
||||
Grids,
|
||||
VpData, VpIcal, VpBaseDS;
|
||||
|
||||
type
|
||||
|
||||
TVpIcalItemKind = (icEvent, icToDo);
|
||||
|
||||
{ TVpICalPreviewForm }
|
||||
|
||||
TVpICalPreviewForm = class(TForm)
|
||||
Button1: TButton;
|
||||
Button2: TButton;
|
||||
Panel1: TPanel;
|
||||
Grid: TDrawGrid;
|
||||
procedure GridDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect;
|
||||
aState: TGridDrawState);
|
||||
procedure GridGetCheckboxState(Sender: TObject; ACol, ARow: Integer;
|
||||
var Value: TCheckboxState);
|
||||
procedure GridPrepareCanvas(sender: TObject; aCol, aRow: Integer;
|
||||
aState: TGridDrawState);
|
||||
procedure GridSetCheckboxState(Sender: TObject; ACol, ARow: Integer;
|
||||
const Value: TCheckboxState);
|
||||
procedure SetCalendar(const AValue: TVpICalendar);
|
||||
procedure SetKind(const AValue: TVpICalItemKind);
|
||||
private
|
||||
FCalendar: TVpICalendar;
|
||||
FDatastore: TVpCustomDatastore;
|
||||
FDefaultCategory: String;
|
||||
FKind: TVpICalItemKind;
|
||||
FTimeFormat: String;
|
||||
FItems: TFPList;
|
||||
procedure CalcRowHeights;
|
||||
function GetCellText(ACol, ARow: Integer): String;
|
||||
function GetEventText(AEvent: TVpICalEvent): String;
|
||||
function GetToDoText(AToDo: TVpICalToDo): String;
|
||||
procedure PrepareItems;
|
||||
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
function Execute: Boolean;
|
||||
property Calendar: TVpICalendar read FCalendar write SetCalendar;
|
||||
property Datastore: TVpCustomDatastore read FDatastore write FDatastore;
|
||||
property DefaultCategory: String read FDefaultCategory write FDefaultCategory;
|
||||
property Kind: TVpICalItemKind read FKind write SetKind;
|
||||
|
||||
end;
|
||||
|
||||
var
|
||||
VpICalPreviewForm: TVpICalPreviewForm;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.lfm}
|
||||
|
||||
uses
|
||||
LCLIntf, LCLType, vpsr;
|
||||
|
||||
constructor TVpICalPreviewForm.Create(AOwner: TComponent);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
FItems := TFPList.Create;
|
||||
FTimeFormat := 'c'; // short date + long time format
|
||||
end;
|
||||
|
||||
destructor TVpICalPreviewForm.Destroy;
|
||||
begin
|
||||
FItems.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.CalcRowHeights;
|
||||
var
|
||||
bmp: TBitmap;
|
||||
row: Integer;
|
||||
R: TRect;
|
||||
flags: Integer;
|
||||
s: String;
|
||||
begin
|
||||
flags := DT_CALCRECT + DT_WORDBREAK;
|
||||
bmp := TBitmap.Create;
|
||||
try
|
||||
bmp.SetSize(1, 1);
|
||||
bmp.Canvas.Font := Grid.Font;
|
||||
for row := 1 to Grid.RowCount-1 do
|
||||
begin
|
||||
R := Rect(0, 0, MaxInt, 0);
|
||||
s := GetCellText(1, row);
|
||||
DrawText(bmp.Canvas.Handle, PChar(s), Length(s), R, flags);
|
||||
Grid.RowHeights[row] := R.Bottom - R.Top + 2*varCellPadding;
|
||||
end;
|
||||
finally
|
||||
bmp.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TVpICalPreviewForm.Execute: Boolean;
|
||||
begin
|
||||
Result := ShowModal = mrOK;
|
||||
end;
|
||||
|
||||
function TVpICalPreviewForm.GetCellText(ACol, ARow: Integer): String;
|
||||
var
|
||||
item: TVpICalEntry;
|
||||
begin
|
||||
Result := '';
|
||||
if ARow < Grid.FixedRows then
|
||||
exit;
|
||||
item := TVpICalEntry(FItems[ARow - Grid.FixedRows]);
|
||||
if item = nil then
|
||||
exit;
|
||||
case ACol of
|
||||
1: case Kind of
|
||||
icEvent: Result := GetEventText(TVpICalEvent(item));
|
||||
icToDo: Result := GetToDoText(TVpICalToDo(item));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TVpICalPreviewForm.GetEventText(AEvent: TVpICalEvent): String;
|
||||
var
|
||||
startTime, endTime: TDateTime;
|
||||
sStartTime, sEndTime: String;
|
||||
advTime: Integer;
|
||||
advTimeUnits: TVpAlarmAdvType;
|
||||
dingPath: String;
|
||||
s: String;
|
||||
cat: String;
|
||||
begin
|
||||
startTime := AEvent.StartTime[false];
|
||||
endTime := AEvent.EndTime[false];
|
||||
sStartTime := FormatDateTime(FTimeFormat, startTime);
|
||||
sEndTime := FormatDateTime(FTimeFormat, endTime);
|
||||
if TVpEvent.IsAllDayEvent(startTime, endTime) then
|
||||
begin
|
||||
if trunc(startTime) = trunc(endTime) then
|
||||
Result := Format('%s (%s)', [sStartTime, RSAllDay])
|
||||
else
|
||||
Result := Format('%s - %s (%s)', [sStartTime, sEndTime, RSAllDay]);
|
||||
end else
|
||||
Result :=
|
||||
RSStartTimeLbl + ' ' + sStartTime + LineEnding +
|
||||
RSEndTimeLbl + ' ' + sEndTime;
|
||||
|
||||
Result := Result + LineEnding +
|
||||
RSDescriptionLbl + ' ' + AEvent.Summary + LineEnding +
|
||||
RSCategoryLbl + ' ';
|
||||
|
||||
// Categories
|
||||
if Assigned(FDatastore) then
|
||||
begin
|
||||
cat := FDatastore.FindBestCategory(AEvent.Categories);
|
||||
if cat = '' then cat := FDefaultCategory;
|
||||
Result := Result + cat;
|
||||
end;
|
||||
|
||||
// Recurrence
|
||||
if AEvent.RecurrenceFrequency <> '' then
|
||||
begin
|
||||
s := '';
|
||||
case Uppercase(AEvent.RecurrenceFrequency) of
|
||||
'YEARLY':
|
||||
if AEvent.RecurrenceInterval in [0, 1] then
|
||||
s := Format(RSYearlyOn, [FormatDateTime('dd/mm',startTime)])
|
||||
else
|
||||
s := Format(RSEveryYearsOn, [AEvent.RecurrenceInterval, FormatDateTime('dd/mm', startTime)]);
|
||||
'MONTHLY':
|
||||
if AEvent.RecurrenceInterval in [0, 1] then
|
||||
s := Format(RSMonthlyOn, [FormatDateTime('d', startTime)])
|
||||
else
|
||||
s := Format(RSEveryMonthsOn, [AEvent.RecurrenceInterval, FormatDateTime('d', startTime)]);
|
||||
'WEEKLY':
|
||||
if AEvent.RecurrenceInterval in [0, 1] then
|
||||
s := Format(RSWeeklyOn, [FormatDateTime('dddd',startTime)])
|
||||
else
|
||||
s := Format(RSEveryWeeksOn, [AEvent.RecurrenceInterval, FormatDateTime('ddd', startTime)]);
|
||||
'DAILY':
|
||||
if AEvent.RecurrenceInterval in [0, 1] then
|
||||
s := RSDaily
|
||||
else
|
||||
s := Format(RSEveryDays, [AEvent.RecurrenceInterval]);
|
||||
end;
|
||||
if s <> '' then
|
||||
Result := Result + LineEnding + RSRepeat + ' ' + s;
|
||||
end;
|
||||
|
||||
// Alarm
|
||||
if AEvent.Alarm <> nil then
|
||||
begin
|
||||
TVpEvent.GetAlarmParams(AEvent.Alarm.Trigger, advTime, advTimeUnits);
|
||||
dingPath := AEvent.Alarm.AudioSrc;
|
||||
if advTime <> 1 then
|
||||
begin
|
||||
case advTimeUnits of
|
||||
atMinutes: s := Format(RSXMinutes, [advTime]);
|
||||
atHours: s := Format(RSXHours, [advTime]);
|
||||
atDays: s := Format(RSXDays, [advTime]);
|
||||
end;
|
||||
s := Format(RSAlarmIn, [s]);
|
||||
end else
|
||||
case advTimeUnits of
|
||||
atMinutes: s := Format(RSAlarmIn, [RS1Minute]);
|
||||
atHours: s := Format(RSAlarmIn, [RS1Hour]);
|
||||
atDays: s := Format(RSAlarmIn, [RS1Day]);
|
||||
end;
|
||||
Result := Result + LineEnding + s;
|
||||
if FileExists(dingPath) then
|
||||
Result := Format('%s, %s: %s', [Result, RSSound, dingPath]);
|
||||
end else
|
||||
Result := Result + LineEnding + RSNoAlarm;
|
||||
end;
|
||||
|
||||
function TVpICalPreviewForm.GetToDoText(AToDo: TVpICalToDo): String;
|
||||
begin
|
||||
Result := '';
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.GridDrawCell(Sender: TObject; aCol, aRow: Integer;
|
||||
aRect: TRect; aState: TGridDrawState);
|
||||
var
|
||||
s: String;
|
||||
R: TRect;
|
||||
begin
|
||||
R := ARect;
|
||||
InflateRect(R, -varCellPadding, - varCellPadding);
|
||||
s := GetCellText(ACol, ARow);
|
||||
Grid.Canvas.TextRect(R, R.Left, R.Top, s);
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.GridGetCheckboxState(Sender: TObject; ACol,
|
||||
ARow: Integer; var Value: TCheckboxState);
|
||||
var
|
||||
item: TVpICalEntry;
|
||||
begin
|
||||
if ARow < Grid.FixedRows then
|
||||
exit;
|
||||
item := TVpICalEntry(FItems[ARow - Grid.FixedRows]);
|
||||
if item = nil then
|
||||
exit;
|
||||
if item.Skip then
|
||||
Value := cbUnchecked
|
||||
else
|
||||
Value := cbChecked;
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.GridPrepareCanvas(sender: TObject; aCol,
|
||||
aRow: Integer; aState: TGridDrawState);
|
||||
var
|
||||
ts: TTextStyle;
|
||||
begin
|
||||
if ACol = 1 then
|
||||
begin
|
||||
ts := Grid.Canvas.TextStyle;
|
||||
ts.SingleLine := false;
|
||||
ts.Wordbreak := true;
|
||||
Grid.Canvas.TextStyle := ts;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.GridSetCheckboxState(Sender: TObject; ACol,
|
||||
ARow: Integer; const Value: TCheckboxState);
|
||||
var
|
||||
item: TVpICalEntry;
|
||||
begin
|
||||
if ARow < Grid.FixedRows then
|
||||
exit;
|
||||
item := TVpICalEntry(FItems[ARow - Grid.FixedRows]);
|
||||
if item = nil then
|
||||
exit;
|
||||
item.Skip := (Value <> cbChecked);
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.PrepareItems;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
FItems.Clear;
|
||||
if FCalendar <> nil then
|
||||
begin
|
||||
case FKind of
|
||||
icEvent:
|
||||
for i := 0 to FCalendar.Count-1 do
|
||||
if (FCalendar.Entry[i] is TVpICalEvent) then
|
||||
FItems.Add(FCalendar.Entry[i]);
|
||||
icToDo:
|
||||
for i := 0 to FCalendar.Count-1 do
|
||||
if (FCalendar.Entry[i] is TVpICalToDo) then
|
||||
FItems.Add(FCalendar.Entry[i]);
|
||||
end;
|
||||
Grid.RowCount := Grid.FixedRows + FItems.Count;
|
||||
CalcRowHeights;
|
||||
end else
|
||||
Grid.RowCount := Grid.FixedRows;
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.SetCalendar(const AValue: TVpICalendar);
|
||||
begin
|
||||
if AValue = FCalendar then
|
||||
exit;
|
||||
FCalendar := AValue;
|
||||
PrepareItems;
|
||||
end;
|
||||
|
||||
procedure TVpICalPreviewForm.SetKind(const AValue: TVpICalItemKind);
|
||||
begin
|
||||
if AValue = FKind then
|
||||
exit;
|
||||
FKind := AValue;
|
||||
PrepareItems;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
@ -272,7 +272,8 @@ type
|
||||
procedure LoadLanguage;
|
||||
procedure DeleteActiveEvent(Verify: Boolean);
|
||||
procedure DragDrop(Source: TObject; X, Y: Integer); override;
|
||||
function ImportICalFile(const AFileName: String; ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
function ImportICalFile(const AFileName: String; APreview: Boolean = false;
|
||||
ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
procedure Invalidate; override;
|
||||
function IsHoliday(ADate: TDate; out AHolidayName: String): Boolean;
|
||||
procedure LinkHandler(Sender: TComponent;
|
||||
@ -1092,16 +1093,14 @@ end;
|
||||
If you are not happy with this category replacement you can iterate over the
|
||||
Result array and change it. }
|
||||
function TVpWeekView.ImportICalFile(const AFileName: String;
|
||||
ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
APreview: Boolean = false; ADefaultCategory: Integer = -1): TVpEventArr;
|
||||
begin
|
||||
if ReadOnly or (not CheckCreateResource) or
|
||||
(not Assigned(DataStore)) or (not Assigned(DataStore.Resource))
|
||||
then
|
||||
Exit;
|
||||
Exit(nil);
|
||||
|
||||
Screen.Cursor := crHourglass;
|
||||
try
|
||||
Result := Datastore.Resource.Schedule.ImportICalFile(AFileName, ADefaultCategory);
|
||||
Result := Datastore.Resource.Schedule.ImportICalFile(AFileName, APreview, ADefaultCategory);
|
||||
if Length(Result) > 0 then
|
||||
begin
|
||||
FActiveEvent := Result[High(Result)];
|
||||
@ -1109,9 +1108,6 @@ begin
|
||||
Datastore.NotifyDependents;
|
||||
Invalidate;
|
||||
end;
|
||||
finally
|
||||
Screen.Cursor := crDefault;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
@ -1339,7 +1335,7 @@ begin
|
||||
try
|
||||
Application.ProcessMessages;
|
||||
for fn in dlg.Files do
|
||||
ImportICalFile(fn);
|
||||
ImportICalFile(fn, dlg.Files.Count = 1);
|
||||
finally
|
||||
Screen.Cursor := crDefault;
|
||||
end;
|
||||
|
Reference in New Issue
Block a user