Fold DataProviders into parent classes

This CL removes the data provider classes and folds the code into the parent
classes.

Review-Url: https://codereview.chromium.org/2480233003
diff --git a/xfa/fwl/core/cfwl_barcode.cpp b/xfa/fwl/core/cfwl_barcode.cpp
index b12a875..77faefe 100644
--- a/xfa/fwl/core/cfwl_barcode.cpp
+++ b/xfa/fwl/core/cfwl_barcode.cpp
@@ -18,7 +18,8 @@
 
 }  // namespace
 
-CFWL_Barcode::CFWL_Barcode(const IFWL_App* app) : CFWL_Edit(app) {}
+CFWL_Barcode::CFWL_Barcode(const IFWL_App* app)
+    : CFWL_Edit(app), m_dwAttributeMask(FWL_BCDATTRIBUTE_NONE) {}
 
 CFWL_Barcode::~CFWL_Barcode() {}
 
@@ -26,66 +27,79 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_Barcode>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_barcodeData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
 
 void CFWL_Barcode::SetCharEncoding(BC_CHAR_ENCODING encoding) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CHARENCODING;
-  m_barcodeData.m_eCharEncoding = encoding;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_CHARENCODING;
+  m_eCharEncoding = encoding;
 }
+
 void CFWL_Barcode::SetModuleHeight(int32_t height) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEHEIGHT;
-  m_barcodeData.m_nModuleHeight = height;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEHEIGHT;
+  m_nModuleHeight = height;
 }
+
 void CFWL_Barcode::SetModuleWidth(int32_t width) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEWIDTH;
-  m_barcodeData.m_nModuleWidth = width;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEWIDTH;
+  m_nModuleWidth = width;
 }
+
 void CFWL_Barcode::SetDataLength(int32_t dataLength) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_DATALENGTH;
-  m_barcodeData.m_nDataLength = dataLength;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_DATALENGTH;
+  m_nDataLength = dataLength;
   ToBarcode(GetWidget())->SetLimit(dataLength);
 }
+
 void CFWL_Barcode::SetCalChecksum(bool calChecksum) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CALCHECKSUM;
-  m_barcodeData.m_bCalChecksum = calChecksum;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_CALCHECKSUM;
+  m_bCalChecksum = calChecksum;
 }
+
 void CFWL_Barcode::SetPrintChecksum(bool printChecksum) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_PRINTCHECKSUM;
-  m_barcodeData.m_bPrintChecksum = printChecksum;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_PRINTCHECKSUM;
+  m_bPrintChecksum = printChecksum;
 }
+
 void CFWL_Barcode::SetTextLocation(BC_TEXT_LOC location) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_TEXTLOCATION;
-  m_barcodeData.m_eTextLocation = location;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_TEXTLOCATION;
+  m_eTextLocation = location;
 }
+
 void CFWL_Barcode::SetWideNarrowRatio(int32_t ratio) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_WIDENARROWRATIO;
-  m_barcodeData.m_nWideNarrowRatio = ratio;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_WIDENARROWRATIO;
+  m_nWideNarrowRatio = ratio;
 }
+
 void CFWL_Barcode::SetStartChar(FX_CHAR startChar) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_STARTCHAR;
-  m_barcodeData.m_cStartChar = startChar;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_STARTCHAR;
+  m_cStartChar = startChar;
 }
+
 void CFWL_Barcode::SetEndChar(FX_CHAR endChar) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_ENDCHAR;
-  m_barcodeData.m_cEndChar = endChar;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_ENDCHAR;
+  m_cEndChar = endChar;
 }
+
 void CFWL_Barcode::SetVersion(int32_t version) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_VERSION;
-  m_barcodeData.m_nVersion = version;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_VERSION;
+  m_nVersion = version;
 }
+
 void CFWL_Barcode::SetErrorCorrectionLevel(int32_t ecLevel) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_ECLEVEL;
-  m_barcodeData.m_nECLevel = ecLevel;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_ECLEVEL;
+  m_nECLevel = ecLevel;
 }
+
 void CFWL_Barcode::SetTruncated(bool truncated) {
-  m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_TRUNCATED;
-  m_barcodeData.m_bTruncated = truncated;
+  m_dwAttributeMask |= FWL_BCDATTRIBUTE_TRUNCATED;
+  m_bTruncated = truncated;
 }
+
 void CFWL_Barcode::ResetBarcodeAttributes() {
-  m_barcodeData.m_dwAttributeMask = FWL_BCDATTRIBUTE_NONE;
+  m_dwAttributeMask = FWL_BCDATTRIBUTE_NONE;
 }
 
 void CFWL_Barcode::SetType(BC_TYPE type) {
@@ -97,66 +111,63 @@
   return GetWidget() ? ToBarcode(GetWidget())->IsProtectedType() : false;
 }
 
