Break circular includes between fpdfsdk/ and fpdfsdk/pwl.
The CPWL_Wnd::PrivateData interface replaces all use of
CPDFSDK_Widget at the pwl/ layer. In turn, IPWL_SystemHandler
can no longer use a widget, so it must use PrivateData instead.
This then hits the "no forward declaration of nested classes"
gotcha, so PrivateData moves to IPWL_SystemHandler and is renamed
PerWindowData.
Change-Id: I98153e2def05cf2d582b96b2bec3dc905c97910a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58814
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/pwl/cpwl_button.cpp b/fpdfsdk/pwl/cpwl_button.cpp
index cf0f348..7554254 100644
--- a/fpdfsdk/pwl/cpwl_button.cpp
+++ b/fpdfsdk/pwl/cpwl_button.cpp
@@ -10,8 +10,9 @@
#include "fpdfsdk/pwl/cpwl_wnd.h"
-CPWL_Button::CPWL_Button(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_Button::CPWL_Button(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)) {
GetCreationParams()->eCursorType = FXCT_HAND;
}
diff --git a/fpdfsdk/pwl/cpwl_button.h b/fpdfsdk/pwl/cpwl_button.h
index 6d4aec6..e7760dd 100644
--- a/fpdfsdk/pwl/cpwl_button.h
+++ b/fpdfsdk/pwl/cpwl_button.h
@@ -10,11 +10,12 @@
#include <memory>
#include "fpdfsdk/pwl/cpwl_wnd.h"
+#include "fpdfsdk/pwl/ipwl_systemhandler.h"
class CPWL_Button : public CPWL_Wnd {
public:
CPWL_Button(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_Button() override;
// CPWL_Wnd
diff --git a/fpdfsdk/pwl/cpwl_caret.cpp b/fpdfsdk/pwl/cpwl_caret.cpp
index 7447955..581ddb6 100644
--- a/fpdfsdk/pwl/cpwl_caret.cpp
+++ b/fpdfsdk/pwl/cpwl_caret.cpp
@@ -14,8 +14,9 @@
#include "core/fxge/cfx_renderdevice.h"
#include "fpdfsdk/pwl/cpwl_wnd.h"
-CPWL_Caret::CPWL_Caret(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_Caret::CPWL_Caret(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)) {}
CPWL_Caret::~CPWL_Caret() = default;
diff --git a/fpdfsdk/pwl/cpwl_caret.h b/fpdfsdk/pwl/cpwl_caret.h
index 44c20f3..482ea5b 100644
--- a/fpdfsdk/pwl/cpwl_caret.h
+++ b/fpdfsdk/pwl/cpwl_caret.h
@@ -14,7 +14,7 @@
class CPWL_Caret final : public CPWL_Wnd {
public:
CPWL_Caret(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_Caret() override;
// CPWL_Wnd
diff --git a/fpdfsdk/pwl/cpwl_combo_box.cpp b/fpdfsdk/pwl/cpwl_combo_box.cpp
index 1a9e248..b3da885 100644
--- a/fpdfsdk/pwl/cpwl_combo_box.cpp
+++ b/fpdfsdk/pwl/cpwl_combo_box.cpp
@@ -28,8 +28,9 @@
} // namespace
-CPWL_CBListBox::CPWL_CBListBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_CBListBox::CPWL_CBListBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_ListBox(cp, std::move(pAttachedData)) {}
CPWL_CBListBox::~CPWL_CBListBox() = default;
@@ -102,8 +103,9 @@
return OnNotifySelectionChanged(true, nFlag);
}
-CPWL_CBButton::CPWL_CBButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_CBButton::CPWL_CBButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)) {}
CPWL_CBButton::~CPWL_CBButton() = default;
@@ -159,8 +161,9 @@
return true;
}
-CPWL_ComboBox::CPWL_ComboBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_ComboBox::CPWL_ComboBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)) {
GetCreationParams()->dwFlags &= ~PWS_HSCROLL;
GetCreationParams()->dwFlags &= ~PWS_VSCROLL;
diff --git a/fpdfsdk/pwl/cpwl_combo_box.h b/fpdfsdk/pwl/cpwl_combo_box.h
index c059b5c..8b9bf12 100644
--- a/fpdfsdk/pwl/cpwl_combo_box.h
+++ b/fpdfsdk/pwl/cpwl_combo_box.h
@@ -16,8 +16,9 @@
class CPWL_CBListBox final : public CPWL_ListBox {
public:
- CPWL_CBListBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_CBListBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_CBListBox() override;
// CPWL_ListBox
@@ -31,8 +32,9 @@
class CPWL_CBButton final : public CPWL_Wnd {
public:
- CPWL_CBButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_CBButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_CBButton() override;
// CPWL_Wnd
@@ -44,8 +46,9 @@
class CPWL_ComboBox final : public CPWL_Wnd {
public:
- CPWL_ComboBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_ComboBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_ComboBox() override;
CPWL_Edit* GetEdit() const { return m_pEdit.Get(); }
diff --git a/fpdfsdk/pwl/cpwl_edit.cpp b/fpdfsdk/pwl/cpwl_edit.cpp
index 99fe2c2..77491da 100644
--- a/fpdfsdk/pwl/cpwl_edit.cpp
+++ b/fpdfsdk/pwl/cpwl_edit.cpp
@@ -27,8 +27,9 @@
#include "fpdfsdk/pwl/cpwl_wnd.h"
#include "public/fpdf_fwlevent.h"
-CPWL_Edit::CPWL_Edit(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_Edit::CPWL_Edit(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_EditCtrl(cp, std::move(pAttachedData)) {}
CPWL_Edit::~CPWL_Edit() {
diff --git a/fpdfsdk/pwl/cpwl_edit.h b/fpdfsdk/pwl/cpwl_edit.h
index 0e16a7f..02de67c 100644
--- a/fpdfsdk/pwl/cpwl_edit.h
+++ b/fpdfsdk/pwl/cpwl_edit.h
@@ -13,19 +13,21 @@
#include "core/fpdfdoc/cpvt_wordrange.h"
#include "core/fxcrt/unowned_ptr.h"
#include "fpdfsdk/pwl/cpwl_edit_ctrl.h"
+#include "fpdfsdk/pwl/ipwl_systemhandler.h"
class IPWL_Filler_Notify {
public:
virtual ~IPWL_Filler_Notify() = default;
// Must write to |bBottom| and |fPopupRet|.
- virtual void QueryWherePopup(const CPWL_Wnd::PrivateData* pAttached,
- float fPopupMin,
- float fPopupMax,
- bool* bBottom,
- float* fPopupRet) = 0;
+ virtual void QueryWherePopup(
+ const IPWL_SystemHandler::PerWindowData* pAttached,
+ float fPopupMin,
+ float fPopupMax,
+ bool* bBottom,
+ float* fPopupRet) = 0;
virtual std::pair<bool, bool> OnBeforeKeyStroke(
- const CPWL_Wnd::PrivateData* pAttached,
+ const IPWL_SystemHandler::PerWindowData* pAttached,
WideString& strChange,
const WideString& strChangeEx,
int nSelStart,
@@ -34,16 +36,19 @@
uint32_t nFlag) = 0;
#ifdef PDF_ENABLE_XFA
- virtual bool OnPopupPreOpen(const CPWL_Wnd::PrivateData* pAttached,
- uint32_t nFlag) = 0;
- virtual bool OnPopupPostOpen(const CPWL_Wnd::PrivateData* pAttached,
- uint32_t nFlag) = 0;
+ virtual bool OnPopupPreOpen(
+ const IPWL_SystemHandler::PerWindowData* pAttached,
+ uint32_t nFlag) = 0;
+ virtual bool OnPopupPostOpen(
+ const IPWL_SystemHandler::PerWindowData* pAttached,
+ uint32_t nFlag) = 0;
#endif // PDF_ENABLE_XFA
};
class CPWL_Edit final : public CPWL_EditCtrl {
public:
- CPWL_Edit(const CreateParams& cp, std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_Edit(const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_Edit() override;
// CPWL_EditCtrl
diff --git a/fpdfsdk/pwl/cpwl_edit_ctrl.cpp b/fpdfsdk/pwl/cpwl_edit_ctrl.cpp
index 28d9168..efdafce 100644
--- a/fpdfsdk/pwl/cpwl_edit_ctrl.cpp
+++ b/fpdfsdk/pwl/cpwl_edit_ctrl.cpp
@@ -17,8 +17,9 @@
#include "public/fpdf_fwlevent.h"
#include "third_party/base/ptr_util.h"
-CPWL_EditCtrl::CPWL_EditCtrl(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_EditCtrl::CPWL_EditCtrl(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)),
m_pEdit(pdfium::MakeUnique<CPWL_EditImpl>()) {
GetCreationParams()->eCursorType = FXCT_VBEAM;
diff --git a/fpdfsdk/pwl/cpwl_edit_ctrl.h b/fpdfsdk/pwl/cpwl_edit_ctrl.h
index df504d8..9cd92bf 100644
--- a/fpdfsdk/pwl/cpwl_edit_ctrl.h
+++ b/fpdfsdk/pwl/cpwl_edit_ctrl.h
@@ -23,8 +23,9 @@
class CPWL_EditCtrl : public CPWL_Wnd {
public:
- CPWL_EditCtrl(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_EditCtrl(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_EditCtrl() override;
void SetSelection(int32_t nStartChar, int32_t nEndChar);
diff --git a/fpdfsdk/pwl/cpwl_icon.cpp b/fpdfsdk/pwl/cpwl_icon.cpp
index 946c76f..9d47067 100644
--- a/fpdfsdk/pwl/cpwl_icon.cpp
+++ b/fpdfsdk/pwl/cpwl_icon.cpp
@@ -15,8 +15,9 @@
#include "core/fpdfapi/parser/cpdf_stream.h"
#include "fpdfsdk/pwl/cpwl_wnd.h"
-CPWL_Icon::CPWL_Icon(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_Icon::CPWL_Icon(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)) {}
CPWL_Icon::~CPWL_Icon() = default;
diff --git a/fpdfsdk/pwl/cpwl_icon.h b/fpdfsdk/pwl/cpwl_icon.h
index c1cc195..859f686 100644
--- a/fpdfsdk/pwl/cpwl_icon.h
+++ b/fpdfsdk/pwl/cpwl_icon.h
@@ -16,7 +16,8 @@
class CPWL_Icon final : public CPWL_Wnd {
public:
- CPWL_Icon(const CreateParams& cp, std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_Icon(const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_Icon() override;
void SetIconFit(CPDF_IconFit* pIconFit) { m_pIconFit = pIconFit; }
diff --git a/fpdfsdk/pwl/cpwl_list_box.cpp b/fpdfsdk/pwl/cpwl_list_box.cpp
index f6f7201..56712a8 100644
--- a/fpdfsdk/pwl/cpwl_list_box.cpp
+++ b/fpdfsdk/pwl/cpwl_list_box.cpp
@@ -65,8 +65,9 @@
m_pList->InvalidateRect(pRect);
}
-CPWL_ListBox::CPWL_ListBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_ListBox::CPWL_ListBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Wnd(cp, std::move(pAttachedData)),
m_pList(pdfium::MakeUnique<CPWL_ListCtrl>()) {}
diff --git a/fpdfsdk/pwl/cpwl_list_box.h b/fpdfsdk/pwl/cpwl_list_box.h
index ab53b70..ba3a653 100644
--- a/fpdfsdk/pwl/cpwl_list_box.h
+++ b/fpdfsdk/pwl/cpwl_list_box.h
@@ -38,8 +38,9 @@
class CPWL_ListBox : public CPWL_Wnd {
public:
- CPWL_ListBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_ListBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_ListBox() override;
// CPWL_Wnd
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.cpp b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
index f5cdc01..f272a89 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.cpp
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
@@ -106,10 +106,11 @@
SetPos(ScrollRange.fMin);
}
-CPWL_SBButton::CPWL_SBButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData,
- PWL_SCROLLBAR_TYPE eScrollBarType,
- PWL_SBBUTTON_TYPE eButtonType)
+CPWL_SBButton::CPWL_SBButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
+ PWL_SCROLLBAR_TYPE eScrollBarType,
+ PWL_SBBUTTON_TYPE eButtonType)
: CPWL_Wnd(cp, std::move(pAttachedData)),
m_eScrollBarType(eScrollBarType),
m_eSBButtonType(eButtonType) {
@@ -298,9 +299,10 @@
return true;
}
-CPWL_ScrollBar::CPWL_ScrollBar(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData,
- PWL_SCROLLBAR_TYPE sbType)
+CPWL_ScrollBar::CPWL_ScrollBar(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
+ PWL_SCROLLBAR_TYPE sbType)
: CPWL_Wnd(cp, std::move(pAttachedData)), m_sbType(sbType) {
GetCreationParams()->eCursorType = FXCT_ARROW;
}
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.h b/fpdfsdk/pwl/cpwl_scroll_bar.h
index 414f718..00fdece 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.h
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.h
@@ -43,10 +43,11 @@
class CPWL_SBButton final : public CPWL_Wnd {
public:
- CPWL_SBButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData,
- PWL_SCROLLBAR_TYPE eScrollBarType,
- PWL_SBBUTTON_TYPE eButtonType);
+ CPWL_SBButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
+ PWL_SCROLLBAR_TYPE eScrollBarType,
+ PWL_SBBUTTON_TYPE eButtonType);
~CPWL_SBButton() override;
// CPWL_Wnd
@@ -114,9 +115,10 @@
class CPWL_ScrollBar final : public CPWL_Wnd {
public:
- CPWL_ScrollBar(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData,
- PWL_SCROLLBAR_TYPE sbType);
+ CPWL_ScrollBar(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData,
+ PWL_SCROLLBAR_TYPE sbType);
~CPWL_ScrollBar() override;
// CPWL_Wnd:
diff --git a/fpdfsdk/pwl/cpwl_special_button.cpp b/fpdfsdk/pwl/cpwl_special_button.cpp
index 16f8c89..3fbf919 100644
--- a/fpdfsdk/pwl/cpwl_special_button.cpp
+++ b/fpdfsdk/pwl/cpwl_special_button.cpp
@@ -11,8 +11,9 @@
#include "fpdfsdk/pwl/cpwl_button.h"
#include "fpdfsdk/pwl/cpwl_wnd.h"
-CPWL_PushButton::CPWL_PushButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_PushButton::CPWL_PushButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Button(cp, std::move(pAttachedData)) {}
CPWL_PushButton::~CPWL_PushButton() = default;
@@ -22,8 +23,9 @@
static_cast<float>(GetBorderWidth()));
}
-CPWL_CheckBox::CPWL_CheckBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_CheckBox::CPWL_CheckBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Button(cp, std::move(pAttachedData)) {}
CPWL_CheckBox::~CPWL_CheckBox() = default;
@@ -41,8 +43,9 @@
return true;
}
-CPWL_RadioButton::CPWL_RadioButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_RadioButton::CPWL_RadioButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: CPWL_Button(cp, std::move(pAttachedData)) {}
CPWL_RadioButton::~CPWL_RadioButton() = default;
diff --git a/fpdfsdk/pwl/cpwl_special_button.h b/fpdfsdk/pwl/cpwl_special_button.h
index 68bb965..3d9fa25 100644
--- a/fpdfsdk/pwl/cpwl_special_button.h
+++ b/fpdfsdk/pwl/cpwl_special_button.h
@@ -13,8 +13,9 @@
class CPWL_PushButton final : public CPWL_Button {
public:
- CPWL_PushButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_PushButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_PushButton() override;
// CPWL_Button:
@@ -23,8 +24,9 @@
class CPWL_CheckBox final : public CPWL_Button {
public:
- CPWL_CheckBox(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_CheckBox(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_CheckBox() override;
// CPWL_Button:
@@ -40,8 +42,9 @@
class CPWL_RadioButton final : public CPWL_Button {
public:
- CPWL_RadioButton(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_RadioButton(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_RadioButton() override;
// CPWL_Button
diff --git a/fpdfsdk/pwl/cpwl_wnd.cpp b/fpdfsdk/pwl/cpwl_wnd.cpp
index 0b77ee4..15e4d45 100644
--- a/fpdfsdk/pwl/cpwl_wnd.cpp
+++ b/fpdfsdk/pwl/cpwl_wnd.cpp
@@ -12,7 +12,6 @@
#include <vector>
#include "core/fxge/cfx_renderdevice.h"
-#include "fpdfsdk/cpdfsdk_widget.h"
#include "fpdfsdk/pwl/cpwl_scroll_bar.h"
#include "public/fpdf_fwlevent.h"
#include "third_party/base/ptr_util.h"
@@ -118,8 +117,9 @@
return !!(nFlag & FWL_EVENTFLAG_AltKey);
}
-CPWL_Wnd::CPWL_Wnd(const CreateParams& cp,
- std::unique_ptr<PrivateData> pAttachedData)
+CPWL_Wnd::CPWL_Wnd(
+ const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData)
: m_CreationParams(cp), m_pAttachedData(std::move(pAttachedData)) {}
CPWL_Wnd::~CPWL_Wnd() {
@@ -254,26 +254,21 @@
}
bool CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
- if (!IsValid())
+ if (!IsValid())
return true;
- ObservedPtr<CPWL_Wnd> thisObserved(this);
- CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect();
- if (!HasFlag(PWS_NOREFRESHCLIP)) {
- CFX_FloatRect rcClip = GetClipRect();
- if (!rcClip.IsEmpty())
- rcRefresh.Intersect(rcClip);
- }
+ ObservedPtr<CPWL_Wnd> thisObserved(this);
+ CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect();
+ if (!HasFlag(PWS_NOREFRESHCLIP)) {
+ CFX_FloatRect rcClip = GetClipRect();
+ if (!rcClip.IsEmpty())
+ rcRefresh.Intersect(rcClip);
+ }
CFX_FloatRect rcWin = PWLtoWnd(rcRefresh);
rcWin.Inflate(1, 1);
rcWin.Normalize();
-
- CPDFSDK_Widget* widget = m_pAttachedData->GetWidget();
- if (!widget)
- return true;
-
- GetSystemHandler()->InvalidateRect(widget, rcWin);
+ GetSystemHandler()->InvalidateRect(m_pAttachedData.get(), rcWin);
return !!thisObserved;
}
@@ -528,7 +523,8 @@
void CPWL_Wnd::OnKillFocus() {}
-std::unique_ptr<CPWL_Wnd::PrivateData> CPWL_Wnd::CloneAttachedData() const {
+std::unique_ptr<IPWL_SystemHandler::PerWindowData> CPWL_Wnd::CloneAttachedData()
+ const {
return m_pAttachedData ? m_pAttachedData->Clone() : nullptr;
}
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h
index d0fe7b7..75a271b 100644
--- a/fpdfsdk/pwl/cpwl_wnd.h
+++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -17,13 +17,12 @@
#include "core/fxge/cfx_renderdevice.h"
#include "fpdfsdk/pwl/cpwl_timer.h"
#include "fpdfsdk/pwl/cpwl_timer_handler.h"
+#include "fpdfsdk/pwl/ipwl_systemhandler.h"
-class CPDFSDK_Widget;
class CPWL_Edit;
class CPWL_MsgControl;
class CPWL_ScrollBar;
class IPVT_FontMap;
-class IPWL_SystemHandler;
struct PWL_SCROLL_INFO;
// window styles
@@ -94,19 +93,13 @@
class CPWL_Wnd : public CPWL_TimerHandler, public Observable {
public:
- class PrivateData {
- public:
- virtual ~PrivateData() = default;
- virtual std::unique_ptr<PrivateData> Clone() const = 0;
- virtual CPDFSDK_Widget* GetWidget() const = 0;
- };
-
class ProviderIface : public Observable {
public:
virtual ~ProviderIface() = default;
// get a matrix which map user space to CWnd client space
- virtual CFX_Matrix GetWindowMatrix(const PrivateData* pAttached) = 0;
+ virtual CFX_Matrix GetWindowMatrix(
+ const IPWL_SystemHandler::PerWindowData* pAttached) = 0;
};
class FocusHandlerIface {
@@ -144,7 +137,8 @@
static bool IsCTRLKeyDown(uint32_t nFlag);
static bool IsALTKeyDown(uint32_t nFlag);
- CPWL_Wnd(const CreateParams& cp, std::unique_ptr<PrivateData> pAttachedData);
+ CPWL_Wnd(const CreateParams& cp,
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData);
~CPWL_Wnd() override;
// Returns |true| iff this instance is still allocated.
@@ -227,8 +221,10 @@
const CFX_FloatRect& GetClipRect() const;
CPWL_Wnd* GetParentWindow() const { return m_pParent.Get(); }
- const PrivateData* GetAttachedData() const { return m_pAttachedData.get(); }
- std::unique_ptr<PrivateData> CloneAttachedData() const;
+ const IPWL_SystemHandler::PerWindowData* GetAttachedData() const {
+ return m_pAttachedData.get();
+ }
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> CloneAttachedData() const;
bool WndHitTest(const CFX_PointF& point) const;
bool ClientHitTest(const CFX_PointF& point) const;
@@ -315,7 +311,7 @@
CPWL_MsgControl* GetMsgControl() const;
CreateParams m_CreationParams;
- std::unique_ptr<PrivateData> m_pAttachedData;
+ std::unique_ptr<IPWL_SystemHandler::PerWindowData> m_pAttachedData;
UnownedPtr<CPWL_Wnd> m_pParent;
std::vector<std::unique_ptr<CPWL_Wnd>> m_Children;
UnownedPtr<CPWL_ScrollBar> m_pVScrollBar;
diff --git a/fpdfsdk/pwl/ipwl_systemhandler.h b/fpdfsdk/pwl/ipwl_systemhandler.h
index 3607e73..017bffe 100644
--- a/fpdfsdk/pwl/ipwl_systemhandler.h
+++ b/fpdfsdk/pwl/ipwl_systemhandler.h
@@ -7,18 +7,25 @@
#ifndef FPDFSDK_PWL_IPWL_SYSTEMHANDLER_H_
#define FPDFSDK_PWL_IPWL_SYSTEMHANDLER_H_
+#include <memory>
+
#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/fx_system.h"
#include "core/fxcrt/timerhandler_iface.h"
-class CPDFSDK_Widget;
class CFFL_FormFiller;
class IPWL_SystemHandler : public TimerHandlerIface {
public:
+ class PerWindowData {
+ public:
+ virtual ~PerWindowData() = default;
+ virtual std::unique_ptr<PerWindowData> Clone() const = 0;
+ };
+
~IPWL_SystemHandler() override = default;
- virtual void InvalidateRect(CPDFSDK_Widget* widget,
+ virtual void InvalidateRect(PerWindowData* pWidgetData,
const CFX_FloatRect& rect) = 0;
virtual void OutputSelectedRect(CFFL_FormFiller* pFormFiller,
const CFX_FloatRect& rect) = 0;