TurboPower_IPro: more general way to copy text to the clipboard. Add CTRL+A to "select all". Improved rendering of table, p and header nodes.

git-svn-id: trunk@50130 -
This commit is contained in:
wp 2015-10-20 19:14:32 +00:00
parent 5fc7132693
commit 26a72d2bfc

View File

@ -1457,16 +1457,24 @@ type
{ TIpHtmlNodeTR } { TIpHtmlNodeTR }
TIpHtmlNodeTR = class(TIpHtmlNodeBlock) TIpHtmlNodeTR = class(TIpHtmlNodeCore)
private private
FAlign: TIpHtmlAlign; FAlign: TIpHtmlAlign;
FVAlign: TIpHtmlVAlign; FVAlign: TIpHtmlVAlign;
FBgColor: TColor;
FTextColor: TColor;
procedure SetBgColor(const AValue: TColor);
procedure SetTextColor(const AValue: TColor);
protected
procedure AppendSelection(var S: String); override;
public public
constructor Create(ParentNode : TIpHtmlNode); constructor Create(ParentNode : TIpHtmlNode);
procedure SetProps(const RenderProps: TIpHtmlProps); override; procedure SetProps(const RenderProps: TIpHtmlProps); override;
public public
property Align : TIpHtmlAlign read FAlign write FAlign; property Align : TIpHtmlAlign read FAlign write FAlign;
property VAlign : TIpHtmlVAlign read FVAlign write FVAlign; property VAlign : TIpHtmlVAlign read FVAlign write FVAlign;
property BgColor: TColor read FBgColor write SetBgColor;
property TextColor: TColor read FTextColor write SetTextColor;
end; end;
TIpHtmlCellScope = (hcsUnspec, hcsRow, hcsCol, hcsRowGroup, hcsColGroup); TIpHtmlCellScope = (hcsUnspec, hcsRow, hcsCol, hcsRowGroup, hcsColGroup);
@ -1485,6 +1493,7 @@ type
FWidth: TIpHtmlLength; FWidth: TIpHtmlLength;
FVAlign: TIpHtmlVAlign3; FVAlign: TIpHtmlVAlign3;
protected protected
procedure AppendSelection(var S: String); override;
procedure DimChanged(Sender: TObject); procedure DimChanged(Sender: TObject);
public public
FPadRect : TRect; FPadRect : TRect;
@ -2665,6 +2674,9 @@ function CalcMultiLength(const List: TIpHtmlMultiLengthList;
function GetAlignmentForStr(str: string; pDefault: TIpHtmlAlign = haDefault): TIpHtmlAlign; function GetAlignmentForStr(str: string; pDefault: TIpHtmlAlign = haDefault): TIpHtmlAlign;
function dbgs(et: TElementType): string; overload; function dbgs(et: TElementType): string; overload;
function GetNextSiblingNode(ANode: TIpHtmlNode): TIpHtmlNode;
function GetPrevSiblingNode(ANode: TIpHtmlNode): TIpHtmlNode;
procedure Register; procedure Register;
implementation implementation
@ -2798,6 +2810,56 @@ begin
writestr(Result,et); writestr(Result,et);
end; end;
function GetNextSiblingNode(ANode: TIpHtmlNode): TIpHtmlNode;
var
node: TIpHtmlNode;
parent: TIpHtmlNodeMulti;
i: Integer;
begin
Result := nil;
if ANode = nil then
exit;
if (ANode.FParentNode = nil) or not (ANode.ParentNode is TIpHtmlNodeMulti) then
exit;
parent := TIpHtmlNodeMulti(ANode.FParentNode);
if parent.ChildCount = 1 then
exit;
Result := parent.ChildNode[parent.ChildCount-1];
for i := parent.ChildCount-2 downto 0 do
begin
node := parent.ChildNode[i];
if node = ANode then
exit;
Result := node;
end;
Result := nil;
end;
function GetPrevSiblingNode(ANode: TIpHtmlNode): TIpHtmlNode;
var
node: TIpHtmlNode;
parent: TIpHtmlNodeMulti;
i: Integer;
begin
Result := nil;
if ANode = nil then
exit;
if (ANode.FParentNode = nil) or not (ANode.ParentNode is TIpHtmlNodeMulti) then
exit;
parent := TIpHtmlNodeMulti(ANode.FParentNode);
if parent.ChildCount = 1 then
exit;
Result := parent.ChildNode[0];
for i:=1 to parent.ChildCount-1 do
begin
node := parent.ChildNode[i];
if node = ANode then
exit;
Result := node;
end;
Result := nil;
end;
procedure Register; procedure Register;
begin begin
RegisterComponents('IPro', [TIpHtmlPanel]); RegisterComponents('IPro', [TIpHtmlPanel]);
@ -9113,16 +9175,19 @@ end;
procedure TIpHtmlNodeP.Enqueue; procedure TIpHtmlNodeP.Enqueue;
begin begin
if FChildren.Count > 0 then begin if FChildren.Count > 0 then begin
if not (FParentNode is TIpHtmlNodeLI) then begin if not ((FParentNode is TIpHtmlNodeLI) or (FParentNode is TIpHtmlNodeTD)) then
begin
EnqueueElement(Owner.SoftLF); EnqueueElement(Owner.SoftLF);
EnqueueElement(Owner.HardLF); EnqueueElement(Owner.HardLF);
end; end;
end; end;
inherited Enqueue; inherited Enqueue;
if FChildren.Count > 0 then begin if FChildren.Count > 0 then begin
if not (FParentNode is TIpHtmlNodeTD) then begin
EnqueueElement(Owner.SoftLF); EnqueueElement(Owner.SoftLF);
EnqueueElement(Owner.HardLF); EnqueueElement(Owner.HardLF);
end; end;
end;
end; end;
procedure TIpHtmlNodeP.SetAlign(const Value: TIpHtmlAlign); procedure TIpHtmlNodeP.SetAlign(const Value: TIpHtmlAlign);
@ -9279,7 +9344,7 @@ begin
inherited Enqueue; inherited Enqueue;
if FChildren.Count > 0 then begin if FChildren.Count > 0 then begin
EnqueueElement(Owner.SoftLF); EnqueueElement(Owner.SoftLF);
EnqueueElement(Owner.HardLF); // EnqueueElement(Owner.HardLF); // Remove large spacing after header line
end; end;
end; end;
@ -10088,9 +10153,14 @@ begin
hiaCenter : hiaCenter :
EnqueueElement(Owner.SoftLF); EnqueueElement(Owner.SoftLF);
end; end;
} }
EnqueueElement(Owner.SoftLF);
EnqueueElement(Element); EnqueueElement(Element);
{
EnqueueElement(Owner.SoftLF);
EnqueueElement(Owner.hardLF); // LFs needed otherwise next element is too close
{
case Align of case Align of
hiaTop, hiaTop,
hiaMiddle, hiaMiddle,
@ -10098,7 +10168,7 @@ begin
hiaCenter : hiaCenter :
EnqueueElement(Owner.SoftLF); EnqueueElement(Owner.SoftLF);
end; end;
} }
end; end;
procedure TIpHtmlNodeTABLE.SetBorder(const Value: Integer); procedure TIpHtmlNodeTABLE.SetBorder(const Value: Integer);
@ -10198,6 +10268,8 @@ begin
end; end;
{$ENDIF} {$ENDIF}
{ TIpNodeTR }
procedure TIpHtmlNodeTR.SetProps(const RenderProps: TIpHtmlProps); procedure TIpHtmlNodeTR.SetProps(const RenderProps: TIpHtmlProps);
begin begin
Props.Assign(RenderProps); Props.Assign(RenderProps);
@ -10212,6 +10284,33 @@ begin
FElementName := 'tr'; FElementName := 'tr';
FAlign := haDefault; FAlign := haDefault;
FValign := hvaMiddle; FValign := hvaMiddle;
FBgColor := -1;
FTextColor := -1;
end;
procedure TIpHtmlNodeTR.AppendSelection(var S: String);
var
prev: TIpHtmlNode;
begin
prev := GetPrevSiblingNode(Self);
if prev is TIpHtmlNodeTR then S := S + LineEnding;
inherited AppendSelection(S);
end;
procedure TIpHtmlNodeTR.SetBgColor(const AValue: TColor);
begin
if AValue <> FBgColor then begin
FBgColor := AValue;
InvalidateSize;
end;
end;
procedure TIpHtmlNodeTR.SetTextColor(const AValue: TColor);
begin
if AValue <> FTextColor then begin
FTextColor := AValue;
InvalidateSize;
end;
end; end;
{ TIpHtmlNodeMAP } { TIpHtmlNodeMAP }
@ -12317,6 +12416,15 @@ begin
inherited; inherited;
end; end;
procedure TIpHtmlNodeTableHeaderOrCell.AppendSelection(var S: String);
var
prev: TIpHtmlNode;
begin
prev := GetPrevSiblingNode(self);
if prev is TIpHtmlNodeTableHeaderOrCell then S := S + #9;
inherited AppendSelection(S);
end;
procedure TIpHtmlNodeTableHeaderOrCell.CalcMinMaxPropWidth(RenderProps: TIpHtmlProps; procedure TIpHtmlNodeTableHeaderOrCell.CalcMinMaxPropWidth(RenderProps: TIpHtmlProps;
var Min, Max: Integer); var Min, Max: Integer);
begin begin
@ -12907,6 +13015,19 @@ begin
TIpHtmlCustomPanel(Owner).Scroll(hsaEnd); TIpHtmlCustomPanel(Owner).Scroll(hsaEnd);
Key := 0 Key := 0
end end
else if ((key = VK_C) or (key = VK_INSERT)) and (Shift = [ssCtrl]) then // copy to clipboard
begin
HtmlPanel.CopyToClipboard;
// FHyper.CopyToClipboard;
Key := 0;
end
else if (key = VK_A) and (Shift = [ssCtrl]) then // select all
begin
HtmlPanel.SelectAll;
// FHyper.SelectAll;
// Invalidate;
Key := 0;
end
else if key = VK_RETURN then // return else if key = VK_RETURN then // return
begin begin
if (FHyper.FTabList.TabItem <> nil) and (FHyper.FTabList.TabItem is TIpHtmlNodeA) then if (FHyper.FTabList.TabItem <> nil) and (FHyper.FTabList.TabItem is TIpHtmlNodeA) then
@ -15504,6 +15625,7 @@ begin
FElementName := 'td'; FElementName := 'td';
end; end;
{ TIpHtmlNodeCAPTION } { TIpHtmlNodeCAPTION }
constructor TIpHtmlNodeCAPTION.Create(ParentNode: TIpHtmlNode); constructor TIpHtmlNodeCAPTION.Create(ParentNode: TIpHtmlNode);
@ -15514,5 +15636,6 @@ end;
initialization initialization
InitScrollProcs; InitScrollProcs;
end. end.