tvplanit: Import event category from ical file.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6501 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2018-06-16 23:07:26 +00:00
parent 774f30a257
commit 5706fa833b
4 changed files with 105 additions and 14 deletions

View File

@ -241,9 +241,12 @@ type
public
constructor Create(AOwner: TComponent);
destructor Destroy; override;
function GetColor(Index: Integer): TColor;
function GetName(Index: Integer):string;
function GetColor(AIndex: Integer): TColor;
function GetName(AIndex: Integer):string;
function GetCategory(AIndex: Integer): TVpCategoryInfo;
function IndexOfCategory(AName: String): Integer;
function IndexOfFirstUnusedCategory: Integer;
procedure SetCategoryName(AIndex: Integer; AName: String);
published
property Category0: TVpCategoryInfo index 0 read GetCategory write SetCat;
property Category1: TVpCategoryInfo index 1 read GetCategory write SetCat;
@ -713,7 +716,7 @@ var
begin
inherited Create;
FOwner := AOwner;
for i:=0 to High(FCat) do
for i:=Low(FCat) to High(FCat) do
begin
FCat[i] := TVpCategoryInfo.Create(FOwner);
FCat[i].FIndex := i;
@ -726,7 +729,7 @@ destructor TVpCategoryColorMap.Destroy;
var
i: Integer;
begin
for i:=0 to High(FCat) do FCat[i].Free;
for i:=Low(FCat) to High(FCat) do FCat[i].Free;
inherited;
end;
@ -735,18 +738,42 @@ begin
Result := FCat[AIndex];
end;
function TVpCategoryColorMap.GetColor(Index: Integer): TColor;
function TVpCategoryColorMap.IndexOfCategory(AName: String): Integer;
var
i: Integer;
begin
if Index <= High(FCat) then
Result := FCat[Index].Color
for i:=Low(FCat) to High(FCat) do
if SameText(FCat[i].Description, AName) then begin
Result := i;
exit;
end;
Result := -1;
end;
function TVpCategoryColorMap.IndexOfFirstUnusedCategory: Integer;
var
i: Integer;
begin
for i := Low(FCat) to High(FCat) do
if FCat[i].Description = Format(RSCategoryDesc, [i]) then begin
Result := i;
exit;
end;
Result := -1;
end;
function TVpCategoryColorMap.GetColor(AIndex: Integer): TColor;
begin
if (AIndex >= Low(FCat)) and (AIndex <= High(FCat)) then
Result := FCat[AIndex].Color
else
Result := clBlack;
end;
function TVpCategoryColorMap.GetName(Index: Integer): string;
function TVpCategoryColorMap.GetName(AIndex: Integer): string;
begin
if Index <= High(FCat) then
Result := FCat[Index].Description
if (AIndex >= Low(FCat)) and (AIndex <= High(FCat)) then
Result := FCat[AIndex].Description
else
Result := '';
end;
@ -756,6 +783,11 @@ begin
FCat[AIndex] := AValue;
end;
procedure TVpCategoryColorMap.SetCategoryName(AIndex: Integer; AName: String);
begin
if (AIndex >= Low(FCat)) and (AIndex <= High(FCat)) then
FCat[AIndex].Description := AName;
end;
(*****************************************************************************)
{ TVpCategoryInfo }

View File

@ -233,7 +233,7 @@ type
FResource : TVpResource;
dsAlertTimer : TTimer; { fires the alerts }
FNotifiers : TList;
FLinkedOwner: TComponent;
FLinkedOwner : TComponent;
{events}
FOnConnect : TNotifyEvent;

View File

