diff --git a/xfa/fwl/lightwidget/app.cpp b/xfa/fwl/lightwidget/cfwl_app.cpp
similarity index 88%
rename from xfa/fwl/lightwidget/app.cpp
rename to xfa/fwl/lightwidget/cfwl_app.cpp
index 1d5b7d6..c09e5c0 100644
--- a/xfa/fwl/lightwidget/app.cpp
+++ b/xfa/fwl/lightwidget/cfwl_app.cpp
@@ -4,28 +4,30 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/app.h"
+#include "xfa/fwl/lightwidget/cfwl_app.h"
 
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_app.h"
-#include "xfa/include/fwl/lightwidget/theme.h"
+#include "xfa/fwl/lightwidget/cfwl_theme.h"
 
 CFWL_App::CFWL_App() : m_pIface(IFWL_App::Create(nullptr)), m_pTheme(nullptr) {}
+
 CFWL_App::~CFWL_App() {
   if (m_pTheme) {
     m_pTheme->Finalize();
     delete m_pTheme;
-    m_pTheme = NULL;
   }
   m_pIface->Release();
 }
+
 FWL_ERR CFWL_App::Initialize() {
   m_pTheme = new CFWL_Theme;
   m_pTheme->Initialize();
   m_pIface->SetThemeProvider(m_pTheme);
   return m_pIface->Initialize();
 }
+
 FWL_ERR CFWL_App::Exit(int32_t iExitCode) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
diff --git a/xfa/fwl/lightwidget/cfwl_app.h b/xfa/fwl/lightwidget/cfwl_app.h
new file mode 100644
index 0000000..24cbd5a
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_app.h
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_APP_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_APP_H_
+
+#include "xfa/fwl/core/fwl_error.h"
+
+class CFWL_Theme;
+class IFWL_App;
+
+class CFWL_App {
+ public:
+  CFWL_App();
+  virtual ~CFWL_App();
+
+  FWL_ERR Initialize();
+  FWL_ERR Exit(int32_t iExitCode);
+
+  CFWL_Theme* GetTheme() const { return m_pTheme; }
+  IFWL_App* GetInterface() const { return m_pIface; }
+
+ private:
+  IFWL_App* m_pIface;
+  CFWL_Theme* m_pTheme;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_APP_H_
diff --git a/xfa/fwl/lightwidget/barcode.cpp b/xfa/fwl/lightwidget/cfwl_barcode.cpp
similarity index 96%
rename from xfa/fwl/lightwidget/barcode.cpp
rename to xfa/fwl/lightwidget/cfwl_barcode.cpp
index 4f05837..4ac358c 100644
--- a/xfa/fwl/lightwidget/barcode.cpp
+++ b/xfa/fwl/lightwidget/cfwl_barcode.cpp
@@ -4,13 +4,14 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/barcode.h"
+#include "xfa/fwl/lightwidget/cfwl_barcode.h"
 
 #include <memory>
 
 CFWL_Barcode* CFWL_Barcode::Create() {
   return new CFWL_Barcode;
 }
+
 FWL_ERR CFWL_Barcode::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -27,13 +28,17 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 CFWL_Barcode::CFWL_Barcode() {}
+
 CFWL_Barcode::~CFWL_Barcode() {}
+
 void CFWL_Barcode::SetType(BC_TYPE type) {
   if (!m_pIface)
     return;
   static_cast<IFWL_Barcode*>(m_pIface)->SetType(type);
 }
+
 FX_BOOL CFWL_Barcode::IsProtectedType() {
   if (!m_pIface)
     return 0;
diff --git a/xfa/fwl/lightwidget/cfwl_barcode.h b/xfa/fwl/lightwidget/cfwl_barcode.h
new file mode 100644
index 0000000..e1e7e65
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_barcode.h
@@ -0,0 +1,120 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_BARCODE_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_BARCODE_H_
+
+#include "xfa/fwl/basewidget/ifwl_barcode.h"
+#include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fwl/lightwidget/cfwl_edit.h"
+
+class CFWL_Widget;
+class CFWL_WidgetProperties;
+
+class CFWL_Barcode : public CFWL_Edit {
+ public:
+  static CFWL_Barcode* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  void SetType(BC_TYPE type);
+  FX_BOOL IsProtectedType();
+
+  void SetCharEncoding(BC_CHAR_ENCODING encoding) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CHARENCODING;
+    m_barcodeData.m_eCharEncoding = encoding;
+  }
+  void SetModuleHeight(int32_t height) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEHEIGHT;
+    m_barcodeData.m_nModuleHeight = height;
+  }
+  void SetModuleWidth(int32_t width) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_MODULEWIDTH;
+    m_barcodeData.m_nModuleWidth = width;
+  }
+  void SetDataLength(int32_t dataLength) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_DATALENGTH;
+    m_barcodeData.m_nDataLength = dataLength;
+    static_cast<IFWL_Barcode*>(m_pIface)->SetLimit(dataLength);
+  }
+  void SetCalChecksum(int32_t calChecksum) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CALCHECKSUM;
+    m_barcodeData.m_nCalChecksum = calChecksum;
+  }
+  void SetPrintChecksum(FX_BOOL printChecksum) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_PRINTCHECKSUM;
+    m_barcodeData.m_bPrintChecksum = printChecksum;
+  }
+  void SetTextLocation(BC_TEXT_LOC location) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_TEXTLOCATION;
+    m_barcodeData.m_eTextLocation = location;
+  }
+  void SetWideNarrowRatio(int32_t ratio) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_WIDENARROWRATIO;
+    m_barcodeData.m_nWideNarrowRatio = ratio;
+  }
+  void SetStartChar(FX_CHAR startChar) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_STARTCHAR;
+    m_barcodeData.m_cStartChar = startChar;
+  }
+  void SetEndChar(FX_CHAR endChar) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_ENDCHAR;
+    m_barcodeData.m_cEndChar = endChar;
+  }
+  void SetVersion(int32_t version) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_VERSION;
+    m_barcodeData.m_nVersion = version;
+  }
+  void SetErrorCorrectionLevel(int32_t ecLevel) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_ECLEVEL;
+    m_barcodeData.m_nECLevel = ecLevel;
+  }
+  void SetTruncated(FX_BOOL truncated) {
+    m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_TRUNCATED;
+    m_barcodeData.m_bTruncated = truncated;
+  }
+  void ResetBarcodeAttributes() { m_barcodeData.m_dwAttributeMask = 0; }
+
+ protected:
+  CFWL_Barcode();
+  virtual ~CFWL_Barcode();
+
+  class CFWL_BarcodeDP : public IFWL_BarcodeDP {
+   public:
+    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+    BC_CHAR_ENCODING m_eCharEncoding;
+    virtual BC_CHAR_ENCODING GetCharEncoding() { return m_eCharEncoding; }
+    int32_t m_nModuleHeight, m_nModuleWidth;
+    virtual int32_t GetModuleHeight() { return m_nModuleHeight; }
+    virtual int32_t GetModuleWidth() { return m_nModuleWidth; }
+    int32_t m_nDataLength;
+    virtual int32_t GetDataLength() { return m_nDataLength; }
+    int32_t m_nCalChecksum;
+    virtual int32_t GetCalChecksum() { return m_nCalChecksum; }
+    FX_BOOL m_bPrintChecksum;
+    virtual FX_BOOL GetPrintChecksum() { return m_bPrintChecksum; }
+
+    BC_TEXT_LOC m_eTextLocation;
+    virtual BC_TEXT_LOC GetTextLocation() { return m_eTextLocation; }
+    int32_t m_nWideNarrowRatio;
+    virtual int32_t GetWideNarrowRatio() { return m_nWideNarrowRatio; }
+    FX_CHAR m_cStartChar, m_cEndChar;
+    virtual FX_CHAR GetStartChar() { return m_cStartChar; }
+    virtual FX_CHAR GetEndChar() { return m_cEndChar; }
+    int32_t m_nVersion;
+    virtual int32_t GetVersion() { return m_nVersion; }
+    int32_t m_nECLevel;
+    virtual int32_t GetErrorCorrectionLevel() { return m_nECLevel; }
+    FX_BOOL m_bTruncated;
+    virtual FX_BOOL GetTruncated() { return m_bTruncated; }
+    uint32_t m_dwAttributeMask;
+    virtual uint32_t GetBarcodeAttributeMask() { return m_dwAttributeMask; }
+
+   public:
+    CFWL_BarcodeDP() : m_dwAttributeMask(0) {}
+  };
+  CFWL_BarcodeDP m_barcodeData;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_BARCODE_H_
diff --git a/xfa/fwl/lightwidget/caret.cpp b/xfa/fwl/lightwidget/cfwl_caret.cpp
similarity index 93%
rename from xfa/fwl/lightwidget/caret.cpp
rename to xfa/fwl/lightwidget/cfwl_caret.cpp
index 9c2b90b..7fea4f9 100644
--- a/xfa/fwl/lightwidget/caret.cpp
+++ b/xfa/fwl/lightwidget/cfwl_caret.cpp
@@ -4,18 +4,19 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/caret.h"
+#include "xfa/fwl/lightwidget/cfwl_caret.h"
 
 #include <memory>
 
 #include "xfa/fwl/basewidget/ifwl_caret.h"
 #include "xfa/fwl/core/fwl_targetimp.h"
 #include "xfa/fxgraphics/cfx_color.h"
-#include "xfa/include/fwl/lightwidget/edit.h"
+#include "xfa/fwl/lightwidget/cfwl_edit.h"
 
 CFWL_Caret* CFWL_Caret::Create() {
   return new CFWL_Caret;
 }
+
 FWL_ERR CFWL_Caret::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -32,17 +33,23 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_Caret::ShowCaret(FX_BOOL bFlag) {
   return static_cast<IFWL_Caret*>(m_pIface)->ShowCaret(bFlag);
 }
+
 FWL_ERR CFWL_Caret::GetFrequency(uint32_t& elapse) {
   return static_cast<IFWL_Caret*>(m_pIface)->GetFrequency(elapse);
 }
+
 FWL_ERR CFWL_Caret::SetFrequency(uint32_t elapse) {
   return static_cast<IFWL_Caret*>(m_pIface)->SetFrequency(elapse);
 }
+
 FWL_ERR CFWL_Caret::SetColor(CFX_Color crFill) {
   return static_cast<IFWL_Caret*>(m_pIface)->SetColor(crFill);
 }
+
 CFWL_Caret::CFWL_Caret() {}
+
 CFWL_Caret::~CFWL_Caret() {}
diff --git a/xfa/fwl/lightwidget/cfwl_caret.h b/xfa/fwl/lightwidget/cfwl_caret.h
new file mode 100644
index 0000000..c806f2e
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_caret.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_CARET_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_CARET_H_
+
+#include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fxgraphics/cfx_color.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_Caret : public CFWL_Widget {
+ public:
+  static CFWL_Caret* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR ShowCaret(FX_BOOL bFlag = TRUE);
+  FWL_ERR GetFrequency(uint32_t& elapse);
+  FWL_ERR SetFrequency(uint32_t elapse);
+  FWL_ERR SetColor(CFX_Color crFill);
+
+ protected:
+  CFWL_Caret();
+  virtual ~CFWL_Caret();
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_CARET_H_
diff --git a/xfa/fwl/lightwidget/checkbox.cpp b/xfa/fwl/lightwidget/cfwl_checkbox.cpp
similarity index 96%
rename from xfa/fwl/lightwidget/checkbox.cpp
rename to xfa/fwl/lightwidget/cfwl_checkbox.cpp
index 1d92199..b5e2a87 100644
--- a/xfa/fwl/lightwidget/checkbox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_checkbox.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/checkbox.h"
+#include "xfa/fwl/lightwidget/cfwl_checkbox.h"
 
 #include <memory>
 
@@ -13,6 +13,7 @@
 CFWL_CheckBox* CFWL_CheckBox::Create() {
   return new CFWL_CheckBox;
 }
