7#ifndef XFA_FXFA_CXFA_TEXTLAYOUT_H_
8#define XFA_FXFA_CXFA_TEXTLAYOUT_H_
13#include "core/fxcrt/css/cfx_css.h"
14#include "core/fxcrt/fx_coordinates.h"
15#include "core/fxcrt/retain_ptr.h"
16#include "core/fxcrt/unowned_ptr.h"
17#include "core/fxcrt/widestring.h"
18#include "core/fxge/dib/fx_dib.h"
19#include "fxjs/gc/heap.h"
20#include "v8/include/cppgc/garbage-collected.h"
21#include "v8/include/cppgc/member.h"
22#include "v8/include/cppgc/visitor.h"
23#include "xfa/fgas/layout/cfgas_char.h"
24#include "xfa/fgas/layout/cfgas_textpiece.h"
25#include "xfa/fxfa/fxfa_basic.h"
27class CFGAS_LinkUserData;
29class CFX_CSSComputedStyle;
39class CXFA_TextLayout
final :
public cppgc::GarbageCollected<CXFA_TextLayout> {
44 void Trace(
cppgc::Visitor* visitor)
const;
52 float Layout(
const CFX_SizeF& size);
54 CFX_SizeF
CalcSize(
const CFX_SizeF& minSize,
const CFX_SizeF& maxSize);
60 bool IsLoaded()
const {
return !m_pieceLines.empty(); }
75 int32_t iUnderline = 0;
76 int32_t iLineThrough = 0;
87 std::vector<std::unique_ptr<TextPiece>> m_textPieces;
88 std::vector<size_t> m_charCounts;
101 struct LoaderContext :
public cppgc::GarbageCollected<LoaderContext> {
105 void Trace(
cppgc::Visitor* visitor)
const;
107 bool bSaveLineHeight =
false;
108 bool bFilterSpace =
false;
112 float fStartLineOffset = 0;
115 int32_t iTotalLines = -1;
117 RetainPtr<CFX_CSSComputedStyle> pParentStyle;
118 cppgc::Member<CXFA_Node> pNode;
119 std::vector<
float> lineHeights;
120 std::vector<BlockHeight> blockHeights;
125 void GetTextDataNode();
127 std::unique_ptr<CFGAS_RTFBreak> CreateBreak(
bool bDefault);
128 void InitBreak(
float fLineWidth);
129 void InitBreak(CFX_CSSComputedStyle* pStyle,
133 CFX_CSSComputedStyle* pParentStyle);
134 void Loader(
float textWidth,
float* pLinePos,
bool bSavePieces);
142 RetainPtr<CFX_CSSComputedStyle> pParentStyle,
148 bool AppendChar(
const WideString& wsText,
157 bool IsEnd(
bool bSavePieces);
158 void UpdateAlign(
float fHeight,
float fBottom);
160 PieceLine* pPieceLine,
162 std::vector<TextCharPos>* pCharPos,
165 const PieceLine* pPieceLine,
167 std::vector<TextCharPos>* pCharPos,
169 size_t GetDisplayPos(
const TextPiece* pPiece,
170 std::vector<TextCharPos>* pCharPos);
171 void DoTabstops(CFX_CSSComputedStyle* pStyle, PieceLine* pPieceLine);
172 bool LayoutInternal(size_t szBlockIndex);
173 size_t CountBlocks()
const;
174 size_t GetNextIndexFromLastBlockData()
const;
175 void UpdateLoaderHeight(
float fTextHeight);
177 bool m_bHasBlock =
false;
178 bool m_bRichText =
false;
179 int32_t m_iLines = 0;
180 float m_fMaxWidth = 0;
181 std::vector<BlockData> m_Blocks;
182 cppgc::Member<CXFA_FFDoc>
const m_pDoc;
183 cppgc::Member<CXFA_TextProvider>
const m_pTextProvider;
184 cppgc::Member<CXFA_Node> m_pTextDataNode;
185 cppgc::Member<CXFA_TextParser> m_pTextParser;
186 cppgc::Member<LoaderContext> m_pLoader;
187 std::unique_ptr<CFGAS_RTFBreak> m_pBreak;
188 std::vector<std::unique_ptr<PieceLine>> m_pieceLines;
189 std::unique_ptr<CXFA_TextTabstopsContext> m_pTabstopContext;
friend class EventParamScope
static bool IsXMLNameChar(wchar_t ch, bool bFirstChar)
CXFA_Script * GetScriptIfExists()
bool TestStatusBits(Mask< XFA_WidgetStatus > val) const
CXFA_EventParam(XFA_EVENTTYPE type)
virtual WideString GetAppTitle() const =0
virtual int32_t MsgBox(const WideString &wsMessage, const WideString &wsTitle, uint32_t dwIconType, uint32_t dwButtonType)=0
CallbackIface * GetAppProvider() const
UpdateScope(CXFA_FFDocView *pDocView)
void InvalidateRect(CXFA_FFPageView *pPageView, const CFX_RectF &rtInvalidate)
CXFA_FFWidgetHandler * GetWidgetHandler()
void AddValidateNode(CXFA_Node *node)
void ResetNode(CXFA_Node *pNode)
void AddCalculateNodeNotify(CXFA_Node *pNodeChange)
CXFA_FFDoc * GetDoc() const
bool SetFocus(CXFA_FFWidget *pNewFocus)
void DeleteLayoutItem(CXFA_FFWidget *pWidget)
void AddNewFormNode(CXFA_Node *pNode)
void OnPageViewEvent(CXFA_ViewLayoutItem *pSender, CXFA_FFDoc::PageViewEvent eEvent)
CXFA_FFWidget * GetWidgetByName(const WideString &wsName, CXFA_FFWidget *pRefWidget)
CXFA_FFPageView * GetPageView(int32_t nIndex) const
void SetFocusNode(CXFA_Node *pNode)
void AddCalculateNode(CXFA_Node *node)
CXFA_LayoutProcessor * GetLayoutProcessor() const
int32_t CountPageViews() const
XFA_EventError ExecEventActivityByDeepFirst(CXFA_Node *pFormNode, XFA_EVENTTYPE eEventType, bool bIsFormReady, bool bRecursive)
CXFA_Node * GetRootSubform()
void AddNullTestMsg(const WideString &msg)
void ProcessValueChanged(CXFA_Node *node)
void UpdateUIDisplay(CXFA_Node *pNode, CXFA_FFWidget *pExcept)
CXFA_FFWidget * GetWidgetForNode(CXFA_Node *node)
void AddIndexChangedSubform(CXFA_Subform *pNode)
bool IsValidationsEnabled() const
bool CommitData() override
void OnDrawWidget(CFGAS_GEGraphics *pGraphics, const CFX_Matrix &matrix) override
void OnProcessEvent(CFWL_Event *pEvent) override
bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command) override
void Trace(cppgc::Visitor *visitor) const override
~CXFA_FFImageEdit() override
bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool LoadWidget() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
FormFieldType GetFormFieldType() override
void SetFWLRect() override
bool UpdateFWLData() override
void OnProcessMessage(CFWL_Message *pMessage) override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
bool LoadWidget() override
~CXFA_FFSignature() override
bool OnMouseWheel(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, const CFX_Vector &delta) override
bool OnMouseExit() override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
FWL_WidgetHit HitTest(const CFX_PointF &point) override
bool OnKeyDown(XFA_FWL_VKEYCODE dwKeyCode, Mask< XFA_FWL_KeyFlag > dwFlags) override
bool OnRButtonDblClk(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnRButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnRButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnChar(uint32_t dwChar, Mask< XFA_FWL_KeyFlag > dwFlags) override
bool OnMouseEnter() override
bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command) override
FormFieldType GetFormFieldType() override
bool LoadWidget() override
bool OnMouseMove(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnLButtonDblClk(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnLButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
bool OnMouseMove(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
FWL_WidgetHit HitTest(const CFX_PointF &point) override
bool OnLButtonUp(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
void RenderWidget(CFGAS_GEGraphics *pGS, const CFX_Matrix &matrix, HighlightOption highlight) override
bool PerformLayout() override
bool AcceptsFocusOnButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point, CFWL_MessageMouse::MouseCommand command) override
bool OnLButtonDown(Mask< XFA_FWL_KeyFlag > dwFlags, const CFX_PointF &point) override
int32_t CountPages() const
CXFA_LayoutItem * GetLayoutItem(CXFA_Node *pFormItem)
CXFA_ViewLayoutItem * GetPage(int32_t index) const
CXFA_Node * GetFirstContainerChild() const
CXFA_Node * GetNextContainerSibling() const
CXFA_Validate * GetValidateIfExists() const
CXFA_Calculate * GetCalculateIfExists() const
bool DeleteItem(int32_t nIndex, bool bNotify, bool bScriptModify)
void SetFlag(XFA_NodeFlag dwFlag)
XFA_EventError ExecuteScript(CXFA_FFDocView *pDocView, CXFA_Script *script, CXFA_EventParam *pEventParam)
bool IsUserInteractive() const
XFA_EventError ProcessEvent(CXFA_FFDocView *pDocView, XFA_AttributeValue iActivity, CXFA_EventParam *pEventParam)
bool IsWidgetReady() const
XFA_FFWidgetType GetFFWidgetType()
XFA_EventError ProcessValidate(CXFA_FFDocView *pDocView, int32_t iFlags)
XFA_EventError ProcessCalculate(CXFA_FFDocView *pDocView)
bool HasRemovedChildren() const
XFA_Element GetElementType() const
CXFA_Document * GetDocument() const
CXFA_ReadyNodeIterator(CXFA_Node *pTravelRoot)
float StartLayout(float fWidth)
WideString GetLinkURLAtPoint(const CFX_PointF &point)
CFX_SizeF CalcSize(const CFX_SizeF &minSize, const CFX_SizeF &maxSize)
bool DrawString(CFX_RenderDevice *pFxDevice, const CFX_Matrix &mtDoc2Device, const CFX_RectF &rtClip, size_t szBlockIndex)
float DoLayout(float fTextHeight)
float DoSplitLayout(size_t szBlockIndex, float fCalcHeight, float fTextHeight)
float Layout(const CFX_SizeF &size)
void ItemBlocks(const CFX_RectF &rtText, size_t szBlockIndex)
CXFA_Node * GetTextNode(bool *bRichText)
CXFA_Para * GetParaIfExists()
bool IsCheckButtonAndAutoWidth() const
CXFA_Font * GetFontIfExists()
void Trace(cppgc::Visitor *visitor) const
absl::optional< WideString > GetEmbeddedObj(const WideString &wsAttr) const
CXFA_FFPageView * GetPageView() const
WideString & operator+=(const WideString &str)
bool operator==(const WideString &other) const
static WideString Format(const wchar_t *pFormat,...)
bool EqualsASCII(ByteStringView that) const
CXFA_FFWidget * GetFFWidget(CXFA_ContentLayoutItem *item)
@ XFA_EVENT_InitCalculate
static XFA_EventError XFA_ProcessEvent(CXFA_FFDocView *pDocView, CXFA_Node *pNode, CXFA_EventParam *pParam)
const XFA_AttributeValue kXFAEventActivity[]
CXFA_ContentLayoutItem * ToContentLayoutItem(CXFA_LayoutItem *item)
#define CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED
WideString operator+(const wchar_t *str1, const WideString &str2)
void XFA_EventErrorAccumulate(XFA_EventError *pAcc, XFA_EventError eNew)