TvPlanIt: Fix ical import (issue #39047)

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8643 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-12-11 13:08:39 +00:00
parent 68e8dba861
commit deede7b752
11 changed files with 117 additions and 92 deletions

View File

@ -471,13 +471,16 @@ msgid "Edit shape"
msgstr "Form bearbeiten"
#: vpsr.rselementalreadyexists
#, object-pascal-format
#, object-pascal-format,fuzzy
#| msgid ""
#| "An element named %s already exists.\n"
#| "Please use a different name.\n"
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
"Ein Element mit Namen %s existiert bereits.\n"
"Bitte einen anderen Namen verwenden."
"Bitte einen anderen Namen verwenden.\n"
#: vpsr.rselements
msgid "Elements:"
@ -1128,13 +1131,16 @@ msgid "&Print"
msgstr "&Drucken"
#: vpsr.rsprintformatalreadyexists
#, object-pascal-format
#, object-pascal-format,fuzzy
#| msgid ""
#| "A print template named %s already exists.\n"
#| "Please use a different name.\n"
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
"Eine Druckvorlage mit Namen %s existiert bereits.\n"
"Bitte einen anderen Namen verwenden."
"Bitte einen anderen Namen verwenden.\n"
#: vpsr.rsprintformatdesigner
msgid "Print template designer"
@ -1144,7 +1150,7 @@ msgstr "Druckvorlagen-Designer"
msgid "Print order"
msgstr ""
"Druck-\n"
"Reihenfolge"
"Reihenfolge\n"
#: vpsr.rsprintprvcancel
msgctxt "vpsr.rsprintprvcancel"
@ -1858,3 +1864,4 @@ msgstr "Unbekannte Achsen-Spezifikation: %s"
#: vpsr.sxmldecnotatbeg
msgid "The XML declaration must appear before the first element"
msgstr "Die XML-Deklaration muss vor dem ersten Element erscheinen"

View File

@ -466,13 +466,16 @@ msgid "Edit shape"
msgstr "Edit shape"
#: vpsr.rselementalreadyexists
#, object-pascal-format
#, object-pascal-format,fuzzy
#| msgid ""
#| "An element named %s already exists.\n"
#| "Please use a different name.\n"
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
#: vpsr.rselements
msgid "Elements:"
@ -1115,13 +1118,16 @@ msgid "&Print"
msgstr "&Print"
#: vpsr.rsprintformatalreadyexists
#, object-pascal-format
#, object-pascal-format,fuzzy
#| msgid ""
#| "A print template named %s already exists.\n"
#| "Please use a different name.\n"
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
#: vpsr.rsprintformatdesigner
msgid "Print template designer"
@ -1838,3 +1844,4 @@ msgstr "Unknown axis specifier: %s"
#: vpsr.sxmldecnotatbeg
msgid "The XML declaration must appear before the first element"
msgstr "The XML declaration must appear before the first element"

View File

@ -464,7 +464,7 @@ msgstr ""
#, object-pascal-format
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rselements
@ -1122,7 +1122,7 @@ msgstr ""
#, object-pascal-format
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rsprintformatdesigner

View File

@ -484,7 +484,7 @@ msgstr ""
#, object-pascal-format
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rselements
@ -1139,7 +1139,7 @@ msgstr "&Imprimer"
#, object-pascal-format
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rsprintformatdesigner

View File

@ -478,7 +478,7 @@ msgstr ""
#, object-pascal-format
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rselements
@ -1133,7 +1133,7 @@ msgstr "&Printen"
#, object-pascal-format
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rsprintformatdesigner

View File

@ -480,7 +480,7 @@ msgstr "Edycja kształtu"
#, object-pascal-format
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rselements
@ -1143,7 +1143,7 @@ msgstr "&Drukuj"
#, object-pascal-format
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rsprintformatdesigner

View File

@ -480,7 +480,7 @@ msgstr ""
#, object-pascal-format
msgid ""
"An element named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rselements
@ -1139,7 +1139,7 @@ msgstr "Печать"
#, object-pascal-format
msgid ""
"A print template named %s already exists.\n"
"Please use a different name."
"Please use a different name.\n"
msgstr ""
#: vpsr.rsprintformatdesigner

View File

@ -245,6 +245,7 @@ type
function GetEvent(Index: Integer): TVpEvent;
function ImportICalFile(const AFileName: String; APreview: Boolean = false;
ADefaultCategory: Integer = -1): TVpEventArr;
function IsEventOfThisDate(ADate: TDateTime; AEvent: TVpEvent): Boolean;
function RepeatsOn(Event: TVpEvent; Day: TDateTime): Boolean;
procedure Sort;
property Owner: TVpResource read FOwner;
@ -1927,6 +1928,9 @@ begin
if (not ical[i].Checked) or (not (ical[i] is TVpICalEvent)) then
Continue;
startTime := TVpICalEvent(ical[i]).StartTime[false]; // use local times
if TVpICalEvent(ical[i]).IsAllDayEvent then
endTime := trunc(startTime) + 1 - OneSecond
else
endTime := TVpICalEvent(ical[i]).EndTime[false];
if startTime = NO_DATE then
continue;
@ -2048,16 +2052,11 @@ var
I: Integer;
Event: TVpEvent;
begin
result := 0;
Result := 0;
for I := 0 to pred(EventCount) do begin
Event := GetEvent(I);
// If this is a repeating event and it falls on today then inc result
if (Event.RepeatCode > rtNone) and RepeatsOn(Event, Value) then
Inc(Result)
// Otherwise if it is an event that naturally falls on today, then inc result
else
if DateInRange(Value, Event.StartTime, Event.EndTime, true) then
Inc(Result);
if IsEventOfThisDate(Value, Event) then
inc(Result);
end;
end;
@ -2068,18 +2067,13 @@ var
begin
if EventCountByDay(Date) = 0 then
EventList.Clear
else begin
// Add this day's events to the Event List.
for I := 0 to pred(EventCount) do begin
Event := GetEvent(I);
// If this is a repeating event and it falls on "Date" then add it to the list.
if (Event.RepeatCode > rtNone) and RepeatsOn(Event, Date) then
EventList.Add(Event)
else
// otherwise if this event naturally falls on "Date" then add it to the list.
if DateInRange(Date, Event.StartTime, Event.EndTime, true) then
begin
// Add this day's events to the Event List.
for I := 0 to pred(EventCount) do
begin
Event := GetEvent(I);
if IsEventOfThisDate(Date, Event) then
EventList.Add(Event);
end;
end;
@ -2190,6 +2184,20 @@ begin
result := FEventList.Count;
end;
function TVpSchedule.IsEventOfThisDate(ADate: TDateTime; AEvent: TVpEvent): Boolean;
begin
Result := false;
// Is is a non-repeating event that naturally falls on the given day?
if (AEvent.RepeatCode = rtNone) then
begin
if (AEvent.EndTime <> FOREVER_DATE) and DateInRange(ADate, AEvent.Starttime, AEvent.EndTime, true) then
Result := true;
end else
// Is it a repeating event that falls on the given day?
if RepeatsOn(AEvent, ADate) then
Result := true;
end;
(*****************************************************************************)
{ TVpContact }

View File

@ -588,7 +588,7 @@ begin
lValue := 'FREQ=' + RecurrenceFrequency;
if RecurrenceInterval > 0 then
lValue := lValue + ';INTERVAL=' + IntToStr(RecurrenceInterval);
if RecurrenceEndDate <> 0 then
if (RecurrenceEndDate <> 0) and (RecurrenceEndDate <> FOREVER_DATE) then
lValue := lValue + ';UNTIL=' + FormatDateTime(TIME_FORMAT, RecurrenceEndDate);
if RecurrenceCount > 0 then
lValue := lValue + ';COUNT=' + IntToStr(RecurrenceCount);

View File

@ -335,6 +335,7 @@ begin
L.AddField('AlarmAdvanceType', GetEnumName(TypeInfo(TVpAlarmAdvType), ord(AEvent.AlarmAdvanceType)));
L.AddDateTimeField('SnoozeTime', AEvent.SnoozeTime, 'tt'); // long time format
L.AddField('RepeatCode', GetEnumName(TypeInfo(TVpRepeatType), ord(AEvent.RepeatCode)));
if (AEvent.RepeatRangeEnd <> 0) and (AEvent.RepeatRangeEnd <> FOREVER_DATE) then
L.AddDateTimeField('RepeatRangeEnd', AEvent.RepeatRangeEnd, 'ddddd'); // short date format
L.AddField('CustomInterval', IntToStr(AEvent.CustomInterval));
L.AddField('UserField0', AEvent.UserField0); // 15
@ -802,7 +803,8 @@ begin
AEvent.SnoozeTime := StrToTime(L.Extract(11));
AEvent.RepeatCode := TVpRepeatType(GetEnumValue(TypeInfo(TVpRepeatType), L.Extract(12)));
if L[13] = '' then
AEvent.RepeatRangeEnd := 0 else
AEvent.RepeatRangeEnd := FOREVER_DATE
else
AEvent.RepeatRangeEnd := StrToDate(L.Extract(13), FFormatSettings);
AEvent.CustomInterval := StrToInt(L.Extract(14));
AEvent.UserField0 := L.Extract(15);

View File

@ -294,15 +294,16 @@ begin
DrawDayHeader(ADayIndex, holiday, TextRect);
if (FWeekView.DataStore <> nil) and (FWeekView.DataStore.Resource <> nil) and
(FWeekView.DataStore.Resource.Schedule.EventCountByDay(StartDate + ADayIndex) > 0) and
// (FWeekView.DataStore.Resource.Schedule.EventCountByDay(StartDate + ADayIndex) > 0) and
(HeightOf(DayRect) >= FWeekView.TextMargin * 2 + FDayHeadHeight)
then begin
// Events exist for this day
// EventList is supposesd to collect the events for the day handled in this procedure
EventList := TList.Create;
try
// Populate the event list with events for this day
FWeekView.DataStore.Resource.Schedule.EventsByDate(StartDate + ADayIndex, EventList);
if EventList.Count > 0 then
begin
{ Now sort times in ascending order. This must be done because the event
list can contain recurring events which have the wrong date part }
EventList.Sort(CompareEventsByTimeOnly);
@ -350,7 +351,7 @@ begin
TextRect.Top := TextRect.Bottom;
TextRect.Bottom := TextRect.Top + rowHeight;
end; { for loop }
end;
finally
EventList.Free;
end;