diff --git a/xfa/fwl/cfwl_combobox.cpp b/xfa/fwl/cfwl_combobox.cpp
index c2977c4..dc62065 100644
--- a/xfa/fwl/cfwl_combobox.cpp
+++ b/xfa/fwl/cfwl_combobox.cpp
@@ -361,18 +361,16 @@
     RepaintRect(m_ClientRect);
     return;
   }
-
   CFWL_ListBox::Item* hItem = m_pListBox->GetItem(this, m_iCurSel);
   if (!hItem)
     return;
+
   if (m_pEdit) {
     m_pEdit->SetText(hItem->GetText());
     m_pEdit->Update();
     m_pEdit->SetSelected();
   }
-
-  CFWL_EventSelectChanged ev(this);
-  ev.bLButtonUp = bLButtonUp;
+  CFWL_EventSelectChanged ev(this, bLButtonUp);
   DispatchEvent(&ev);
 }
 
@@ -435,9 +433,8 @@
   CFWL_Event::Type type = pEvent->GetType();
   if (type == CFWL_Event::Type::Scroll) {
     CFWL_EventScroll* pScrollEvent = static_cast<CFWL_EventScroll*>(pEvent);
-    CFWL_EventScroll pScrollEv(this);
-    pScrollEv.m_iScrollCode = pScrollEvent->m_iScrollCode;
-    pScrollEv.m_fPos = pScrollEvent->m_fPos;
+    CFWL_EventScroll pScrollEv(this, pScrollEvent->GetScrollCode(),
+                               pScrollEvent->GetPos());
     DispatchEvent(&pScrollEv);
   } else if (type == CFWL_Event::Type::TextWillChange) {
     CFWL_Event pTemp(CFWL_Event::Type::EditChanged, this);
diff --git a/xfa/fwl/cfwl_datetimepicker.cpp b/xfa/fwl/cfwl_datetimepicker.cpp
index 9108539..6f16255 100644
--- a/xfa/fwl/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/cfwl_datetimepicker.cpp
@@ -284,10 +284,7 @@
   m_pEdit->Update();
   RepaintRect(m_ClientRect);
 
-  CFWL_EventSelectChanged ev(this);
-  ev.iYear = m_iYear;
-  ev.iMonth = m_iMonth;
-  ev.iDay = m_iDay;
+  CFWL_EventSelectChanged ev(this, m_iYear, m_iMonth, m_iDay);
   DispatchEvent(&ev);
 }
 
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index d14e515..1150ee2 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -283,19 +283,15 @@
 }
 
 void CFWL_Edit::OnTextWillChange(CFDE_TextEditEngine::TextChange* change) {
-  CFWL_EventTextWillChange event(this);
-  event.previous_text = change->previous_text;
-  event.change_text = change->text;
-  event.selection_start = change->selection_start;
-  event.selection_end = change->selection_end;
-  event.cancelled = false;
-
+  CFWL_EventTextWillChange event(this, change->text, change->previous_text,
+                                 change->selection_start,
+                                 change->selection_end);
   DispatchEvent(&event);
 
-  change->text = event.change_text;
-  change->selection_start = event.selection_start;
-  change->selection_end = event.selection_end;
-  change->cancelled = event.cancelled;
+  change->text = event.GetChangeText();
+  change->selection_start = event.GetSelectionStart();
+  change->selection_end = event.GetSelectionEnd();
+  change->cancelled = event.GetCancelled();
 }
 
 void CFWL_Edit::OnTextChanged() {
@@ -311,11 +307,9 @@
 }
 
 bool CFWL_Edit::OnValidate(const WideString& wsText) {
-  CFWL_EventValidate event(this);
-  event.wsInsert = wsText;
-  event.bValidate = true;
+  CFWL_EventValidate event(this, wsText);
   DispatchEvent(&event);
-  return event.bValidate;
+  return event.GetValidate();
 }
 
 void CFWL_Edit::SetScrollOffset(float fScrollOffset) {
@@ -961,7 +955,7 @@
       (pSrcTarget == m_pHorzScrollBar && m_pHorzScrollBar)) {
     CFWL_EventScroll* pScrollEvent = static_cast<CFWL_EventScroll*>(pEvent);
     OnScroll(static_cast<CFWL_ScrollBar*>(pSrcTarget),
-             pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
+             pScrollEvent->GetScrollCode(), pScrollEvent->GetPos());
   }
 }
 
