mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 10:19:52 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			916 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			916 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
unit iphtmlprop;
 | 
						|
 | 
						|
{$mode objfpc}{$H+}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Classes, SysUtils, types, contnrs, Graphics,
 | 
						|
  IpConst, IpUtils;
 | 
						|
 | 
						|
type
 | 
						|
 | 
						|
  TIpHtmlAlign = (haDefault, haLeft, haCenter, haRight, haJustify, haChar, haUnknown);
 | 
						|
  TIpHtmlVAlign = (hvaTop, hvaMiddle, hvaBottom);
 | 
						|
  TIpHtmlVAlign3 = (hva3Top, hva3Middle, hva3Bottom, hva3Baseline, hva3Default);
 | 
						|
 | 
						|
  TIpHtmlElemMarginStyle = (
 | 
						|
    hemsAuto, // use default
 | 
						|
    hemsPx    // pixel
 | 
						|
    );
 | 
						|
 | 
						|
  TIpHtmlElemMargin = record
 | 
						|
    Style: TIpHtmlElemMarginStyle;
 | 
						|
    Size: single; // negative values are not yet supported
 | 
						|
  end;
 | 
						|
 | 
						|
  TFontNameStr = string[50];
 | 
						|
  TIpHtmlPropAFieldsRec = record
 | 
						|
    BaseFontSize: Integer;
 | 
						|
    FontSize: Integer;
 | 
						|
    FontStyle: TFontStyles;
 | 
						|
    FontName: TFontNameStr;
 | 
						|
  end;
 | 
						|
 | 
						|
  TIpHtmlPropBFieldsRec = record
 | 
						|
    FontBaseline: Integer;
 | 
						|
    Alignment: TIpHtmlAlign;
 | 
						|
    FontColor: TColor;
 | 
						|
    VAlignment: TIpHtmlVAlign3;
 | 
						|
    LinkColor : TColor;
 | 
						|
    VLinkColor : TColor;
 | 
						|
    ALinkColor : TColor;
 | 
						|
    HoverColor : TColor;
 | 
						|
    HoverBgColor : TColor;
 | 
						|
    BgColor : TColor;
 | 
						|
    Preformatted : Boolean;
 | 
						|
    NoBreak : Boolean;
 | 
						|
    ElemMarginTop: TIpHtmlElemMargin;
 | 
						|
    ElemMarginLeft: TIpHtmlElemMargin;
 | 
						|
    ElemMarginBottom: TIpHtmlElemMargin;
 | 
						|
    ElemMarginRight: TIpHtmlElemMargin;
 | 
						|
  end;
 | 
						|
 | 
						|
  TIpHtmlPropsAList = class;
 | 
						|
 | 
						|
  { TIpHtmlPropA }
 | 
						|
 | 
						|
  {display properties that affect the font size}
 | 
						|
  TIpHtmlPropA = class
 | 
						|
  private
 | 
						|
    FOwner: TIpHtmlPropsAList;
 | 
						|
    FPropRec : TIpHtmlPropAFieldsRec;
 | 
						|
    FUseCount: Integer;
 | 
						|
    FKnownSizeOfSpace: TSize;
 | 
						|
    FSizeOfSpaceKnown : Boolean;
 | 
						|
    procedure SetBaseFontSize(const Value: Integer);
 | 
						|
    procedure SetFontName(const Value: TFontNameStr);
 | 
						|
    procedure SetFontSize(const Value: Integer);
 | 
						|
    procedure SetFontStyle(const Value: TFontStyles);
 | 
						|
  public
 | 
						|
    KnownSizeOfHyphen : TSize;
 | 
						|
    tmAscent, tmDescent, tmHeight : Integer;
 | 
						|
    constructor Create(AOwner: TIpHtmlPropsAList);
 | 
						|
    destructor Destroy; override;
 | 
						|
    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 : TFontNameStr read FPropRec.FontName write SetFontName;
 | 
						|
    property FontSize : Integer read FPropRec.FontSize write SetFontSize;
 | 
						|
    property FontStyle : TFontStyles read FPropRec.FontStyle write SetFontStyle;
 | 
						|
    property UseCount : Integer read FUseCount write FUseCount;
 | 
						|
  end;
 | 
						|
 | 
						|
  TIpHtmlPropsBList = class;
 | 
						|
 | 
						|
  { TIpHtmlPropB }
 | 
						|
 | 
						|
  {display properties that don't affect the font size}
 | 
						|
  TIpHtmlPropB = class
 | 
						|
  private
 | 
						|
    FOwner: TIpHtmlPropsBList;
 | 
						|
    FPropRec : TIpHtmlPropBFieldsRec;
 | 
						|
    FUseCount: Integer;
 | 
						|
  public
 | 
						|
    constructor Create(AOwner: TIpHtmlPropsBList);
 | 
						|
    destructor Destroy; override;
 | 
						|
    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;
 | 
						|
    property UseCount : Integer read FUseCount write FUseCount;
 | 
						|
  end;
 | 
						|
 | 
						|
  { TIpHtmlProps }
 | 
						|
 | 
						|
  TIpHtmlProps = class
 | 
						|
  {-class for holding the currently active style attributes}
 | 
						|
  private
 | 
						|
    FPropsACache: TIpHtmlPropsAList;
 | 
						|
    FPropsBCache: TIpHtmlPropsBList;
 | 
						|
    FPropA : TIpHtmlPropA;
 | 
						|
    FPropB : TIpHtmlPropB;
 | 
						|
    FDelayCache: integer;
 | 
						|
    FDirtyA, FDirtyB: Boolean;
 | 
						|
    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(var pRec: TIpHtmlPropAFieldsRec);
 | 
						|
    procedure CopyPropBRecTo(var pRec: TIpHtmlPropBFieldsRec);
 | 
						|
    procedure CopyPropARecFrom(var pRec: TIpHtmlPropAFieldsRec);
 | 
						|
    procedure CopyPropBRecFrom(var pRec: TIpHtmlPropBFieldsRec);
 | 
						|
    procedure FindOrCreatePropA(var pRec: TIpHtmlPropAFieldsRec);
 | 
						|
    procedure FindOrCreatePropB(var pRec: TIpHtmlPropBFieldsRec);
 | 
						|
    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;
 | 
						|
 | 
						|
  { TIpHtmlPropsAList and TIpHtmlPropsBList }
 | 
						|
 | 
						|
  TIpHtmlPropsAList = class(TObjectList)
 | 
						|
  private
 | 
						|
    FDummyA : TIpHtmlPropA;
 | 
						|
    function GetItem(Index: Integer): TIpHtmlPropA;
 | 
						|
    procedure SetItem(Index: Integer; AValue: TIpHtmlPropA);
 | 
						|
  public
 | 
						|
    constructor Create;
 | 
						|
    destructor Destroy; override;
 | 
						|
    function FindPropARec(var pRec: TIpHtmlPropAFieldsRec): TIpHtmlPropA;
 | 
						|
    procedure ResetCache;
 | 
						|
    property Items[Index: Integer]: TIpHtmlPropA read GetItem write SetItem; default;
 | 
						|
  end;
 | 
						|
 | 
						|
  TIpHtmlPropsBList = class(TObjectList)
 | 
						|
  private
 | 
						|
    FDummyB : TIpHtmlPropB;
 | 
						|
    function GetItem(Index: Integer): TIpHtmlPropB;
 | 
						|
    procedure SetItem(Index: Integer; AValue: TIpHtmlPropB);
 | 
						|
  public
 | 
						|
    constructor Create;
 | 
						|
    destructor Destroy; override;
 | 
						|
    function FindPropBRec(var pRec: TIpHtmlPropBFieldsRec): TIpHtmlPropB;
 | 
						|
    property Items[Index: Integer]: TIpHtmlPropB read GetItem write SetItem; default;
 | 
						|
  end;
 | 
						|
 | 
						|
 | 
						|
implementation
 | 
						|
 | 
						|
function AreHtmlMarginsEqual(Margin1, Margin2: TIpHtmlElemMargin): boolean;
 | 
						|
begin
 | 
						|
  Result:=(Margin1.Style=Margin2.Style) and (Margin1.Size=Margin2.Size);
 | 
						|
end;
 | 
						|
 | 
						|
{ TIpHtmlPropA }
 | 
						|
 | 
						|
constructor TIpHtmlPropA.Create(AOwner: TIpHtmlPropsAList);
 | 
						|
begin
 | 
						|
  inherited Create;
 | 
						|
  FOwner := AOwner;
 | 
						|
end;
 | 
						|
 | 
						|
destructor TIpHtmlPropA.Destroy;
 | 
						|
begin
 | 
						|
  inherited Destroy;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropA.Assign(const Source: TIpHtmlPropA);
 | 
						|
begin
 | 
						|
  if Source <> nil then begin
 | 
						|
    Move(Source.FPropRec, FPropRec, sizeof(TIpHtmlPropAFieldsRec));
 | 
						|
  end;
 | 
						|
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: TFontNameStr);
 | 
						|
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: TIpHtmlPropsBList);
 | 
						|