+
 FWL_ERR CFWL_CheckBox::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -29,29 +30,38 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_CheckBox::SetCaption(const CFX_WideStringC& wsCaption) {
   m_checkboxData.m_wsCaption = wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_CheckBox::SetBoxSize(FX_FLOAT fHeight) {
   m_checkboxData.m_fBoxHeight = fHeight;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_CheckBox::GetCheckState() {
   return static_cast<IFWL_CheckBox*>(m_pIface)->GetCheckState();
 }
+
 FWL_ERR CFWL_CheckBox::SetCheckState(int32_t iCheck) {
   return static_cast<IFWL_CheckBox*>(m_pIface)->SetCheckState(iCheck);
 }
+
 CFWL_CheckBox::CFWL_CheckBox() {}
+
 CFWL_CheckBox::~CFWL_CheckBox() {}
+
 CFWL_CheckBox::CFWL_CheckBoxDP::CFWL_CheckBoxDP()
     : m_fBoxHeight(16.0f), m_wsCaption(L"Check box") {}
+
 FWL_ERR CFWL_CheckBox::CFWL_CheckBoxDP::GetCaption(IFWL_Widget* pWidget,
                                                    CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 FX_FLOAT CFWL_CheckBox::CFWL_CheckBoxDP::GetBoxSize(IFWL_Widget* pWidget) {
   return m_fBoxHeight;
 }
diff --git a/xfa/fwl/lightwidget/cfwl_checkbox.h b/xfa/fwl/lightwidget/cfwl_checkbox.h
new file mode 100644
index 0000000..7b7e400
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_checkbox.h
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_CHECKBOX_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_CHECKBOX_H_
+
+#include "xfa/fwl/basewidget/ifwl_checkbox.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_CheckBox : public CFWL_Widget {
+ public:
+  static CFWL_CheckBox* Create();
+
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR GetCaption(CFX_WideString& wsCaption);
+  FWL_ERR SetCaption(const CFX_WideStringC& wsCaption);
+  FWL_ERR SetBoxSize(FX_FLOAT fHeight);
+  int32_t GetCheckState();
+  FWL_ERR SetCheckState(int32_t iCheck);
+  CFWL_CheckBox();
+  virtual ~CFWL_CheckBox();
+
+ protected:
+  class CFWL_CheckBoxDP : public IFWL_CheckBoxDP {
+   public:
+    CFWL_CheckBoxDP();
+    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+    virtual FX_FLOAT GetBoxSize(IFWL_Widget* pWidget);
+    FX_FLOAT m_fBoxHeight;
+    CFX_WideString m_wsCaption;
+  };
+  CFWL_CheckBoxDP m_checkboxData;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_CHECKBOX_H_
diff --git a/xfa/fwl/lightwidget/combobox.cpp b/xfa/fwl/lightwidget/cfwl_combobox.cpp
similarity index 99%
rename from xfa/fwl/lightwidget/combobox.cpp
rename to xfa/fwl/lightwidget/cfwl_combobox.cpp
index 65b1081..bdcc36f 100644
--- a/xfa/fwl/lightwidget/combobox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_combobox.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/combobox.h"
+#include "xfa/fwl/lightwidget/cfwl_combobox.h"
 
 #include <utility>
 
@@ -14,6 +14,7 @@
 CFWL_ComboBox* CFWL_ComboBox::Create() {
   return new CFWL_ComboBox;
 }
+
 FWL_ERR CFWL_ComboBox::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -30,6 +31,7 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_ComboBox::AddString(const CFX_WideStringC& wsText) {
   std::unique_ptr<CFWL_ComboBoxItem> pItem(new CFWL_ComboBoxItem);
   pItem->m_wsText = wsText;
@@ -37,6 +39,7 @@
   m_comboBoxData.m_ItemArray.push_back(std::move(pItem));
   return m_comboBoxData.m_ItemArray.size() - 1;
 }
+
 int32_t CFWL_ComboBox::AddString(const CFX_WideStringC& wsText,
                                  CFX_DIBitmap* pIcon) {
   std::unique_ptr<CFWL_ComboBoxItem> pItem(new CFWL_ComboBoxItem);
@@ -46,6 +49,7 @@
   m_comboBoxData.m_ItemArray.push_back(std::move(pItem));
   return m_comboBoxData.m_ItemArray.size() - 1;
 }
+
 bool CFWL_ComboBox::RemoveAt(int32_t iIndex) {
   if (iIndex < 0 ||
       static_cast<size_t>(iIndex) >= m_comboBoxData.m_ItemArray.size()) {
@@ -54,12 +58,15 @@
   m_comboBoxData.m_ItemArray.erase(m_comboBoxData.m_ItemArray.begin() + iIndex);
   return true;
 }
+
 void CFWL_ComboBox::RemoveAll() {
   m_comboBoxData.m_ItemArray.clear();
 }
+
 int32_t CFWL_ComboBox::CountItems() {
   return m_comboBoxData.CountItems(GetWidget());
 }
+
 FWL_ERR CFWL_ComboBox::GetTextByIndex(int32_t iIndex, CFX_WideString& wsText) {
   CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(
       m_comboBoxData.GetItem(m_pIface, iIndex));
@@ -68,26 +75,31 @@
   wsText = pItem->m_wsText;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_ComboBox::GetCurSel() {
   if (!m_pIface)
     return -1;
   return static_cast<IFWL_ComboBox*>(m_pIface)->GetCurSel();
 }
+
 FWL_ERR CFWL_ComboBox::SetCurSel(int32_t iSel) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ComboBox*>(m_pIface)->SetCurSel(iSel);
 }
+
 FWL_ERR CFWL_ComboBox::SetEditText(const CFX_WideStringC& wsText) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditText(wsText);
 }
+
 int32_t CFWL_ComboBox::GetEditTextLength() const {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditTextLength();
 }
+
 FWL_ERR CFWL_ComboBox::GetEditText(CFX_WideString& wsText,
                                    int32_t nStart,
                                    int32_t nCount) const {
@@ -96,45 +108,54 @@
   return static_cast<IFWL_ComboBox*>(m_pIface)
       ->GetEditText(wsText, nStart, nCount);
 }
+
 FWL_ERR CFWL_ComboBox::SetEditSelRange(int32_t nStart, int32_t nCount) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditSelRange(nStart, nCount);
 }
+
 int32_t CFWL_ComboBox::GetEditSelRange(int32_t nIndex, int32_t& nStart) {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditSelRange(nIndex, nStart);
 }
+
 int32_t CFWL_ComboBox::GetEditLimit() {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditLimit();
 }
+
 FWL_ERR CFWL_ComboBox::SetEditLimit(int32_t nLimit) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditLimit(nLimit);
 }
+
 FWL_ERR CFWL_ComboBox::EditDoClipboard(int32_t iCmd) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditDoClipboard(iCmd);
 }
+
 FX_BOOL CFWL_ComboBox::EditRedo(const CFX_ByteStringC& bsRecord) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditRedo(bsRecord);
 }
+
 FX_BOOL CFWL_ComboBox::EditUndo(const CFX_ByteStringC& bsRecord) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditUndo(bsRecord);
 }
+
 FWL_ERR CFWL_ComboBox::SetMaxListHeight(FX_FLOAT fMaxHeight) {
   m_comboBoxData.m_fMaxListHeight = fMaxHeight;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ComboBox::SetItemData(int32_t iIndex, void* pData) {
   CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(
       m_comboBoxData.GetItem(m_pIface, iIndex));
@@ -143,6 +164,7 @@
   pItem->m_pData = pData;
   return FWL_ERR_Succeeded;
 }
+
 void* CFWL_ComboBox::GetItemData(int32_t iIndex) {
   CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(
       m_comboBoxData.GetItem(m_pIface, iIndex));
@@ -150,86 +172,104 @@
     return NULL;
   return pItem->m_pData;
 }
+
 FWL_ERR CFWL_ComboBox::SetListTheme(IFWL_ThemeProvider* pTheme) {
   return static_cast<IFWL_ComboBox*>(m_pIface)->GetListBoxt()->SetThemeProvider(
       pTheme);
 }
+
 FX_BOOL CFWL_ComboBox::AfterFocusShowDropList() {
   return static_cast<IFWL_ComboBox*>(m_pIface)->AfterFocusShowDropList();
 }
+
 FWL_ERR CFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) {
   return static_cast<IFWL_ComboBox*>(m_pIface)->OpenDropDownList(bActivate);
 }
+
 FX_BOOL CFWL_ComboBox::EditCanUndo() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanUndo();
 }
+
 FX_BOOL CFWL_ComboBox::EditCanRedo() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanRedo();
 }
+
 FX_BOOL CFWL_ComboBox::EditUndo() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditUndo();
 }
+
 FX_BOOL CFWL_ComboBox::EditRedo() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditRedo();
 }
+
 FX_BOOL CFWL_ComboBox::EditCanCopy() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanCopy();
 }
+
 FX_BOOL CFWL_ComboBox::EditCanCut() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanCut();
 }
+
 FX_BOOL CFWL_ComboBox::EditCanSelectAll() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanSelectAll();
 }
+
 FX_BOOL CFWL_ComboBox::EditCopy(CFX_WideString& wsCopy) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCopy(wsCopy);
 }
+
 FX_BOOL CFWL_ComboBox::EditCut(CFX_WideString& wsCut) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditCut(wsCut);
 }
+
 FX_BOOL CFWL_ComboBox::EditPaste(const CFX_WideString& wsPaste) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditPaste(wsPaste);
 }
+
 FX_BOOL CFWL_ComboBox::EditSelectAll() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditSelectAll();
 }
+
 FX_BOOL CFWL_ComboBox::EditDelete() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditDelete();
 }
+
 FX_BOOL CFWL_ComboBox::EditDeSelect() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->EditDeSelect();
 }
+
 FWL_ERR CFWL_ComboBox::GetBBox(CFX_RectF& rect) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ComboBox*>(m_pIface)->GetBBox(rect);
 }
+
 FWL_ERR CFWL_ComboBox::EditModifyStylesEx(uint32_t dwStylesExAdded,
                                           uint32_t dwStylesExRemoved) {
   if (!m_pIface)
@@ -237,16 +277,22 @@
   return static_cast<IFWL_ComboBox*>(m_pIface)
       ->EditModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
 }
+
 CFWL_ComboBox::CFWL_ComboBox() {}
+
 CFWL_ComboBox::~CFWL_ComboBox() {}
+
 CFWL_ComboBox::CFWL_ComboBoxDP::CFWL_ComboBoxDP() {
   m_fItemHeight = 0;
   m_fMaxListHeight = 0;
 }
+
 CFWL_ComboBox::CFWL_ComboBoxDP::~CFWL_ComboBoxDP() {}
+
 int32_t CFWL_ComboBox::CFWL_ComboBoxDP::CountItems(IFWL_Widget* pWidget) {
   return m_ItemArray.size();
 }
+
 FWL_HLISTITEM CFWL_ComboBox::CFWL_ComboBoxDP::GetItem(IFWL_Widget* pWidget,
                                                       int32_t nIndex) {
   if (nIndex < 0 || static_cast<size_t>(nIndex) >= m_ItemArray.size())
@@ -254,6 +300,7 @@
 
   return reinterpret_cast<FWL_HLISTITEM>(m_ItemArray[nIndex].get());
 }
+
 int32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIndex(IFWL_Widget* pWidget,
                                                      FWL_HLISTITEM hItem) {
   auto it = std::find_if(
@@ -263,6 +310,7 @@
       });
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
+
 FX_BOOL CFWL_ComboBox::CFWL_ComboBoxDP::SetItemIndex(IFWL_Widget* pWidget,
                                                      FWL_HLISTITEM hItem,
                                                      int32_t nIndex) {
@@ -272,12 +320,14 @@
   m_ItemArray[nIndex].reset(reinterpret_cast<CFWL_ComboBoxItem*>(hItem));
   return TRUE;
 }
+
 uint32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemStyles(IFWL_Widget* pWidget,
                                                        FWL_HLISTITEM hItem) {
   if (!hItem)
     return 0;
   return reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_dwStyles;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemText(IFWL_Widget* pWidget,
                                                     FWL_HLISTITEM hItem,
                                                     CFX_WideString& wsText) {
@@ -286,6 +336,7 @@
   wsText = reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_wsText;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemRect(IFWL_Widget* pWidget,
                                                     FWL_HLISTITEM hItem,
                                                     CFX_RectF& rtItem) {
@@ -296,6 +347,7 @@
              pItem->m_rtItem.height);
   return FWL_ERR_Succeeded;
 }
+
 void* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemData(IFWL_Widget* pWidget,
                                                   FWL_HLISTITEM hItem) {
   if (!hItem)
@@ -303,6 +355,7 @@
   CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem);
   return pItem->m_pData;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemStyles(IFWL_Widget* pWidget,
                                                       FWL_HLISTITEM hItem,
                                                       uint32_t dwStyle) {
@@ -311,6 +364,7 @@
   reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_dwStyles = dwStyle;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemText(IFWL_Widget* pWidget,
                                                     FWL_HLISTITEM hItem,
                                                     const FX_WCHAR* pszText) {
@@ -319,6 +373,7 @@
   reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_wsText = pszText;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemRect(IFWL_Widget* pWidget,
                                                     FWL_HLISTITEM hItem,
                                                     const CFX_RectF& rtItem) {
@@ -327,15 +382,18 @@
   reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_rtItem = rtItem;
   return FWL_ERR_Succeeded;
 }
+
 FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
   return m_fItemHeight;
 }
+
 CFX_DIBitmap* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIcon(IFWL_Widget* pWidget,
                                                           FWL_HLISTITEM hItem) {
   if (!hItem)
     return NULL;
   return reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_pDIB;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
                                                          FWL_HLISTITEM hItem,
                                                          CFX_RectF& rtCheck) {
@@ -343,6 +401,7 @@
   rtCheck = pItem->m_rtCheckBox;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckRect(
     IFWL_Widget* pWidget,
     FWL_HLISTITEM hItem,
@@ -351,12 +410,14 @@
   pItem->m_rtCheckBox = rtCheck;
   return FWL_ERR_Succeeded;
 }
+
 uint32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckState(
     IFWL_Widget* pWidget,
     FWL_HLISTITEM hItem) {
   CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem);
   return pItem->m_dwCheckState;
 }
+
 FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckState(
     IFWL_Widget* pWidget,
     FWL_HLISTITEM hItem,
@@ -365,6 +426,7 @@
   pItem->m_dwCheckState = dwCheckState;
   return FWL_ERR_Succeeded;
 }
+
 FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetListHeight(IFWL_Widget* pWidget) {
   return m_fMaxListHeight;
 }
diff --git a/xfa/fwl/lightwidget/cfwl_combobox.h b/xfa/fwl/lightwidget/cfwl_combobox.h
new file mode 100644
index 0000000..59b542c
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_combobox.h
@@ -0,0 +1,143 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_COMBOBOX_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_COMBOBOX_H_
+
+#include <memory>
+#include <vector>
+
+#include "xfa/fwl/basewidget/ifwl_combobox.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_WidgetProperties;
+class IFWL_ComboBoxDP;
+class CFWL_ComboBoxDP;
+class CFWL_ComboBoxItem;
+
+class CFWL_ComboBox : public CFWL_Widget {
+ public:
+  static CFWL_ComboBox* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  int32_t AddString(const CFX_WideStringC& wsText);
+  int32_t AddString(const CFX_WideStringC& wsText, CFX_DIBitmap* pIcon);
+  bool RemoveAt(int32_t iIndex);  // Returns false iff |iIndex| out of range.
+  void RemoveAll();
+  int32_t CountItems();
+  FWL_ERR GetTextByIndex(int32_t iIndex, CFX_WideString& wsText);
+  int32_t GetCurSel();
+  FWL_ERR SetCurSel(int32_t iSel);
+  FWL_ERR SetEditText(const CFX_WideStringC& wsText);
+  int32_t GetEditTextLength() const;
+  FWL_ERR GetEditText(CFX_WideString& wsText,
+                      int32_t nStart = 0,
+                      int32_t nCount = -1) const;
+  FWL_ERR SetEditSelRange(int32_t nStart, int32_t nCount = -1);
+  int32_t GetEditSelRange(int32_t nIndex, int32_t& nStart);
+  int32_t GetEditLimit();
+  FWL_ERR SetEditLimit(int32_t nLimit);
+  FWL_ERR EditDoClipboard(int32_t iCmd);
+  FX_BOOL EditRedo(const CFX_ByteStringC& bsRecord);
+  FX_BOOL EditUndo(const CFX_ByteStringC& bsRecord);
+  FWL_ERR SetMaxListHeight(FX_FLOAT fMaxHeight);
+  FWL_ERR SetItemData(int32_t iIndex, void* pData);
+  void* GetItemData(int32_t iIndex);
+  FWL_ERR SetListTheme(IFWL_ThemeProvider* pTheme);
+  FX_BOOL AfterFocusShowDropList();
+  FWL_ERR OpenDropDownList(FX_BOOL bActivate);
+
+  FX_BOOL EditCanUndo();
+  FX_BOOL EditCanRedo();
+  FX_BOOL EditUndo();
+  FX_BOOL EditRedo();
+  FX_BOOL EditCanCopy();
+  FX_BOOL EditCanCut();
+  FX_BOOL EditCanSelectAll();
+  FX_BOOL EditCopy(CFX_WideString& wsCopy);
+  FX_BOOL EditCut(CFX_WideString& wsCut);
+  FX_BOOL EditPaste(const CFX_WideString& wsPaste);
+  FX_BOOL EditSelectAll();
+  FX_BOOL EditDelete();
+  FX_BOOL EditDeSelect();
+  FWL_ERR GetBBox(CFX_RectF& rect);
+  FWL_ERR EditModifyStylesEx(uint32_t dwStylesExAdded,
+                             uint32_t dwStylesExRemoved);
+  CFWL_ComboBox();
+  virtual ~CFWL_ComboBox();
+
+ protected:
+  class CFWL_ComboBoxDP : public IFWL_ComboBoxDP {
+   public:
+    CFWL_ComboBoxDP();
+    ~CFWL_ComboBoxDP();
+    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget,
+                               CFX_WideString& wsCaption) {
+      return FWL_ERR_Succeeded;
+    }
+
+    virtual int32_t CountItems(IFWL_Widget* pWidget);
+    virtual FWL_HLISTITEM GetItem(IFWL_Widget* pWidget, int32_t nIndex);
+    virtual int32_t GetItemIndex(IFWL_Widget* pWidget, FWL_HLISTITEM hItem);
+    virtual FX_BOOL SetItemIndex(IFWL_Widget* pWidget,
+                                 FWL_HLISTITEM hItem,
+                                 int32_t nIndex);
+
+    virtual uint32_t GetItemStyles(IFWL_Widget* pWidget, FWL_HLISTITEM hItem);
+    virtual FWL_ERR GetItemText(IFWL_Widget* pWidget,
+                                FWL_HLISTITEM hItem,
+                                CFX_WideString& wsText);
+    virtual FWL_ERR GetItemRect(IFWL_Widget* pWidget,
+                                FWL_HLISTITEM hItem,
+                                CFX_RectF& rtItem);
+    virtual void* GetItemData(IFWL_Widget* pWidget, FWL_HLISTITEM hItem);
+    virtual FWL_ERR SetItemStyles(IFWL_Widget* pWidget,
+                                  FWL_HLISTITEM hItem,
+                                  uint32_t dwStyle);
+    virtual FWL_ERR SetItemText(IFWL_Widget* pWidget,
+                                FWL_HLISTITEM hItem,
+                                const FX_WCHAR* pszText);
+    virtual FWL_ERR SetItemRect(IFWL_Widget* pWidget,
+                                FWL_HLISTITEM hItem,
+                                const CFX_RectF& rtItem);
+    virtual FX_FLOAT GetItemHeight(IFWL_Widget* pWidget);
+    virtual CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
+                                      FWL_HLISTITEM hItem);
+    virtual FWL_ERR GetItemCheckRect(IFWL_Widget* pWidget,
+                                     FWL_HLISTITEM hItem,
+                                     CFX_RectF& rtCheck);
+    virtual FWL_ERR SetItemCheckRect(IFWL_Widget* pWidget,
+                                     FWL_HLISTITEM hItem,
+                                     const CFX_RectF& rtCheck);
+    virtual uint32_t GetItemCheckState(IFWL_Widget* pWidget,
+                                       FWL_HLISTITEM hItem);
+    virtual FWL_ERR SetItemCheckState(IFWL_Widget* pWidget,
+                                      FWL_HLISTITEM hItem,
+                                      uint32_t dwCheckState);
+    virtual FX_FLOAT GetListHeight(IFWL_Widget* pWidget);
+
+    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:
+  CFWL_ComboBoxItem() {
+    m_pDIB = NULL;
+    m_pData = NULL;
+  }
+  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;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_COMBOBOX_H_
diff --git a/xfa/fwl/lightwidget/datetimepicker.cpp b/xfa/fwl/lightwidget/cfwl_datetimepicker.cpp
similarity index 98%
rename from xfa/fwl/lightwidget/datetimepicker.cpp
rename to xfa/fwl/lightwidget/cfwl_datetimepicker.cpp
index a3ace90..e470616 100644
--- a/xfa/fwl/lightwidget/datetimepicker.cpp
+++ b/xfa/fwl/lightwidget/cfwl_datetimepicker.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/datetimepicker.h"
+#include "xfa/fwl/lightwidget/cfwl_datetimepicker.h"
 
 #include <memory>
 
@@ -15,6 +15,7 @@
 CFWL_DateTimePicker* CFWL_DateTimePicker::Create() {
   return new CFWL_DateTimePicker;
 }
+
 FWL_ERR CFWL_DateTimePicker::Initialize(
     const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
@@ -43,44 +44,55 @@
   m_DateTimePickerDP.m_iDay = iDay;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_DateTimePicker::CountSelRanges() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->CountSelRanges();
 }
+
 int32_t CFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)
       ->GetSelRange(nIndex, nStart);
 }
+
 FWL_ERR CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetEditText(wsText);
 }
+
 FWL_ERR CFWL_DateTimePicker::SetEditText(const CFX_WideStringC& wsText) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditText(wsText);
 }
+
 FWL_ERR CFWL_DateTimePicker::GetCurSel(int32_t& iYear,
                                        int32_t& iMonth,
                                        int32_t& iDay) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)
       ->GetCurSel(iYear, iMonth, iDay);
 }
+
 FWL_ERR CFWL_DateTimePicker::SetCurSel(int32_t iYear,
                                        int32_t iMonth,
                                        int32_t iDay) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)
       ->SetCurSel(iYear, iMonth, iDay);
 }
+
 CFWL_DateTimePicker::CFWL_DateTimePicker() {}
+
 CFWL_DateTimePicker::~CFWL_DateTimePicker() {}
+
 CFWL_DateTimePicker::CFWL_DateTimePickerDP::CFWL_DateTimePickerDP() {
   m_iYear = 2011;
   m_iMonth = 1;
   m_iDay = 1;
 }
+
 FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetCaption(
     IFWL_Widget* pWidget,
     CFX_WideString& wsCaption) {
   wsCaption = m_wsData;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_DateTimePicker::CFWL_DateTimePickerDP::GetToday(
     IFWL_Widget* pWidget,
     int32_t& iYear,
@@ -91,51 +103,67 @@
   iDay = m_iDay;
   return FWL_ERR_Succeeded;
 }
+
 FX_BOOL CFWL_DateTimePicker::CanUndo() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanUndo();
 }
+
 FX_BOOL CFWL_DateTimePicker::CanRedo() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanRedo();
 }
+
 FX_BOOL CFWL_DateTimePicker::Undo() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->Undo();
 }
+
 FX_BOOL CFWL_DateTimePicker::Redo() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->Redo();
 }
+
 FX_BOOL CFWL_DateTimePicker::CanCopy() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCopy();
 }
+
 FX_BOOL CFWL_DateTimePicker::CanCut() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCut();
 }
+
 FX_BOOL CFWL_DateTimePicker::CanSelectAll() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanSelectAll();
 }
+
 FX_BOOL CFWL_DateTimePicker::Copy(CFX_WideString& wsCopy) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCopy);
 }
+
 FX_BOOL CFWL_DateTimePicker::Cut(CFX_WideString& wsCut) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCut);
 }
+
 FX_BOOL CFWL_DateTimePicker::Paste(const CFX_WideString& wsPaste) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->Paste(wsPaste);
 }
+
 FX_BOOL CFWL_DateTimePicker::SelectAll() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->SelectAll();
 }
+
 FX_BOOL CFWL_DateTimePicker::Delete() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->Delete();
 }
+
 FX_BOOL CFWL_DateTimePicker::DeSelect() {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->DeSelect();
 }
+
 FWL_ERR CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetBBox(rect);
 }
+
 FWL_ERR CFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditLimit(nLimit);
 }
+
 FWL_ERR CFWL_DateTimePicker::ModifyEditStylesEx(uint32_t dwStylesExAdded,
                                                 uint32_t dwStylesExRemoved) {
   return static_cast<IFWL_DateTimePicker*>(m_pIface)
diff --git a/xfa/fwl/lightwidget/cfwl_datetimepicker.h b/xfa/fwl/lightwidget/cfwl_datetimepicker.h
new file mode 100644
index 0000000..a96ac53
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_datetimepicker.h
@@ -0,0 +1,61 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_DATETIMEPICKER_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_DATETIMEPICKER_H_
+
+#include "xfa/fwl/basewidget/ifwl_datetimepicker.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_DateTimePicker : public CFWL_Widget {
+ public:
+  static CFWL_DateTimePicker* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR SetToday(int32_t iYear, int32_t iMonth, int32_t iDay);
+  FWL_ERR GetEditText(CFX_WideString& wsText);
+  FWL_ERR SetEditText(const CFX_WideStringC& wsText);
+  int32_t CountSelRanges();
+  int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
+  FWL_ERR GetCurSel(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
+  FWL_ERR SetCurSel(int32_t iYear, int32_t iMonth, int32_t iDay);
+  FX_BOOL CanUndo();
+  FX_BOOL CanRedo();
+  FX_BOOL Undo();
+  FX_BOOL Redo();
+  FX_BOOL CanCopy();
+  FX_BOOL CanCut();
+  FX_BOOL CanSelectAll();
+  FX_BOOL Copy(CFX_WideString& wsCopy);
+  FX_BOOL Cut(CFX_WideString& wsCut);
+  FX_BOOL Paste(const CFX_WideString& wsPaste);
+  FX_BOOL SelectAll();
+  FX_BOOL Delete();
+  FX_BOOL DeSelect();
+  FWL_ERR GetBBox(CFX_RectF& rect);
+  FWL_ERR SetEditLimit(int32_t nLimit);
+  FWL_ERR ModifyEditStylesEx(uint32_t dwStylesExAdded,
+                             uint32_t dwStylesExRemoved);
+
+ protected:
+  CFWL_DateTimePicker();
+  virtual ~CFWL_DateTimePicker();
+  class CFWL_DateTimePickerDP : public IFWL_DateTimePickerDP {
+   public:
+    CFWL_DateTimePickerDP();
+    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+    virtual FWL_ERR GetToday(IFWL_Widget* pWidget,
+                             int32_t& iYear,
+                             int32_t& iMonth,
+                             int32_t& iDay);
+    int32_t m_iYear;
+    int32_t m_iMonth;
+    int32_t m_iDay;
+    CFX_WideString m_wsData;
+  };
+  CFWL_DateTimePickerDP m_DateTimePickerDP;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_DATETIMEPICKER_H_
diff --git a/xfa/fwl/lightwidget/edit.cpp b/xfa/fwl/lightwidget/cfwl_edit.cpp
similarity index 98%
rename from xfa/fwl/lightwidget/edit.cpp
rename to xfa/fwl/lightwidget/cfwl_edit.cpp
index efceb4e..ba0ff58 100644
--- a/xfa/fwl/lightwidget/edit.cpp
+++ b/xfa/fwl/lightwidget/cfwl_edit.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/edit.h"
+#include "xfa/fwl/lightwidget/cfwl_edit.h"
 
 #include <memory>
 #include <vector>
@@ -14,6 +14,7 @@
 CFWL_Edit* CFWL_Edit::Create() {
   return new CFWL_Edit;
 }
+
 FWL_ERR CFWL_Edit::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -30,16 +31,19 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_Edit::SetText(const CFX_WideString& wsText) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->SetText(wsText);
 }
+
 int32_t CFWL_Edit::GetTextLength() const {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_Edit*>(m_pIface)->GetTextLength();
 }
+
 FWL_ERR CFWL_Edit::GetText(CFX_WideString& wsText,
                            int32_t nStart,
                            int32_t nCount) const {
@@ -47,21 +51,25 @@
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->GetText(wsText, nStart, nCount);
 }
+
 FWL_ERR CFWL_Edit::ClearText() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->ClearText();
 }
+
 int32_t CFWL_Edit::GetCaretPos() const {
   if (!m_pIface)
     return -1;
   return static_cast<IFWL_Edit*>(m_pIface)->GetCaretPos();
 }
+
 int32_t CFWL_Edit::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
   if (!m_pIface)
     return -1;
   return static_cast<IFWL_Edit*>(m_pIface)->SetCaretPos(nIndex, bBefore);
 }
+
 FWL_ERR CFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
@@ -75,36 +83,43 @@
   }
   return static_cast<IFWL_Edit*>(m_pIface)->SetCaretPos(pos);
 }
+
 int32_t CFWL_Edit::CountSelRanges() {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_Edit*>(m_pIface)->CountSelRanges();
 }
+
 int32_t CFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_Edit*>(m_pIface)->GetSelRange(nIndex, nStart);
 }
+
 FWL_ERR CFWL_Edit::ClearSelections() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->ClearSelections();
 }
+
 int32_t CFWL_Edit::GetLimit() {
   if (!m_pIface)
     return -1;
   return static_cast<IFWL_Edit*>(m_pIface)->GetLimit();
 }
+
 FWL_ERR CFWL_Edit::SetLimit(int32_t nLimit) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->SetLimit(nLimit);
 }
+
 FWL_ERR CFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->SetAliasChar(wAlias);
 }
+
 FWL_ERR CFWL_Edit::Insert(int32_t nStart,
                           const FX_WCHAR* lpText,
                           int32_t nLen) {
@@ -112,21 +127,25 @@
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->Insert(nStart, lpText, nLen);
 }
+
 FWL_ERR CFWL_Edit::DeleteSelections() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->DeleteSelections();
 }
+
 FWL_ERR CFWL_Edit::DeleteRange(int32_t nStart, int32_t nCount) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->DeleteRange(nStart, nCount);
 }
+
 FWL_ERR CFWL_Edit::ReplaceSelections(const CFX_WideStringC& wsReplace) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->ReplaceSelections(wsReplace);
 }
+
 FWL_ERR CFWL_Edit::Replace(int32_t nStart,
                            int32_t nLen,
                            const CFX_WideStringC& wsReplace) {
@@ -134,78 +153,98 @@
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->Replace(nStart, nLen, wsReplace);
 }
+
 FWL_ERR CFWL_Edit::DoClipboard(int32_t iCmd) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->DoClipboard(iCmd);
 }
+
 FX_BOOL CFWL_Edit::Redo(const CFX_ByteStringC& bsRecord) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_Edit*>(m_pIface)->Redo(bsRecord);
 }
+
 FX_BOOL CFWL_Edit::Undo(const CFX_ByteStringC& bsRecord) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_Edit*>(m_pIface)->Undo(bsRecord);
 }
+
 FWL_ERR CFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)
       ->SetTabWidth(fTabWidth, bEquidistant);
 }
+
 FWL_ERR CFWL_Edit::SetNumberRange(int32_t iMin, int32_t iMax) {
   if (iMin > iMax) {
     return FWL_ERR_Parameter_Invalid;
   }
   return static_cast<IFWL_Edit*>(m_pIface)->SetNumberRange(iMin, iMax);
 }
+
 FWL_ERR CFWL_Edit::SetBackColor(uint32_t dwColor) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->SetBackColor(dwColor);
 }
+
 FWL_ERR CFWL_Edit::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_Edit*>(m_pIface)->SetFont(wsFont, fSize);
 }
+
 FX_BOOL CFWL_Edit::CanUndo() {
   return static_cast<IFWL_Edit*>(m_pIface)->CanUndo();
 }
+
 FX_BOOL CFWL_Edit::CanRedo() {
   return static_cast<IFWL_Edit*>(m_pIface)->CanRedo();
 }
+
 FX_BOOL CFWL_Edit::Undo() {
   return static_cast<IFWL_Edit*>(m_pIface)->Undo();
 }
+
 FX_BOOL CFWL_Edit::Redo() {
   return static_cast<IFWL_Edit*>(m_pIface)->Undo();
 }
+
 FX_BOOL CFWL_Edit::Copy(CFX_WideString& wsCopy) {
   return static_cast<IFWL_Edit*>(m_pIface)->Copy(wsCopy);
 }
+
 FX_BOOL CFWL_Edit::Cut(CFX_WideString& wsCut) {
   return static_cast<IFWL_Edit*>(m_pIface)->Cut(wsCut);
 }
+
 FX_BOOL CFWL_Edit::Paste(const CFX_WideString& wsPaste) {
   return static_cast<IFWL_Edit*>(m_pIface)->Paste(wsPaste);
 }
+
 FX_BOOL CFWL_Edit::Delete() {
   return static_cast<IFWL_Edit*>(m_pIface)->Delete();
 }
+
 void CFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) {
   return static_cast<IFWL_Edit*>(m_pIface)->SetScrollOffset(fScrollOffset);
 }
+
 FX_BOOL CFWL_Edit::GetSuggestWords(CFX_PointF pointf,
                                    std::vector<CFX_ByteString>& sSuggest) {
   return static_cast<IFWL_Edit*>(m_pIface)->GetSuggestWords(pointf, sSuggest);
 }
+
 FX_BOOL CFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf,
                                          const CFX_ByteStringC& bsReplace) {
   return static_cast<IFWL_Edit*>(m_pIface)
       ->ReplaceSpellCheckWord(pointf, bsReplace);
 }
+
 CFWL_Edit::CFWL_Edit() {}
+
 CFWL_Edit::~CFWL_Edit() {}
diff --git a/xfa/fwl/lightwidget/cfwl_edit.h b/xfa/fwl/lightwidget/cfwl_edit.h
new file mode 100644
index 0000000..153c756
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_edit.h
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_EDIT_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_EDIT_H_
+
+#include <vector>
+
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_WidgetProperties;
+
+class CFWL_Edit : public CFWL_Widget {
+ public:
+  static CFWL_Edit* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR SetText(const CFX_WideString& wsText);
+  int32_t GetTextLength() const;
+  FWL_ERR GetText(CFX_WideString& wsText,
+                  int32_t nStart = 0,
+                  int32_t nCount = -1) const;
+  FWL_ERR ClearText();
+  int32_t GetCaretPos() const;
+  int32_t SetCaretPos(int32_t nIndex, FX_BOOL bBefore = TRUE);
+  FWL_ERR AddSelRange(int32_t nStart, int32_t nCount = -1);
+  int32_t CountSelRanges();
+  int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
+  FWL_ERR ClearSelections();
+  int32_t GetLimit();
+  FWL_ERR SetLimit(int32_t nLimit);
+  FWL_ERR SetAliasChar(FX_WCHAR wAlias);
+  FWL_ERR SetFormatString(const CFX_WideString& wsFormat);
+  FWL_ERR Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLen);
+  FWL_ERR DeleteSelections();
+  FWL_ERR DeleteRange(int32_t nStart, int32_t nCount = -1);
+  FWL_ERR ReplaceSelections(const CFX_WideStringC& wsReplace);
+  FWL_ERR Replace(int32_t nStart,
+                  int32_t nLen,
+                  const CFX_WideStringC& wsReplace);
+  FWL_ERR DoClipboard(int32_t iCmd);
+  FX_BOOL Redo(const CFX_ByteStringC& bsRecord);
+  FX_BOOL Undo(const CFX_ByteStringC& bsRecord);
+  FWL_ERR SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant);
+  FWL_ERR SetNumberRange(int32_t iMin, int32_t iMax);
+  FWL_ERR SetBackColor(uint32_t dwColor);
+  FWL_ERR SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize);
+  FX_BOOL CanUndo();
+  FX_BOOL CanRedo();
+  FX_BOOL Undo();
+  FX_BOOL Redo();
+  FX_BOOL Copy(CFX_WideString& wsCopy);
+  FX_BOOL Cut(CFX_WideString& wsCut);
+  FX_BOOL Paste(const CFX_WideString& wsPaste);
+  FX_BOOL Delete();
+  void SetScrollOffset(FX_FLOAT fScrollOffset);
+  FX_BOOL GetSuggestWords(CFX_PointF pointf,
+                          std::vector<CFX_ByteString>& sSuggest);
+  FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
+                                const CFX_ByteStringC& bsReplace);
+  CFWL_Edit();
+  virtual ~CFWL_Edit();
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_EDIT_H_
diff --git a/xfa/fwl/lightwidget/listbox.cpp b/xfa/fwl/lightwidget/cfwl_listbox.cpp
similarity index 99%
rename from xfa/fwl/lightwidget/listbox.cpp
rename to xfa/fwl/lightwidget/cfwl_listbox.cpp
index 7913727..2102d2d 100644
--- a/xfa/fwl/lightwidget/listbox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_listbox.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/listbox.h"
+#include "xfa/fwl/lightwidget/cfwl_listbox.h"
 
 #include <memory>
 
@@ -13,6 +13,7 @@
 CFWL_ListBox* CFWL_ListBox::Create() {
   return new CFWL_ListBox;
 }
+
 FWL_ERR CFWL_ListBox::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -29,10 +30,12 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::AddDIBitmap(CFX_DIBitmap* pDIB, FWL_HLISTITEM hItem) {
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_pDIB = pDIB;
   return FWL_ERR_Succeeded;
 }
+
 FWL_HLISTITEM CFWL_ListBox::AddString(const CFX_WideStringC& wsAdd,
                                       FX_BOOL bSelect) {
   std::unique_ptr<CFWL_ListItem> pItem(new CFWL_ListItem);
@@ -42,6 +45,7 @@
   m_ListBoxDP.m_ItemArray.push_back(std::move(pItem));
   return (FWL_HLISTITEM)m_ListBoxDP.m_ItemArray.back().get();
 }
+
 FX_BOOL CFWL_ListBox::DeleteString(FWL_HLISTITEM hItem) {
   int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem);
   if (nIndex < 0 ||
@@ -64,43 +68,52 @@
   m_ListBoxDP.m_ItemArray.erase(m_ListBoxDP.m_ItemArray.begin() + nIndex);
   return TRUE;
 }
+
 void CFWL_ListBox::DeleteAll() {
   m_ListBoxDP.m_ItemArray.clear();
 }
+
 int32_t CFWL_ListBox::CountSelItems() {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ListBox*>(m_pIface)->CountSelItems();
 }
+
 FWL_HLISTITEM CFWL_ListBox::GetSelItem(int32_t nIndexSel) {
   if (!m_pIface)
     return NULL;
   return static_cast<IFWL_ListBox*>(m_pIface)->GetSelItem(nIndexSel);
 }
+
 int32_t CFWL_ListBox::GetSelIndex(int32_t nIndex) {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ListBox*>(m_pIface)->GetSelIndex(nIndex);
 }
+
 FWL_ERR CFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ListBox*>(m_pIface)->SetSelItem(hItem, bSelect);
 }
+
 FWL_ERR CFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ListBox*>(m_pIface)->GetItemText(hItem, wsText);
 }
+
 FWL_ERR CFWL_ListBox::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fPos, bVert);
 }
+
 FWL_ERR CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) {
   m_ListBoxDP.m_fItemHeight = fItemHeight;
   return FWL_ERR_Succeeded;
 }
+
 FWL_HLISTITEM CFWL_ListBox::GetFocusItem() {
   for (const auto& hItem : m_ListBoxDP.m_ItemArray) {
     if (hItem->m_dwStates & FWL_ITEMSTATE_LTB_Focused)
@@ -108,23 +121,28 @@
   }
   return nullptr;
 }
+
 FWL_ERR CFWL_ListBox::SetFocusItem(FWL_HLISTITEM hItem) {
   int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem);
   m_ListBoxDP.m_ItemArray[nIndex]->m_dwStates |= FWL_ITEMSTATE_LTB_Focused;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR* CFWL_ListBox::Sort(IFWL_ListBoxCompare* pCom) {
   return static_cast<IFWL_ListBox*>(m_pIface)->Sort(pCom);
 }
+
 int32_t CFWL_ListBox::CountItems() {
   return pdfium::CollectionSize<int32_t>(m_ListBoxDP.m_ItemArray);
 }
+
 FWL_HLISTITEM CFWL_ListBox::GetItem(int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems())
     return nullptr;
 
   return (FWL_HLISTITEM)m_ListBoxDP.m_ItemArray[nIndex].get();
 }
+
 FWL_ERR CFWL_ListBox::SetItemString(FWL_HLISTITEM hItem,
                                     const CFX_WideStringC& wsText) {
   if (!hItem)
@@ -132,6 +150,7 @@
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText = wsText;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::GetItemString(FWL_HLISTITEM hItem,
                                     CFX_WideString& wsText) {
   if (!hItem)
@@ -139,17 +158,20 @@
   wsText = reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::SetItemData(FWL_HLISTITEM hItem, void* pData) {
   if (!hItem)
     return FWL_ERR_Indefinite;
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_pData = pData;
   return FWL_ERR_Succeeded;
 }
+
 void* CFWL_ListBox::GetItemData(FWL_HLISTITEM hItem) {
   if (!hItem)
     return NULL;
   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_pData;
 }
+
 FWL_HLISTITEM CFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
   CFX_RectF rtClient;
   m_pIface->GetClientRect(rtClient);
@@ -174,24 +196,32 @@
   }
   return NULL;
 }
+
 uint32_t CFWL_ListBox::GetItemStates(FWL_HLISTITEM hItem) {
   if (!hItem)
     return 0;
   CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem);
   return pItem->m_dwStates | pItem->m_dwCheckState;
 }
+
 CFWL_ListBox::CFWL_ListBox() {}
+
 CFWL_ListBox::~CFWL_ListBox() {}
+
 CFWL_ListBox::CFWL_ListBoxDP::CFWL_ListBoxDP() {}
+
 CFWL_ListBox::CFWL_ListBoxDP::~CFWL_ListBoxDP() {}
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetCaption(IFWL_Widget* pWidget,
                                                  CFX_WideString& wsCaption) {
   wsCaption = m_wsData;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_ListBox::CFWL_ListBoxDP::CountItems(IFWL_Widget* pWidget) {
   return pdfium::CollectionSize<int32_t>(m_ItemArray);
 }
+
 FWL_HLISTITEM CFWL_ListBox::CFWL_ListBoxDP::GetItem(IFWL_Widget* pWidget,
                                                     int32_t nIndex) {
   if (nIndex < 0 || nIndex >= CountItems(pWidget))
@@ -199,6 +229,7 @@
 
   return (FWL_HLISTITEM)m_ItemArray[nIndex].get();
 }
+
 int32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemIndex(IFWL_Widget* pWidget,
                                                    FWL_HLISTITEM hItem) {
   auto it = std::find_if(
@@ -208,6 +239,7 @@
       });
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
+
 FX_BOOL CFWL_ListBox::CFWL_ListBoxDP::SetItemIndex(IFWL_Widget* pWidget,
                                                    FWL_HLISTITEM hItem,
                                                    int32_t nIndex) {
@@ -216,12 +248,14 @@
   m_ItemArray[nIndex].reset(reinterpret_cast<CFWL_ListItem*>(hItem));
   return TRUE;
 }
+
 uint32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemStyles(IFWL_Widget* pWidget,
                                                      FWL_HLISTITEM hItem) {
   if (!hItem)
     return -1;
   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwStates;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemText(IFWL_Widget* pWidget,
                                                   FWL_HLISTITEM hItem,
                                                   CFX_WideString& wsText) {
@@ -230,6 +264,7 @@
   wsText = reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemRect(IFWL_Widget* pWidget,
                                                   FWL_HLISTITEM hItem,
                                                   CFX_RectF& rtItem) {
@@ -239,6 +274,7 @@
   rtItem = pItem->m_rtItem;
   return FWL_ERR_Succeeded;
 }
+
 void* CFWL_ListBox::CFWL_ListBoxDP::GetItemData(IFWL_Widget* pWidget,
                                                 FWL_HLISTITEM hItem) {
   if (!hItem)
@@ -246,6 +282,7 @@
   CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem);
   return pItem->m_pData;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemStyles(IFWL_Widget* pWidget,
                                                     FWL_HLISTITEM hItem,
                                                     uint32_t dwStyle) {
@@ -254,6 +291,7 @@
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwStates = dwStyle;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemText(IFWL_Widget* pWidget,
                                                   FWL_HLISTITEM hItem,
                                                   const FX_WCHAR* pszText) {
@@ -262,6 +300,7 @@
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText = pszText;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemRect(IFWL_Widget* pWidget,
                                                   FWL_HLISTITEM hItem,
                                                   const CFX_RectF& rtItem) {
@@ -270,19 +309,23 @@
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtItem = rtItem;
   return FWL_ERR_Succeeded;
 }
+
 FX_FLOAT CFWL_ListBox::CFWL_ListBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
   return m_fItemHeight;
 }
+
 CFX_DIBitmap* CFWL_ListBox::CFWL_ListBoxDP::GetItemIcon(IFWL_Widget* pWidget,
                                                         FWL_HLISTITEM hItem) {
   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_pDIB;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
                                                        FWL_HLISTITEM hItem,
                                                        CFX_RectF& rtCheck) {
   rtCheck = reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtCheckBox;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckRect(
     IFWL_Widget* pWidget,
     FWL_HLISTITEM hItem,
@@ -290,10 +333,12 @@
   reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtCheckBox = rtCheck;
   return FWL_ERR_Succeeded;
 }
+
 uint32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckState(IFWL_Widget* pWidget,
                                                          FWL_HLISTITEM hItem) {
   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwCheckState;
 }
+
 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckState(IFWL_Widget* pWidget,
                                                         FWL_HLISTITEM hItem,
                                                         uint32_t dwCheckState) {
diff --git a/xfa/fwl/lightwidget/cfwl_listbox.h b/xfa/fwl/lightwidget/cfwl_listbox.h
new file mode 100644
index 0000000..28fb42a
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_listbox.h
@@ -0,0 +1,127 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_LISTBOX_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_LISTBOX_H_
+
+#include <memory>
+#include <vector>
+
+#include "xfa/fwl/basewidget/ifwl_listbox.h"
+#include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fwl/core/ifwl_widget.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_ListItem;
+
+class CFWL_ListBox : public CFWL_Widget {
+ public:
+  static CFWL_ListBox* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR AddDIBitmap(CFX_DIBitmap* pDIB, FWL_HLISTITEM hItem);
+  FWL_HLISTITEM AddString(const CFX_WideStringC& wsAdd,
+                          FX_BOOL bSelect = FALSE);
+  FX_BOOL DeleteString(FWL_HLISTITEM hItem);
+  void DeleteAll();
+  int32_t CountSelItems();
+  FWL_HLISTITEM GetSelItem(int32_t nIndexSel);
+  int32_t GetSelIndex(int32_t nIndex);
+  FWL_ERR SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect = TRUE);
+  FWL_ERR GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText);
+  FWL_ERR GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert = TRUE);
+  FWL_ERR SetItemHeight(FX_FLOAT fItemHeight);
+  FWL_HLISTITEM GetFocusItem();
+  FWL_ERR SetFocusItem(FWL_HLISTITEM hItem);
+  FWL_ERR* Sort(IFWL_ListBoxCompare* pCom);
+  int32_t CountItems();
+  FWL_HLISTITEM GetItem(int32_t nIndex);
+  FWL_ERR SetItemString(FWL_HLISTITEM hItem, const CFX_WideStringC& wsText);
+  FWL_ERR GetItemString(FWL_HLISTITEM hItem, CFX_WideString& wsText);
+  FWL_ERR SetItemData(FWL_HLISTITEM hItem, void* pData);
+  void* GetItemData(FWL_HLISTITEM hItem);
+  FWL_HLISTITEM GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy);
+  uint32_t GetItemStates(FWL_HLISTITEM hItem);
+  CFWL_ListBox();
+  virtual ~CFWL_ListBox();
+
+ protected:
+  class CFWL_ListBoxDP : public IFWL_ListBoxDP {
+   public:
+    CFWL_ListBoxDP();
+    ~CFWL_ListBoxDP();
+
+    // IFWL_DataProvider:
+    FWL_ERR GetCaption(IFWL_Widget* pWidget,
+                       CFX_WideString& wsCaption) override;
+
+    // IFWL_ListBoxDP:
+    int32_t CountItems(IFWL_Widget* pWidget) override;
+    FWL_HLISTITEM GetItem(IFWL_Widget* pWidget, int32_t nIndex) override;
+    int32_t GetItemIndex(IFWL_Widget* pWidget, FWL_HLISTITEM hItem) override;
+    FX_BOOL SetItemIndex(IFWL_Widget* pWidget,
+                         FWL_HLISTITEM hItem,
+                         int32_t nIndex) override;
+    uint32_t GetItemStyles(IFWL_Widget* pWidget, FWL_HLISTITEM hItem) override;
+    FWL_ERR GetItemText(IFWL_Widget* pWidget,
+                        FWL_HLISTITEM hItem,
+                        CFX_WideString& wsText) override;
+    FWL_ERR GetItemRect(IFWL_Widget* pWidget,
+                        FWL_HLISTITEM hItem,
+                        CFX_RectF& rtItem) override;
+    void* GetItemData(IFWL_Widget* pWidget, FWL_HLISTITEM hItem) override;
+    FWL_ERR SetItemStyles(IFWL_Widget* pWidget,
+                          FWL_HLISTITEM hItem,
+                          uint32_t dwStyle) override;
+    FWL_ERR SetItemText(IFWL_Widget* pWidget,
+                        FWL_HLISTITEM hItem,
+                        const FX_WCHAR* pszText) override;
+    FWL_ERR SetItemRect(IFWL_Widget* pWidget,
+                        FWL_HLISTITEM hItem,
+                        const CFX_RectF& rtItem) override;
+    FX_FLOAT GetItemHeight(IFWL_Widget* pWidget) override;
+    CFX_DIBitmap* GetItemIcon(IFWL_Widget* pWidget,
+                              FWL_HLISTITEM hItem) override;
+    FWL_ERR GetItemCheckRect(IFWL_Widget* pWidget,
+                             FWL_HLISTITEM hItem,
+                             CFX_RectF& rtCheck) override;
+    FWL_ERR SetItemCheckRect(IFWL_Widget* pWidget,
+                             FWL_HLISTITEM hItem,
+                             const CFX_RectF& rtCheck) override;
+    uint32_t GetItemCheckState(IFWL_Widget* pWidget,
+                               FWL_HLISTITEM hItem) override;
+    FWL_ERR SetItemCheckState(IFWL_Widget* pWidget,
+                              FWL_HLISTITEM hItem,
+                              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:
+  CFWL_ListItem() {
+    m_rtItem.Reset();
+    m_dwStates = 0;
+    m_wsText = L"";
+    m_pDIB = NULL;
+    m_pData = NULL;
+    m_dwCheckState = 0;
+    m_rtCheckBox.Reset();
+  }
+  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;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_LISTBOX_H_
diff --git a/xfa/fwl/lightwidget/picturebox.cpp b/xfa/fwl/lightwidget/cfwl_picturebox.cpp
similarity index 98%
rename from xfa/fwl/lightwidget/picturebox.cpp
rename to xfa/fwl/lightwidget/cfwl_picturebox.cpp
index e35741c..b0bd3c9 100644
--- a/xfa/fwl/lightwidget/picturebox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_picturebox.cpp
@@ -4,13 +4,14 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/picturebox.h"
+#include "xfa/fwl/lightwidget/cfwl_picturebox.h"
 
 #include <memory>
 
 CFWL_PictureBox* CFWL_PictureBox::Create() {
   return new CFWL_PictureBox;
 }
+
 FWL_ERR CFWL_PictureBox::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -27,45 +28,56 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 CFX_DIBitmap* CFWL_PictureBox::GetPicture() {
   return m_PictureBoxDP.m_pBitmap;
 }
+
 FWL_ERR CFWL_PictureBox::SetPicture(CFX_DIBitmap* pBitmap) {
   m_PictureBoxDP.m_pBitmap = pBitmap;
   return FWL_ERR_Succeeded;
 }
+
 FX_FLOAT CFWL_PictureBox::GetRotation() {
   return m_PictureBoxDP.m_fRotation;
 }
+
 FWL_ERR CFWL_PictureBox::SetRotation(FX_FLOAT fRotation) {
   m_PictureBoxDP.m_fRotation = fRotation;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_PictureBox::GetFlipMode() {
   return m_PictureBoxDP.GetFlipMode(m_pIface);
 }
+
 FWL_ERR CFWL_PictureBox::SetFlipMode(int32_t iFlipMode) {
   m_PictureBoxDP.m_iFlipMode = iFlipMode;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_PictureBox::GetOpacity() {
   return m_PictureBoxDP.GetOpacity(m_pIface);
 }
+
 FWL_ERR CFWL_PictureBox::SetOpacity(int32_t iOpacity) {
   m_PictureBoxDP.m_iOpacity = iOpacity;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_PictureBox::GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY) {
   CFX_Matrix matrix;
   m_PictureBoxDP.GetMatrix(m_pIface, matrix);
   matrix.Scale(fScaleX, fScaleY);
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_PictureBox::SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY) {
   m_PictureBoxDP.m_fScaleX = fScaleX;
   m_PictureBoxDP.m_fScaleY = fScaleY;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_PictureBox::GetOffset(FX_FLOAT& fx, FX_FLOAT& fy) {
   CFX_Matrix matrix;
   m_PictureBoxDP.GetMatrix(m_pIface, matrix);
@@ -73,33 +85,42 @@
   fy = matrix.f;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_PictureBox::SetOffset(FX_FLOAT fx, FX_FLOAT fy) {
   m_PictureBoxDP.m_fOffSetX = fx;
   m_PictureBoxDP.m_fOffSetY = fy;
   return FWL_ERR_Succeeded;
 }
+
 CFWL_PictureBox::CFWL_PictureBox() {}
+
 CFWL_PictureBox::~CFWL_PictureBox() {}
+
 FWL_ERR CFWL_PictureBox::CFWL_PictureBoxDP::GetCaption(
     IFWL_Widget* pWidget,
     CFX_WideString& wsCaption) {
   return FWL_ERR_Succeeded;
 }
+
 CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetPicture(
     IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
+
 CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetErrorPicture(
     IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
+
 CFX_DIBitmap* CFWL_PictureBox::CFWL_PictureBoxDP::GetInitialPicture(
     IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
+
 int32_t CFWL_PictureBox::CFWL_PictureBoxDP::GetOpacity(IFWL_Widget* pWidget) {
   return m_iOpacity;
 }
+
 FWL_ERR CFWL_PictureBox::CFWL_PictureBoxDP::GetMatrix(IFWL_Widget* pWidget,
                                                       CFX_Matrix& matrix) {
   CFX_RectF rect;
@@ -114,6 +135,7 @@
   matrix.Translate(m_fOffSetX, m_fOffSetY);
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_PictureBox::CFWL_PictureBoxDP::GetFlipMode(IFWL_Widget* pWidget) {
   return m_iFlipMode;
 }
diff --git a/xfa/fwl/lightwidget/cfwl_picturebox.h b/xfa/fwl/lightwidget/cfwl_picturebox.h
new file mode 100644
index 0000000..8fa985a
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_picturebox.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_PICTUREBOX_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_PICTUREBOX_H_
+
+#include "xfa/fwl/basewidget/ifwl_picturebox.h"
+#include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_PictureBox : public CFWL_Widget {
+ public:
+  static CFWL_PictureBox* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  CFX_DIBitmap* GetPicture();
+  FWL_ERR SetPicture(CFX_DIBitmap* pBitmap);
+  FX_FLOAT GetRotation();
+  FWL_ERR SetRotation(FX_FLOAT fRotation);
+  int32_t GetFlipMode();
+  FWL_ERR SetFlipMode(int32_t iFlipMode);
+  int32_t GetOpacity();
+  FWL_ERR SetOpacity(int32_t iOpacity);
+  FWL_ERR GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY);
+  FWL_ERR SetScale(FX_FLOAT fScaleX, FX_FLOAT fScaleY);
+  FWL_ERR GetOffset(FX_FLOAT& fx, FX_FLOAT& fy);
+  FWL_ERR SetOffset(FX_FLOAT fx, FX_FLOAT fy);
+  CFWL_PictureBox();
+  virtual ~CFWL_PictureBox();
+
+ protected:
+  class CFWL_PictureBoxDP : public IFWL_PictureBoxDP {
+   public:
+    CFWL_PictureBoxDP() {
+      m_fRotation = 0.0f;
+      m_fScaleX = 1.0f;
+      m_fScaleY = 1.0f;
+      m_fOffSetX = 0.0f;
+      m_fOffSetY = 0.0f;
+      m_pBitmap = NULL;
+    }
+    virtual FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+    virtual CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget);
+    virtual CFX_DIBitmap* GetErrorPicture(IFWL_Widget* pWidget);
+    virtual CFX_DIBitmap* GetInitialPicture(IFWL_Widget* pWidget);
+    virtual int32_t GetOpacity(IFWL_Widget* pWidget);
+    virtual int32_t GetFlipMode(IFWL_Widget* pWidget);
+    virtual FWL_ERR GetMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix);
+    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;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_PICTUREBOX_H_
diff --git a/xfa/fwl/lightwidget/pushbutton.cpp b/xfa/fwl/lightwidget/cfwl_pushbutton.cpp
similarity index 96%
rename from xfa/fwl/lightwidget/pushbutton.cpp
rename to xfa/fwl/lightwidget/cfwl_pushbutton.cpp
index c9fb74e..52747bd 100644
--- a/xfa/fwl/lightwidget/pushbutton.cpp
+++ b/xfa/fwl/lightwidget/cfwl_pushbutton.cpp
@@ -4,13 +4,14 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/pushbutton.h"
+#include "xfa/fwl/lightwidget/cfwl_pushbutton.h"
 
 #include <memory>
 
 CFWL_PushButton* CFWL_PushButton::Create() {
   return new CFWL_PushButton;
 }
+
 FWL_ERR CFWL_PushButton::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -27,29 +28,37 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_PushButton::GetCaption(CFX_WideString& wsCaption) {
   wsCaption = m_buttonData.m_wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_PushButton::SetCaption(const CFX_WideStringC& wsCaption) {
   m_buttonData.m_wsCaption = wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 CFX_DIBitmap* CFWL_PushButton::GetPicture() {
   return m_buttonData.m_pBitmap;
 }
+
 FWL_ERR CFWL_PushButton::SetPicture(CFX_DIBitmap* pBitmap) {
   m_buttonData.m_pBitmap = pBitmap;
   return FWL_ERR_Succeeded;
 }
+
 CFWL_PushButton::CFWL_PushButton() {}
+
 CFWL_PushButton::~CFWL_PushButton() {}
+
 FWL_ERR CFWL_PushButton::CFWL_PushButtonDP::GetCaption(
     IFWL_Widget* pWidget,
     CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 CFX_DIBitmap* CFWL_PushButton::CFWL_PushButtonDP::GetPicture(
     IFWL_Widget* pWidget) {
   return m_pBitmap;
diff --git a/xfa/fwl/lightwidget/cfwl_pushbutton.h b/xfa/fwl/lightwidget/cfwl_pushbutton.h
new file mode 100644
index 0000000..99b067d
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_pushbutton.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_PUSHBUTTON_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_PUSHBUTTON_H_
+
+#include "xfa/fwl/basewidget/ifwl_pushbutton.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_PushButton : public CFWL_Widget {
+ public:
+  static CFWL_PushButton* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR GetCaption(CFX_WideString& wsCaption);
+  FWL_ERR SetCaption(const CFX_WideStringC& wsCaption);
+  CFX_DIBitmap* GetPicture();
+  FWL_ERR SetPicture(CFX_DIBitmap* pBitmap);
+  CFWL_PushButton();
+  virtual ~CFWL_PushButton();
+
+ protected:
+  class CFWL_PushButtonDP : public IFWL_PushButtonDP {
+   public:
+    CFWL_PushButtonDP() : m_pBitmap(NULL) {}
+    FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+    virtual CFX_DIBitmap* GetPicture(IFWL_Widget* pWidget);
+    CFX_WideString m_wsCaption;
+    CFX_DIBitmap* m_pBitmap;
+  };
+  CFWL_PushButtonDP m_buttonData;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_PUSHBUTTON_H_
diff --git a/xfa/fwl/lightwidget/scrollbar.cpp b/xfa/fwl/lightwidget/cfwl_scrollbar.cpp
similarity index 97%
rename from xfa/fwl/lightwidget/scrollbar.cpp
rename to xfa/fwl/lightwidget/cfwl_scrollbar.cpp
index 62f2ffd..0c02314 100644
--- a/xfa/fwl/lightwidget/scrollbar.cpp
+++ b/xfa/fwl/lightwidget/cfwl_scrollbar.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/scrollbar.h"
+#include "xfa/fwl/lightwidget/cfwl_scrollbar.h"
 
 #include <memory>
 
@@ -13,6 +13,11 @@
 CFWL_ScrollBar* CFWL_ScrollBar::Create() {
   return new CFWL_ScrollBar;
 }
+
+CFWL_ScrollBar::CFWL_ScrollBar() {}
+
+CFWL_ScrollBar::~CFWL_ScrollBar() {}
+
 FWL_ERR CFWL_ScrollBar::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -29,65 +34,75 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FX_BOOL CFWL_ScrollBar::IsVertical() {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->IsVertical();
 }
+
 FWL_ERR CFWL_ScrollBar::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->GetRange(fMin, fMax);
 }
+
 FWL_ERR CFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->SetRange(fMin, fMax);
 }
+
 FX_FLOAT CFWL_ScrollBar::GetPageSize() {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->GetPageSize();
 }
+
 FWL_ERR CFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->SetPageSize(fPageSize);
 }
+
 FX_FLOAT CFWL_ScrollBar::GetStepSize() {
   if (!m_pIface)
     return 0;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->GetStepSize();
 }
+
 FWL_ERR CFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->SetStepSize(fStepSize);
 }
+
 FX_FLOAT CFWL_ScrollBar::GetPos() {
   if (!m_pIface)
     return -1;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->GetPos();
 }
+
 FWL_ERR CFWL_ScrollBar::SetPos(FX_FLOAT fPos) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->SetPos(fPos);
 }
+
 FX_FLOAT CFWL_ScrollBar::GetTrackPos() {
   if (!m_pIface)
     return -1;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->GetTrackPos();
 }
+
 FWL_ERR CFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->SetTrackPos(fTrackPos);
 }
+
 FX_BOOL CFWL_ScrollBar::DoScroll(uint32_t dwCode, FX_FLOAT fPos) {
   if (!m_pIface)
     return FALSE;
   return static_cast<IFWL_ScrollBar*>(m_pIface)->DoScroll(dwCode, fPos);
 }
-CFWL_ScrollBar::CFWL_ScrollBar() {}
-CFWL_ScrollBar::~CFWL_ScrollBar() {}
diff --git a/xfa/fwl/lightwidget/cfwl_scrollbar.h b/xfa/fwl/lightwidget/cfwl_scrollbar.h
new file mode 100644
index 0000000..89c0fe4
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_scrollbar.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_SCROLLBAR_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_SCROLLBAR_H_
+
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_ScrollBar : public CFWL_Widget {
+ public:
+  static CFWL_ScrollBar* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FX_BOOL IsVertical();
+  FWL_ERR GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax);
+  FWL_ERR SetRange(FX_FLOAT fMin, FX_FLOAT fMax);
+  FX_FLOAT GetPageSize();
+  FWL_ERR SetPageSize(FX_FLOAT fPageSize);
+  FX_FLOAT GetStepSize();
+  FWL_ERR SetStepSize(FX_FLOAT fStepSize);
+  FX_FLOAT GetPos();
+  FWL_ERR SetPos(FX_FLOAT fPos);
+  FX_FLOAT GetTrackPos();
+  FWL_ERR SetTrackPos(FX_FLOAT fTrackPos);
+  FX_BOOL DoScroll(uint32_t dwCode, FX_FLOAT fPos = 0.0f);
+  CFWL_ScrollBar();
+  virtual ~CFWL_ScrollBar();
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_SCROLLBAR_H_
diff --git a/xfa/fwl/lightwidget/theme.cpp b/xfa/fwl/lightwidget/cfwl_theme.cpp
similarity index 87%
rename from xfa/fwl/lightwidget/theme.cpp
rename to xfa/fwl/lightwidget/cfwl_theme.cpp
index 59729c1..fdb0a89 100644
--- a/xfa/fwl/lightwidget/theme.cpp
+++ b/xfa/fwl/lightwidget/cfwl_theme.cpp
@@ -4,25 +4,25 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/theme.h"
+#include "xfa/fwl/lightwidget/cfwl_theme.h"
 
 #include <algorithm>
 
 #include "xfa/fwl/core/cfwl_themebackground.h"
 #include "xfa/fwl/core/cfwl_themepart.h"
 #include "xfa/fwl/core/cfwl_themetext.h"
-#include "xfa/include/fwl/theme/barcodetp.h"
-#include "xfa/include/fwl/theme/carettp.h"
-#include "xfa/include/fwl/theme/checkboxtp.h"
-#include "xfa/include/fwl/theme/comboboxtp.h"
-#include "xfa/include/fwl/theme/datetimepickertp.h"
-#include "xfa/include/fwl/theme/edittp.h"
-#include "xfa/include/fwl/theme/formtp.h"
-#include "xfa/include/fwl/theme/listboxtp.h"
-#include "xfa/include/fwl/theme/monthcalendartp.h"
-#include "xfa/include/fwl/theme/pictureboxtp.h"
-#include "xfa/include/fwl/theme/pushbuttontp.h"
-#include "xfa/include/fwl/theme/scrollbartp.h"
+#include "xfa/fwl/theme/cfwl_barcodetp.h"
+#include "xfa/fwl/theme/cfwl_carettp.h"
+#include "xfa/fwl/theme/cfwl_checkboxtp.h"
+#include "xfa/fwl/theme/cfwl_comboboxtp.h"
+#include "xfa/fwl/theme/cfwl_datetimepickertp.h"
+#include "xfa/fwl/theme/cfwl_edittp.h"
+#include "xfa/fwl/theme/cfwl_formtp.h"
+#include "xfa/fwl/theme/cfwl_listboxtp.h"
+#include "xfa/fwl/theme/cfwl_monthcalendartp.h"
+#include "xfa/fwl/theme/cfwl_pictureboxtp.h"
+#include "xfa/fwl/theme/cfwl_pushbuttontp.h"
+#include "xfa/fwl/theme/cfwl_scrollbartp.h"
 
 CFWL_Theme::CFWL_Theme() {
   m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_FormTP));
diff --git a/xfa/fwl/lightwidget/cfwl_theme.h b/xfa/fwl/lightwidget/cfwl_theme.h
new file mode 100644
index 0000000..fa62e09
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_theme.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_THEME_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_THEME_H_
+
+#include <memory>
+#include <vector>
+
+#include "core/fxcrt/include/fx_coordinates.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "core/include/fxge/fx_dib.h"
+#include "xfa/fwl/core/ifwl_themeprovider.h"
+
+class CFWL_WidgetTP;
+class IFWL_Widget;
+class CFWL_ThemePart;
+class CFWL_ThemeText;
+
+class CFWL_Theme : public IFWL_ThemeProvider {
+ public:
+  CFWL_Theme();
+  ~CFWL_Theme() override;
+
+  // IFWL_ThemeProvider:
+  FX_BOOL IsValidWidget(IFWL_Widget* pWidget) override;
+  uint32_t GetThemeID(IFWL_Widget* pWidget) override;
+  uint32_t SetThemeID(IFWL_Widget* pWidget,
+                      uint32_t dwThemeID,
+                      FX_BOOL bChildren = TRUE) override;
+  FWL_ERR GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
+  FWL_ERR SetThemeMatrix(IFWL_Widget* pWidget,
+                         const CFX_Matrix& matrix) override;
+  FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
+  FX_BOOL DrawText(CFWL_ThemeText* pParams) override;
+  void* GetCapacity(CFWL_ThemePart* pThemePart, uint32_t dwCapacity) override;
+  FX_BOOL IsCustomizedLayout(IFWL_Widget* pWidget) override;
+  FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) override;
+  FX_BOOL IsInPart(CFWL_ThemePart* pThemePart,
+                   FX_FLOAT fx,
+                   FX_FLOAT fy) override;
+  FX_BOOL CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) override;
+
+  FWL_ERR Initialize();
+  FWL_ERR Finalize();
+  FWL_ERR SetFont(IFWL_Widget* pWidget,
+                  const FX_WCHAR* strFont,
+                  FX_FLOAT fFontSize,
+                  FX_ARGB rgbFont);
+  CFWL_WidgetTP* GetTheme(IFWL_Widget* pWidget);
+
+ protected:
+  std::vector<std::unique_ptr<CFWL_WidgetTP>> m_ThemesArray;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_THEME_H_
diff --git a/xfa/fwl/lightwidget/tooltipctrl.cpp b/xfa/fwl/lightwidget/cfwl_tooltip.cpp
similarity index 97%
rename from xfa/fwl/lightwidget/tooltipctrl.cpp
rename to xfa/fwl/lightwidget/cfwl_tooltip.cpp
index 323eed0..abdf489 100644
--- a/xfa/fwl/lightwidget/tooltipctrl.cpp
+++ b/xfa/fwl/lightwidget/cfwl_tooltip.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/tooltipctrl.h"
+#include "xfa/fwl/lightwidget/cfwl_tooltip.h"
 
 #include <memory>
 
@@ -18,6 +18,7 @@
 CFWL_ToolTip* CFWL_ToolTip::Create() {
   return new CFWL_ToolTip;
 }
+
 FWL_ERR CFWL_ToolTip::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (m_pIface)
     return FWL_ERR_Indefinite;
@@ -34,78 +35,100 @@
   CFWL_Widget::Initialize();
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ToolTip::GetCaption(CFX_WideString& wsCaption) {
   wsCaption = m_tooltipData.m_wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ToolTip::SetCaption(const CFX_WideStringC& wsCaption) {
   m_tooltipData.m_wsCaption = wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_ToolTip::GetInitialDelay() {
   return m_tooltipData.m_nInitDelayTime;
 }
+
 int32_t CFWL_ToolTip::SetInitialDelay(int32_t nDelayTime) {
   m_tooltipData.m_nInitDelayTime = nDelayTime;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_ToolTip::GetAutoPopDelay() {
   return m_tooltipData.m_nAutoPopDelayTime;
 }
+
 int32_t CFWL_ToolTip::SetAutoPopDelay(int32_t nDelayTime) {
   m_tooltipData.m_nAutoPopDelayTime = nDelayTime;
   return FWL_ERR_Succeeded;
 }
+
 CFX_DIBitmap* CFWL_ToolTip::GetToolTipIcon() {
   return m_tooltipData.m_pBitmap;
 }
+
 FWL_ERR CFWL_ToolTip::SetToolTipIcon(CFX_DIBitmap* pBitmap) {
   m_tooltipData.m_pBitmap = pBitmap;
   return FWL_ERR_Succeeded;
 }
+
 CFX_SizeF CFWL_ToolTip::GetToolTipIconSize() {
   return m_tooltipData.m_fIconSize;
 }
+
 FWL_ERR CFWL_ToolTip::SetToolTipIconSize(CFX_SizeF fSize) {
   m_tooltipData.m_fIconSize = fSize;
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_ToolTip::SetAnchor(const CFX_RectF& rtAnchor) {
   return static_cast<IFWL_ToolTip*>(m_pIface)->SetAnchor(rtAnchor);
 }
+
 FWL_ERR CFWL_ToolTip::Show() {
   return static_cast<IFWL_ToolTip*>(m_pIface)->Show();
 }
+
 FWL_ERR CFWL_ToolTip::Hide() {
   return static_cast<IFWL_ToolTip*>(m_pIface)->Hide();
 }
+
 CFWL_ToolTip::CFWL_ToolTip() {}
+
 CFWL_ToolTip::~CFWL_ToolTip() {}
+
 CFWL_ToolTip::CFWL_ToolTipDP::CFWL_ToolTipDP() : m_pBitmap(NULL) {
   m_wsCaption = L"";
   m_nInitDelayTime = 500;
   m_nAutoPopDelayTime = 50000;
   m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
 }
+
 FWL_ERR CFWL_ToolTip::CFWL_ToolTipDP::GetCaption(IFWL_Widget* pWidget,
                                                  CFX_WideString& wsCaption) {
   wsCaption = m_wsCaption;
   return FWL_ERR_Succeeded;
 }
+
 int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
   return m_nInitDelayTime;
 }
+
 int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
   return m_nAutoPopDelayTime;
 }
+
 CFX_DIBitmap* CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIcon(
     IFWL_Widget* pWidget) {
   return m_pBitmap;
 }
+
 CFX_SizeF CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIconSize(
     IFWL_Widget* pWidget) {
   return m_fIconSize;
 }
+
 CFX_RectF CFWL_ToolTip::CFWL_ToolTipDP::GetAnchor() {
   return m_fAnchor;
 }
diff --git a/xfa/fwl/lightwidget/cfwl_tooltip.h b/xfa/fwl/lightwidget/cfwl_tooltip.h
new file mode 100644
index 0000000..817362a
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_tooltip.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_TOOLTIP_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_TOOLTIP_H_
+
+#include "xfa/fwl/basewidget/ifwl_tooltip.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+class CFWL_ToolTip : public CFWL_Widget {
+ public:
+  static CFWL_ToolTip* Create();
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+  FWL_ERR GetCaption(CFX_WideString& wsCaption);
+  FWL_ERR SetCaption(const CFX_WideStringC& wsCaption);
+  int32_t GetInitialDelay();
+  int32_t SetInitialDelay(int32_t nDelayTime);
+  int32_t GetAutoPopDelay();
+  int32_t SetAutoPopDelay(int32_t nDelayTime);
+  CFX_DIBitmap* GetToolTipIcon();
+  FWL_ERR SetToolTipIcon(CFX_DIBitmap* pBitmap);
+  CFX_SizeF GetToolTipIconSize();
+  FWL_ERR SetToolTipIconSize(CFX_SizeF fSize);
+  FWL_ERR SetAnchor(const CFX_RectF& rtAnchor);
+  FWL_ERR Show();
+  FWL_ERR Hide();
+  CFWL_ToolTip();
+  virtual ~CFWL_ToolTip();
+
+ protected:
+  class CFWL_ToolTipDP : public IFWL_ToolTipDP {
+   public:
+    CFWL_ToolTipDP();
+    FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
+    int32_t GetInitialDelay(IFWL_Widget* pWidget);
+    int32_t GetAutoPopDelay(IFWL_Widget* pWidget);
+    CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget);
+    CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget);
+    CFX_RectF GetAnchor();
+    CFX_WideString m_wsCaption;
+    int32_t m_nInitDelayTime;
+    int32_t m_nAutoPopDelayTime;
+    CFX_DIBitmap* m_pBitmap;
+    CFX_SizeF m_fIconSize;
+    CFX_RectF m_fAnchor;
+  };
+  CFWL_ToolTipDP m_tooltipData;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_TOOLTIP_H_
diff --git a/xfa/fwl/lightwidget/widget.cpp b/xfa/fwl/lightwidget/cfwl_widget.cpp
similarity index 89%
rename from xfa/fwl/lightwidget/widget.cpp
rename to xfa/fwl/lightwidget/cfwl_widget.cpp
index 294604a..1f4512e 100644
--- a/xfa/fwl/lightwidget/widget.cpp
+++ b/xfa/fwl/lightwidget/cfwl_widget.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/include/fwl/lightwidget/widget.h"
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
 
 #include "xfa/fde/tto/fde_textout.h"
 #include "xfa/fwl/core/cfwl_themetext.h"
@@ -16,65 +16,60 @@
 #include "xfa/fwl/core/ifwl_notethread.h"
 #include "xfa/fwl/core/ifwl_themeprovider.h"
 
-CFWL_WidgetImpProperties CFWL_WidgetProperties::MakeWidgetImpProperties(
-    IFWL_DataProvider* pDataProvider) const {
-  CFWL_WidgetImpProperties result;
-  result.m_ctmOnParent = m_ctmOnParent;
-  result.m_rtWidget = m_rtWidget;
-  result.m_dwStyles = m_dwStyles;
-  result.m_dwStyleExes = m_dwStyleExes;
-  result.m_dwStates = m_dwStates;
-  if (m_pParent)
-    result.m_pParent = m_pParent->GetWidget();
-  if (m_pOwner)
-    result.m_pOwner = m_pOwner->GetWidget();
-  result.m_pDataProvider = pDataProvider;
-  return result;
-}
 IFWL_Widget* CFWL_Widget::GetWidget() {
   return m_pIface;
 }
+
 FWL_ERR CFWL_Widget::GetClassName(CFX_WideString& wsClass) const {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->GetClassName(wsClass);
 }
+
 uint32_t CFWL_Widget::GetClassID() const {
   if (!m_pIface)
     return 0;
   return m_pIface->GetClassID();
 }
+
 FX_BOOL CFWL_Widget::IsInstance(const CFX_WideStringC& wsClass) const {
   if (!m_pIface)
     return FALSE;
   return m_pIface->IsInstance(wsClass);
 }
+
 static void* gs_pFWLWidget = (void*)FXBSTR_ID('l', 'i', 'g', 't');
+
 FWL_ERR CFWL_Widget::Initialize(const CFWL_WidgetProperties* pProperties) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->SetPrivateData(gs_pFWLWidget, this, NULL);
 }
+
 FWL_ERR CFWL_Widget::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->GetWidgetRect(rect, bAutoSize);
 }
+
 FWL_ERR CFWL_Widget::GetGlobalRect(CFX_RectF& rect) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->GetGlobalRect(rect);
 }
+
 FWL_ERR CFWL_Widget::SetWidgetRect(const CFX_RectF& rect) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->SetWidgetRect(rect);
 }
+
 FWL_ERR CFWL_Widget::GetClientRect(CFX_RectF& rect) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->GetClientRect(rect);
 }
+
 CFWL_Widget* CFWL_Widget::GetParent() {
   if (!m_pIface)
     return NULL;
@@ -84,26 +79,31 @@
   }
   return NULL;
 }
+
 FWL_ERR CFWL_Widget::SetParent(CFWL_Widget* pParent) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->SetParent(pParent ? pParent->GetWidget() : NULL);
 }
+
 CFWL_Widget* CFWL_Widget::GetOwner() {
   if (!m_pIface)
     return NULL;
   return NULL;
 }
+
 FWL_ERR CFWL_Widget::SetOwner(CFWL_Widget* pOwner) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return FWL_ERR_Succeeded;
 }
+
 uint32_t CFWL_Widget::GetStyles() {
   if (!m_pIface)
     return 0;
   return m_pIface->GetStyles();
 }
+
 FWL_ERR CFWL_Widget::ModifyStyles(uint32_t dwStylesAdded,
                                   uint32_t dwStylesRemoved) {
   if (!m_pIface)
@@ -115,20 +115,24 @@
     return 0;
   return m_pIface->GetStylesEx();
 }
+
 FWL_ERR CFWL_Widget::ModifyStylesEx(uint32_t dwStylesExAdded,
                                     uint32_t dwStylesExRemoved) {
   return m_pIface->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
 }
+
 uint32_t CFWL_Widget::GetStates() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->GetStates();
 }
+
 FWL_ERR CFWL_Widget::SetStates(uint32_t dwStates, FX_BOOL bSet) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->SetStates(dwStates, bSet);
 }
+
 FWL_ERR CFWL_Widget::SetPrivateData(void* module_id,
                                     void* pData,
                                     PD_CALLBACK_FREEDATA callback) {
@@ -136,31 +140,37 @@
     return FWL_ERR_Indefinite;
   return m_pIface->SetPrivateData(module_id, pData, callback);
 }
+
 void* CFWL_Widget::GetPrivateData(void* module_id) {
   if (!m_pIface)
     return NULL;
   return m_pIface->GetPrivateData(module_id);
 }
+
 FWL_ERR CFWL_Widget::Update() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->Update();
 }
+
 FWL_ERR CFWL_Widget::LockUpdate() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->LockUpdate();
 }
+
 FWL_ERR CFWL_Widget::UnlockUpdate() {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->UnlockUpdate();
 }
+
 uint32_t CFWL_Widget::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
   if (!m_pIface)
     return 0;
   return m_pIface->HitTest(fx, fy);
 }
+
 FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget* pWidget,
                                  FX_FLOAT& fx,
                                  FX_FLOAT& fy) {
@@ -168,39 +178,46 @@
     return FWL_ERR_Indefinite;
   return m_pIface->TransformTo(pWidget ? pWidget->GetWidget() : NULL, fx, fy);
 }
+
 FWL_ERR CFWL_Widget::TransformTo(CFWL_Widget* pWidget, CFX_RectF& rt) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->TransformTo(pWidget ? pWidget->GetWidget() : NULL, rt);
 }
+
 FWL_ERR CFWL_Widget::GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->GetMatrix(matrix, bGlobal);
 }
+
 FWL_ERR CFWL_Widget::SetMatrix(const CFX_Matrix& matrix) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->SetMatrix(matrix);
 }
+
 FWL_ERR CFWL_Widget::DrawWidget(CFX_Graphics* pGraphics,
                                 const CFX_Matrix* pMatrix) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
   return m_pIface->DrawWidget(pGraphics, pMatrix);
 }
+
 IFWL_WidgetDelegate* CFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) {
   if (!m_pIface)
     return NULL;
   m_pDelegate = m_pIface->SetDelegate(pDelegate);
   return m_pDelegate;
 }
+
 CFWL_Widget::CFWL_Widget()
     : m_pIface(NULL), m_pDelegate(NULL), m_pProperties(NULL) {
   m_pProperties = new CFWL_WidgetProperties;
   m_pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
   FXSYS_assert(m_pWidgetMgr != NULL);
 }
+
 CFWL_Widget::~CFWL_Widget() {
   delete m_pProperties;
   if (m_pIface) {
@@ -208,6 +225,7 @@
     delete m_pIface;
   }
 }
+
 FWL_ERR CFWL_Widget::Repaint(const CFX_RectF* pRect) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
@@ -220,6 +238,7 @@
   }
   return m_pWidgetMgr->RepaintWidget(m_pIface, &rect);
 }
+
 FWL_ERR CFWL_Widget::SetFocus(FX_BOOL bFocus) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
@@ -238,6 +257,7 @@
   }
   return FWL_ERR_Succeeded;
 }
+
 FWL_ERR CFWL_Widget::SetGrab(FX_BOOL bSet) {
   if (!m_pIface)
     return FWL_ERR_Indefinite;
@@ -250,6 +270,7 @@
   pDriver->SetGrab(m_pIface, bSet);
   return FWL_ERR_Succeeded;
 }
+
 void CFWL_Widget::RegisterEventTarget(CFWL_Widget* pEventSource,
                                       uint32_t dwFilter) {
   if (!m_pIface)
@@ -264,6 +285,7 @@
       !pEventSource ? NULL : pEventSource->GetWidget();
   pNoteDriver->RegisterEventTarget(GetWidget(), pEventSourceImp, dwFilter);
 }
+
 void CFWL_Widget::DispatchEvent(CFWL_Event* pEvent) {
   if (!m_pIface)
     return;
@@ -278,9 +300,11 @@
     return;
   pNoteDriver->SendNote(pEvent);
 }
+
 #define FWL_WGT_CalcHeight 2048
 #define FWL_WGT_CalcWidth 2048
 #define FWL_WGT_CalcMultiLineDefWidth 120.0f
+
 CFX_SizeF CFWL_Widget::CalcTextSize(const CFX_WideString& wsText,
                                     FX_BOOL bMultiLine,
                                     int32_t iLineWidth) {
@@ -305,15 +329,3 @@
   pTheme->CalcTextRect(&calPart, rect);
   return CFX_SizeF(rect.width, rect.height);
 }
-CFWL_WidgetDelegate::CFWL_WidgetDelegate() {}
-CFWL_WidgetDelegate::~CFWL_WidgetDelegate() {}
-int32_t CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  return 1;
-}
-FWL_ERR CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event* pEvent) {
-  return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                          const CFX_Matrix* pMatrix) {
-  return FWL_ERR_Succeeded;
-}
diff --git a/xfa/fwl/lightwidget/cfwl_widget.h b/xfa/fwl/lightwidget/cfwl_widget.h
new file mode 100644
index 0000000..f1b6715
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_widget.h
@@ -0,0 +1,76 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_WIDGET_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_WIDGET_H_
+
+#include "xfa/fwl/core/cfwl_event.h"
+#include "xfa/fwl/lightwidget/cfwl_widgetproperties.h"
+#include "xfa/fwl/core/ifwl_widget.h"
+
+class CFWL_Event;
+class CFWL_Message;
+class CFWL_Widget;
+class CFWL_WidgetDelegate;
+class CFWL_WidgetMgr;
+
+class CFWL_Widget {
+ public:
+  virtual ~CFWL_Widget();
+  IFWL_Widget* GetWidget();
+  FWL_ERR GetClassName(CFX_WideString& wsClass) const;
+  uint32_t GetClassID() const;
+  virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
+
+  FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
+  FWL_ERR GetGlobalRect(CFX_RectF& rect);
+  FWL_ERR SetWidgetRect(const CFX_RectF& rect);
+  FWL_ERR GetClientRect(CFX_RectF& rtClient);
+  CFWL_Widget* GetParent();
+  FWL_ERR SetParent(CFWL_Widget* pParent);
+  CFWL_Widget* GetOwner();
+  FWL_ERR SetOwner(CFWL_Widget* pOwner);
+  uint32_t GetStyles();
+  FWL_ERR ModifyStyles(uint32_t dwStylesAdded, uint32_t dwStylesRemoved);
+  uint32_t GetStylesEx();
+  FWL_ERR ModifyStylesEx(uint32_t dwStylesExAdded, uint32_t dwStylesExRemoved);
+  uint32_t GetStates();
+  FWL_ERR SetStates(uint32_t dwStates, FX_BOOL bSet = TRUE);
+  FWL_ERR SetPrivateData(void* module_id,
+                         void* pData,
+                         PD_CALLBACK_FREEDATA callback);
+  void* GetPrivateData(void* module_id);
+  FWL_ERR Update();
+  FWL_ERR LockUpdate();
+  FWL_ERR UnlockUpdate();
+  uint32_t HitTest(FX_FLOAT fx, FX_FLOAT fy);
+  FWL_ERR TransformTo(CFWL_Widget* pWidget, FX_FLOAT& fx, FX_FLOAT& fy);
+  FWL_ERR TransformTo(CFWL_Widget* pWidget, CFX_RectF& rt);
+  FWL_ERR GetMatrix(CFX_Matrix& matrix, FX_BOOL bGlobal = FALSE);
+  FWL_ERR SetMatrix(const CFX_Matrix& matrix);
+  FWL_ERR DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix = NULL);
+  IFWL_WidgetDelegate* SetDelegate(IFWL_WidgetDelegate* pDelegate);
+  FWL_ERR Repaint(const CFX_RectF* pRect = NULL);
+  FWL_ERR SetFocus(FX_BOOL bFocus);
+  FWL_ERR SetGrab(FX_BOOL bSet);
+  CFWL_Widget();
+
+  void RegisterEventTarget(CFWL_Widget* pEventSource = NULL,
+                           uint32_t dwFilter = FWL_EVENT_ALL_MASK);
+  void DispatchEvent(CFWL_Event* pEvent);
+  CFX_SizeF CalcTextSize(const CFX_WideString& wsText,
+                         FX_BOOL bMultiLine = FALSE,
+                         int32_t iLineWidth = -1);
+  IFWL_Widget* m_pIface;
+  IFWL_WidgetDelegate* m_pDelegate;
+  CFWL_WidgetMgr* m_pWidgetMgr;
+  CFWL_WidgetProperties* m_pProperties;
+
+ protected:
+  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_WIDGET_H_
diff --git a/xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp b/xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp
new file mode 100644
index 0000000..1596aba
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp
@@ -0,0 +1,27 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/lightwidget/cfwl_widgetdelegate.h"
+
+#include "xfa/fwl/core/cfwl_event.h"
+#include "xfa/fwl/core/cfwl_message.h"
+
+CFWL_WidgetDelegate::CFWL_WidgetDelegate() {}
+
+CFWL_WidgetDelegate::~CFWL_WidgetDelegate() {}
+
+int32_t CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+  return 1;
+}
+
+FWL_ERR CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+  return FWL_ERR_Succeeded;
+}
+
+FWL_ERR CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
+                                          const CFX_Matrix* pMatrix) {
+  return FWL_ERR_Succeeded;
+}
diff --git a/xfa/fwl/lightwidget/cfwl_widgetdelegate.h b/xfa/fwl/lightwidget/cfwl_widgetdelegate.h
new file mode 100644
index 0000000..42f6f93
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_widgetdelegate.h
@@ -0,0 +1,29 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_WIDGETDELEGATE_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_WIDGETDELEGATE_H_
+
+#include "xfa/fwl/core/fwl_error.h"
+#include "xfa/fwl/core/ifwl_widgetdelegate.h"
+
+class CFWL_Event;
+class CFWL_Message;
+class CFX_Graphics;
+class CFX_Matrix;
+
+class CFWL_WidgetDelegate : public IFWL_WidgetDelegate {
+ public:
+  CFWL_WidgetDelegate();
+  virtual ~CFWL_WidgetDelegate();
+
+  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
+  FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override;
+  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
+                       const CFX_Matrix* pMatrix = nullptr) override;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_WIDGETDELEGATE_H_
diff --git a/xfa/fwl/lightwidget/cfwl_widgetproperties.cpp b/xfa/fwl/lightwidget/cfwl_widgetproperties.cpp
new file mode 100644
index 0000000..9afa1b6
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_widgetproperties.cpp
@@ -0,0 +1,25 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/lightwidget/cfwl_widgetproperties.h"
+
+#include "xfa/fwl/lightwidget/cfwl_widget.h"
+
+CFWL_WidgetImpProperties CFWL_WidgetProperties::MakeWidgetImpProperties(
+    IFWL_DataProvider* pDataProvider) const {
+  CFWL_WidgetImpProperties result;
+  result.m_ctmOnParent = m_ctmOnParent;
+  result.m_rtWidget = m_rtWidget;
+  result.m_dwStyles = m_dwStyles;
+  result.m_dwStyleExes = m_dwStyleExes;
+  result.m_dwStates = m_dwStates;
+  if (m_pParent)
+    result.m_pParent = m_pParent->GetWidget();
+  if (m_pOwner)
+    result.m_pOwner = m_pOwner->GetWidget();
+  result.m_pDataProvider = pDataProvider;
+  return result;
+}
diff --git a/xfa/fwl/lightwidget/cfwl_widgetproperties.h b/xfa/fwl/lightwidget/cfwl_widgetproperties.h
new file mode 100644
index 0000000..2a3e3ff
--- /dev/null
+++ b/xfa/fwl/lightwidget/cfwl_widgetproperties.h
@@ -0,0 +1,42 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_LIGHTWIDGET_CFWL_WIDGETPROPERTIES_H_
+#define XFA_FWL_LIGHTWIDGET_CFWL_WIDGETPROPERTIES_H_
+
+#include "core/fxcrt/include/fx_coordinates.h"
+#include "core/fxcrt/include/fx_string.h"
+#include "core/fxcrt/include/fx_system.h"
+#include "xfa/fwl/core/cfwl_widgetimpproperties.h"
+
+class CFWL_Widget;
+class IFWL_DataProvider;
+
+class CFWL_WidgetProperties {
+ public:
+  CFWL_WidgetProperties()
+      : m_dwStyles(FWL_WGTSTYLE_Child),
+        m_dwStyleExes(0),
+        m_dwStates(0),
+        m_pParent(nullptr),
+        m_pOwner(nullptr) {
+    m_rtWidget.Set(0, 0, 0, 0);
+  }
+
+  CFWL_WidgetImpProperties MakeWidgetImpProperties(
+      IFWL_DataProvider* pDataProvider) const;
+
+  CFX_WideString m_wsWindowclass;
+  CFX_Matrix m_ctmOnParent;
+  CFX_RectF m_rtWidget;
+  uint32_t m_dwStyles;
+  uint32_t m_dwStyleExes;
+  uint32_t m_dwStates;
+  CFWL_Widget* m_pParent;
+  CFWL_Widget* m_pOwner;
+};
+
+#endif  // XFA_FWL_LIGHTWIDGET_CFWL_WIDGETPROPERTIES_H_
