Add another interface to prevent fwl -> fxfa inclusion.
- Also add a comment for a class declaration that had me scratching
my head for a few moments when I read it.
Change-Id: If6ed1ae3c5ceadea36b0b1b6cc10ea7c694e489f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55130
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index fcd4159..7d09f71 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -907,17 +907,12 @@
pRect->Offset(rtOuter.left, rtOuter.top);
}
- CXFA_FFWidget* pXFAWidget = pOuter->GetFFWidget();
+ CFWL_Widget::AdapterIface* pXFAWidget = pOuter->GetFFWidget();
if (!pXFAWidget)
return;
- IXFA_DocEnvironment* pDocEnvironment =
- pXFAWidget->GetDoc()->GetDocEnvironment();
- if (!pDocEnvironment)
- return;
-
CFX_RectF rt = pXFAWidget->GetRotateMatrix().TransformRect(*pRect);
- pDocEnvironment->DisplayCaret(pXFAWidget, true, &rt);
+ pXFAWidget->DisplayCaret(true, &rt);
}
void CFWL_Edit::HideCaret(CFX_RectF* pRect) {
@@ -931,16 +926,11 @@
while (pOuter->GetOuter())
pOuter = pOuter->GetOuter();
- CXFA_FFWidget* pXFAWidget = pOuter->GetFFWidget();
+ CFWL_Widget::AdapterIface* pXFAWidget = pOuter->GetFFWidget();
if (!pXFAWidget)
return;
- IXFA_DocEnvironment* pDocEnvironment =
- pXFAWidget->GetDoc()->GetDocEnvironment();
- if (!pDocEnvironment)
- return;
-
- pDocEnvironment->DisplayCaret(pXFAWidget, false, pRect);
+ pXFAWidget->DisplayCaret(false, pRect);
}
bool CFWL_Edit::ValidateNumberChar(wchar_t cNum) {
diff --git a/xfa/fwl/cfwl_widget.h b/xfa/fwl/cfwl_widget.h
index 0fe8e4c..3c15c69 100644
--- a/xfa/fwl/cfwl_widget.h
+++ b/xfa/fwl/cfwl_widget.h
@@ -45,11 +45,18 @@
class CFWL_MessageKey;
class CFWL_Widget;
class CFWL_WidgetMgr;
-class CXFA_FFWidget;
class IFWL_ThemeProvider;
+// NOTE: CFWL_Widget serves as its own delegate until replaced at runtime.
class CFWL_Widget : public IFWL_WidgetDelegate {
public:
+ class AdapterIface {
+ public:
+ virtual ~AdapterIface() {}
+ virtual CFX_Matrix GetRotateMatrix() = 0;
+ virtual void DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) = 0;
+ };
+
~CFWL_Widget() override;
virtual FWL_Type GetClassID() const = 0;
@@ -114,8 +121,8 @@
uint32_t GetEventKey() const { return m_nEventKey; }
void SetEventKey(uint32_t key) { m_nEventKey = key; }
- CXFA_FFWidget* GetFFWidget() const { return m_pFFWidget; }
- void SetFFWidget(CXFA_FFWidget* pItem) { m_pFFWidget = pItem; }
+ AdapterIface* GetFFWidget() const { return m_pFFWidget; }
+ void SetFFWidget(AdapterIface* pItem) { m_pFFWidget = pItem; }
void RepaintRect(const CFX_RectF& pRect);
@@ -166,7 +173,7 @@
bool IsParent(CFWL_Widget* pParent);
uint32_t m_nEventKey = 0;
- CXFA_FFWidget* m_pFFWidget = nullptr;
+ AdapterIface* m_pFFWidget = nullptr;
UnownedPtr<IFWL_WidgetDelegate> m_pDelegate;
};
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index d5c1367..acd74d5 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -549,6 +549,14 @@
return mt;
}
+void CXFA_FFWidget::DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) {
+ IXFA_DocEnvironment* pDocEnvironment = GetDoc()->GetDocEnvironment();
+ if (!pDocEnvironment)
+ return;
+
+ pDocEnvironment->DisplayCaret(this, bVisible, pRtAnchor);
+}
+
bool CXFA_FFWidget::IsLayoutRectEmpty() {
CFX_RectF rtLayout = GetRectWithoutRotate();
return rtLayout.width < 0.1f && rtLayout.height < 0.1f;
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index 1327c54..58ebb66 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -14,6 +14,7 @@
#include "core/fxge/cfx_graphstatedata.h"
#include "xfa/fwl/cfwl_app.h"
#include "xfa/fwl/cfwl_messagemouse.h"
+#include "xfa/fwl/cfwl_widget.h"
#include "xfa/fxfa/fxfa.h"
#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
@@ -61,13 +62,17 @@
int32_t m_iRefCount;
};
-class CXFA_FFWidget {
+class CXFA_FFWidget : public CFWL_Widget::AdapterIface {
public:
enum FocusOption { kDoNotDrawFocus = 0, kDrawFocus };
enum HighlightOption { kNoHighlight = 0, kHighlight };
explicit CXFA_FFWidget(CXFA_Node* pNode);
- virtual ~CXFA_FFWidget();
+ ~CXFA_FFWidget() override;
+
+ // CFWL_Widget::AdapterIface:
+ CFX_Matrix GetRotateMatrix() override;
+ void DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) override;
virtual CFX_RectF GetBBox(FocusOption focus);
virtual void RenderWidget(CXFA_Graphics* pGS,
@@ -141,7 +146,6 @@
return GetLayoutItem()->TestStatusBits(XFA_WidgetStatus_Focused);
}
CFX_PointF Rotate2Normal(const CFX_PointF& point);
- CFX_Matrix GetRotateMatrix();
bool IsLayoutRectEmpty();
CXFA_LayoutItem* GetParent();
bool IsAncestorOf(CXFA_FFWidget* pWidget);
diff --git a/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp b/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp
index 3e25c73..ff8534d 100644
--- a/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp
+++ b/xfa/fxfa/cxfa_fwladapterwidgetmgr.cpp
@@ -17,7 +17,7 @@
if (!pWidget)
return;
- CXFA_FFWidget* pFFWidget = pWidget->GetFFWidget();
+ auto* pFFWidget = static_cast<CXFA_FFWidget*>(pWidget->GetFFWidget());
if (!pFFWidget)
return;
@@ -29,7 +29,7 @@
float fMaxHeight,
const CFX_RectF& rtAnchor,
CFX_RectF* pPopupRect) {
- CXFA_FFWidget* pFFWidget = pWidget->GetFFWidget();
+ auto* pFFWidget = static_cast<CXFA_FFWidget*>(pWidget->GetFFWidget());
CFX_RectF rtRotateAnchor =
pFFWidget->GetRotateMatrix().TransformRect(rtAnchor);
pFFWidget->GetDoc()->GetDocEnvironment()->GetPopupPos(
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp
index 459e44d..0e87554 100644
--- a/xfa/fxfa/cxfa_fwltheme.cpp
+++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -42,7 +42,7 @@
CFWL_Widget* pOuter = pWidget;
while (pOuter && pOuter->GetOuter())
pOuter = pOuter->GetOuter();
- return pOuter ? pOuter->GetFFWidget() : nullptr;
+ return pOuter ? static_cast<CXFA_FFWidget*>(pOuter->GetFFWidget()) : nullptr;
}
CXFA_FWLTheme::CXFA_FWLTheme(CXFA_FFApp* pApp)