diff --git a/xfa/fwl/cfwl_eventmouse.cpp b/xfa/fwl/cfwl_eventmouse.cpp
index bad066b..75f543d 100644
--- a/xfa/fwl/cfwl_eventmouse.cpp
+++ b/xfa/fwl/cfwl_eventmouse.cpp
@@ -6,11 +6,10 @@
 
 #include "xfa/fwl/cfwl_eventmouse.h"
 
-CFWL_EventMouse::CFWL_EventMouse(CFWL_Widget* pSrcTarget)
-    : CFWL_EventMouse(pSrcTarget, nullptr) {}
-
 CFWL_EventMouse::CFWL_EventMouse(CFWL_Widget* pSrcTarget,
-                                 CFWL_Widget* pDstTarget)
-    : CFWL_Event(CFWL_Event::Type::Mouse, pSrcTarget, pDstTarget) {}
+                                 CFWL_Widget* pDstTarget,
+                                 FWL_MouseCommand cmd)
+    : CFWL_Event(CFWL_Event::Type::Mouse, pSrcTarget, pDstTarget),
+      m_dwCmd(cmd) {}
 
 CFWL_EventMouse::~CFWL_EventMouse() = default;
diff --git a/xfa/fwl/cfwl_eventmouse.h b/xfa/fwl/cfwl_eventmouse.h
index e7982fb..180f565 100644
--- a/xfa/fwl/cfwl_eventmouse.h
+++ b/xfa/fwl/cfwl_eventmouse.h
@@ -12,11 +12,15 @@
 
 class CFWL_EventMouse final : public CFWL_Event {
  public:
-  explicit CFWL_EventMouse(CFWL_Widget* pSrcTarget);
-  CFWL_EventMouse(CFWL_Widget* pSrcTarget, CFWL_Widget* pDstTarget);
+  CFWL_EventMouse(CFWL_Widget* pSrcTarget,
+                  CFWL_Widget* pDstTarget,
+                  FWL_MouseCommand cmd);
   ~CFWL_EventMouse() override;
 
-  FWL_MouseCommand m_dwCmd = FWL_MouseCommand::LeftButtonDown;
+  FWL_MouseCommand GetCommand() const { return m_dwCmd; }
+
+ private:
+  const FWL_MouseCommand m_dwCmd;
 };
 
 #endif  // XFA_FWL_CFWL_EVENTMOUSE_H_
diff --git a/xfa/fwl/cfwl_eventscroll.cpp b/xfa/fwl/cfwl_eventscroll.cpp
index 53b45a7..db8d29d 100644
--- a/xfa/fwl/cfwl_eventscroll.cpp
+++ b/xfa/fwl/cfwl_eventscroll.cpp
@@ -6,7 +6,11 @@
 
 #include "xfa/fwl/cfwl_eventscroll.h"
 
-CFWL_EventScroll::CFWL_EventScroll(CFWL_Widget* pSrcTarget)
-    : CFWL_Event(CFWL_Event::Type::Scroll, pSrcTarget) {}
+CFWL_EventScroll::CFWL_EventScroll(CFWL_Widget* pSrcTarget,
+                                   Code code,
+                                   float pos)
+    : CFWL_Event(CFWL_Event::Type::Scroll, pSrcTarget),
+      m_iScrollCode(code),
+      m_fPos(pos) {}
 
 CFWL_EventScroll::~CFWL_EventScroll() = default;
