diff --git a/components/fpvectorial/fpvectorial.pas b/components/fpvectorial/fpvectorial.pas index 3d9670f8dd..e942be1d10 100644 --- a/components/fpvectorial/fpvectorial.pas +++ b/components/fpvectorial/fpvectorial.pas @@ -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); diff --git a/components/fpvectorial/htmlvectorialreader.pas b/components/fpvectorial/htmlvectorialreader.pas index c68a3bbbf8..d6b980016a 100644 --- a/components/fpvectorial/htmlvectorialreader.pas +++ b/components/fpvectorial/htmlvectorialreader.pas @@ -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;