begin
 | 
						|
  inherited Create;
 | 
						|
  FOwner := AOwner;
 | 
						|
  FPropRec.HoverColor := -1;
 | 
						|
  FPropRec.HoverBgColor := -1;
 | 
						|
end;
 | 
						|
 | 
						|
destructor TIpHtmlPropB.Destroy;
 | 
						|
begin
 | 
						|
  inherited Destroy;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropB.Assign(const Source: TIpHtmlPropB);
 | 
						|
begin
 | 
						|
  if Source <> nil then
 | 
						|
    FPropRec := Source.FPropRec;
 | 
						|
    //Move(Source.FPropRec, FPropRec, sizeof(TIpHtmlPropBFieldsRec));
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropB.DecUse;
 | 
						|
begin
 | 
						|
  Dec(FUseCount);
 | 
						|
  if FUseCount < 0 then
 | 
						|
    raise EIpHtmlException.Create(SHtmlInternal)
 | 
						|
  else if FUseCount = 0 then
 | 
						|
    if FOwner.Remove(Self) = -1 then
 | 
						|
      raise EIpHtmlException.Create(SHtmlInternal);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropB.IncUse;
 | 
						|
begin
 | 
						|
  Inc(FUseCount);
 | 
						|
end;
 | 
						|
 | 
						|
{ TIpHtmlProps }
 | 
						|
 | 
						|