diff --git a/xfa/fwl/cfwl_eventscroll.h b/xfa/fwl/cfwl_eventscroll.h
index 78960c8..9a13952 100644
--- a/xfa/fwl/cfwl_eventscroll.h
+++ b/xfa/fwl/cfwl_eventscroll.h
@@ -24,11 +24,15 @@
     EndScroll,
   };
 
-  explicit CFWL_EventScroll(CFWL_Widget* pSrcTarget);
+  CFWL_EventScroll(CFWL_Widget* pSrcTarget, Code code, float pos);
   ~CFWL_EventScroll() override;
 
-  Code m_iScrollCode = Code::None;
-  float m_fPos = 0.0f;
+  Code GetScrollCode() const { return m_iScrollCode; }
+  float GetPos() const { return m_fPos; }
+
+ private:
+  const Code m_iScrollCode;
+  const float m_fPos;
 };
 
 #endif  // XFA_FWL_CFWL_EVENTSCROLL_H_
diff --git a/xfa/fwl/cfwl_eventselectchanged.cpp b/xfa/fwl/cfwl_eventselectchanged.cpp
index 73f396a..85637b7 100644
--- a/xfa/fwl/cfwl_eventselectchanged.cpp
+++ b/xfa/fwl/cfwl_eventselectchanged.cpp
@@ -6,7 +6,22 @@
 
 #include "xfa/fwl/cfwl_eventselectchanged.h"
 
-CFWL_EventSelectChanged::CFWL_EventSelectChanged(CFWL_Widget* pSrcTarget)
-    : CFWL_Event(CFWL_Event::Type::SelectChanged, pSrcTarget) {}
+CFWL_EventSelectChanged::CFWL_EventSelectChanged(CFWL_Widget* pSrcTarget,
+                                                 bool bLButtonUp)
+    : CFWL_Event(CFWL_Event::Type::SelectChanged, pSrcTarget),
+      m_bLButtonUp(bLButtonUp),
+      m_iYear(-1),
+      m_iMonth(-1),
+      m_iDay(-1) {}
+
+CFWL_EventSelectChanged::CFWL_EventSelectChanged(CFWL_Widget* pSrcTarget,
+                                                 int32_t iYear,
+                                                 int32_t iMonth,
+                                                 int32_t iDay)
+    : CFWL_Event(CFWL_Event::Type::SelectChanged, pSrcTarget),
+      m_bLButtonUp(false),
+      m_iYear(iYear),
+      m_iMonth(iMonth),
+      m_iDay(iDay) {}
 
 CFWL_EventSelectChanged::~CFWL_EventSelectChanged() = default;
diff --git a/xfa/fwl/cfwl_eventselectchanged.h b/xfa/fwl/cfwl_eventselectchanged.h
index d4b68b3..33010c0 100644
--- a/xfa/fwl/cfwl_eventselectchanged.h
+++ b/xfa/fwl/cfwl_eventselectchanged.h
@@ -11,16 +11,26 @@
 
 class CFWL_EventSelectChanged final : public CFWL_Event {
  public:
-  explicit CFWL_EventSelectChanged(CFWL_Widget* pSrcTarget);
+  CFWL_EventSelectChanged(CFWL_Widget* pSrcTarget, bool bLButtonUp);
+  CFWL_EventSelectChanged(CFWL_Widget* pSrcTarget,
+                          int32_t iYear,
+                          int32_t iMonth,
+                          int32_t iDay);
   ~CFWL_EventSelectChanged() override;
 
+  bool GetLButtonUp() const { return m_bLButtonUp; }
+  int32_t GetYear() const { return m_iYear; }
+  int32_t GetMonth() const { return m_iMonth; }
+  int32_t GetDay() const { return m_iDay; }
+
+ protected:
   // Used by ComboBox.
-  bool bLButtonUp = false;
+  const bool m_bLButtonUp;
 
   // Used by DateTimePIcker
-  int32_t iYear = -1;
-  int32_t iMonth = -1;
-  int32_t iDay = -1;
+  const int32_t m_iYear;
+  const int32_t m_iMonth;
+  const int32_t m_iDay;
 };
 
 #endif  // XFA_FWL_CFWL_EVENTSELECTCHANGED_H_
diff --git a/xfa/fwl/cfwl_eventtextwillchange.cpp b/xfa/fwl/cfwl_eventtextwillchange.cpp
index 22b1100..c1e2daf 100644
--- a/xfa/fwl/cfwl_eventtextwillchange.cpp
+++ b/xfa/fwl/cfwl_eventtextwillchange.cpp
@@ -6,7 +6,16 @@
 
 #include "xfa/fwl/cfwl_eventtextwillchange.h"
 
-CFWL_EventTextWillChange::CFWL_EventTextWillChange(CFWL_Widget* pSrcTarget)
-    : CFWL_Event(CFWL_Event::Type::TextWillChange, pSrcTarget) {}
+CFWL_EventTextWillChange::CFWL_EventTextWillChange(
+    CFWL_Widget* pSrcTarget,
+    const WideString& change_text,
+    const WideString& previous_text,
+    size_t selection_start,
+    size_t selection_end)
+    : CFWL_Event(CFWL_Event::Type::TextWillChange, pSrcTarget),
+      change_text_(change_text),
+      previous_text_(previous_text),
+      selection_start_(selection_start),
+      selection_end_(selection_end) {}
 
 CFWL_EventTextWillChange::~CFWL_EventTextWillChange() = default;
diff --git a/xfa/fwl/cfwl_eventtextwillchange.h b/xfa/fwl/cfwl_eventtextwillchange.h
index 069a234..dd21a25 100644
--- a/xfa/fwl/cfwl_eventtextwillchange.h
+++ b/xfa/fwl/cfwl_eventtextwillchange.h
@@ -12,14 +12,37 @@
 
 class CFWL_EventTextWillChange final : public CFWL_Event {
  public:
-  explicit CFWL_EventTextWillChange(CFWL_Widget* pSrcTarget);
+  CFWL_EventTextWillChange(CFWL_Widget* pSrcTarget,
+                           const WideString& change_text,
+                           const WideString& previous_text,
+                           size_t selection_start,
+                           size_t selection_end);
   ~CFWL_EventTextWillChange() override;
 
-  WideString change_text;
-  WideString previous_text;
-  bool cancelled = false;
-  size_t selection_start = 0;
-  size_t selection_end = 0;
+  WideString GetChangeText() const { return change_text_; }
+  WideString GetPreviousText() const { return previous_text_; }
+  size_t GetSelectionStart() const { return selection_start_; }
+  size_t GetSelectionEnd() const { return selection_end_; }
+  bool GetCancelled() const { return cancelled_; }
+
+  void SetChangeText(const WideString& change_text) {
+    change_text_ = change_text;
+  }
+  void SetPreviousText(const WideString& previous_text) {
+    previous_text_ = previous_text;
+  }
+  void SetSelectionStart(size_t selection_start) {
+    selection_start_ = selection_start;
+  }
+  void SetSelectionEnd(size_t selection_end) { selection_end_ = selection_end; }
+  void SetCancelled(bool cancelled) { cancelled_ = cancelled; }
+
+ protected:
+  WideString change_text_;
+  WideString previous_text_;
+  size_t selection_start_;
+  size_t selection_end_;
+  bool cancelled_ = false;
 };
 
 #endif  // XFA_FWL_CFWL_EVENTTEXTWILLCHANGE_H_
diff --git a/xfa/fwl/cfwl_eventvalidate.cpp b/xfa/fwl/cfwl_eventvalidate.cpp
index c3e68c3..ab2a736 100644
--- a/xfa/fwl/cfwl_eventvalidate.cpp
+++ b/xfa/fwl/cfwl_eventvalidate.cpp
@@ -6,7 +6,9 @@
 
 #include "xfa/fwl/cfwl_eventvalidate.h"
 
