📄 jvqmarkuplabel.pas
字号:
{******************************************************************************}
{* WARNING: JEDI VCL To CLX Converter generated unit. *}
{* Manual modifications will be lost on next release. *}
{******************************************************************************}
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvMarkupLabel.PAS, released on 2002-06-15.
The Initial Developer of the Original Code is Jan Verhoeven [jan1 dott verhoeven att wxs dott nl]
Portions created by Jan Verhoeven are Copyright (C) 2002 Jan Verhoeven.
All Rights Reserved.
Contributor(s):
Robert Love [rlove att slcdug dott org].
Lionel Reynaud
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvQMarkupLabel.pas,v 1.15 2004/12/01 22:53:19 asnepvangers Exp $
unit JvQMarkupLabel;
{$I jvcl.inc}
interface
uses
QWindows, QMessages, QGraphics, QControls,
SysUtils, Classes,
JvQComponent, JvQMarkupCommon;
type
TJvMarkupLabel = class(TJvGraphicControl)
private
FElementStack: TJvHTMLElementStack;
FTagStack: TJvHTMLElementStack;
FMarginLeft: Integer;
FMarginRight: Integer;
FMarginTop: Integer;
FAlignment: TAlignment;
FText: TCaption;
FAutoSize: Boolean;
procedure Refresh;
procedure ParseHTML(S: string);
procedure RenderHTML;
procedure HTMLClearBreaks;
procedure HTMLElementDimensions;
procedure SetMarginLeft(const Value: Integer);
procedure SetMarginRight(const Value: Integer);
procedure SetMarginTop(const Value: Integer);
procedure SetAlignment(const Value: TAlignment);
procedure DoReadBackColor(Reader: TReader);
protected
procedure FontChanged; override;
procedure SetText(const Value: TCaption); override;
procedure SetAutoSize(Value: Boolean);
procedure DefineProperties(Filer: TFiler); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Paint; override;
published
property Height default 100;
property Width default 200;
property MarginLeft: Integer read FMarginLeft write SetMarginLeft default 5;
property MarginRight: Integer read FMarginRight write SetMarginRight default 5;
property MarginTop: Integer read FMarginTop write SetMarginTop default 5;
property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
property Text: TCaption read FText write SetText;
property AutoSize: Boolean read FAutoSize write SetAutoSize default False;
property Align;
property Font;
property Anchors;
property Enabled;
property Color default clBtnFace; // Duplicates BackColor
property Constraints;
property ParentColor default True;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property Visible;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseEnter;
property OnMouseLeave;
property OnStartDrag;
end;
implementation
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
JvQConsts, JvQThemes;
constructor TJvMarkupLabel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FElementStack := TJvHTMLElementStack.Create;
FTagStack := TJvHTMLElementStack.Create;
FAlignment := taLeftJustify;
Width := 200;
Height := 100;
FMarginLeft := 5;
FMarginRight := 5;
FMarginTop := 5;
Color := clBtnFace;
ParentColor := True;
end;
destructor TJvMarkupLabel.Destroy;
begin
FElementStack.Free;
FTagStack.Free;
inherited Destroy;
end;
procedure TJvMarkupLabel.HTMLClearBreaks;
var
I, C: Integer;
El: TJvHTMLElement;
begin
C := FElementStack.Count;
if C = 0 then
Exit;
for I := 0 to C - 1 do
begin
El := TJvHTMLElement(FElementStack.Items[I]);
El.SolText := '';
El.EolText := '';
end;
end;
procedure TJvMarkupLabel.HTMLElementDimensions;
var
I, C: Integer;
El: TJvHTMLElement;
H, A, W: Integer;
Tm: TTextMetric;
S: string;
begin
C := FElementStack.Count;
if C = 0 then
Exit;
for I := 0 to C - 1 do
begin
El := TJvHTMLElement(FElementStack.Items[I]);
S := El.Text;
Canvas.Font.Name := El.FontName;
Canvas.Font.Size := El.FontSize;
Canvas.Font.Style := El.FontStyle;
Canvas.Font.Color := El.FontColor;
GetTextMetrics(Canvas.Handle, Tm);
H := Tm.tmHeight;
A := Tm.tmAscent;
W := Canvas.TextWidth(S);
El.Height := H;
El.Ascent := A;
El.Width := W;
end;
end;
procedure TJvMarkupLabel.Refresh;
begin
ParseHTML(FText);
HTMLElementDimensions;
Invalidate;
end;
procedure TJvMarkupLabel.Paint;
begin
RenderHTML;
end;
procedure TJvMarkupLabel.FontChanged;
begin
inherited FontChanged;
Refresh;
end;
procedure TJvMarkupLabel.ParseHTML(S: string);
var
P: Integer;
SE, ST: string;
FText: string;
FStyle: TFontStyles;
FName: string;
FSize: Integer;
FBreakLine: Boolean;
AColor, FColor: TColor;
Element: TJvHTMLElement;
function HTMLStringToColor(V: string; var Col: TColor): Boolean;
var
VV: string;
begin
Result := False;
if Length(V) < 2 then
Exit;
if not (V[1] in ['#', '$']) then
begin
// allow the use of both "clBlack" and "Black"
if Pos('cl', AnsiLowerCase(V)) = 1 then
VV := V
else
VV := 'cl' + V;
try
Col := StringToColor(VV);
Result := True;
except
Result := False;
end;
end
else
// this is either #FFFFFF or $FFFFFF - we treat them the same
begin
try
VV := '$' + Copy(V, 6, 2) + Copy(V, 4, 2) + Copy(V, 2, 2);
Col := StringToColor(VV);
Result := True;
except
Result := False;
end
end;
end;
procedure PushTag;
begin
Element := TJvHTMLElement.Create;
Element.FontName := FName;
Element.FontSize := FSize;
Element.FontStyle := FStyle;
Element.FontColor := FColor;
FTagStack.Push(Element);
end;
procedure PopTag;
begin
Element := FTagStack.Pop;
if Element <> nil then
begin
FName := Element.FontName;
FSize := Element.FontSize;
FStyle := Element.FontStyle;
FColor := Element.FontColor;
Element.Free;
end;
end;
procedure PushElement;
begin
Element := TJvHTMLElement.Create;
Element.Text := FText;
Element.FontName := FName;
Element.FontSize := FSize;
Element.FontStyle := FStyle;
Element.FontColor := FColor;
Element.BreakLine := FBreakLine;
FBreakLine := False;
FElementStack.Push(Element);
end;
procedure ParseTag(SS: string);
var
PP: Integer;
ATag, APar, AVal: string;
HaveParams: Boolean;
begin
SS := Trim(SS);
HaveParams := False;
PP := Pos(' ', SS);
if PP = 0 then
ATag := SS // tag only
else
begin // tag + attributes
ATag := Copy(SS, 1, PP - 1);
SS := Trim(Copy(SS, PP + 1, Length(SS)));
HaveParams := True;
end;
// handle ATag
ATag := LowerCase(ATag);
if ATag = 'br' then
FBreakLine := True
else
if ATag = 'b' then
begin // bold
PushTag;
FStyle := FStyle + [fsBold];
end
else
if ATag = '/b' then
begin // cancel bold
FStyle := FStyle - [fsBold];
PopTag;
end
else
if ATag = 'i' then
begin // italic
PushTag;
FStyle := FStyle + [fsItalic];
end
else
if ATag = '/i' then
begin // cancel italic
FStyle := FStyle - [fsItalic];
PopTag;
end
else
if ATag = 'u' then
begin // underline
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -