fpvectorial: Starts support for html and rendering support for lists

git-svn-id: trunk@48984 -
This commit is contained in:
sekelsenmat 2015-05-11 09:44:01 +00:00
parent 013aae61e4
commit d74381d94a
2 changed files with 115 additions and 3 deletions

View File

@ -1007,11 +1007,14 @@ type
function AddParagraph(ASimpleText: string): TvParagraph;
function AddList : TvList;
function Level : Integer;
class procedure DrawBullet(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo;
ALevel: Integer; AX, AY: Double; ADestX: Integer = 0; ADestY: Integer = 0;
AMulX: Double = 1.0; AMulY: Double = 1.0; ADoDraw: Boolean = True);
{function TryToSelect(APos: TPoint; var ASubpart: Cardinal): TvFindEntityResult; override;
//function TryToSelect(APos: TPoint; var ASubpart: Cardinal): TvFindEntityResult; override;
procedure Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0); override;
function GenerateDebugTree(ADestRoutine: TvDebugAddItemProc; APageItem: Pointer): Pointer; override;}
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0; ADoDraw: Boolean = True); override;
//function GenerateDebugTree(ADestRoutine: TvDebugAddItemProc; APageItem: Pointer): Pointer; override;}
end;
{@@
@ -6284,6 +6287,83 @@ begin
end;
end;
class procedure TvList.DrawBullet(ADest: TFPCustomCanvas;
var ARenderInfo: TvRenderInfo; ALevel: Integer; AX, AY: Double;
ADestX: Integer; ADestY: Integer; AMulX: Double; AMulY: Double;
ADoDraw: Boolean);
function CoordToCanvasX(ACoord: Double): Integer;
begin
Result := Round(ADestX + AmulX * ACoord);
end;
function CoordToCanvasY(ACoord: Double): Integer;
begin
Result := Round(ADestY + AmulY * ACoord);
end;
begin
end;
procedure TvList.Render(ADest: TFPCustomCanvas; var ARenderInfo: TvRenderInfo; ADestX: Integer = 0;
ADestY: Integer = 0; AMulX: Double = 1.0; AMulY: Double = 1.0; ADoDraw: Boolean = True);
function CoordToCanvasX(ACoord: Double): Integer;
begin
Result := Round(ADestX + AmulX * ACoord);
end;
function CoordToCanvasY(ACoord: Double): Integer;
begin
Result := Round(ADestY + AmulY * ACoord);
end;
var
lEntity: TvEntity;
lPara: TvParagraph absolute lEntity;
lList: TvList absolute lEntity;
lEntityRenderInfo: TvRenderInfo;
CurX, CurY: Double;
begin
InitializeRenderInfo(ARenderInfo);
// Don't call inherited Render(ADest, ARenderInfo, ADestX, ADestY, AMulX, AMulY, ADoDraw);
lEntity := GetFirstEntity();
while lEntity <> nil do
begin
if lEntity is TvParagraph then
begin
{lText.Render(ADest, lEntityRenderInfo, CurX, ADestY + lHeight_px, AMulX, AMulY, ADoDraw);
lText.CalculateBoundingBox(ADest, lLeft, lTop, lRight, lBottom);
lCurWidth := lCurWidth + Abs(lRight - lLeft);
lFirstText := False;
lPrevText := lText;
lText.X := OldTextX;
lText.Y := OldTextY;
if lResetOldStyle then
TvText(lEntity).Style := nil; }
end
else if lEntity is TvList then
begin
{OldTextX := lText.X;
OldTextY := lText.Y;
lEntity.X := CoordToCanvasX(lEntity.X + X + lCurWidth);
lEntity.Y := lEntity.Y + Y;
lEntity.Render(ADest, lEntityRenderInfo, ADestX, ADestY + lHeight_px, AMulX, AMulY, ADoDraw);
lEntity.X := OldTextX;
lEntity.Y := OldTextY; }
end;
MergeRenderInfo(lEntityRenderInfo, ARenderInfo);
lEntity := GetNextEntity();
end;
end;
{ TvRichText }
constructor TvRichText.Create(APage: TvPage);

View File

@ -37,6 +37,7 @@ type
function ReadMathFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadTableFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadTableRowNode(ATable: TvTable; ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
function ReadUListFromNode(ANode: TDOMNode; AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
public
{ General reading methods }
constructor Create; override;
@ -100,6 +101,7 @@ begin
AData.AddParagraph().AddText(LineEnding);
Result := nil;
end;
'ul': Result := ReadUListFromNode(ANode, AData, ADoc);
end;
end;
@ -437,6 +439,36 @@ begin
end;
end;
function TvHTMLVectorialReader.ReadUListFromNode(ANode: TDOMNode;
AData: TvTextPageSequence; ADoc: TvVectorialDocument): TvEntity;
var
lCurNode: TDOMNode;
lNodeName, lNodeValue: DOMString;
lNodeText: string;
//
lList: TvList;
lCurPara: TvParagraph;
begin
Result := nil;
lList := AData.AddList();
lCurNode := ANode.FirstChild;
while Assigned(lCurNode) do
begin
lNodeName := lCurNode.NodeName;
lNodeValue := lCurNode.NodeValue;
case lNodeName of
'li':
begin
lNodeText := GetTextContentFromNode(lCurNode);
lCurPara := lList.AddParagraph(lNodeText);
end;
end;
lCurNode := lCurNode.NextSibling;
end;
end;
constructor TvHTMLVectorialReader.Create;
begin
inherited Create;