-CFWL_EventValidate::CFWL_EventValidate(CFWL_Widget* pSrcTarget)
-    : CFWL_Event(CFWL_Event::Type::Validate, pSrcTarget) {}
+CFWL_EventValidate::CFWL_EventValidate(CFWL_Widget* pSrcTarget,
+                                       const WideString& wsInsert)
+    : CFWL_Event(CFWL_Event::Type::Validate, pSrcTarget),
+      m_wsInsert(wsInsert) {}
 
 CFWL_EventValidate::~CFWL_EventValidate() = default;
diff --git a/xfa/fwl/cfwl_eventvalidate.h b/xfa/fwl/cfwl_eventvalidate.h
index 6cf5816..51f9b01 100644
--- a/xfa/fwl/cfwl_eventvalidate.h
+++ b/xfa/fwl/cfwl_eventvalidate.h
@@ -12,11 +12,16 @@
 
 class CFWL_EventValidate final : public CFWL_Event {
  public:
-  explicit CFWL_EventValidate(CFWL_Widget* pSrcTarget);
+  CFWL_EventValidate(CFWL_Widget* pSrcTarget, const WideString& wsInsert);
   ~CFWL_EventValidate() override;
 
-  bool bValidate = false;
-  WideString wsInsert;
+  WideString GetInsert() const { return m_wsInsert; }
+  bool GetValidate() const { return m_bValidate; }
+  void SetValidate(bool bValidate) { m_bValidate = bValidate; }
+
+ protected:
+  const WideString m_wsInsert;
+  bool m_bValidate = true;
 };
 
 #endif  // XFA_FWL_CFWL_EVENTVALIDATE_H_
diff --git a/xfa/fwl/cfwl_listbox.cpp b/xfa/fwl/cfwl_listbox.cpp
index e93babd..49197e8 100644
--- a/xfa/fwl/cfwl_listbox.cpp
+++ b/xfa/fwl/cfwl_listbox.cpp
@@ -656,7 +656,7 @@
       (pSrcTarget == m_pHorzScrollBar && m_pHorzScrollBar)) {
     CFWL_EventScroll* pScrollEvent = static_cast<CFWL_EventScroll*>(pEvent);
     OnScroll(static_cast<CFWL_ScrollBar*>(pSrcTarget),
-             pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
+             pScrollEvent->GetScrollCode(), pScrollEvent->GetPos());
   }
 }
 
diff --git a/xfa/fwl/cfwl_pushbutton.cpp b/xfa/fwl/cfwl_pushbutton.cpp
index 0b502f3..1ef9d9d 100644
--- a/xfa/fwl/cfwl_pushbutton.cpp
+++ b/xfa/fwl/cfwl_pushbutton.cpp
@@ -205,8 +205,7 @@
   if (pMsg->m_dwKeyCode != XFA_FWL_VKEY_Return)
     return;
 
-  CFWL_EventMouse wmMouse(this);
-  wmMouse.m_dwCmd = FWL_MouseCommand::LeftButtonUp;
+  CFWL_EventMouse wmMouse(this, nullptr, FWL_MouseCommand::LeftButtonUp);
   DispatchEvent(&wmMouse);
   if (!wmMouse.GetSrcTarget())
     return;
diff --git a/xfa/fwl/cfwl_scrollbar.cpp b/xfa/fwl/cfwl_scrollbar.cpp
index 7b61342..40505a9 100644
--- a/xfa/fwl/cfwl_scrollbar.cpp
+++ b/xfa/fwl/cfwl_scrollbar.cpp
@@ -279,9 +279,7 @@
 }
 
 bool CFWL_ScrollBar::OnScroll(CFWL_EventScroll::Code dwCode, float fPos) {
-  CFWL_EventScroll ev(this);
-  ev.m_iScrollCode = dwCode;
-  ev.m_fPos = fPos;
+  CFWL_EventScroll ev(this, dwCode, fPos);
   DispatchEvent(&ev);
   return true;
 }
