mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-28 04:13:51 +02:00
530 lines
12 KiB
ObjectPascal
530 lines
12 KiB
ObjectPascal
unit IpHtmlClasses;
|
|
|
|
{$mode Delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Types, Graphics, Forms,
|
|
IpHtmlTypes;
|
|
|
|
type
|
|
{ Integer property which can be scaled}
|
|
TIpHtmlInteger = class(TPersistent)
|
|
private
|
|
FValue : Integer;
|
|
FChange: TNotifyEvent;
|
|
procedure DoChange;
|
|
function GetValue: Integer;
|
|
procedure SetValue(const Value: Integer);
|
|
public
|
|
constructor Create(AValue: Integer);
|
|
property Value: Integer read GetValue write SetValue;
|
|
property OnChange: TNotifyEvent read FChange write FChange;
|
|
end;
|
|
|
|
TIpHtmlPixels = class(TPersistent)
|
|
private
|
|
FValue : Integer;
|
|
FPixelsType : TIpHtmlPixelsType;
|
|
FChange: TNotifyEvent;
|
|
procedure DoChange;
|
|
function GetValue: Integer;
|
|
procedure SetPixelsType(const Value: TIpHtmlPixelsType);
|
|
procedure SetValue(const Value: Integer);
|
|
public
|
|
property Value: Integer read GetValue write SetValue;
|
|
property PixelsType: TIpHtmlPixelsType read FPixelsType write SetPixelsType;
|
|
property OnChange: TNotifyEvent read FChange write FChange;
|
|
end;
|
|
|
|
TIpHtmlLength = class(TPersistent)
|
|
private
|
|
FLengthValue: Integer;
|
|
FLengthType: TIpHtmlLengthType;
|
|
FChange: TNotifyEvent;
|
|
procedure SetLengthType(const Value: TIpHtmlLengthType);
|
|
procedure SetLengthValue(const Value: Integer);
|
|
function GetLengthValue: Integer;
|
|
procedure DoChange;
|
|
public
|
|
property LengthValue : Integer read GetLengthValue write SetLengthValue;
|
|
property LengthType : TIpHtmlLengthType read FLengthType write SetLengthType;
|
|
property OnChange: TNotifyEvent read FChange write FChange;
|
|
end;
|
|
|
|
TIpHtmlMultiLengthType = (hmlUndefined, hmlAbsolute, hmlPercent, hmlRelative);
|
|
TIpHtmlMultiLength = class(TPersistent)
|
|
private
|
|
FLengthValue : Integer;
|
|
FLengthType : TIpHtmlMultiLengthType;
|
|
function GetLengthValue: Integer;
|
|
public
|
|
property LengthValue: Integer read GetLengthValue write FLengthValue;
|
|
property LengthType: TIpHtmlMultiLengthType read FLengthType write FLengthType;
|
|
end;
|
|
|
|
TIpHtmlMultiLengthList = class(TPersistent)
|
|
private
|
|
List: TFPList;
|
|
function GetEntries: Integer;
|
|
function GetValues(Index: Integer): TIpHtmlMultiLength;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
property Values[Index: Integer]: TIpHtmlMultiLength read GetValues;
|
|
procedure AddEntry(Value: TIpHtmlMultiLength);
|
|
procedure Clear;
|
|
property Entries: Integer read GetEntries;
|
|
end;
|
|
|
|
TIpHtmlRelSizeType = (hrsUnspecified, hrsAbsolute, hrsRelative);
|
|
TIpHtmlRelSize = class(TPersistent)
|
|
private
|
|
FChange: TNotifyEvent;
|
|
FSizeType : TIpHtmlRelSizeType;
|
|
FValue : Integer;
|
|
procedure SetSizeType(const Value: TIpHtmlRelSizeType);
|
|
procedure SetValue(const Value: Integer);
|
|
procedure DoChange;
|
|
public
|
|
property SizeType : TIpHtmlRelSizeType read FSizeType write SetSizeType;
|
|
property Value : Integer read FValue write SetValue;
|
|
property OnChange: TNotifyEvent read FChange write FChange;
|
|
end;
|
|
|
|
TInternalIntArr = array [0..Pred(MAXINTS)] of Integer;
|
|
PInternalIntArr = ^TInternalIntArr;
|
|
|
|
TIntArr = class
|
|
private
|
|
InternalIntArr : PInternalIntArr;
|
|
IntArrSize : Integer;
|
|
function GetValue(Index: Integer): Integer;
|
|
procedure SetValue(Index, Value: Integer);
|
|
public
|
|
destructor Destroy; override;
|
|
property Value[Index: Integer]: Integer read GetValue write SetValue; default;
|
|
end;
|
|
|
|
TInternalRectArr = array [0..Pred(MAXINTS)] of PRect;
|
|
PInternalRectArr = ^TInternalRectArr;
|
|
|
|
TRectArr = class
|
|
private
|
|
InternalRectArr : PInternalRectArr;
|
|
IntArrSize : Integer;
|
|
function GetValue(Index: Integer): PRect;
|
|
procedure SetValue(Index: Integer; Value: PRect);
|
|
public
|
|
destructor Destroy; override;
|
|
property Value[Index: Integer]: PRect read GetValue write SetValue; default;
|
|
end;
|
|
|
|
TInternalRectRectArr = array [0..Pred(MAXINTS)] of TRectArr;
|
|
PInternalRectRectArr = ^TInternalRectRectArr;
|
|
|
|
TRectRectArr = class
|
|
protected
|
|
InternalRectRectArr : PInternalRectRectArr;
|
|
IntArrSize : Integer;
|
|
function GetValue(Index: Integer): TRectArr;
|
|
public
|
|
destructor Destroy; override;
|
|
property Value[Index: Integer]: TRectArr read GetValue; default;
|
|
procedure Delete(Index: Integer);
|
|
end;
|
|
|
|
TIpHtmlPreviewSettings = class(TPersistent)
|
|
private
|
|
FAntiAliasingMode: TAntiAliasingMode;
|
|
FPosition: TPosition;
|
|
FMaximized: Boolean;
|
|
FLeft: Integer;
|
|
FTop: Integer;
|
|
FWidth: Integer;
|
|
FHeight: Integer;
|
|
FZoom: Integer;
|
|
public
|
|
constructor Create;
|
|
published
|
|
property AntiAliasingMode: TAntiAliasingMode
|
|
read FAntiAliasingMode write FAntiAliasingMode default amDontCare;
|
|
property Position: TPosition
|
|
read FPosition write FPosition default poScreenCenter;
|
|
property Maximized: Boolean
|
|
read FMaximized write FMaximized default false;
|
|
property Left: Integer
|
|
read FLeft write FLeft;
|
|
property Top: Integer
|
|
read FTop write FTop;
|
|
property Width: Integer
|
|
read FWidth write FWidth;
|
|
property Height: Integer
|
|
read FHeight write FHeight;
|
|
property Zoom: integer
|
|
read FZoom write FZoom default 100;
|
|
end;
|
|
|
|
TIpHtmlPrintSettings = class(TPersistent)
|
|
private
|
|
FPreview: TIpHtmlPreviewSettings;
|
|
FMarginTop: Double;
|
|
FMarginLeft: Double;
|
|
FMarginBottom: Double;
|
|
FMarginRight: Double;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
published
|
|
property MarginLeft: Double read FMarginLeft write FMarginLeft;
|
|
property MarginTop: Double read FMarginTop write FMarginTop;
|
|
property MarginRight: Double read FMarginRight write FMarginRight;
|
|
property MarginBottom: Double read FMarginBottom write FMarginBottom;
|
|
property Preview: TIpHtmlPreviewSettings read FPreview write FPreview;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
{ TIpHtmlInteger }
|
|
|
|
constructor TIpHtmlInteger.Create(AValue: Integer);
|
|
begin
|
|
inherited Create;
|
|
FValue := AValue;
|
|
end;
|
|
|
|
procedure TIpHtmlInteger.DoChange;
|
|
begin
|
|
if assigned(FChange) then
|
|
FChange(Self);
|
|
end;
|
|
|
|
function TIpHtmlInteger.GetValue: Integer;
|
|
begin
|
|
if ScaleBitmaps then
|
|
Result := round(FValue * Aspect)
|
|
else
|
|
Result := FValue;
|
|
end;
|
|
|
|
procedure TIpHtmlInteger.SetValue(const Value: Integer);
|
|
begin
|
|
if Value <> FValue then begin
|
|
FValue := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlPixels }
|
|
|
|
procedure TIpHtmlPixels.DoChange;
|
|
begin
|
|
if assigned(FChange) then
|
|
FChange(Self);
|
|
end;
|
|
|
|
function TIpHtmlPixels.GetValue: Integer;
|
|
begin
|
|
if (PixelsType = hpAbsolute) and ScaleBitmaps then
|
|
Result := round(FValue * Aspect)
|
|
else
|
|
Result := FValue;
|
|
end;
|
|
|
|
procedure TIpHtmlPixels.SetPixelsType(const Value: TIpHtmlPixelsType);
|
|
begin
|
|
if Value <> FPixelsType then begin
|
|
FPixelsType := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlPixels.SetValue(const Value: Integer);
|
|
begin
|
|
if Value <> FValue then begin
|
|
FValue := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlRelSize }
|
|
|
|
procedure TIpHtmlRelSize.DoChange;
|
|
begin
|
|
if assigned(FChange) then
|
|
FChange(Self);
|
|
end;
|
|
|
|
procedure TIpHtmlRelSize.SetSizeType(const Value: TIpHtmlRelSizeType);
|
|
begin
|
|
if Value <> FSizeType then begin
|
|
FSizeType := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlRelSize.SetValue(const Value: Integer);
|
|
begin
|
|
if Value <> FValue then begin
|
|
FValue := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlLength }
|
|
|
|
procedure TIpHtmlLength.DoChange;
|
|
begin
|
|
if Assigned(FChange) then
|
|
FChange(Self);
|
|
end;
|
|
|
|
function TIpHtmlLength.GetLengthValue: Integer;
|
|
begin
|
|
if (LengthType = hlAbsolute) and ScaleBitmaps then
|
|
Result := round(FLengthValue * Aspect)
|
|
else
|
|
Result := FLengthValue;
|
|
end;
|
|
|
|
procedure TIpHtmlLength.SetLengthType(const Value: TIpHtmlLengthType);
|
|
begin
|
|
if Value <> FLengthType then begin
|
|
FLengthType := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
procedure TIpHtmlLength.SetLengthValue(const Value: Integer);
|
|
begin
|
|
if Value <> FLengthValue then begin
|
|
FLengthValue := Value;
|
|
DoChange;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlMultiLength }
|
|
|
|
function TIpHtmlMultiLength.GetLengthValue: Integer;
|
|
begin
|
|
if (LengthType = hmlAbsolute) and ScaleBitmaps then
|
|
Result := round(FLengthValue * Aspect)
|
|
else
|
|
Result := FLengthValue;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlMultiLengthList }
|
|
|
|
procedure TIpHtmlMultiLengthList.AddEntry(Value: TIpHtmlMultiLength);
|
|
begin
|
|
List.Add(Value);
|
|
end;
|
|
|
|
procedure TIpHtmlMultiLengthList.Clear;
|
|
begin
|
|
while List.Count > 0 do begin
|
|
TIpHtmlMultiLength(List[0]).Free;
|
|
List.Delete(0);
|
|
end;
|
|
end;
|
|
|
|
constructor TIpHtmlMultiLengthList.Create;
|
|
begin
|
|
inherited Create;
|
|
List := TFPList.Create;
|
|
end;
|
|
|
|
destructor TIpHtmlMultiLengthList.Destroy;
|
|
begin
|
|
inherited;
|
|
Clear;
|
|
List.Free;
|
|
end;
|
|
|
|
function TIpHtmlMultiLengthList.GetEntries: Integer;
|
|
begin
|
|
Result := List.Count;
|
|
end;
|
|
|
|
function TIpHtmlMultiLengthList.GetValues(
|
|
Index: Integer): TIpHtmlMultiLength;
|
|
begin
|
|
Result := TIpHtmlMultiLength(List[Index]);
|
|
end;
|
|
|
|
|
|
{ TIntArr }
|
|
|
|
destructor TIntArr.Destroy;
|
|
begin
|
|
inherited;
|
|
Freemem(InternalIntArr);
|
|
end;
|
|
|
|
function TIntArr.GetValue(Index: Integer): Integer;
|
|
begin
|
|
if (Index < 0) or (Index >= IntArrSize) then
|
|
Result := 0
|
|
else
|
|
Result := InternalIntArr^[Index];
|
|
end;
|
|
|
|
procedure TIntArr.SetValue(Index, Value: Integer);
|
|
var
|
|
p: ^Integer;
|
|
NewSize: Integer;
|
|
begin
|
|
if Index >= 0 then begin
|
|
if Index >= IntArrSize then begin
|
|
NewSize := IntArrSize;
|
|
repeat
|
|
Inc(NewSize, TINTARRGROWFACTOR);
|
|
until Index < NewSize;
|
|
{code below does not check if InternalIntArr<>nil}
|
|
ReallocMem(InternalIntArr,NewSize * sizeof(PtrInt));
|
|
p := pointer(InternalIntArr);
|
|
Inc(p, IntArrSize);
|
|
fillchar(p^, (NewSize - IntArrSize)*sizeOf(PtrInt), 0);
|
|
IntArrSize := NewSize;
|
|
end;
|
|
InternalIntArr^[Index] := Value;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ TRectArr }
|
|
|
|
destructor TRectArr.Destroy;
|
|
begin
|
|
inherited;
|
|
Freemem(InternalRectArr);
|
|
end;
|
|
|
|
function TRectArr.GetValue(Index: Integer): PRect;
|
|
begin
|
|
Assert(Self <> nil);
|
|
if (Index < 0) or (Index >= IntArrSize) then
|
|
Result := nil
|
|
else
|
|
Result := InternalRectArr^[Index];
|
|
end;
|
|
|
|
procedure TRectArr.SetValue(Index: Integer; Value: PRect);
|
|
var
|
|
P: Pointer;
|
|
NewSize: Integer;
|
|
begin
|
|
Assert(Self <> nil);
|
|
if Index >= 0 then begin
|
|
if Index >= IntArrSize then begin
|
|
NewSize := IntArrSize;
|
|
repeat
|
|
Inc(NewSize, TINTARRGROWFACTOR);
|
|
until Index < NewSize;
|
|
{code below does not check if InternalIntArr<>nil and set buggy IntArrSize}
|
|
ReallocMem(InternalRectArr,NewSize * sizeof(PtrInt));
|
|
P := pointer(InternalRectArr);
|
|
Inc(P, IntArrSize);
|
|
fillchar(p^, (NewSize - IntArrSize)*sizeOf(PtrInt), 0);
|
|
IntArrSize:=NewSize;
|
|
end;
|
|
InternalRectArr^[Index] := Value;
|
|
end;
|
|
end;
|
|
|
|
|
|
{ TRectRectArr }
|
|
|
|
procedure TRectRectArr.Delete(Index: Integer);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
if (Index >= 0) and (Index < IntArrSize) then begin
|
|
Value[Index].Free;
|
|
for i := 1 to IntArrSize - 1 do
|
|
InternalRectRectArr[i-1] := InternalRectRectArr[i];
|
|
InternalRectRectArr[IntArrSize - 1] := nil;
|
|
end;
|
|
end;
|
|
|
|
destructor TRectRectArr.Destroy;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
inherited;
|
|
for i := 0 to IntArrSize - 1 do
|
|
Delete(i);
|
|
if InternalRectRectArr <> nil then
|
|
Freemem(InternalRectRectArr);
|
|
end;
|
|
|
|
function TRectRectArr.GetValue(Index: Integer): TRectArr;
|
|
var
|
|
P: ^Pointer;
|
|
NewSize: Integer;
|
|
begin
|
|
if Index >= 0 then begin
|
|
if Index >= IntArrSize then begin
|
|
NewSize := IntArrSize;
|
|
repeat
|
|
Inc(NewSize, TINTARRGROWFACTOR);
|
|
until Index < NewSize;
|
|
{code below does not check if InternalIntArr<>nil and set buggy IntArrSize}
|
|
ReallocMem(InternalRectRectArr,NewSize * sizeof(PtrInt));
|
|
p := pointer(InternalRectRectArr);
|
|
Inc(p, IntArrSize);
|
|
fillchar(p^, (NewSize - IntArrSize)*sizeOf(PtrInt), 0);
|
|
IntArrSize:=NewSize;
|
|
end;
|
|
Result := InternalRectRectArr^[Index];
|
|
if Result = nil then begin
|
|
Result := TRectArr.Create;
|
|
InternalRectRectArr^[Index] := Result;
|
|
end;
|
|
end else
|
|
Result := nil;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlPreviewSettings }
|
|
|
|
constructor TIpHtmlPreviewSettings.Create;
|
|
begin
|
|
inherited;
|
|
FPosition := poScreenCenter;
|
|
FZoom := 100;
|
|
FWidth := Screen.Width * 3 div 4;
|
|
FHeight := Screen.Height * 3 div 4;
|
|
FLeft := Screen.Width div 4;
|
|
FTop := Screen.Height div 4;
|
|
end;
|
|
|
|
|
|
{ TIpHtmlPrintSettings }
|
|
|
|
constructor TIpHtmlPrintSettings.Create;
|
|
begin
|
|
inherited;
|
|
FPreview := TIpHtmlPreviewSettings.Create;
|
|
FMarginLeft := DEFAULT_PRINTMARGIN;
|
|
FMarginTop := DEFAULT_PRINTMARGIN;
|
|
FMarginRight := DEFAULT_PRINTMARGIN;
|
|
FMarginBottom := DEFAULT_PRINTMARGIN;
|
|
end;
|
|
|
|
destructor TIpHtmlPrintSettings.Destroy;
|
|
begin
|
|
FPreview.Free;
|
|
inherited;
|
|
end;
|
|
|
|
end.
|
|
|