-CFWL_Barcode::CFWL_BarcodeDP::CFWL_BarcodeDP()
-    : m_dwAttributeMask(FWL_BCDATTRIBUTE_NONE) {}
-
-FWL_Error CFWL_Barcode::CFWL_BarcodeDP::GetCaption(IFWL_Widget* pWidget,
-                                                   CFX_WideString& wsCaption) {
+FWL_Error CFWL_Barcode::GetCaption(IFWL_Widget* pWidget,
+                                   CFX_WideString& wsCaption) {
   return FWL_Error::Succeeded;
 }
 
-BC_CHAR_ENCODING CFWL_Barcode::CFWL_BarcodeDP::GetCharEncoding() const {
+BC_CHAR_ENCODING CFWL_Barcode::GetCharEncoding() const {
   return m_eCharEncoding;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetModuleHeight() const {
+int32_t CFWL_Barcode::GetModuleHeight() const {
   return m_nModuleHeight;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetModuleWidth() const {
+int32_t CFWL_Barcode::GetModuleWidth() const {
   return m_nModuleWidth;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetDataLength() const {
+int32_t CFWL_Barcode::GetDataLength() const {
   return m_nDataLength;
 }
 
-bool CFWL_Barcode::CFWL_BarcodeDP::GetCalChecksum() const {
+bool CFWL_Barcode::GetCalChecksum() const {
   return m_bCalChecksum;
 }
 
-bool CFWL_Barcode::CFWL_BarcodeDP::GetPrintChecksum() const {
+bool CFWL_Barcode::GetPrintChecksum() const {
   return m_bPrintChecksum;
 }
 
-BC_TEXT_LOC CFWL_Barcode::CFWL_BarcodeDP::GetTextLocation() const {
+BC_TEXT_LOC CFWL_Barcode::GetTextLocation() const {
   return m_eTextLocation;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetWideNarrowRatio() const {
+int32_t CFWL_Barcode::GetWideNarrowRatio() const {
   return m_nWideNarrowRatio;
 }
 
-FX_CHAR CFWL_Barcode::CFWL_BarcodeDP::GetStartChar() const {
+FX_CHAR CFWL_Barcode::GetStartChar() const {
   return m_cStartChar;
 }
 
-FX_CHAR CFWL_Barcode::CFWL_BarcodeDP::GetEndChar() const {
+FX_CHAR CFWL_Barcode::GetEndChar() const {
   return m_cEndChar;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetVersion() const {
+int32_t CFWL_Barcode::GetVersion() const {
   return m_nVersion;
 }
 
-int32_t CFWL_Barcode::CFWL_BarcodeDP::GetErrorCorrectionLevel() const {
+int32_t CFWL_Barcode::GetErrorCorrectionLevel() const {
   return m_nECLevel;
 }
 
-bool CFWL_Barcode::CFWL_BarcodeDP::GetTruncated() const {
+bool CFWL_Barcode::GetTruncated() const {
   return m_bTruncated;
 }
 
-uint32_t CFWL_Barcode::CFWL_BarcodeDP::GetBarcodeAttributeMask() const {
+uint32_t CFWL_Barcode::GetBarcodeAttributeMask() const {
   return m_dwAttributeMask;
 }
diff --git a/xfa/fwl/core/cfwl_barcode.h b/xfa/fwl/core/cfwl_barcode.h
index b5642d2..be89318 100644
--- a/xfa/fwl/core/cfwl_barcode.h
+++ b/xfa/fwl/core/cfwl_barcode.h
@@ -11,9 +11,7 @@
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_barcode.h"
 
-class CFWL_Widget;
-
-class CFWL_Barcode : public CFWL_Edit {
+class CFWL_Barcode : public CFWL_Edit, public IFWL_BarcodeDP {
  public:
   CFWL_Barcode(const IFWL_App*);
   ~CFWL_Barcode() override;
@@ -38,48 +36,41 @@
   void SetTruncated(bool truncated);
   void ResetBarcodeAttributes();
 
- protected:
-  class CFWL_BarcodeDP : public IFWL_BarcodeDP {
-   public:
-    CFWL_BarcodeDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_BarcodeDP
+  BC_CHAR_ENCODING GetCharEncoding() const override;
+  int32_t GetModuleHeight() const override;
+  int32_t GetModuleWidth() const override;
+  int32_t GetDataLength() const override;
+  bool GetCalChecksum() const override;
+  bool GetPrintChecksum() const override;
+  BC_TEXT_LOC GetTextLocation() const override;
+  int32_t GetWideNarrowRatio() const override;
+  FX_CHAR GetStartChar() const override;
+  FX_CHAR GetEndChar() const override;
+  int32_t GetVersion() const override;
+  int32_t GetErrorCorrectionLevel() const override;
+  bool GetTruncated() const override;
+  uint32_t GetBarcodeAttributeMask() const override;
 
-    // IFWL_BarcodeDP
-    BC_CHAR_ENCODING GetCharEncoding() const override;
-    int32_t GetModuleHeight() const override;
-    int32_t GetModuleWidth() const override;
-    int32_t GetDataLength() const override;
-    bool GetCalChecksum() const override;
-    bool GetPrintChecksum() const override;
-    BC_TEXT_LOC GetTextLocation() const override;
-    int32_t GetWideNarrowRatio() const override;
-    FX_CHAR GetStartChar() const override;
-    FX_CHAR GetEndChar() const override;
-    int32_t GetVersion() const override;
-    int32_t GetErrorCorrectionLevel() const override;
-    bool GetTruncated() const override;
-    uint32_t GetBarcodeAttributeMask() const override;
-
-    BC_CHAR_ENCODING m_eCharEncoding;
-    int32_t m_nModuleHeight;
-    int32_t m_nModuleWidth;
-    int32_t m_nDataLength;
-    bool m_bCalChecksum;
-    bool m_bPrintChecksum;
-    BC_TEXT_LOC m_eTextLocation;
-    int32_t m_nWideNarrowRatio;
-    FX_CHAR m_cStartChar;
-    FX_CHAR m_cEndChar;
-    int32_t m_nVersion;
-    int32_t m_nECLevel;
-    bool m_bTruncated;
-    uint32_t m_dwAttributeMask;
-  };
-
-  CFWL_BarcodeDP m_barcodeData;
+ private:
+  BC_CHAR_ENCODING m_eCharEncoding;
+  int32_t m_nModuleHeight;
+  int32_t m_nModuleWidth;
+  int32_t m_nDataLength;
+  bool m_bCalChecksum;
+  bool m_bPrintChecksum;
+  BC_TEXT_LOC m_eTextLocation;
+  int32_t m_nWideNarrowRatio;
+  FX_CHAR m_cStartChar;
+  FX_CHAR m_cEndChar;
+  int32_t m_nVersion;
+  int32_t m_nECLevel;
+  bool m_bTruncated;
+  uint32_t m_dwAttributeMask;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_BARCODE_H_
diff --git a/xfa/fwl/core/cfwl_checkbox.cpp b/xfa/fwl/core/cfwl_checkbox.cpp
index 9baea41..5372083 100644
--- a/xfa/fwl/core/cfwl_checkbox.cpp
+++ b/xfa/fwl/core/cfwl_checkbox.cpp
@@ -19,7 +19,8 @@
 
 }  // namespace
 
-CFWL_CheckBox::CFWL_CheckBox(const IFWL_App* app) : CFWL_Widget(app) {}
+CFWL_CheckBox::CFWL_CheckBox(const IFWL_App* app)
+    : CFWL_Widget(app), m_fBoxHeight(16.0f), m_wsCaption(L"Check box") {}
 
 CFWL_CheckBox::~CFWL_CheckBox() {}
 
@@ -27,18 +28,18 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_CheckBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_checkboxData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
 
 FWL_Error CFWL_CheckBox::SetCaption(const CFX_WideStringC& wsCaption) {
-  m_checkboxData.m_wsCaption = wsCaption;
+  m_wsCaption = wsCaption;
   return FWL_Error::Succeeded;
 }
 
 FWL_Error CFWL_CheckBox::SetBoxSize(FX_FLOAT fHeight) {
-  m_checkboxData.m_fBoxHeight = fHeight;
+  m_fBoxHeight = fHeight;
   return FWL_Error::Succeeded;
 }
 
@@ -50,16 +51,12 @@
   return ToCheckBox(GetWidget())->SetCheckState(iCheck);
 }
 
-CFWL_CheckBox::CFWL_CheckBoxDP::CFWL_CheckBoxDP()
-    : m_fBoxHeight(16.0f), m_wsCaption(L"Check box") {}
-
-FWL_Error CFWL_CheckBox::CFWL_CheckBoxDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error CFWL_CheckBox::GetCaption(IFWL_Widget* pWidget,
+                                    CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_CheckBox::CFWL_CheckBoxDP::GetBoxSize(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_CheckBox::GetBoxSize(IFWL_Widget* pWidget) {
   return m_fBoxHeight;
 }
diff --git a/xfa/fwl/core/cfwl_checkbox.h b/xfa/fwl/core/cfwl_checkbox.h
index 22574b4..8ab8885 100644
--- a/xfa/fwl/core/cfwl_checkbox.h
+++ b/xfa/fwl/core/cfwl_checkbox.h
@@ -10,7 +10,7 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_checkbox.h"
 
-class CFWL_CheckBox : public CFWL_Widget {
+class CFWL_CheckBox : public CFWL_Widget, public IFWL_CheckBoxDP {
  public:
   CFWL_CheckBox(const IFWL_App*);
   ~CFWL_CheckBox() override;
@@ -22,23 +22,16 @@
   int32_t GetCheckState();
   FWL_Error SetCheckState(int32_t iCheck);
 
- protected:
-  class CFWL_CheckBoxDP : public IFWL_CheckBoxDP {
-   public:
-    CFWL_CheckBoxDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_CheckBoxDP
+  FX_FLOAT GetBoxSize(IFWL_Widget* pWidget) override;
 
-    // IFWL_CheckBoxDP
-    FX_FLOAT GetBoxSize(IFWL_Widget* pWidget) override;
-
-    FX_FLOAT m_fBoxHeight;
-    CFX_WideString m_wsCaption;
-  };
-
-  CFWL_CheckBoxDP m_checkboxData;
+ private:
+  FX_FLOAT m_fBoxHeight;
+  CFX_WideString m_wsCaption;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_CHECKBOX_H_
diff --git a/xfa/fwl/core/cfwl_combobox.cpp b/xfa/fwl/core/cfwl_combobox.cpp
index 60b6e50..fa2698b 100644
--- a/xfa/fwl/core/cfwl_combobox.cpp
+++ b/xfa/fwl/core/cfwl_combobox.cpp
@@ -24,7 +24,8 @@
 
 }  // namespace
 
-CFWL_ComboBox::CFWL_ComboBox(const IFWL_App* app) : CFWL_Widget(app) {}
+CFWL_ComboBox::CFWL_ComboBox(const IFWL_App* app)
+    : CFWL_Widget(app), m_fMaxListHeight(0), m_fItemHeight(0) {}
 
 CFWL_ComboBox::~CFWL_ComboBox() {}
 
@@ -32,7 +33,7 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_ComboBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_comboBoxData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
@@ -41,8 +42,8 @@
   std::unique_ptr<CFWL_ComboBoxItem> pItem(new CFWL_ComboBoxItem);
   pItem->m_wsText = wsText;
   pItem->m_dwStyles = 0;
-  m_comboBoxData.m_ItemArray.push_back(std::move(pItem));
-  return m_comboBoxData.m_ItemArray.size() - 1;
+  m_ItemArray.push_back(std::move(pItem));
+  return m_ItemArray.size() - 1;
 }
 
 int32_t CFWL_ComboBox::AddString(const CFX_WideStringC& wsText,
@@ -51,31 +52,30 @@
   pItem->m_wsText = wsText;
   pItem->m_dwStyles = 0;
   pItem->m_pDIB = pIcon;
-  m_comboBoxData.m_ItemArray.push_back(std::move(pItem));
-  return m_comboBoxData.m_ItemArray.size() - 1;
+  m_ItemArray.push_back(std::move(pItem));
+  return m_ItemArray.size() - 1;
 }
 
 bool CFWL_ComboBox::RemoveAt(int32_t iIndex) {
-  if (iIndex < 0 ||
-      static_cast<size_t>(iIndex) >= m_comboBoxData.m_ItemArray.size()) {
+  if (iIndex < 0 || static_cast<size_t>(iIndex) >= m_ItemArray.size()) {
     return false;
   }
-  m_comboBoxData.m_ItemArray.erase(m_comboBoxData.m_ItemArray.begin() + iIndex);
+  m_ItemArray.erase(m_ItemArray.begin() + iIndex);
   return true;
 }
 
 void CFWL_ComboBox::RemoveAll() {
-  m_comboBoxData.m_ItemArray.clear();
+  m_ItemArray.clear();
 }
 
 int32_t CFWL_ComboBox::CountItems() {
-  return m_comboBoxData.CountItems(GetWidget());
+  return CountItems(GetWidget());
 }
 
 FWL_Error CFWL_ComboBox::GetTextByIndex(int32_t iIndex,
                                         CFX_WideString& wsText) {
-  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
-      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
+  CFWL_ComboBoxItem* pItem =
+      static_cast<CFWL_ComboBoxItem*>(GetItem(m_pIface.get(), iIndex));
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = pItem->m_wsText;
@@ -141,13 +141,13 @@
 }
 
 FWL_Error CFWL_ComboBox::SetMaxListHeight(FX_FLOAT fMaxHeight) {
-  m_comboBoxData.m_fMaxListHeight = fMaxHeight;
+  m_fMaxListHeight = fMaxHeight;
   return FWL_Error::Succeeded;
 }
 
 FWL_Error CFWL_ComboBox::SetItemData(int32_t iIndex, void* pData) {
-  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
-      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
+  CFWL_ComboBoxItem* pItem =
+      static_cast<CFWL_ComboBoxItem*>(GetItem(m_pIface.get(), iIndex));
   if (!pItem)
     return FWL_Error::Indefinite;
   pItem->m_pData = pData;
@@ -155,8 +155,8 @@
 }
 
 void* CFWL_ComboBox::GetItemData(int32_t iIndex) {
-  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
-      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
+  CFWL_ComboBoxItem* pItem =
+      static_cast<CFWL_ComboBoxItem*>(GetItem(m_pIface.get(), iIndex));
   return pItem ? pItem->m_pData : nullptr;
 }
 
@@ -237,34 +237,25 @@
              : FWL_Error::Indefinite;
 }
 
-CFWL_ComboBox::CFWL_ComboBoxDP::CFWL_ComboBoxDP() {
-  m_fItemHeight = 0;
-  m_fMaxListHeight = 0;
-}
-
-CFWL_ComboBox::CFWL_ComboBoxDP::~CFWL_ComboBoxDP() {}
-
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error CFWL_ComboBox::GetCaption(IFWL_Widget* pWidget,
+                                    CFX_WideString& wsCaption) {
   return FWL_Error::Succeeded;
 }
 
-int32_t CFWL_ComboBox::CFWL_ComboBoxDP::CountItems(const IFWL_Widget* pWidget) {
+int32_t CFWL_ComboBox::CountItems(const IFWL_Widget* pWidget) {
   return m_ItemArray.size();
 }
 
-IFWL_ListItem* CFWL_ComboBox::CFWL_ComboBoxDP::GetItem(
-    const IFWL_Widget* pWidget,
-    int32_t nIndex) {
+IFWL_ListItem* CFWL_ComboBox::GetItem(const IFWL_Widget* pWidget,
+                                      int32_t nIndex) {
   if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size())
     return nullptr;
 
   return m_ItemArray[nIndex].get();
 }
 
-int32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIndex(IFWL_Widget* pWidget,
-                                                     IFWL_ListItem* pItem) {
+int32_t CFWL_ComboBox::GetItemIndex(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem) {
   auto it = std::find_if(
       m_ItemArray.begin(), m_ItemArray.end(),
       [pItem](const std::unique_ptr<CFWL_ComboBoxItem>& candidate) {
@@ -273,9 +264,9 @@
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
 
-bool CFWL_ComboBox::CFWL_ComboBoxDP::SetItemIndex(IFWL_Widget* pWidget,
-                                                  IFWL_ListItem* pItem,
-                                                  int32_t nIndex) {
+bool CFWL_ComboBox::SetItemIndex(IFWL_Widget* pWidget,
+                                 IFWL_ListItem* pItem,
+                                 int32_t nIndex) {
   if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size())
     return false;
 
@@ -283,25 +274,25 @@
   return true;
 }
 
-uint32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemStyles(IFWL_Widget* pWidget,
-                                                       IFWL_ListItem* pItem) {
+uint32_t CFWL_ComboBox::GetItemStyles(IFWL_Widget* pWidget,
+                                      IFWL_ListItem* pItem) {
   if (!pItem)
     return 0;
   return static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwStyles;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetItemText(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      CFX_WideString& wsText) {
+FWL_Error CFWL_ComboBox::GetItemText(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     CFX_WideString& wsText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = static_cast<CFWL_ComboBoxItem*>(pItem)->m_wsText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetItemRect(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      CFX_RectF& rtItem) {
+FWL_Error CFWL_ComboBox::GetItemRect(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   CFWL_ComboBoxItem* pComboItem = static_cast<CFWL_ComboBoxItem*>(pItem);
@@ -310,78 +301,73 @@
   return FWL_Error::Succeeded;
 }
 
-void* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemData(IFWL_Widget* pWidget,
-                                                  IFWL_ListItem* pItem) {
+void* CFWL_ComboBox::GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) {
   return pItem ? static_cast<CFWL_ComboBoxItem*>(pItem)->m_pData : nullptr;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemStyles(IFWL_Widget* pWidget,
-                                                        IFWL_ListItem* pItem,
-                                                        uint32_t dwStyle) {
+FWL_Error CFWL_ComboBox::SetItemStyles(IFWL_Widget* pWidget,
+                                       IFWL_ListItem* pItem,
+                                       uint32_t dwStyle) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwStyles = dwStyle;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemText(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      const FX_WCHAR* pszText) {
+FWL_Error CFWL_ComboBox::SetItemText(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     const FX_WCHAR* pszText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_wsText = pszText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemRect(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      const CFX_RectF& rtItem) {
+FWL_Error CFWL_ComboBox::SetItemRect(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem,
+                                     const CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_rtItem = rtItem;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_ComboBox::GetItemHeight(IFWL_Widget* pWidget) {
   return m_fItemHeight;
 }
 
-CFX_DIBitmap* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIcon(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem) {
+CFX_DIBitmap* CFWL_ComboBox::GetItemIcon(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem) {
   return pItem ? static_cast<CFWL_ComboBoxItem*>(pItem)->m_pDIB : nullptr;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
-                                                           IFWL_ListItem* pItem,
-                                                           CFX_RectF& rtCheck) {
+FWL_Error CFWL_ComboBox::GetItemCheckRect(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem,
+                                          CFX_RectF& rtCheck) {
   rtCheck = static_cast<CFWL_ComboBoxItem*>(pItem)->m_rtCheckBox;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckRect(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    const CFX_RectF& rtCheck) {
+FWL_Error CFWL_ComboBox::SetItemCheckRect(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem,
+                                          const CFX_RectF& rtCheck) {
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_rtCheckBox = rtCheck;
   return FWL_Error::Succeeded;
 }
 
-uint32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckState(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem) {
+uint32_t CFWL_ComboBox::GetItemCheckState(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem) {
   return static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwCheckState;
 }
 
-FWL_Error CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckState(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    uint32_t dwCheckState) {
+FWL_Error CFWL_ComboBox::SetItemCheckState(IFWL_Widget* pWidget,
+                                           IFWL_ListItem* pItem,
+                                           uint32_t dwCheckState) {
   static_cast<CFWL_ComboBoxItem*>(pItem)->m_dwCheckState = dwCheckState;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetListHeight(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_ComboBox::GetListHeight(IFWL_Widget* pWidget) {
   return m_fMaxListHeight;
 }
 
diff --git a/xfa/fwl/core/cfwl_combobox.h b/xfa/fwl/core/cfwl_combobox.h
index c85b0e7..cd409ff 100644
--- a/xfa/fwl/core/cfwl_combobox.h
+++ b/xfa/fwl/core/cfwl_combobox.h
@@ -13,11 +13,21 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_combobox.h"
 
-class IFWL_ComboBoxDP;
-class CFWL_ComboBoxDP;
-class CFWL_ComboBoxItem;
+class CFWL_ComboBoxItem : public IFWL_ListItem {
+ public:
+  CFWL_ComboBoxItem();
+  ~CFWL_ComboBoxItem();
 
-class CFWL_ComboBox : public CFWL_Widget {
+  CFX_RectF m_rtItem;
+  uint32_t m_dwStyles;
+  CFX_WideString m_wsText;
+  CFX_DIBitmap* m_pDIB;
+  uint32_t m_dwCheckState;
+  CFX_RectF m_rtCheckBox;
+  void* m_pData;
+};
+
+class CFWL_ComboBox : public CFWL_Widget, public IFWL_ComboBoxDP {
  public:
   CFWL_ComboBox(const IFWL_App*);
   ~CFWL_ComboBox() override;
@@ -68,78 +78,57 @@
   FWL_Error EditModifyStylesEx(uint32_t dwStylesExAdded,
                                uint32_t dwStylesExRemoved);
 
- protected:
-  class CFWL_ComboBoxDP : public IFWL_ComboBoxDP {
-   public:
-    CFWL_ComboBoxDP();
-    ~CFWL_ComboBoxDP() override;
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_ListBoxDP
+  int32_t CountItems(const IFWL_Widget* pWidget) override;
+  IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
+  int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  bool SetItemIndex(IFWL_Widget* pWidget,
+                    IFWL_ListItem* pItem,
+                    int32_t nIndex) override;
 
-    // IFWL_ListBoxDP
-    int32_t CountItems(const IFWL_Widget* pWidget) override;
-    IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
-    int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    bool SetItemIndex(IFWL_Widget* pWidget,
-                      IFWL_ListItem* pItem,
-                      int32_t nIndex) override;
-
-    uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error GetItemText(IFWL_Widget* pWidget,
+  uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error GetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_WideString& wsText) override;
+  FWL_Error GetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_RectF& rtItem) override;
+  void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error SetItemStyles(IFWL_Widget* pWidget,
                           IFWL_ListItem* pItem,
-                          CFX_WideString& wsText) override;
-    FWL_Error GetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          CFX_RectF& rtItem) override;
-    void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error SetItemStyles(IFWL_Widget* pWidget,
-                            IFWL_ListItem* pItem,
-                            uint32_t dwStyle) override;
-    FWL_Error SetItemText(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const FX_WCHAR* pszText) override;
-    FWL_Error SetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const CFX_RectF& rtItem) override;
-    FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
-                              IFWL_ListItem* pItem) override;
-    FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               CFX_RectF& rtCheck) override;
-    FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               const CFX_RectF& rtCheck) override;
-    uint32_t GetItemCheckState(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem) override;
-    FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
-                                IFWL_ListItem* pItem,
-                                uint32_t dwCheckState) override;
+                          uint32_t dwStyle) override;
+  FWL_Error SetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const FX_WCHAR* pszText) override;
+  FWL_Error SetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const CFX_RectF& rtItem) override;
+  FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
+                            IFWL_ListItem* pItem) override;
+  FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             CFX_RectF& rtCheck) override;
+  FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             const CFX_RectF& rtCheck) override;
+  uint32_t GetItemCheckState(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem) override;
+  FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
+                              IFWL_ListItem* pItem,
+                              uint32_t dwCheckState) override;
 
-    // IFWL_ComboBoxDP
-    FX_FLOAT GetListHeight(IFWL_Widget* pWidget) override;
+  // IFWL_ComboBoxDP
+  FX_FLOAT GetListHeight(IFWL_Widget* pWidget) override;
 
-    std::vector<std::unique_ptr<CFWL_ComboBoxItem>> m_ItemArray;
-    FX_FLOAT m_fMaxListHeight;
-    FX_FLOAT m_fItemHeight;
-  };
-  CFWL_ComboBoxDP m_comboBoxData;
-};
-
-class CFWL_ComboBoxItem : public IFWL_ListItem {
- public:
-  CFWL_ComboBoxItem();
-  ~CFWL_ComboBoxItem();
-
-  CFX_RectF m_rtItem;
-  uint32_t m_dwStyles;
-  CFX_WideString m_wsText;
-  CFX_DIBitmap* m_pDIB;
-  uint32_t m_dwCheckState;
-  CFX_RectF m_rtCheckBox;
-  void* m_pData;
+ private:
+  std::vector<std::unique_ptr<CFWL_ComboBoxItem>> m_ItemArray;
+  FX_FLOAT m_fMaxListHeight;
+  FX_FLOAT m_fItemHeight;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_COMBOBOX_H_
diff --git a/xfa/fwl/core/cfwl_datetimepicker.cpp b/xfa/fwl/core/cfwl_datetimepicker.cpp
index fba04b6..554a16b 100644
--- a/xfa/fwl/core/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/core/cfwl_datetimepicker.cpp
@@ -22,7 +22,7 @@
 }  // namespace
 
 CFWL_DateTimePicker::CFWL_DateTimePicker(const IFWL_App* app)
-    : CFWL_Widget(app) {}
+    : CFWL_Widget(app), m_iYear(2011), m_iMonth(1), m_iDay(1) {}
 
 CFWL_DateTimePicker::~CFWL_DateTimePicker() {}
 
@@ -30,7 +30,7 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_DateTimePicker>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_DateTimePickerDP));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
@@ -38,9 +38,9 @@
 FWL_Error CFWL_DateTimePicker::SetToday(int32_t iYear,
                                         int32_t iMonth,
                                         int32_t iDay) {
-  m_DateTimePickerDP.m_iYear = iYear;
-  m_DateTimePickerDP.m_iMonth = iMonth;
-  m_DateTimePickerDP.m_iDay = iDay;
+  m_iYear = iYear;
+  m_iMonth = iMonth;
+  m_iDay = iDay;
   return FWL_Error::Succeeded;
 }
 
@@ -72,24 +72,16 @@
   return ToDateTimePicker(GetWidget())->SetCurSel(iYear, iMonth, iDay);
 }
 
-CFWL_DateTimePicker::CFWL_DateTimePickerDP::CFWL_DateTimePickerDP() {
-  m_iYear = 2011;
-  m_iMonth = 1;
-  m_iDay = 1;
-}
-
-FWL_Error CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error CFWL_DateTimePicker::GetCaption(IFWL_Widget* pWidget,
+                                          CFX_WideString& wsCaption) {
   wsCaption = m_wsData;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetToday(
-    IFWL_Widget* pWidget,
-    int32_t& iYear,
-    int32_t& iMonth,
-    int32_t& iDay) {
+FWL_Error CFWL_DateTimePicker::GetToday(IFWL_Widget* pWidget,
+                                        int32_t& iYear,
+                                        int32_t& iMonth,
+                                        int32_t& iDay) {
   iYear = m_iYear;
   iMonth = m_iMonth;
   iDay = m_iDay;
diff --git a/xfa/fwl/core/cfwl_datetimepicker.h b/xfa/fwl/core/cfwl_datetimepicker.h
index 327364c..2b5277f 100644
--- a/xfa/fwl/core/cfwl_datetimepicker.h
+++ b/xfa/fwl/core/cfwl_datetimepicker.h
@@ -10,7 +10,7 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_datetimepicker.h"
 
-class CFWL_DateTimePicker : public CFWL_Widget {
+class CFWL_DateTimePicker : public CFWL_Widget, public IFWL_DateTimePickerDP {
  public:
   CFWL_DateTimePicker(const IFWL_App*);
   ~CFWL_DateTimePicker() override;
@@ -42,27 +42,21 @@
   FWL_Error ModifyEditStylesEx(uint32_t dwStylesExAdded,
                                uint32_t dwStylesExRemoved);
 
- protected:
-  class CFWL_DateTimePickerDP : public IFWL_DateTimePickerDP {
-   public:
-    CFWL_DateTimePickerDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_DateTimePickerDP
+  FWL_Error GetToday(IFWL_Widget* pWidget,
+                     int32_t& iYear,
+                     int32_t& iMonth,
+                     int32_t& iDay) override;
 
-    // IFWL_DateTimePickerDP
-    FWL_Error GetToday(IFWL_Widget* pWidget,
-                       int32_t& iYear,
-                       int32_t& iMonth,
-                       int32_t& iDay) override;
-    int32_t m_iYear;
-    int32_t m_iMonth;
-    int32_t m_iDay;
-    CFX_WideString m_wsData;
-  };
-
-  CFWL_DateTimePickerDP m_DateTimePickerDP;
+ private:
+  int32_t m_iYear;
+  int32_t m_iMonth;
+  int32_t m_iDay;
+  CFX_WideString m_wsData;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_DATETIMEPICKER_H_
diff --git a/xfa/fwl/core/cfwl_listbox.cpp b/xfa/fwl/core/cfwl_listbox.cpp
index 8590540..458a0eb 100644
--- a/xfa/fwl/core/cfwl_listbox.cpp
+++ b/xfa/fwl/core/cfwl_listbox.cpp
@@ -27,7 +27,7 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_ListBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_ListBoxDP), nullptr);
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this), nullptr);
 
   CFWL_Widget::Initialize();
 }
@@ -43,17 +43,16 @@
   pItem->m_dwStates = 0;
   pItem->m_wsText = wsAdd;
   pItem->m_dwStates = bSelect ? FWL_ITEMSTATE_LTB_Selected : 0;
-  m_ListBoxDP.m_ItemArray.push_back(std::move(pItem));
-  return m_ListBoxDP.m_ItemArray.back().get();
+  m_ItemArray.push_back(std::move(pItem));
+  return m_ItemArray.back().get();
 }
 
 bool CFWL_ListBox::DeleteString(IFWL_ListItem* pItem) {
-  int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), pItem);
-  if (nIndex < 0 ||
-      static_cast<size_t>(nIndex) >= m_ListBoxDP.m_ItemArray.size()) {
+  int32_t nIndex = GetItemIndex(GetWidget(), pItem);
+  if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size()) {
     return false;
   }
-  int32_t iCount = m_ListBoxDP.CountItems(m_pIface.get());
+  int32_t iCount = CountItems(m_pIface.get());
   int32_t iSel = nIndex + 1;
   if (iSel >= iCount) {
     iSel = nIndex - 1;
@@ -63,15 +62,15 @@
   }
   if (iSel >= 0) {
     CFWL_ListItem* pSel =
-        static_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface.get(), iSel));
+        static_cast<CFWL_ListItem*>(GetItem(m_pIface.get(), iSel));
     pSel->m_dwStates |= FWL_ITEMSTATE_LTB_Selected;
   }
-  m_ListBoxDP.m_ItemArray.erase(m_ListBoxDP.m_ItemArray.begin() + nIndex);
+  m_ItemArray.erase(m_ItemArray.begin() + nIndex);
   return true;
 }
 
 void CFWL_ListBox::DeleteAll() {
-  m_ListBoxDP.m_ItemArray.clear();
+  m_ItemArray.clear();
 }
 
 int32_t CFWL_ListBox::CountSelItems() {
@@ -112,12 +111,12 @@
 }
 
 FWL_Error CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) {
-  m_ListBoxDP.m_fItemHeight = fItemHeight;
+  m_fItemHeight = fItemHeight;
   return FWL_Error::Succeeded;
 }
 
 IFWL_ListItem* CFWL_ListBox::GetFocusItem() {
-  for (const auto& pItem : m_ListBoxDP.m_ItemArray) {
+  for (const auto& pItem : m_ItemArray) {
     if (pItem->m_dwStates & FWL_ITEMSTATE_LTB_Focused)
       return pItem.get();
   }
@@ -125,20 +124,20 @@
 }
 
 FWL_Error CFWL_ListBox::SetFocusItem(IFWL_ListItem* pItem) {
-  int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), pItem);
-  m_ListBoxDP.m_ItemArray[nIndex]->m_dwStates |= FWL_ITEMSTATE_LTB_Focused;
+  int32_t nIndex = GetItemIndex(GetWidget(), pItem);
+  m_ItemArray[nIndex]->m_dwStates |= FWL_ITEMSTATE_LTB_Focused;
   return FWL_Error::Succeeded;
 }
 
 int32_t CFWL_ListBox::CountItems() {
-  return pdfium::CollectionSize<int32_t>(m_ListBoxDP.m_ItemArray);
+  return pdfium::CollectionSize<int32_t>(m_ItemArray);
 }
 
 IFWL_ListItem* CFWL_ListBox::GetItem(int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems())
     return nullptr;
 
-  return m_ListBoxDP.m_ItemArray[nIndex].get();
+  return m_ItemArray[nIndex].get();
 }
 
 FWL_Error CFWL_ListBox::SetItemString(IFWL_ListItem* pItem,
@@ -177,14 +176,14 @@
   FX_FLOAT fPosY = 0;
   ToListBox(GetWidget())->GetScrollPos(fx);
   ToListBox(GetWidget())->GetScrollPos(fy, false);
-  int32_t nCount = m_ListBoxDP.CountItems(nullptr);
+  int32_t nCount = CountItems(nullptr);
   for (int32_t i = 0; i < nCount; i++) {
-    IFWL_ListItem* pItem = m_ListBoxDP.GetItem(nullptr, i);
+    IFWL_ListItem* pItem = GetItem(nullptr, i);
     if (!pItem) {
       continue;
     }
     CFX_RectF rtItem;
-    m_ListBoxDP.GetItemRect(nullptr, pItem, rtItem);
+    GetItemRect(nullptr, pItem, rtItem);
     rtItem.Offset(-fPosX, -fPosY);
     if (rtItem.Contains(fx, fy)) {
       return pItem;
@@ -200,30 +199,25 @@
   return pListItem->m_dwStates | pListItem->m_dwCheckState;
 }
 
-CFWL_ListBox::CFWL_ListBoxDP::CFWL_ListBoxDP() {}
-
-CFWL_ListBox::CFWL_ListBoxDP::~CFWL_ListBoxDP() {}
-
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetCaption(IFWL_Widget* pWidget,
-                                                   CFX_WideString& wsCaption) {
+FWL_Error CFWL_ListBox::GetCaption(IFWL_Widget* pWidget,
+                                   CFX_WideString& wsCaption) {
   wsCaption = m_wsData;
   return FWL_Error::Succeeded;
 }
 
-int32_t CFWL_ListBox::CFWL_ListBoxDP::CountItems(const IFWL_Widget* pWidget) {
+int32_t CFWL_ListBox::CountItems(const IFWL_Widget* pWidget) {
   return pdfium::CollectionSize<int32_t>(m_ItemArray);
 }
 
-IFWL_ListItem* CFWL_ListBox::CFWL_ListBoxDP::GetItem(const IFWL_Widget* pWidget,
-                                                     int32_t nIndex) {
+IFWL_ListItem* CFWL_ListBox::GetItem(const IFWL_Widget* pWidget,
+                                     int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems(pWidget))
     return nullptr;
 
   return m_ItemArray[nIndex].get();
 }
 
-int32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemIndex(IFWL_Widget* pWidget,
-                                                   IFWL_ListItem* pItem) {
+int32_t CFWL_ListBox::GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) {
   auto it = std::find_if(
       m_ItemArray.begin(), m_ItemArray.end(),
       [pItem](const std::unique_ptr<CFWL_ListItem>& candidate) {
@@ -232,105 +226,102 @@
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
 
-bool CFWL_ListBox::CFWL_ListBoxDP::SetItemIndex(IFWL_Widget* pWidget,
-                                                IFWL_ListItem* pItem,
-                                                int32_t nIndex) {
+bool CFWL_ListBox::SetItemIndex(IFWL_Widget* pWidget,
+                                IFWL_ListItem* pItem,
+                                int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems(pWidget))
     return false;
   m_ItemArray[nIndex].reset(static_cast<CFWL_ListItem*>(pItem));
   return true;
 }
 
-uint32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemStyles(IFWL_Widget* pWidget,
-                                                     IFWL_ListItem* pItem) {
+uint32_t CFWL_ListBox::GetItemStyles(IFWL_Widget* pWidget,
+                                     IFWL_ListItem* pItem) {
   if (!pItem)
     return 0;
   return static_cast<CFWL_ListItem*>(pItem)->m_dwStates;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetItemText(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    CFX_WideString& wsText) {
+FWL_Error CFWL_ListBox::GetItemText(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    CFX_WideString& wsText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = static_cast<CFWL_ListItem*>(pItem)->m_wsText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetItemRect(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    CFX_RectF& rtItem) {
+FWL_Error CFWL_ListBox::GetItemRect(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   rtItem = static_cast<CFWL_ListItem*>(pItem)->m_rtItem;
   return FWL_Error::Succeeded;
 }
 
-void* CFWL_ListBox::CFWL_ListBoxDP::GetItemData(IFWL_Widget* pWidget,
-                                                IFWL_ListItem* pItem) {
+void* CFWL_ListBox::GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) {
   return pItem ? static_cast<CFWL_ListItem*>(pItem)->m_pData : nullptr;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemStyles(IFWL_Widget* pWidget,
-                                                      IFWL_ListItem* pItem,
-                                                      uint32_t dwStyle) {
+FWL_Error CFWL_ListBox::SetItemStyles(IFWL_Widget* pWidget,
+                                      IFWL_ListItem* pItem,
+                                      uint32_t dwStyle) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ListItem*>(pItem)->m_dwStates = dwStyle;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemText(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    const FX_WCHAR* pszText) {
+FWL_Error CFWL_ListBox::SetItemText(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    const FX_WCHAR* pszText) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ListItem*>(pItem)->m_wsText = pszText;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemRect(IFWL_Widget* pWidget,
-                                                    IFWL_ListItem* pItem,
-                                                    const CFX_RectF& rtItem) {
+FWL_Error CFWL_ListBox::SetItemRect(IFWL_Widget* pWidget,
+                                    IFWL_ListItem* pItem,
+                                    const CFX_RectF& rtItem) {
   if (!pItem)
     return FWL_Error::Indefinite;
   static_cast<CFWL_ListItem*>(pItem)->m_rtItem = rtItem;
   return FWL_Error::Succeeded;
 }
 
-FX_FLOAT CFWL_ListBox::CFWL_ListBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_ListBox::GetItemHeight(IFWL_Widget* pWidget) {
   return m_fItemHeight;
 }
 
-CFX_DIBitmap* CFWL_ListBox::CFWL_ListBoxDP::GetItemIcon(IFWL_Widget* pWidget,
-                                                        IFWL_ListItem* pItem) {
+CFX_DIBitmap* CFWL_ListBox::GetItemIcon(IFWL_Widget* pWidget,
+                                        IFWL_ListItem* pItem) {
   return static_cast<CFWL_ListItem*>(pItem)->m_pDIB;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
-                                                         IFWL_ListItem* pItem,
-                                                         CFX_RectF& rtCheck) {
+FWL_Error CFWL_ListBox::GetItemCheckRect(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem,
+                                         CFX_RectF& rtCheck) {
   rtCheck = static_cast<CFWL_ListItem*>(pItem)->m_rtCheckBox;
   return FWL_Error::Succeeded;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckRect(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    const CFX_RectF& rtCheck) {
+FWL_Error CFWL_ListBox::SetItemCheckRect(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem,
+                                         const CFX_RectF& rtCheck) {
   static_cast<CFWL_ListItem*>(pItem)->m_rtCheckBox = rtCheck;
   return FWL_Error::Succeeded;
 }
 
-uint32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckState(IFWL_Widget* pWidget,
-                                                         IFWL_ListItem* pItem) {
+uint32_t CFWL_ListBox::GetItemCheckState(IFWL_Widget* pWidget,
+                                         IFWL_ListItem* pItem) {
   return static_cast<CFWL_ListItem*>(pItem)->m_dwCheckState;
 }
 
-FWL_Error CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckState(
-    IFWL_Widget* pWidget,
-    IFWL_ListItem* pItem,
-    uint32_t dwCheckState) {
+FWL_Error CFWL_ListBox::SetItemCheckState(IFWL_Widget* pWidget,
+                                          IFWL_ListItem* pItem,
+                                          uint32_t dwCheckState) {
   static_cast<CFWL_ListItem*>(pItem)->m_dwCheckState = dwCheckState;
   return FWL_Error::Succeeded;
 }
diff --git a/xfa/fwl/core/cfwl_listbox.h b/xfa/fwl/core/cfwl_listbox.h
index cb77f90..d91ddff 100644
--- a/xfa/fwl/core/cfwl_listbox.h
+++ b/xfa/fwl/core/cfwl_listbox.h
@@ -15,9 +15,21 @@
 #include "xfa/fwl/core/ifwl_listbox.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 
-class CFWL_ListItem;
+class CFWL_ListItem : public IFWL_ListItem {
+ public:
+  CFWL_ListItem();
+  ~CFWL_ListItem();
 
-class CFWL_ListBox : public CFWL_Widget {
+  CFX_RectF m_rtItem;
+  uint32_t m_dwStates;
+  CFX_WideString m_wsText;
+  CFX_DIBitmap* m_pDIB;
+  void* m_pData;
+  uint32_t m_dwCheckState;
+  CFX_RectF m_rtCheckBox;
+};
+
+class CFWL_ListBox : public CFWL_Widget, public IFWL_ListBoxDP {
  public:
   CFWL_ListBox(const IFWL_App*);
   ~CFWL_ListBox() override;
@@ -46,75 +58,53 @@
   IFWL_ListItem* GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy);
   uint32_t GetItemStates(IFWL_ListItem* pItem);
 
- protected:
-  class CFWL_ListBoxDP : public IFWL_ListBoxDP {
-   public:
-    CFWL_ListBoxDP();
-    ~CFWL_ListBoxDP() override;
+  // IFWL_DataProvider:
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider:
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
-
-    // IFWL_ListBoxDP:
-    int32_t CountItems(const IFWL_Widget* pWidget) override;
-    IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
-    int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    bool SetItemIndex(IFWL_Widget* pWidget,
-                      IFWL_ListItem* pItem,
-                      int32_t nIndex) override;
-    uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error GetItemText(IFWL_Widget* pWidget,
+  // IFWL_ListBoxDP:
+  int32_t CountItems(const IFWL_Widget* pWidget) override;
+  IFWL_ListItem* GetItem(const IFWL_Widget* pWidget, int32_t nIndex) override;
+  int32_t GetItemIndex(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  bool SetItemIndex(IFWL_Widget* pWidget,
+                    IFWL_ListItem* pItem,
+                    int32_t nIndex) override;
+  uint32_t GetItemStyles(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error GetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_WideString& wsText) override;
+  FWL_Error GetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        CFX_RectF& rtItem) override;
+  void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
+  FWL_Error SetItemStyles(IFWL_Widget* pWidget,
                           IFWL_ListItem* pItem,
-                          CFX_WideString& wsText) override;
-    FWL_Error GetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          CFX_RectF& rtItem) override;
-    void* GetItemData(IFWL_Widget* pWidget, IFWL_ListItem* pItem) override;
-    FWL_Error SetItemStyles(IFWL_Widget* pWidget,
-                            IFWL_ListItem* pItem,
-                            uint32_t dwStyle) override;
-    FWL_Error SetItemText(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const FX_WCHAR* pszText) override;
-    FWL_Error SetItemRect(IFWL_Widget* pWidget,
-                          IFWL_ListItem* pItem,
-                          const CFX_RectF& rtItem) override;
-    FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
-                              IFWL_ListItem* pItem) override;
-    FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               CFX_RectF& rtCheck) override;
-    FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem,
-                               const CFX_RectF& rtCheck) override;
-    uint32_t GetItemCheckState(IFWL_Widget* pWidget,
-                               IFWL_ListItem* pItem) override;
-    FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
-                                IFWL_ListItem* pItem,
-                                uint32_t dwCheckState) override;
+                          uint32_t dwStyle) override;
+  FWL_Error SetItemText(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const FX_WCHAR* pszText) override;
+  FWL_Error SetItemRect(IFWL_Widget* pWidget,
+                        IFWL_ListItem* pItem,
+                        const CFX_RectF& rtItem) override;
+  FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
+                            IFWL_ListItem* pItem) override;
+  FWL_Error GetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             CFX_RectF& rtCheck) override;
+  FWL_Error SetItemCheckRect(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem,
+                             const CFX_RectF& rtCheck) override;
+  uint32_t GetItemCheckState(IFWL_Widget* pWidget,
+                             IFWL_ListItem* pItem) override;
+  FWL_Error SetItemCheckState(IFWL_Widget* pWidget,
+                              IFWL_ListItem* pItem,
+                              uint32_t dwCheckState) override;
 
-    std::vector<std::unique_ptr<CFWL_ListItem>> m_ItemArray;
-    CFX_WideString m_wsData;
-    FX_FLOAT m_fItemHeight;
-  };
-
-  CFWL_ListBoxDP m_ListBoxDP;
-};
-
-class CFWL_ListItem : public IFWL_ListItem {
- public:
-  CFWL_ListItem();
-  ~CFWL_ListItem();
-
-  CFX_RectF m_rtItem;
-  uint32_t m_dwStates;
-  CFX_WideString m_wsText;
-  CFX_DIBitmap* m_pDIB;
-  void* m_pData;
-  uint32_t m_dwCheckState;
-  CFX_RectF m_rtCheckBox;
+ private:
+  std::vector<std::unique_ptr<CFWL_ListItem>> m_ItemArray;
+  CFX_WideString m_wsData;
+  FX_FLOAT m_fItemHeight;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_LISTBOX_H_
diff --git a/xfa/fwl/core/cfwl_picturebox.cpp b/xfa/fwl/core/cfwl_picturebox.cpp
index a0e1c30..28d3186 100644
--- a/xfa/fwl/core/cfwl_picturebox.cpp
+++ b/xfa/fwl/core/cfwl_picturebox.cpp
@@ -10,84 +10,9 @@
 
 #include "third_party/base/ptr_util.h"
 
-CFWL_PictureBox::CFWL_PictureBox(const IFWL_App* app) : CFWL_Widget(app) {}
-
-CFWL_PictureBox::~CFWL_PictureBox() {}
-
-void CFWL_PictureBox::Initialize() {
-  ASSERT(!m_pIface);
-
-  m_pIface = pdfium::MakeUnique<IFWL_PictureBox>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_PictureBoxDP));
-
-  CFWL_Widget::Initialize();
-}
-
-CFX_DIBitmap* CFWL_PictureBox::GetPicture() {
-  return m_PictureBoxDP.m_pBitmap;
-}
-
-FWL_Error CFWL_PictureBox::SetPicture(CFX_DIBitmap* pBitmap) {
-  m_PictureBoxDP.m_pBitmap = pBitmap;
-  return FWL_Error::Succeeded;
-}
-
-FX_FLOAT CFWL_PictureBox::GetRotation() {
-  return m_PictureBoxDP.m_fRotation;
-}
-
-FWL_Error CFWL_PictureBox::SetRotation(FX_FLOAT fRotation) {
-  m_PictureBoxDP.m_fRotation = fRotation;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_PictureBox::GetFlipMode() {
-  return m_PictureBoxDP.GetFlipMode(m_pIface.get());
-}
-
-FWL_Error CFWL_PictureBox::SetFlipMode(int32_t iFlipMode) {
-  m_PictureBoxDP.m_iFlipMode = iFlipMode;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_PictureBox::GetOpacity() {
-  return m_PictureBoxDP.GetOpacity(m_pIface.get());
-}
-
-FWL_Error CFWL_PictureBox::SetOpacity(int32_t iOpacity) {
-  m_PictureBoxDP.m_iOpacity = iOpacity;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY) {
-  CFX_Matrix matrix;
-  m_PictureBoxDP.GetMatrix(m_pIface.get(), matrix);
-  matrix.Scale(fScaleX, fScaleY);
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY) {
-  m_PictureBoxDP.m_fScaleX = fScaleX;
-  m_PictureBoxDP.m_fScaleY = fScaleY;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::GetOffset(FX_FLOAT& fx, FX_FLOAT& fy) {
-  CFX_Matrix matrix;
-  m_PictureBoxDP.GetMatrix(m_pIface.get(), matrix);
-  fx = matrix.e;
-  fy = matrix.f;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PictureBox::SetOffset(FX_FLOAT fx, FX_FLOAT fy) {
-  m_PictureBoxDP.m_fOffSetX = fx;
-  m_PictureBoxDP.m_fOffSetY = fy;
-  return FWL_Error::Succeeded;
-}
-
-CFWL_PictureBox::CFWL_PictureBoxDP::CFWL_PictureBoxDP()
-    : m_pBitmap(nullptr),
+CFWL_PictureBox::CFWL_PictureBox(const IFWL_App* app)
+    : CFWL_Widget(app),
+      m_pBitmap(nullptr),
       m_iOpacity(0),
       m_iFlipMode(0),
       m_fRotation(0.0f),
@@ -96,33 +21,102 @@
       m_fOffSetX(0.0f),
       m_fOffSetY(0.0f) {}
 
-FWL_Error CFWL_PictureBox::CFWL_PictureBoxDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+CFWL_PictureBox::~CFWL_PictureBox() {}
+
+void CFWL_PictureBox::Initialize() {
+  ASSERT(!m_pIface);
+
+  m_pIface = pdfium::MakeUnique<IFWL_PictureBox>(
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
+
+  CFWL_Widget::Initialize();
+}
+
+CFX_DIBitmap* CFWL_PictureBox::GetPicture() {
+  return m_pBitmap;
+}
+
+FWL_Error CFWL_PictureBox::SetPicture(CFX_DIBitmap* pBitmap) {
+  m_pBitmap = pBitmap;
   return FWL_Error::Succeeded;
 }
 
-CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetPicture(
-    IFWL_Widget* pWidget) {
+FX_FLOAT CFWL_PictureBox::GetRotation() {
+  return m_fRotation;
+}
+
+FWL_Error CFWL_PictureBox::SetRotation(FX_FLOAT fRotation) {
+  m_fRotation = fRotation;
+  return FWL_Error::Succeeded;
+}
+
+int32_t CFWL_PictureBox::GetFlipMode() {
+  return GetFlipMode(m_pIface.get());
+}
+
+FWL_Error CFWL_PictureBox::SetFlipMode(int32_t iFlipMode) {
+  m_iFlipMode = iFlipMode;
+  return FWL_Error::Succeeded;
+}
+
+int32_t CFWL_PictureBox::GetOpacity() {
+  return GetOpacity(m_pIface.get());
+}
+
+FWL_Error CFWL_PictureBox::SetOpacity(int32_t iOpacity) {
+  m_iOpacity = iOpacity;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY) {
+  CFX_Matrix matrix;
+  GetMatrix(m_pIface.get(), matrix);
+  matrix.Scale(fScaleX, fScaleY);
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY) {
+  m_fScaleX = fScaleX;
+  m_fScaleY = fScaleY;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::GetOffset(FX_FLOAT& fx, FX_FLOAT& fy) {
+  CFX_Matrix matrix;
+  GetMatrix(m_pIface.get(), matrix);
+  fx = matrix.e;
+  fy = matrix.f;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::SetOffset(FX_FLOAT fx, FX_FLOAT fy) {
+  m_fOffSetX = fx;
+  m_fOffSetY = fy;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PictureBox::GetCaption(IFWL_Widget* pWidget,
+                                      CFX_WideString& wsCaption) {
+  return FWL_Error::Succeeded;
+}
+
+CFX_DIBitmap* CFWL_PictureBox::GetPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
 
-CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetErrorPicture(
-    IFWL_Widget* pWidget) {
+CFX_DIBitmap* CFWL_PictureBox::GetErrorPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
 
-CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetInitialPicture(
-    IFWL_Widget* pWidget) {
+CFX_DIBitmap* CFWL_PictureBox::GetInitialPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
 
-int32_t CFWL_PictureBox::CFWL_PictureBoxDP::GetOpacity(IFWL_Widget* pWidget) {
+int32_t CFWL_PictureBox::GetOpacity(IFWL_Widget* pWidget) {
   return m_iOpacity;
 }
 
-FWL_Error CFWL_PictureBox::CFWL_PictureBoxDP::GetMatrix(IFWL_Widget* pWidget,
-                                                        CFX_Matrix& matrix) {
+FWL_Error CFWL_PictureBox::GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) {
   CFX_RectF rect;
   pWidget->GetClientRect(rect);
   FX_FLOAT fLen = rect.width / 2;
@@ -136,6 +130,6 @@
   return FWL_Error::Succeeded;
 }
 
-int32_t CFWL_PictureBox::CFWL_PictureBoxDP::GetFlipMode(IFWL_Widget* pWidget) {
+int32_t CFWL_PictureBox::GetFlipMode(IFWL_Widget* pWidget) {
   return m_iFlipMode;
 }
diff --git a/xfa/fwl/core/cfwl_picturebox.h b/xfa/fwl/core/cfwl_picturebox.h
index f8fcdfb..5cd7c6f 100644
--- a/xfa/fwl/core/cfwl_picturebox.h
+++ b/xfa/fwl/core/cfwl_picturebox.h
@@ -11,7 +11,7 @@
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_picturebox.h"
 
-class CFWL_PictureBox : public CFWL_Widget {
+class CFWL_PictureBox : public CFWL_Widget, public IFWL_PictureBoxDP {
  public:
   CFWL_PictureBox(const IFWL_App*);
   ~CFWL_PictureBox() override;
@@ -31,35 +31,28 @@
   FWL_Error GetOffset(FX_FLOAT& fx, FX_FLOAT& fy);
   FWL_Error SetOffset(FX_FLOAT fx, FX_FLOAT fy);
 
- protected:
-  class CFWL_PictureBoxDP : public IFWL_PictureBoxDP {
-   public:
-    CFWL_PictureBoxDP();
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_PictureBoxDP
+  CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetErrorPicture(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetInitialPicture(IFWL_Widget* pWidget) override;
+  int32_t GetOpacity(IFWL_Widget* pWidget) override;
+  int32_t GetFlipMode(IFWL_Widget* pWidget) override;
+  FWL_Error GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
 
-    // IFWL_PictureBoxDP
-    CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetErrorPicture(IFWL_Widget* pWidget) override;
-    CFX_DIBitmap* GetInitialPicture(IFWL_Widget* pWidget) override;
-    int32_t GetOpacity(IFWL_Widget* pWidget) override;
-    int32_t GetFlipMode(IFWL_Widget* pWidget) override;
-    FWL_Error GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
-
-    CFX_DIBitmap* m_pBitmap;
-    int32_t m_iOpacity;
-    int32_t m_iFlipMode;
-    FX_FLOAT m_fRotation;
-    FX_FLOAT m_fScaleX;
-    FX_FLOAT m_fScaleY;
-    FX_FLOAT m_fOffSetX;
-    FX_FLOAT m_fOffSetY;
-    CFX_WideString m_wsData;
-  };
-
-  CFWL_PictureBoxDP m_PictureBoxDP;
+ private:
+  CFX_DIBitmap* m_pBitmap;
+  int32_t m_iOpacity;
+  int32_t m_iFlipMode;
+  FX_FLOAT m_fRotation;
+  FX_FLOAT m_fScaleX;
+  FX_FLOAT m_fScaleY;
+  FX_FLOAT m_fOffSetX;
+  FX_FLOAT m_fOffSetY;
+  CFX_WideString m_wsData;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_PICTUREBOX_H_
diff --git a/xfa/fwl/core/cfwl_pushbutton.cpp b/xfa/fwl/core/cfwl_pushbutton.cpp
index 1b98d25..888c127 100644
--- a/xfa/fwl/core/cfwl_pushbutton.cpp
+++ b/xfa/fwl/core/cfwl_pushbutton.cpp
@@ -10,7 +10,8 @@
 
 #include "third_party/base/ptr_util.h"
 
-CFWL_PushButton::CFWL_PushButton(const IFWL_App* app) : CFWL_Widget(app) {}
+CFWL_PushButton::CFWL_PushButton(const IFWL_App* app)
+    : CFWL_Widget(app), m_pBitmap(nullptr) {}
 
 CFWL_PushButton::~CFWL_PushButton() {}
 
@@ -18,38 +19,36 @@
   ASSERT(!m_pIface);
 
   m_pIface = pdfium::MakeUnique<IFWL_PushButton>(
-      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(&m_buttonData));
+      m_pApp, pdfium::MakeUnique<CFWL_WidgetProperties>(this));
 
   CFWL_Widget::Initialize();
 }
 
 FWL_Error CFWL_PushButton::GetCaption(CFX_WideString& wsCaption) {
-  wsCaption = m_buttonData.m_wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PushButton::SetCaption(const CFX_WideStringC& wsCaption) {
-  m_buttonData.m_wsCaption = wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-CFX_DIBitmap* CFWL_PushButton::GetPicture() {
-  return m_buttonData.m_pBitmap;
-}
-
-FWL_Error CFWL_PushButton::SetPicture(CFX_DIBitmap* pBitmap) {
-  m_buttonData.m_pBitmap = pBitmap;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_PushButton::CFWL_PushButtonDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_Error::Succeeded;
 }
 
-CFX_DIBitmap* CFWL_PushButton::CFWL_PushButtonDP::GetPicture(
-    IFWL_Widget* pWidget) {
+FWL_Error CFWL_PushButton::SetCaption(const CFX_WideStringC& wsCaption) {
+  m_wsCaption = wsCaption;
+  return FWL_Error::Succeeded;
+}
+
+CFX_DIBitmap* CFWL_PushButton::GetPicture() {
+  return m_pBitmap;
+}
+
+FWL_Error CFWL_PushButton::SetPicture(CFX_DIBitmap* pBitmap) {
+  m_pBitmap = pBitmap;
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CFWL_PushButton::GetCaption(IFWL_Widget* pWidget,
+                                      CFX_WideString& wsCaption) {
+  wsCaption = m_wsCaption;
+  return FWL_Error::Succeeded;
+}
+
+CFX_DIBitmap* CFWL_PushButton::GetPicture(IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
diff --git a/xfa/fwl/core/cfwl_pushbutton.h b/xfa/fwl/core/cfwl_pushbutton.h
index 1c4b6b4..a146efc 100644
--- a/xfa/fwl/core/cfwl_pushbutton.h
+++ b/xfa/fwl/core/cfwl_pushbutton.h
@@ -10,7 +10,7 @@
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_pushbutton.h"
 
-class CFWL_PushButton : public CFWL_Widget {
+class CFWL_PushButton : public CFWL_Widget, public IFWL_PushButtonDP {
  public:
   CFWL_PushButton(const IFWL_App*);
   ~CFWL_PushButton() override;
@@ -22,23 +22,16 @@
   CFX_DIBitmap* GetPicture();
   FWL_Error SetPicture(CFX_DIBitmap* pBitmap);
 
- protected:
-  class CFWL_PushButtonDP : public IFWL_PushButtonDP {
-   public:
-    CFWL_PushButtonDP() : m_pBitmap(nullptr) {}
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
 
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
+  // IFWL_PushButtonDP
+  CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
 
-    // IFWL_PushButtonDP
-    CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget) override;
-
-    CFX_WideString m_wsCaption;
-    CFX_DIBitmap* m_pBitmap;
-  };
-
-  CFWL_PushButtonDP m_buttonData;
+ private:
+  CFX_WideString m_wsCaption;
+  CFX_DIBitmap* m_pBitmap;
 };
 
 #endif  // XFA_FWL_CORE_CFWL_PUSHBUTTON_H_
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
index 86a1ca8..fc7523a 100644
--- a/xfa/fwl/core/fwl_noteimp.cpp
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -637,58 +637,6 @@
   }
 }
 
-class CFWL_CoreToolTipDP : public IFWL_ToolTipDP {
- public:
-  CFWL_CoreToolTipDP(int32_t iInitDelayTime, int32_t iAutoDelayTime);
-
-  // IFWL_ToolTipDP
-  FWL_Error GetCaption(IFWL_Widget* pWidget,
-                       CFX_WideString& wsCaption) override;
-  int32_t GetInitialDelay(IFWL_Widget* pWidget) override;
-  int32_t GetAutoPopDelay(IFWL_Widget* pWidget) override;
-  CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget) override;
-  CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget) override;
-
-  CFX_RectF GetAnchor();
-
-  CFX_WideString m_wsCaption;
-  int32_t m_nInitDelayTime;
-  int32_t m_nAutoPopDelayTime;
-  CFX_RectF m_fAnchor;
-};
-
-CFWL_CoreToolTipDP::CFWL_CoreToolTipDP(int32_t iInitDelayTime,
-                                       int32_t iAutoDelayTime)
-    : m_nInitDelayTime(iInitDelayTime), m_nAutoPopDelayTime(iAutoDelayTime) {
-  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
-}
-
-FWL_Error CFWL_CoreToolTipDP::GetCaption(IFWL_Widget* pWidget,
-                                         CFX_WideString& wsCaption) {
-  wsCaption = m_wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_CoreToolTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
-  return m_nInitDelayTime;
-}
-
-int32_t CFWL_CoreToolTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
-  return m_nAutoPopDelayTime;
-}
-
-CFX_DIBitmap* CFWL_CoreToolTipDP::GetToolTipIcon(IFWL_Widget* pWidget) {
-  return nullptr;
-}
-
-CFX_SizeF CFWL_CoreToolTipDP::GetToolTipIconSize(IFWL_Widget* pWidget) {
-  return CFX_SizeF();
-}
-
-CFX_RectF CFWL_CoreToolTipDP::GetAnchor() {
-  return m_fAnchor;
-}
-
 CFWL_EventTarget::CFWL_EventTarget(CFWL_NoteDriver* pNoteDriver,
                                    IFWL_Widget* pListener)
     : m_pListener(pListener), m_pNoteDriver(pNoteDriver), m_bInvalid(false) {}
@@ -759,10 +707,38 @@
 CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = nullptr;
 
 CFWL_ToolTipContainer::CFWL_ToolTipContainer()
-    : m_pToolTipDp(new CFWL_CoreToolTipDP(0, 2000)) {}
+    : m_nInitDelayTime(0), m_nAutoPopDelayTime(2000) {
+  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
+}
 
 CFWL_ToolTipContainer::~CFWL_ToolTipContainer() {}
 
+FWL_Error CFWL_ToolTipContainer::GetCaption(IFWL_Widget* pWidget,
+                                            CFX_WideString& wsCaption) {
+  wsCaption = m_wsCaption;
+  return FWL_Error::Succeeded;
+}
+
+int32_t CFWL_ToolTipContainer::GetInitialDelay(IFWL_Widget* pWidget) {
+  return m_nInitDelayTime;
+}
+
+int32_t CFWL_ToolTipContainer::GetAutoPopDelay(IFWL_Widget* pWidget) {
+  return m_nAutoPopDelayTime;
+}
+
+CFX_DIBitmap* CFWL_ToolTipContainer::GetToolTipIcon(IFWL_Widget* pWidget) {
+  return nullptr;
+}
+
+CFX_SizeF CFWL_ToolTipContainer::GetToolTipIconSize(IFWL_Widget* pWidget) {
+  return CFX_SizeF();
+}
+
+CFX_RectF CFWL_ToolTipContainer::GetAnchor() {
+  return m_fAnchor;
+}
+
 // static
 CFWL_ToolTipContainer* CFWL_ToolTipContainer::getInstance() {
   if (!s_pInstance)
diff --git a/xfa/fwl/core/fwl_noteimp.h b/xfa/fwl/core/fwl_noteimp.h
index e9a738a..0b99dba 100644
--- a/xfa/fwl/core/fwl_noteimp.h
+++ b/xfa/fwl/core/fwl_noteimp.h
@@ -13,10 +13,10 @@
 #include "xfa/fwl/core/cfwl_event.h"
 #include "xfa/fwl/core/cfwl_message.h"
 #include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fwl/core/ifwl_tooltip.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 #include "xfa/fxgraphics/cfx_graphics.h"
 
-class CFWL_CoreToolTipDP;
 class CFWL_EventTarget;
 class CFWL_MsgActivate;
 class CFWL_MsgDeactivate;
@@ -127,19 +127,31 @@
   bool m_bInvalid;
 };
 
-class CFWL_ToolTipContainer final {
+class CFWL_ToolTipContainer final : public IFWL_ToolTipDP {
  public:
   static CFWL_ToolTipContainer* getInstance();
   static void DeleteInstance();
 
+  // IFWL_ToolTipDP
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
+  int32_t GetInitialDelay(IFWL_Widget* pWidget) override;
+  int32_t GetAutoPopDelay(IFWL_Widget* pWidget) override;
+  CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget) override;
+  CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget) override;
+
  protected:
   CFWL_ToolTipContainer();
-  ~CFWL_ToolTipContainer();
+  ~CFWL_ToolTipContainer() override;
 
-  std::unique_ptr<CFWL_CoreToolTipDP> m_pToolTipDp;
+  CFX_RectF GetAnchor();
 
  private:
   static CFWL_ToolTipContainer* s_pInstance;
+  CFX_WideString m_wsCaption;
+  int32_t m_nInitDelayTime;
+  int32_t m_nAutoPopDelayTime;
+  CFX_RectF m_fAnchor;
 };
 
 #endif  // XFA_FWL_CORE_FWL_NOTEIMP_H_
diff --git a/xfa/fwl/core/ifwl_datetimepicker.cpp b/xfa/fwl/core/ifwl_datetimepicker.cpp
index 8a59b00..915449a 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.cpp
+++ b/xfa/fwl/core/ifwl_datetimepicker.cpp
@@ -32,13 +32,15 @@
       m_iYear(-1),
       m_iMonth(-1),
       m_iDay(-1),
-      m_bLBtnDown(false) {
+      m_bLBtnDown(false),
+      m_iCurYear(2010),
+      m_iCurMonth(3),
+      m_iCurDay(29) {
   m_rtBtn.Set(0, 0, 0, 0);
 
   m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
 
-  auto monthProp =
-      pdfium::MakeUnique<CFWL_WidgetProperties>(&m_MonthCalendarDP);
+  auto monthProp = pdfium::MakeUnique<CFWL_WidgetProperties>(this);
   monthProp->m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border;
   monthProp->m_dwStates = FWL_WGTSTATE_Invisible;
   monthProp->m_pParent = this;
@@ -112,8 +114,7 @@
   if (m_pProperties->m_pDataProvider) {
     IFWL_DateTimePickerDP* pData =
         static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
-    pData->GetToday(this, m_MonthCalendarDP.m_iCurYear,
-                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
+    pData->GetToday(this, m_iCurYear, m_iCurMonth, m_iCurDay);
   }
   CFX_RectF rtMonthCal;
   m_pMonthCal->GetWidgetRect(rtMonthCal, true);
@@ -464,7 +465,7 @@
   if (m_pMonthCal)
     return;
 
-  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>(&m_MonthCalendarDP);
+  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>(this);
   prop->m_dwStyles =
       FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border | FWL_WGTSTYLE_EdgeSunken;
   prop->m_dwStates = FWL_WGTSTATE_Invisible;
@@ -575,8 +576,7 @@
   if (m_pProperties->m_pDataProvider) {
     IFWL_DateTimePickerDP* pData =
         static_cast<IFWL_DateTimePickerDP*>(m_pProperties->m_pDataProvider);
-    pData->GetToday(this, m_MonthCalendarDP.m_iCurYear,
-                    m_MonthCalendarDP.m_iCurMonth, m_MonthCalendarDP.m_iCurDay);
+    pData->GetToday(this, m_iCurYear, m_iCurMonth, m_iCurDay);
   }
   FX_FLOAT* pWidth = static_cast<FX_FLOAT*>(
       GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
@@ -788,29 +788,19 @@
   Repaint(&rtInvalidate);
 }
 
-IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::CFWL_MonthCalendarImpDP() {
-  m_iCurYear = 2010;
-  m_iCurMonth = 3;
-  m_iCurDay = 29;
-}
-
-FWL_Error IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCaption(
-    IFWL_Widget* pWidget,
-    CFX_WideString& wsCaption) {
+FWL_Error IFWL_DateTimePicker::GetCaption(IFWL_Widget* pWidget,
+                                          CFX_WideString& wsCaption) {
   return FWL_Error::Succeeded;
 }
 
-int32_t IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCurDay(
-    IFWL_Widget* pWidget) {
+int32_t IFWL_DateTimePicker::GetCurDay(IFWL_Widget* pWidget) {
   return m_iCurDay;
 }
 
-int32_t IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCurMonth(
-    IFWL_Widget* pWidget) {
+int32_t IFWL_DateTimePicker::GetCurMonth(IFWL_Widget* pWidget) {
   return m_iCurMonth;
 }
 
-int32_t IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::GetCurYear(
-    IFWL_Widget* pWidget) {
+int32_t IFWL_DateTimePicker::GetCurYear(IFWL_Widget* pWidget) {
   return m_iCurYear;
 }
diff --git a/xfa/fwl/core/ifwl_datetimepicker.h b/xfa/fwl/core/ifwl_datetimepicker.h
index 8ebe54a..5e4ca5e 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.h
+++ b/xfa/fwl/core/ifwl_datetimepicker.h
@@ -60,7 +60,7 @@
                              int32_t& iDay) = 0;
 };
 
-class IFWL_DateTimePicker : public IFWL_Widget {
+class IFWL_DateTimePicker : public IFWL_Widget, public IFWL_MonthCalendarDP {
  public:
   explicit IFWL_DateTimePicker(
       const IFWL_App* app,
@@ -113,25 +113,16 @@
 
   IFWL_FormProxy* GetFormProxy() const { return m_pForm.get(); }
 
+  // IFWL_DataProvider
+  FWL_Error GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
+
+  // IFWL_MonthCalendarDP
+  int32_t GetCurDay(IFWL_Widget* pWidget) override;
+  int32_t GetCurMonth(IFWL_Widget* pWidget) override;
+  int32_t GetCurYear(IFWL_Widget* pWidget) override;
+
  protected:
-  class CFWL_MonthCalendarImpDP : public IFWL_MonthCalendarDP {
-   public:
-    CFWL_MonthCalendarImpDP();
-
-    // IFWL_DataProvider
-    FWL_Error GetCaption(IFWL_Widget* pWidget,
-                         CFX_WideString& wsCaption) override;
-
-    // IFWL_MonthCalendarDP
-    int32_t GetCurDay(IFWL_Widget* pWidget) override;
-    int32_t GetCurMonth(IFWL_Widget* pWidget) override;
-    int32_t GetCurYear(IFWL_Widget* pWidget) override;
-
-    int32_t m_iCurDay;
-    int32_t m_iCurYear;
-    int32_t m_iCurMonth;
-  };
-
   void DrawDropDownButton(CFX_Graphics* pGraphics,
                           IFWL_ThemeProvider* pTheme,
                           const CFX_Matrix* pMatrix);
@@ -153,7 +144,6 @@
   std::unique_ptr<IFWL_DateTimeCalendar> m_pMonthCal;
   std::unique_ptr<IFWL_FormProxy> m_pForm;
   FX_FLOAT m_fBtn;
-  CFWL_MonthCalendarImpDP m_MonthCalendarDP;
 
  private:
   FWL_Error DisForm_Initialize();
@@ -175,6 +165,10 @@
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
   void DisForm_OnFocusChanged(CFWL_Message* pMsg, bool bSet);
+
+  int32_t m_iCurYear;
+  int32_t m_iCurMonth;
+  int32_t m_iCurDay;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_DATETIMEPICKER_H_