diff --git a/xfa/fwl/cfwl_widget.cpp b/xfa/fwl/cfwl_widget.cpp
index 15c1e47..3a207c1 100644
--- a/xfa/fwl/cfwl_widget.cpp
+++ b/xfa/fwl/cfwl_widget.cpp
@@ -336,8 +336,7 @@
   switch (pMessage->GetType()) {
     case CFWL_Message::Type::kMouse: {
       CFWL_MessageMouse* pMsgMouse = static_cast<CFWL_MessageMouse*>(pMessage);
-      CFWL_EventMouse evt(pWidget, pWidget);
-      evt.m_dwCmd = pMsgMouse->m_dwCmd;
+      CFWL_EventMouse evt(pWidget, pWidget, pMsgMouse->m_dwCmd);
       pWidget->DispatchEvent(&evt);
       break;
     }
diff --git a/xfa/fxfa/cxfa_ffcombobox.cpp b/xfa/fxfa/cxfa_ffcombobox.cpp
index baf0bdd..f9bf697 100644
--- a/xfa/fxfa/cxfa_ffcombobox.cpp
+++ b/xfa/fxfa/cxfa_ffcombobox.cpp
@@ -350,7 +350,7 @@
   switch (pEvent->GetType()) {
     case CFWL_Event::Type::SelectChanged: {
       auto* postEvent = static_cast<CFWL_EventSelectChanged*>(pEvent);
-      OnSelectChanged(GetNormalWidget(), postEvent->bLButtonUp);
+      OnSelectChanged(GetNormalWidget(), postEvent->GetLButtonUp());
       break;
     }
     case CFWL_Event::Type::EditChanged: {
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index 62a26eb..9c693fb 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -210,8 +210,8 @@
 void CXFA_FFDateTimeEdit::OnProcessEvent(CFWL_Event* pEvent) {
   if (pEvent->GetType() == CFWL_Event::Type::SelectChanged) {
     auto* event = static_cast<CFWL_EventSelectChanged*>(pEvent);
-    OnSelectChanged(GetNormalWidget(), event->iYear, event->iMonth,
-                    event->iDay);
+    OnSelectChanged(GetNormalWidget(), event->GetYear(), event->GetMonth(),
+                    event->GetDay());
     return;
   }
   CXFA_FFTextEdit::OnProcessEvent(pEvent);
diff --git a/xfa/fxfa/cxfa_fffield.cpp b/xfa/fxfa/cxfa_fffield.cpp
index b90ab57..4f5b910 100644
--- a/xfa/fxfa/cxfa_fffield.cpp
+++ b/xfa/fxfa/cxfa_fffield.cpp
@@ -704,25 +704,26 @@
   switch (pEvent->GetType()) {
     case CFWL_Event::Type::Mouse: {
       CFWL_EventMouse* event = static_cast<CFWL_EventMouse*>(pEvent);
-      if (event->m_dwCmd == FWL_MouseCommand::Enter) {
+      FWL_MouseCommand cmd = event->GetCommand();
+      if (cmd == FWL_MouseCommand::Enter) {
         CXFA_EventParam eParam;
         eParam.m_eType = XFA_EVENT_MouseEnter;
         eParam.m_pTarget = m_pNode.Get();
         m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::MouseEnter,
                               &eParam);
-      } else if (event->m_dwCmd == FWL_MouseCommand::Leave) {
+      } else if (cmd == FWL_MouseCommand::Leave) {
         CXFA_EventParam eParam;
         eParam.m_eType = XFA_EVENT_MouseExit;
         eParam.m_pTarget = m_pNode.Get();
         m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::MouseExit,
                               &eParam);
-      } else if (event->m_dwCmd == FWL_MouseCommand::LeftButtonDown) {
+      } else if (cmd == FWL_MouseCommand::LeftButtonDown) {
         CXFA_EventParam eParam;
         eParam.m_eType = XFA_EVENT_MouseDown;
         eParam.m_pTarget = m_pNode.Get();
         m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::MouseDown,
                               &eParam);
-      } else if (event->m_dwCmd == FWL_MouseCommand::LeftButtonUp) {
+      } else if (cmd == FWL_MouseCommand::LeftButtonUp) {
         CXFA_EventParam eParam;
         eParam.m_eType = XFA_EVENT_MouseUp;
         eParam.m_pTarget = m_pNode.Get();
diff --git a/xfa/fxfa/cxfa_ffnumericedit.cpp b/xfa/fxfa/cxfa_ffnumericedit.cpp
index 8ab4cf9..cae2530 100644
--- a/xfa/fxfa/cxfa_ffnumericedit.cpp
+++ b/xfa/fxfa/cxfa_ffnumericedit.cpp
@@ -70,13 +70,14 @@
 void CXFA_FFNumericEdit::OnProcessEvent(CFWL_Event* pEvent) {
   if (pEvent->GetType() == CFWL_Event::Type::Validate) {
     CFWL_EventValidate* event = static_cast<CFWL_EventValidate*>(pEvent);
-    event->bValidate = OnValidate(GetNormalWidget(), event->wsInsert);
+    event->SetValidate(OnValidate(GetNormalWidget(), event->GetInsert()));
     return;
   }
   CXFA_FFTextEdit::OnProcessEvent(pEvent);
 }
 
-bool CXFA_FFNumericEdit::OnValidate(CFWL_Widget* pWidget, WideString& wsText) {
+bool CXFA_FFNumericEdit::OnValidate(CFWL_Widget* pWidget,
+                                    const WideString& wsText) {
   WideString wsPattern = m_pNode->GetPictureContent(XFA_VALUEPICTURE_Edit);
   if (!wsPattern.IsEmpty())
     return true;
diff --git a/xfa/fxfa/cxfa_ffnumericedit.h b/xfa/fxfa/cxfa_ffnumericedit.h
index b2c39ce..e8b933d 100644
--- a/xfa/fxfa/cxfa_ffnumericedit.h
+++ b/xfa/fxfa/cxfa_ffnumericedit.h
@@ -24,7 +24,7 @@
   void OnProcessEvent(CFWL_Event* pEvent) override;
 
  private:
-  bool OnValidate(CFWL_Widget* pWidget, WideString& wsText);
+  bool OnValidate(CFWL_Widget* pWidget, const WideString& wsText);
 };
 
 #endif  // XFA_FXFA_CXFA_FFNUMERICEDIT_H_
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp
index 28602a6..ebf8cf2 100644
--- a/xfa/fxfa/cxfa_fftextedit.cpp
+++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -312,20 +312,19 @@
 
   CXFA_EventParam eParam;
   eParam.m_eType = XFA_EVENT_Change;
-  eParam.m_wsChange = event->change_text;
+  eParam.m_wsChange = event->GetChangeText();
   eParam.m_pTarget = m_pNode.Get();
-  eParam.m_wsPrevText = event->previous_text;
-  eParam.m_iSelStart = static_cast<int32_t>(event->selection_start);
-  eParam.m_iSelEnd = static_cast<int32_t>(event->selection_end);
-
+  eParam.m_wsPrevText = event->GetPreviousText();
+  eParam.m_iSelStart = static_cast<int32_t>(event->GetSelectionStart());
+  eParam.m_iSelEnd = static_cast<int32_t>(event->GetSelectionEnd());
   m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Change, &eParam);
 
   // Copy the data back out of the EventParam and into the TextChanged event so
   // it can propagate back to the calling widget.
-  event->cancelled = eParam.m_bCancelAction;
-  event->change_text = std::move(eParam.m_wsChange);
-  event->selection_start = static_cast<size_t>(eParam.m_iSelStart);
-  event->selection_end = static_cast<size_t>(eParam.m_iSelEnd);
+  event->SetCancelled(eParam.m_bCancelAction);
+  event->SetChangeText(eParam.m_wsChange);
+  event->SetSelectionStart(static_cast<size_t>(eParam.m_iSelStart));
+  event->SetSelectionEnd(static_cast<size_t>(eParam.m_iSelEnd));
 }
 
 void CXFA_FFTextEdit::OnTextFull(CFWL_Widget* pWidget) {