constructor TIpHtmlProps.Create(APropsAList: TIpHtmlPropsAList; APropsBList: TIpHtmlPropsBList);
 | 
						|
begin
 | 
						|
  FPropsACache := APropsAList;
 | 
						|
  FPropsBCache := APropsBList;
 | 
						|
  FPropA := FPropsACache.FDummyA;
 | 
						|
  FPropA.IncUse;
 | 
						|
  FPropB := FPropsBCache.FDummyB;
 | 
						|
  FPropB.IncUse;
 | 
						|
  //BgColor := -1;
 | 
						|
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);
 | 
						|
 | 
						|
  if (not b) and (FDelayCache = 0) then
 | 
						|
  begin
 | 
						|
      if FDirtyA then
 | 
						|
      begin
 | 
						|
        //Finish/Commit transaction
 | 
						|
        FDirtyA := False;
 | 
						|
      end;
 | 
						|
      if FDirtyB then
 | 
						|
      begin
 | 
						|
        //Finish/Commit transaction
 | 
						|
        FDirtyB := False;
 | 
						|
      end;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.CopyPropARecTo(var pRec: TIpHtmlPropAFieldsRec);
 | 
						|
begin
 | 
						|
    Move(FPropA.FPropRec, pRec, sizeof(TIpHtmlPropAFieldsRec))
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.CopyPropBRecTo(var pRec: TIpHtmlPropBFieldsRec);
 | 
						|
begin
 | 
						|
    Move(FPropB.FPropRec, pRec, sizeof(TIpHtmlPropBFieldsRec))
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.CopyPropARecFrom(var pRec: TIpHtmlPropAFieldsRec);
 | 
						|
begin
 | 
						|
    Move(pRec, FPropA.FPropRec, sizeof(TIpHtmlPropAFieldsRec));
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.CopyPropBRecFrom(var pRec: TIpHtmlPropBFieldsRec);
 | 
						|
begin
 | 
						|
    Move(pRec, FPropB.FPropRec, sizeof(TIpHtmlPropBFieldsRec));
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.FindOrCreatePropA(var pRec: TIpHtmlPropAFieldsRec);
 | 
						|
var
 | 
						|
  NewPropA : TIpHtmlPropA;
 | 
						|
begin
 | 
						|
  if FDirtyA then
 | 
						|
    // we are in a transaction updating a new unique entry
 | 
						|
    CopyPropARecFrom(pRec)
 | 
						|
  else
 | 
						|
  begin
 | 
						|
    NewPropA := FPropsACache.FindPropARec(pRec);
 | 
						|
    if NewPropA = nil then begin
 | 
						|
      NewPropA := TIpHtmlPropA.Create(FPropsACache);
 | 
						|
      Move(pRec, NewPropA.FPropRec, sizeof(TIpHtmlPropAFieldsRec));
 | 
						|
      //Start Transaction if DelayCache is set
 | 
						|
      if DelayCache then FDirtyA := True;
 | 
						|
      FPropsACache.Add(NewPropA);
 | 
						|
    end;
 | 
						|
    NewPropA.IncUse;
 | 
						|
    FPropA.DecUse;
 | 
						|
    FPropA := NewPropA;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.FindOrCreatePropB(var pRec: TIpHtmlPropBFieldsRec);
 | 
						|