@ -77,7 +77,7 @@ type
TVpResources = class
private
FOwner: TObject;
FOwner: TObject; // This is the Datastore.
FResourceGroups: TList;
function GetCount: Integer;
function GetItem(Index: Integer): TVpResource;
@ -695,7 +695,7 @@ implementation
uses
Math, DateUtils,
VpException, VpConst, VpMisc;
VpException, VpConst, VpMisc, VpBaseDS;
const
TIME_EPS = 1.0 / SecondsInDay; // Epsilon for comparing times
@ -1269,6 +1269,9 @@ end;
procedure TVpEvent.LoadFromICalendar(AEntry: TVpICalEvent);
var
dt: Double;
cat: String;
i, j, k: Integer;
datastore: TVpCustomDatastore;
begin
if AEntry = nil then
exit;
@ -1279,6 +1282,30 @@ begin
FLocation := AEntry.Location;
// Start and end time already have been set --> Skip .
{ Category }
{ tvplanit has only 1 category, ical may have several. We pick the first one
defined in the datastore. If none is defined we create the first one. }
if AEntry.CategoryCount > 0 then begin
datastore := TVpCustomDatastore(Owner.Owner.Owner.Owner);
k := -1;
for i := 0 to AEntry.CategoryCount-1 do begin
cat := AEntry.category[i];
j := datastore.CategoryColorMap.IndexOfCategory(cat);
if j <> -1 then begin
k := j;
break;
end;
end;
if k = -1 then begin // category not found in data store
k := datastore.CategoryColorMap.IndexOfFirstUnusedCategory;
if k <> -1 then
datastore.CategoryColorMap.SetCategoryName(k, AEntry.Category[0]);
end;
if k <> -1 then
FCategory := k;
end;
{ All-day event }
FAllDayEvent := (frac(FStartTime) = 0) and (frac(FEndTime) = 0);

View File

@ -19,7 +19,7 @@ type
private
FCalendar: TVpICalendar;
public
constructor Create(ACalendar: TVpICalendar);
constructor Create(ACalendar: TVpICalendar); virtual;
function FindItem(AKey: String): TVpICalItem;
end;
@ -46,6 +46,8 @@ type
property AudioSrc: String read FAudioSrc;
end;
{ TVpICalEvent }
TVpICalEvent = class(TVpICalEntry)
private
FSummary: String; // --> Description
@ -62,9 +64,13 @@ type
FRecurrenceCount: Integer;
FRecurrenceByXXX: String;
FAlarm: TVpICalAlarm;
FCategories: TStrings;
function GetCategory(AIndex: Integer): String;
function GetCategoryCount: Integer;
function GetEndTime(UTC: Boolean): TDateTime;
function GetStartTime(UTC: Boolean): TDateTime;
public
constructor Create(ACalendar: TVpICalendar); override;
destructor Destroy; override;
procedure Analyze; override;
procedure UseAlarm;
@ -73,6 +79,8 @@ type
property Location: String read FLocation;
property StartTime[UTC: Boolean]: TDateTime read GetStartTime;
property EndTime[UTC: Boolean]: TDateTime read GetEndTime;
property Category[AIndex: Integer]: String read GetCategory;
property CategoryCount: Integer read GetCategoryCount;
property Alarm: TVpICalAlarm read FAlarm;
property RecurrenceFrequency: String read FRecurrenceFreq;
property RecurrenceInterval: Integer read FRecurrenceInterval;
@ -287,8 +295,17 @@ end;
{ TVpICalEvent }
{==============================================================================}
constructor TVpICalEvent.Create(ACalendar: TVpICalendar);
begin
inherited;
FCategories := TStringList.Create;
FCategories.Delimiter := VALUE_DELIMITER;
FCategories.StrictDelimiter := True;
end;
destructor TVpICalEvent.Destroy;
begin
FCategories.Free;
FAlarm.Free;
inherited;
end;
@ -328,6 +345,8 @@ begin
FLocation := item.Value;
'DURATION':
FDuration := ICalDuration(item.Value);
'CATEGORIES':
FCategories.DelimitedText := item.Value;
'RRULE':
begin
L := TStringList.Create;
@ -354,6 +373,19 @@ begin
end;
end;
function TVpICalEvent.GetCategory(AIndex: Integer): String;
begin
if (AIndex >= 0) and (AIndex < FCategories.Count) then
Result := FCategories[AIndex]
else
Result := '';
end;
function TVpICalEvent.GetCategoryCount: Integer;
begin
Result := FCategories.Count;
end;
function TVpICalEvent.GetEndTime(UTC: Boolean): TDateTime;
begin
if FEndTime <> 0 then