mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-17 14:45:55 +02:00
896 lines
24 KiB
ObjectPascal
896 lines
24 KiB
ObjectPascal
unit IpHtmlProp;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Types, Contnrs, AVL_Tree,
|
|
Graphics,
|
|
IpConst, IpUtils, IpHtmlTypes;
|
|
|
|
type
|
|
TIpHtmlElemMargin = record
|
|
Style: TIpHtmlElemMarginStyle;
|
|
Size: single; // negative values are not yet supported
|
|
end;
|
|
|
|
PIpHtmlPropAFieldsRec = ^TIpHtmlPropAFieldsRec;
|
|
TIpHtmlPropAFieldsRec = packed record
|
|
BaseFontSize: Integer;
|
|
FontSize: Integer;
|
|
FontName: string;
|
|
FontStyle: TFontStyles;
|
|
end;
|
|
|
|
PIpHtmlPropBFieldsRec = ^TIpHtmlPropBFieldsRec;
|
|
TIpHtmlPropBFieldsRec = packed record
|
|
FontBaseline: Integer;
|
|
FontColor: TColor;
|
|
LinkColor : TColor;
|
|
VLinkColor : TColor;
|
|
ALinkColor : TColor;
|
|
HoverColor : TColor;
|
|
HoverBgColor : TColor;
|
|
BgColor : TColor;
|
|
Alignment: TIpHtmlAlign;
|
|
VAlignment: TIpHtmlVAlign3;
|
|
Preformatted : Boolean;
|
|
NoBreak : Boolean;
|
|
ElemMarginTop: TIpHtmlElemMargin;
|
|
ElemMarginLeft: TIpHtmlElemMargin;
|
|
ElemMarginBottom: TIpHtmlElemMargin;
|
|
ElemMarginRight: TIpHtmlElemMargin;
|
|
end;
|
|
|
|
TIpHtmlPropBase = class;
|
|
|
|
{ TObjectAVLTree }
|
|
|
|
// This container owns its objects. They are freed at the end.
|
|
TObjectAVLTree = class(TAVLTree)
|
|
public
|
|
destructor Destroy; override;
|
|
function Add(AProp: TIpHtmlPropBase): TAVLTreeNode;
|
|
function Remove(AProp: TIpHtmlPropBase): Boolean;
|
|
end;
|
|
|
|
{ TIpHtmlPropBase }
|
|
|
|
TIpHtmlPropBase = class
|
|
private
|
|
FOwner: TObjectAVLTree;
|
|
FUseCount: Integer;
|
|
public
|
|
constructor Create(AOwner: TObjectAVLTree);
|
|
end;
|
|
|
|
{ TIpHtmlPropA }
|
|
|
|
{display properties that affect the font size}
|
|
TIpHtmlPropA = class(TIpHtmlPropBase)
|
|
private
|
|
FPropRec : TIpHtmlPropAFieldsRec;
|
|
FKnownSizeOfSpace: TSize;
|
|
FSizeOfSpaceKnown : Boolean;
|
|
procedure SetBaseFontSize(const Value: Integer);
|
|
procedure SetFontName(const Value: string);
|
|
procedure SetFontSize(const Value: Integer);
|
|
procedure SetFontStyle(const Value: TFontStyles);
|
|
public
|
|
KnownSizeOfHyphen : TSize;
|
|
tmAscent, tmDescent, tmHeight : Integer;
|
|
procedure Assign(const Source: TIpHtmlPropA);
|
|
procedure DecUse;
|
|
procedure IncUse;
|
|
procedure SetKnownSizeOfSpace(const Size:TSize);
|
|
public
|
|
property SizeOfSpaceKnown: Boolean read FSizeOfSpaceKnown;
|
|
property KnownSizeOfSpace : TSize read FKnownSizeOfSpace;
|
|
property BaseFontSize : Integer read FPropRec.BaseFontSize write SetBaseFontSize;
|
|
property FontName : string read FPropRec.FontName write SetFontName;
|
|
property FontSize : Integer read FPropRec.FontSize write SetFontSize;
|
|
property FontStyle : TFontStyles read FPropRec.FontStyle write SetFontStyle;
|
|
end;
|
|
|
|
{ TIpHtmlPropB }
|
|
|
|
{display properties that don't affect the font size}
|
|
TIpHtmlPropB = class(TIpHtmlPropBase)
|
|
private
|
|
FPropRec : TIpHtmlPropBFieldsRec;
|
|
public
|
|
constructor Create(AOwner: TObjectAVLTree);
|
|
procedure Assign(const Source: TIpHtmlPropB);
|
|
procedure DecUse;
|
|
procedure IncUse;
|
|
public
|
|
property FontBaseline : Integer read FPropRec.FontBaseline write FPropRec.FontBaseline;
|
|
property FontColor : TColor read FPropRec.FontColor write FPropRec.FontColor;
|
|
property Alignment : TIpHtmlAlign read FPropRec.Alignment write FPropRec.Alignment;
|
|
property VAlignment : TIpHtmlVAlign3 read FPropRec.VAlignment write FPropRec.VAlignment;
|
|
property LinkColor : TColor read FPropRec.LinkColor write FPropRec.LinkColor;
|
|
property VLinkColor : TColor read FPropRec.VLinkColor write FPropRec.VLinkColor;
|
|
property ALinkColor : TColor read FPropRec.ALinkColor write FPropRec.ALinkColor;
|
|
property HoverColor : TColor read FPropRec.HoverColor write FPropRec.HoverColor;
|
|
property HoverBgColor : TColor read FPropRec.HoverBgColor write FPropRec.HoverBgColor;
|
|
property BgColor : TColor read FPropRec.BgColor write FPropRec.BgColor;
|
|
property Preformatted : Boolean read FPropRec.Preformatted write FPropRec.Preformatted;
|
|
property NoBreak : Boolean read FPropRec.NoBreak write FPropRec.NoBreak;
|
|
property ElemMarginTop: TIpHtmlElemMargin read FPropRec.ElemMarginTop write FPropRec.ElemMarginTop;
|
|
property ElemMarginLeft: TIpHtmlElemMargin read FPropRec.ElemMarginLeft write FPropRec.ElemMarginLeft;
|
|
property ElemMarginBottom: TIpHtmlElemMargin read FPropRec.ElemMarginBottom write FPropRec.ElemMarginBottom;
|
|
property ElemMarginRight: TIpHtmlElemMargin read FPropRec.ElemMarginRight write FPropRec.ElemMarginRight;
|
|
end;
|
|
|
|
{ TIpHtmlPropsAList }
|
|
|
|
TIpHtmlPropsAList = class(TObjectAVLTree)
|
|
private
|
|
FDummyA : TIpHtmlPropA;
|
|
public
|
|
constructor Create;
|
|
function FindPropARec(pRec: PIpHtmlPropAFieldsRec): TIpHtmlPropA;
|
|
procedure ResetCache;
|
|
end;
|
|
|
|
{ TIpHtmlPropsBList }
|
|
|
|
TIpHtmlPropsBList = class(TObjectAVLTree)
|
|
private
|
|
FDummyB : TIpHtmlPropB;
|
|
public
|
|
constructor Create;
|
|
function FindPropBRec(pRec: PIpHtmlPropBFieldsRec): TIpHtmlPropB;
|
|
end;
|
|
|
|
{ TIpHtmlProps }
|
|
|
|
TIpHtmlProps = class
|
|
{-class for holding the currently active style attributes}
|
|
private
|
|
FPropsACache: TIpHtmlPropsAList;
|
|
FPropsBCache: TIpHtmlPropsBList;
|
|
FPropA : TIpHtmlPropA;
|
|
FPropB : TIpHtmlPropB;
|
|
FDelayCache: integer;
|
|
function GetAlignment: TIpHtmlAlign;
|
|
function GetALinkColor: TColor;
|
|
function GetBaseFontSize: Integer;
|
|
function GetBgColor: TColor;
|
|
function GetElemMarginBottom: TIpHtmlElemMargin;
|
|
function GetElemMarginLeft: TIpHtmlElemMargin;
|
|
function GetElemMarginRight: TIpHtmlElemMargin;
|
|
function GetElemMarginTop: TIpHtmlElemMargin;
|
|
function GetFontBaseline: Integer;
|
|
function GetFontColor: TColor;
|
|
function GetFontName: string;
|
|
function GetFontSize: Integer;
|
|
function GetFontStyle: TFontStyles;
|
|
function GetLinkColor: TColor;
|
|
function GetPreformatted: Boolean;
|
|
function GetVAlignment: TIpHtmlVAlign3;
|
|
function GetVLinkColor: TColor;
|
|
function GetHoverColor: TColor;
|
|
function GetHoverBgColor: TColor;
|
|
procedure SetAlignment(const Value: TIpHtmlAlign);
|
|
procedure SetALinkColor(const Value: TColor);
|
|
procedure SetBaseFontSize(const Value: Integer);
|
|
procedure SetBgColor(const Value: TColor);
|
|
procedure SetElemMarginBottom(const AValue: TIpHtmlElemMargin);
|
|
procedure SetElemMarginLeft(const AValue: TIpHtmlElemMargin);
|
|
procedure SetElemMarginRight(const AValue: TIpHtmlElemMargin);
|
|
procedure SetElemMarginTop(const AValue: TIpHtmlElemMargin);
|
|
procedure SetFontBaseline(const Value: Integer);
|
|
procedure SetFontColor(const Value: TColor);
|
|
procedure SetFontName(const Value: string);
|
|
procedure SetFontSize(const Value: Integer);
|
|
procedure SetFontStyle(const Value: TFontStyles);
|
|
procedure SetLinkColor(const Value: TColor);
|
|
procedure SetPreformatted(const Value: Boolean);
|
|
procedure SetVAlignment(const Value: TIpHtmlVAlign3);
|
|
procedure SetVLinkColor(const Value: TColor);
|
|
procedure SetHoverColor(const Value: TColor);
|
|
procedure SetHoverBgColor(const Value: TColor);
|
|
function GetNoBreak: Boolean;
|
|
procedure SetNoBreak(const Value: Boolean);
|
|
procedure CopyPropARecTo(pRec: PIpHtmlPropAFieldsRec);
|
|
procedure CopyPropBRecTo(pRec: PIpHtmlPropBFieldsRec);
|
|
procedure FindOrCreatePropA(pRec: PIpHtmlPropAFieldsRec);
|
|
procedure FindOrCreatePropB(pRec: PIpHtmlPropBFieldsRec);
|
|
procedure SetDelayCache(b: boolean);
|
|
function getDelayCache: boolean;
|
|
protected
|
|
public
|
|
constructor Create(APropsAList: TIpHtmlPropsAList; APropsBList: TIpHtmlPropsBList);
|
|
destructor Destroy; override;
|
|
procedure Assign(Source : TIpHtmlProps);
|
|
procedure CommitCache;
|
|
function IsEqualTo(Compare: TIpHtmlProps): Boolean;
|
|
function AIsEqualTo(Compare: TIpHtmlProps): Boolean;
|
|
function BIsEqualTo(Compare: TIpHtmlProps): Boolean;
|
|
property BaseFontSize : Integer read GetBaseFontSize write SetBaseFontSize;
|
|
property FontName : string read GetFontName write SetFontName;
|
|
property FontSize : Integer read GetFontSize write SetFontSize;
|
|
property FontBaseline : Integer read GetFontBaseline write SetFontBaseline;
|
|
property FontStyle : TFontStyles read GetFontStyle write SetFontStyle;
|
|
property FontColor : TColor read GetFontColor write SetFontColor;
|
|
property Alignment : TIpHtmlAlign read GetAlignment write SetAlignment;
|
|
property VAlignment : TIpHtmlVAlign3 read GetVAlignment write SetVAlignment;
|
|
property LinkColor : TColor read GetLinkColor write SetLinkColor;
|
|
property VLinkColor : TColor read GetVLinkColor write SetVLinkColor;
|
|
property ALinkColor : TColor read GetALinkColor write SetALinkColor;
|
|
property HoverColor : TColor read GetHoverColor write SetHoverColor;
|
|
property HoverBgColor : TColor read GetHoverBgColor write SetHoverBgColor;
|
|
property BgColor : TColor read GetBgColor write SetBgColor;
|
|
property Preformatted : Boolean read GetPreformatted write SetPreformatted;
|
|
property NoBreak : Boolean read GetNoBreak write SetNoBreak;
|
|
property ElemMarginTop: TIpHtmlElemMargin read GetElemMarginTop write SetElemMarginTop;
|
|
property ElemMarginLeft: TIpHtmlElemMargin read GetElemMarginLeft write SetElemMarginLeft;
|
|
property ElemMarginBottom: TIpHtmlElemMargin read GetElemMarginBottom write SetElemMarginBottom;
|
|
property ElemMarginRight: TIpHtmlElemMargin read GetElemMarginRight write SetElemMarginRight;
|
|
public
|
|
property PropA: TIpHtmlPropA read FPropA;
|
|
property PropB: TIpHtmlPropB read FPropB;
|
|
property DelayCache : Boolean read getDelayCache write setDelayCache;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
function AreHtmlMarginsEqual(Margin1, Margin2: TIpHtmlElemMargin): boolean;
|
|
begin
|
|
Result:=(Margin1.Style=Margin2.Style) and (Margin1.Size=Margin2.Size);
|
|
end;
|
|
|
|
{ TObjectAVLTree }
|
|
|
|
destructor TObjectAVLTree.Destroy;
|
|
var
|
|
Enumerator: TAVLTreeNodeEnumerator;
|
|
begin
|
|
Enumerator := GetEnumerator;
|
|
while Enumerator.MoveNext do
|
|
TObject(Enumerator.Current.Data).Free;
|
|
Enumerator.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
function TObjectAVLTree.Add(AProp: TIpHtmlPropBase): TAVLTreeNode;
|
|
begin
|
|
AProp.FUseCount := 1; // Initial count. Will not be disposed so quickly.
|
|
Result := inherited Add(AProp);
|
|
end;
|
|
|
|
function TObjectAVLTree.Remove(AProp: TIpHtmlPropBase): Boolean;
|
|
begin
|
|
Result := inherited Remove(AProp);
|
|
if Result then
|
|
AProp.Free;
|
|
end;
|
|
|
|
{ TIpHtmlPropBase }
|
|
|
|
constructor TIpHtmlPropBase.Create(AOwner: TObjectAVLTree);
|
|
begin
|
|
inherited Create;
|
|
FOwner := AOwner;
|
|
end;
|
|
|
|
{ TIpHtmlPropA }
|
|
|
|
procedure TIpHtmlPropA.Assign(const Source: TIpHtmlPropA);
|
|
begin
|
|
if Source <> nil then
|
|
Move(Source.FPropRec, FPropRec, sizeof(TIpHtmlPropAFieldsRec));
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.DecUse;
|
|
begin
|
|
if FUseCount > 0 then
|
|
Dec(FUseCount);
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.IncUse;
|
|
begin
|
|
Inc(FUseCount);
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.SetBaseFontSize(const Value: Integer);
|
|
begin
|
|
if Value <> FPropRec.BaseFontSize then begin
|
|
FPropRec.BaseFontSize := Value;
|
|
FSizeOfSpaceKnown := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.SetFontName(const Value: string);
|
|
begin
|
|
if Value <> FPropRec.FontName then begin
|
|
FPropRec.FontName := Value;
|
|
FSizeOfSpaceKnown := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.SetFontSize(const Value: Integer);
|
|
begin
|
|
if Value <> FPropRec.FontSize then begin
|
|
FPropRec.FontSize := Value;
|
|
FSizeOfSpaceKnown := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.SetFontStyle(const Value: TFontStyles);
|
|
begin
|
|
if Value <> FPropRec.FontStyle then begin
|
|
FPropRec.FontStyle := Value;
|
|
FSizeOfSpaceKnown := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlPropA.SetKnownSizeOfSpace(const Size: TSize);
|
|
begin
|
|
FKnownSizeOfSpace := Size;
|
|
FSizeOfSpaceKnown := True;
|
|
end;
|
|
|
|
{ TIpHtmlPropB }
|
|
|
|
constructor TIpHtmlPropB.Create(AOwner: TObjectAVLTree);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FPropRec.BgColor := clNone;
|
|
FPropRec.HoverColor := clNone;
|
|
FPropRec.HoverBgColor := clNone;
|
|
end;
|
|
|
|
procedure TIpHtmlPropB.Assign(const Source: TIpHtmlPropB);
|
|
begin
|
|
if Source <> nil then
|
|
FPropRec := Source.FPropRec;
|
|
end;
|
|
|
|
procedure TIpHtmlPropB.DecUse;
|
|
begin
|
|
Dec(FUseCount);
|
|
if FUseCount < 0 then
|
|
raise EIpHtmlException.Create(SHtmlInternal)
|
|
else if FUseCount = 0 then
|
|
if not FOwner.Remove(Self) then
|
|
raise EIpHtmlException.Create(SHtmlInternal);
|
|
end;
|
|
|
|
procedure TIpHtmlPropB.IncUse;
|
|
begin
|
|
Inc(FUseCount);
|
|
end;
|
|
|
|
{ TIpHtmlPropsAList }
|
|
|
|
function ComparePropARec(Prop1, Prop2: PIpHtmlPropAFieldsRec): integer;
|
|
begin
|
|
Result := Prop1^.BaseFontSize - Prop2^.BaseFontSize;
|
|
if Result <> 0 then Exit;
|
|
Result := Prop1^.FontSize - Prop2^.FontSize;
|
|
if Result <> 0 then Exit;
|
|
Result := LongWord(Prop1^.FontStyle) - LongWord(Prop2^.FontStyle);
|
|
if Result <> 0 then Exit;
|
|
Result := CompareStr(Prop1^.FontName, Prop2^.FontName);
|
|
end;
|
|
|
|
function ComparePropAFields(Data1, Data2: Pointer): integer;
|
|
begin
|
|
Result := ComparePropARec(@TIpHtmlPropA(Data1).FPropRec, @TIpHtmlPropA(Data2).FPropRec);
|
|
end;
|
|
|
|
function CompareKeyPropA(Key, Data: Pointer): integer;
|
|
begin
|
|
Result := ComparePropARec(PIpHtmlPropAFieldsRec(Key), @TIpHtmlPropA(Data).FPropRec);
|
|
end;
|
|
|
|
constructor TIpHtmlPropsAList.Create;
|
|
begin
|
|
inherited Create(@ComparePropAFields);
|
|
FDummyA := TIpHtmlPropA.Create(Self);
|
|
Add(FDummyA);
|
|
end;
|
|
|
|
function TIpHtmlPropsAList.FindPropARec(pRec: PIpHtmlPropAFieldsRec): TIpHtmlPropA;
|
|
var
|
|
Node: TAVLTreeNode;
|
|
begin
|
|
Node := FindKey(pRec, @CompareKeyPropA);
|
|
if Assigned(Node) then
|
|
Result := TIpHtmlPropA(Node.Data)
|
|
else
|
|
Result := Nil;
|
|
end;
|
|
|
|
procedure TIpHtmlPropsAList.ResetCache;
|
|
var
|
|
Enumerator: TAVLTreeNodeEnumerator;
|
|
Prop: TIpHtmlPropA;
|
|
begin
|
|
Enumerator := GetEnumerator;
|
|
while Enumerator.MoveNext do begin
|
|
Prop := TIpHtmlPropA(Enumerator.Current.Data);
|
|
Prop.FSizeOfSpaceKnown := False;
|
|
Prop.tmHeight := 0;
|
|
end;
|
|
Enumerator.Free;
|
|
end;
|
|
|
|
{ TIpHtmlPropsBList }
|
|
|
|
function ComparePropBFields(Data1, Data2: Pointer): integer;
|
|
begin
|
|
Result := CompareByte(TIpHtmlPropB(Data1).FPropRec,
|
|
TIpHtmlPropB(Data2).FPropRec, SizeOf(TIpHtmlPropBFieldsRec));
|
|
end;
|
|
|
|
function CompareKeyPropB(Key, Data: Pointer): integer;
|
|
begin
|
|
Result := CompareByte(Key^, TIpHtmlPropB(Data).FPropRec, SizeOf(TIpHtmlPropBFieldsRec));
|
|
end;
|
|
|
|
constructor TIpHtmlPropsBList.Create;
|
|
begin
|
|
inherited Create(@ComparePropBFields);
|
|
FDummyB := TIpHtmlPropB.Create(Self);
|
|
Add(FDummyB);
|
|
end;
|
|
|
|
function TIpHtmlPropsBList.FindPropBRec(pRec: PIpHtmlPropBFieldsRec): TIpHtmlPropB;
|
|
var
|
|
Node: TAVLTreeNode;
|
|
begin
|
|
Node := FindKey(pRec, @CompareKeyPropB);
|
|
if Assigned(Node) then
|
|
Result := TIpHtmlPropB(Node.Data)
|
|
else
|
|
Result := Nil;
|
|
end;
|
|
|
|
{ TIpHtmlProps }
|
|
|
|
constructor TIpHtmlProps.Create(APropsAList: TIpHtmlPropsAList; APropsBList: TIpHtmlPropsBList);
|
|
begin
|
|
inherited Create;
|
|
FPropsACache := APropsAList;
|
|
FPropsBCache := APropsBList;
|
|
FPropA := FPropsACache.FDummyA;
|
|
FPropA.IncUse;
|
|
FPropB := FPropsBCache.FDummyB;
|
|
FPropB.IncUse;
|
|
//BgColor := clNone;
|
|
end;
|
|
|
|
destructor TIpHtmlProps.Destroy;
|
|
begin
|
|
FPropA.DecUse;
|
|
FPropB.DecUse;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.Assign(Source: TIpHtmlProps);
|
|
begin
|
|
if FPropA <> Source.FPropA then begin
|
|
FPropA.DecUse;
|
|
FPropA := Source.FPropA;
|
|
FPropA.IncUse;
|
|
end;
|
|
if FPropB <> Source.FPropB then begin
|
|
FPropB.DecUse;
|
|
FPropB := Source.FPropB;
|
|
FPropB.IncUse;
|
|
end;
|
|
end;
|
|
|
|
function TIpHtmlProps.AIsEqualTo(Compare: TIpHtmlProps): Boolean;
|
|
begin
|
|
Result := (FPropA = Compare.FPropA);
|
|
end;
|
|
|
|
function TIpHtmlProps.BIsEqualTo(Compare: TIpHtmlProps): Boolean;
|
|
begin
|
|
Result := (FPropB = Compare.FPropB);
|
|
end;
|
|
|
|
function TIpHtmlProps.IsEqualTo(Compare: TIpHtmlProps): Boolean;
|
|
begin
|
|
Result := (FPropA = Compare.FPropA) and (FPropB = Compare.FPropB);
|
|
end;
|
|
|
|
function TIpHtmlProps.GetAlignment: TIpHtmlAlign;
|
|
begin
|
|
Result := FPropB.Alignment;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetALinkColor: TColor;
|
|
begin
|
|
Result := FPropB.ALinkColor;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetBaseFontSize: Integer;
|
|
begin
|
|
Result := FPropA.BaseFontSize;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetBgColor: TColor;
|
|
begin
|
|
Result := FPropB.BgColor;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetElemMarginBottom: TIpHtmlElemMargin;
|
|
begin
|
|
Result:=FPropB.ElemMarginBottom;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetElemMarginLeft: TIpHtmlElemMargin;
|
|
begin
|
|
Result:=FPropB.ElemMarginLeft;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetElemMarginRight: TIpHtmlElemMargin;
|
|
begin
|
|
Result:=FPropB.ElemMarginRight;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetElemMarginTop: TIpHtmlElemMargin;
|
|
begin
|
|
Result:=FPropB.ElemMarginTop;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetFontBaseline: Integer;
|
|
begin
|
|
Result := FPropB.FontBaseline;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetFontColor: TColor;
|
|
begin
|
|
Result := FPropB.FontColor;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetFontName: string;
|
|
begin
|
|
Result := FPropA.FontName;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetFontSize: Integer;
|
|
begin
|
|
Result := FPropA.FontSize;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetFontStyle: TFontStyles;
|
|
begin
|
|
Result := FPropA.FontStyle;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetLinkColor: TColor;
|
|
begin
|
|
Result := FPropB.LinkColor;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetNoBreak: Boolean;
|
|
begin
|
|
Result := FPropB.NoBreak;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetPreformatted: Boolean;
|
|
begin
|
|
Result := FPropB.Preformatted;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetVAlignment: TIpHtmlVAlign3;
|
|
begin
|
|
Result := FPropB.VAlignment;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetVLinkColor: TColor;
|
|
begin
|
|
Result := FPropB.VLinkColor;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetHoverColor: TColor;
|
|
begin
|
|
Result := FPropB.HoverColor;
|
|
end;
|
|
|
|
function TIpHtmlProps.GetHoverBgColor: TColor;
|
|
begin
|
|
Result := FPropB.HoverBgColor;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.CommitCache;
|
|
begin
|
|
if FDelayCache > 0 then
|
|
begin
|
|
FDelayCache := 1;
|
|
SetDelayCache(false);
|
|
end;
|
|
end;
|
|
|
|
function TIpHtmlProps.getDelayCache: boolean;
|
|
begin
|
|
result := FDelayCache > 0;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetDelayCache(b: boolean);
|
|
begin
|
|
if b then
|
|
Inc(FDelayCache)
|
|
else if FDelayCache > 0 then
|
|
Dec(FDelayCache);
|
|
end;
|
|
|
|
procedure TIpHtmlProps.CopyPropARecTo(pRec: PIpHtmlPropAFieldsRec);
|
|
begin
|
|
pRec^.BaseFontSize := FPropA.FPropRec.BaseFontSize;
|
|
pRec^.FontSize := FPropA.FPropRec.FontSize;
|
|
pRec^.FontStyle := FPropA.FPropRec.FontStyle;
|
|
pRec^.FontName := FPropA.FPropRec.FontName;
|
|
// Cannot use Move() because of a reference counted string.
|
|
//Move(FPropA.FPropRec, pRec^, sizeof(TIpHtmlPropAFieldsRec))
|
|
end;
|
|
|
|
procedure TIpHtmlProps.CopyPropBRecTo(pRec: PIpHtmlPropBFieldsRec);
|
|
begin
|
|
Move(FPropB.FPropRec, pRec^, sizeof(TIpHtmlPropBFieldsRec))
|
|
end;
|
|
|
|
procedure TIpHtmlProps.FindOrCreatePropA(pRec: PIpHtmlPropAFieldsRec);
|
|
var
|
|
NewPropA : TIpHtmlPropA;
|
|
begin
|
|
NewPropA := FPropsACache.FindPropARec(pRec);
|
|
if NewPropA = nil then begin
|
|
NewPropA := TIpHtmlPropA.Create(FPropsACache);
|
|
NewPropA.FPropRec.BaseFontSize := pRec^.BaseFontSize;
|
|
NewPropA.FPropRec.FontSize := pRec^.FontSize;
|
|
NewPropA.FPropRec.FontStyle := pRec^.FontStyle;
|
|
NewPropA.FPropRec.FontName := pRec^.FontName; // Reference counted string.
|
|
FPropsACache.Add(NewPropA);
|
|
end;
|
|
NewPropA.IncUse;
|
|
FPropA.DecUse;
|
|
FPropA := NewPropA;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.FindOrCreatePropB(pRec: PIpHtmlPropBFieldsRec);
|
|
var
|
|
NewPropB : TIpHtmlPropB;
|
|
begin
|
|
NewPropB := FPropsBCache.FindPropBRec(pRec);
|
|
if NewPropB = nil then begin
|
|
NewPropB := TIpHtmlPropB.Create(FPropsBCache);
|
|
Move(pRec^, NewPropB.FPropRec, sizeof(TIpHtmlPropBFieldsRec));
|
|
FPropsBCache.Add(NewPropB);
|
|
end;
|
|
NewPropB.IncUse;
|
|
FPropB.DecUse;
|
|
FPropB := NewPropB;
|
|
end;
|
|
|
|
// For TIpHtmlPropAFieldsRec
|
|
|
|
procedure TIpHtmlProps.SetBaseFontSize(const Value: Integer);
|
|
var
|
|
Rec : TIpHtmlPropAFieldsRec;
|
|
begin
|
|
if Value <> BaseFontSize then begin
|
|
CopyPropARecTo(@Rec);
|
|
Rec.BaseFontSize:=Value;
|
|
FindOrCreatePropA(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetFontName(const Value: string);
|
|
var
|
|
Rec : TIpHtmlPropAFieldsRec;
|
|
begin
|
|
if Value <> FontName then begin
|
|
CopyPropARecTo(@Rec);
|
|
Rec.FontName:=Value;
|
|
FindOrCreatePropA(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetFontSize(const Value: Integer);
|
|
var
|
|
Rec : TIpHtmlPropAFieldsRec;
|
|
begin
|
|
if Value <> FontSize then begin
|
|
CopyPropARecTo(@Rec);
|
|
Rec.FontSize:=Value;
|
|
FindOrCreatePropA(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetFontStyle(const Value: TFontStyles);
|
|
var
|
|
Rec : TIpHtmlPropAFieldsRec;
|
|
begin
|
|
if Value <> FontStyle then begin
|
|
CopyPropARecTo(@Rec);
|
|
Rec.FontStyle:=Value;
|
|
FindOrCreatePropA(@Rec);
|
|
end;
|
|
end;
|
|
|
|
// For TIpHtmlPropBFieldsRec
|
|
|
|
procedure TIpHtmlProps.SetAlignment(const Value: TIpHtmlAlign);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if (Value <> haDefault) and (Value <> Alignment) then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.Alignment:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetALinkColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> ALinkColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.ALinkColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetBgColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> BgColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.BgColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetFontBaseline(const Value: Integer);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> FontBaseline then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.FontBaseline:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetFontColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> FontColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.FontColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetLinkColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> LinkColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.LinkColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetElemMarginBottom(const AValue: TIpHtmlElemMargin);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if AreHtmlMarginsEqual(AValue,ElemMarginBottom) then exit;
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.ElemMarginBottom:=AValue;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetElemMarginLeft(const AValue: TIpHtmlElemMargin);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if AreHtmlMarginsEqual(AValue,ElemMarginLeft) then exit;
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.ElemMarginLeft:=AValue;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetElemMarginRight(const AValue: TIpHtmlElemMargin);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if AreHtmlMarginsEqual(AValue,ElemMarginRight) then exit;
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.ElemMarginRight:=AValue;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetElemMarginTop(const AValue: TIpHtmlElemMargin);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if AreHtmlMarginsEqual(AValue,ElemMarginTop) then exit;
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.ElemMarginTop:=AValue;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetNoBreak(const Value: Boolean);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> NoBreak then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.NoBreak:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetPreformatted(const Value: Boolean);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> Preformatted then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.Preformatted:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetVAlignment(const Value: TIpHtmlVAlign3);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> VAlignment then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.VAlignment:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetVLinkColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> VLinkColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.VLinkColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetHoverColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> HoverColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.HoverColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlProps.SetHoverBgColor(const Value: TColor);
|
|
var
|
|
Rec : TIpHtmlPropBFieldsRec;
|
|
begin
|
|
if Value <> HoverBgColor then begin
|
|
CopyPropBRecTo(@Rec);
|
|
Rec.HoverBgColor:=Value;
|
|
FindOrCreatePropB(@Rec);
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|