var
 | 
						|
  NewPropB : TIpHtmlPropB;
 | 
						|
begin
 | 
						|
  if FDirtyB then
 | 
						|
    //we are in a transaction updating a new unique entry
 | 
						|
    CopyPropBRecFrom(pRec)
 | 
						|
  else
 | 
						|
  begin
 | 
						|
    NewPropB := FPropsBCache.FindPropBRec(pRec);
 | 
						|
    if NewPropB = nil then begin
 | 
						|
      NewPropB := TIpHtmlPropB.Create(FPropsBCache);
 | 
						|
      Move(pRec, NewPropB.FPropRec, sizeof(TIpHtmlPropBFieldsRec));
 | 
						|
      //Start Transaction if DelayCache is set
 | 
						|
      if DelayCache then FDirtyB := True;
 | 
						|
      FPropsBCache.Add(NewPropB);
 | 
						|
    end;
 | 
						|
    NewPropB.IncUse;
 | 
						|
    FPropB.DecUse;
 | 
						|
    FPropB := NewPropB;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetAlignment(const Value: TIpHtmlAlign);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if (Value <> haDefault) and (Value <> Alignment) then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.Alignment:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetALinkColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> ALinkColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.ALinkColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetBaseFontSize(const Value: Integer);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropAFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> BaseFontSize then begin
 | 
						|
    CopyPropARecTo(pRec);
 | 
						|
    pRec.BaseFontSize:=Value;
 | 
						|
    FindOrCreatePropA(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetBgColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> BgColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.BgColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetFontBaseline(const Value: Integer);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> FontBaseline then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.FontBaseline:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetFontColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> FontColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.FontColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetFontName(const Value: string);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropAFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> FontName then begin
 | 
						|
    CopyPropARecTo(pRec);
 | 
						|
    pRec.FontName:=Value;
 | 
						|
    FindOrCreatePropA(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetFontSize(const Value: Integer);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropAFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> FontSize then begin
 | 
						|
    CopyPropARecTo(pRec);
 | 
						|
    pRec.FontSize:=Value;
 | 
						|
    FindOrCreatePropA(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetFontStyle(const Value: TFontStyles);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropAFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> FontStyle then begin
 | 
						|
    CopyPropARecTo(pRec);
 | 
						|
    pRec.FontStyle:=Value;
 | 
						|
    FindOrCreatePropA(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetLinkColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> LinkColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.LinkColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetElemMarginBottom(const AValue: TIpHtmlElemMargin);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if AreHtmlMarginsEqual(AValue,ElemMarginBottom) then exit;
 | 
						|
  CopyPropBRecTo(pRec);
 | 
						|
  pRec.ElemMarginBottom:=AValue;
 | 
						|
  FindOrCreatePropB(pRec);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetElemMarginLeft(const AValue: TIpHtmlElemMargin);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if AreHtmlMarginsEqual(AValue,ElemMarginLeft) then exit;
 | 
						|
  CopyPropBRecTo(pRec);
 | 
						|
  pRec.ElemMarginLeft:=AValue;
 | 
						|
  FindOrCreatePropB(pRec);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetElemMarginRight(const AValue: TIpHtmlElemMargin);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if AreHtmlMarginsEqual(AValue,ElemMarginRight) then exit;
 | 
						|
  CopyPropBRecTo(pRec);
 | 
						|
  pRec.ElemMarginRight:=AValue;
 | 
						|
  FindOrCreatePropB(pRec);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetElemMarginTop(const AValue: TIpHtmlElemMargin);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if AreHtmlMarginsEqual(AValue,ElemMarginTop) then exit;
 | 
						|
  CopyPropBRecTo(pRec);
 | 
						|
  pRec.ElemMarginTop:=AValue;
 | 
						|
  FindOrCreatePropB(pRec);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetNoBreak(const Value: Boolean);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> NoBreak then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.NoBreak:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetPreformatted(const Value: Boolean);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> Preformatted then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.Preformatted:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetVAlignment(const Value: TIpHtmlVAlign3);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> VAlignment then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.VAlignment:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetVLinkColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> VLinkColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.VLinkColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetHoverColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> HoverColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.HoverColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlProps.SetHoverBgColor(const Value: TColor);
 | 
						|
var
 | 
						|
  pRec : TIpHtmlPropBFieldsRec;
 | 
						|
begin
 | 
						|
  if Value <> HoverBgColor then begin
 | 
						|
    CopyPropBRecTo(pRec);
 | 
						|
    pRec.HoverBgColor:=Value;
 | 
						|
    FindOrCreatePropB(pRec);
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
{ TIpHtmlPropsAList }
 | 
						|
 | 
						|
constructor TIpHtmlPropsAList.Create;
 | 
						|
begin
 | 
						|
  inherited Create;
 | 
						|
  FDummyA := TIpHtmlPropA.Create(Self);
 | 
						|
  FDummyA.UseCount := 1;
 | 
						|
  Add(FDummyA);
 | 
						|
end;
 | 
						|
 | 
						|
destructor TIpHtmlPropsAList.Destroy;
 | 
						|
begin
 | 
						|
  inherited Destroy;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropsAList.ResetCache;
 | 
						|
var
 | 
						|
  i : Integer;
 | 
						|
begin
 | 
						|
  for i := 0 to Pred(Count) do begin
 | 
						|
    Items[i].FSizeOfSpaceKnown := False;
 | 
						|
    Items[i].tmHeight := 0;
 | 
						|
  end;
 | 
						|
end;
 | 
						|
 | 
						|
function TIpHtmlPropsAList.FindPropARec(var pRec: TIpHtmlPropAFieldsRec): TIpHtmlPropA;
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  for i := 0 to Pred(Count) do begin
 | 
						|
    Result := Items[i];
 | 
						|
    if CompareByte(Result.FPropRec, pRec, sizeof(TIpHtmlPropAFieldsRec)) = 0 then
 | 
						|
       exit;
 | 
						|
  end;
 | 
						|
  Result := nil;
 | 
						|
end;
 | 
						|
 | 
						|
// Getter / Setter
 | 
						|
 | 
						|
function TIpHtmlPropsAList.GetItem(Index: Integer): TIpHtmlPropA;
 | 
						|
begin
 | 
						|
  Result := TIpHtmlPropA(inherited Items[Index]);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropsAList.SetItem(Index: Integer; AValue: TIpHtmlPropA);
 | 
						|
begin
 | 
						|
  inherited Items[Index] := AValue;
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
{ TIpHtmlPropsBList }
 | 
						|
 | 
						|
constructor TIpHtmlPropsBList.Create;
 | 
						|
begin
 | 
						|
  inherited Create;
 | 
						|
  FDummyB := TIpHtmlPropB.Create(Self);
 | 
						|
  FDummyB.UseCount := 1;
 | 
						|
  Add(FDummyB);
 | 
						|
end;
 | 
						|
 | 
						|
destructor TIpHtmlPropsBList.Destroy;
 | 
						|
begin
 | 
						|
  inherited Destroy;
 | 
						|
end;
 | 
						|
 | 
						|
function TIpHtmlPropsBList.FindPropBRec(var pRec: TIpHtmlPropBFieldsRec): TIpHtmlPropB;
 | 
						|
var
 | 
						|
  i: Integer;
 | 
						|
begin
 | 
						|
  for i := 0 to Pred(Count) do begin
 | 
						|
    Result := Items[i];
 | 
						|
    if CompareByte(Result.FPropRec, pRec, sizeof(TIpHtmlPropBFieldsRec)) = 0 then
 | 
						|
       exit;
 | 
						|
  end;
 | 
						|
  Result := nil;
 | 
						|
end;
 | 
						|
 | 
						|
// Getter / Setter
 | 
						|
 | 
						|
function TIpHtmlPropsBList.GetItem(Index: Integer): TIpHtmlPropB;
 | 
						|
begin
 | 
						|
  Result := TIpHtmlPropB(inherited Items[Index]);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TIpHtmlPropsBList.SetItem(Index: Integer; AValue: TIpHtmlPropB);
 | 
						|
begin
 | 
						|
  inherited Items[Index] := AValue;
 | 
						|
end;
 | 
						|
 | 
						|
end.
 | 
						|
 |