diff --git a/public/fpdf_fwlevent.h b/public/fpdf_fwlevent.h
index 511c6a3..8d2f1a4 100644
--- a/public/fpdf_fwlevent.h
+++ b/public/fpdf_fwlevent.h
@@ -75,6 +75,7 @@
 typedef enum {
   FWL_VKEY_Back = 0x08,
   FWL_VKEY_Tab = 0x09,
+  FWL_VKEY_NewLine = 0x0A,
   FWL_VKEY_Clear = 0x0C,
   FWL_VKEY_Return = 0x0D,
   FWL_VKEY_Shift = 0x10,
diff --git a/xfa/fwl/core/fwl_widgetdef.h b/xfa/fwl/core/fwl_widgetdef.h
index f0ef5f5..c01f540 100644
--- a/xfa/fwl/core/fwl_widgetdef.h
+++ b/xfa/fwl/core/fwl_widgetdef.h
@@ -56,6 +56,7 @@
 #define FWL_VKEY_MButton 0x04
 #define FWL_VKEY_Back 0x08
 #define FWL_VKEY_Tab 0x09
+#define FWL_VKEY_NewLine 0x0A
 #define FWL_VKEY_Clear 0x0C
 #define FWL_VKEY_Return 0x0D
 #define FWL_VKEY_Shift 0x10
diff --git a/xfa/fwl/core/ifwl_edit.cpp b/xfa/fwl/core/ifwl_edit.cpp
index 3e864ba..65a54dc 100644
--- a/xfa/fwl/core/ifwl_edit.cpp
+++ b/xfa/fwl/core/ifwl_edit.cpp
@@ -45,9 +45,8 @@
                      FX_FLOAT fStep) {
   pPathData->MoveTo(fStartX, fY);
   int i = 1;
-  for (FX_FLOAT fx = fStartX + fStep; fx < fEndX; fx += fStep, ++i) {
+  for (FX_FLOAT fx = fStartX + fStep; fx < fEndX; fx += fStep, ++i)
     pPathData->LineTo(fx, fY + (i & 1) * fStep);
-  }
 }
 
 }  // namespace
@@ -77,7 +76,6 @@
 IFWL_Edit::~IFWL_Edit() {
   if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
     ShowCaret(false);
-
   ClearRecord();
 }
 
@@ -86,20 +84,7 @@
 }
 
 void IFWL_Edit::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-
-    int32_t iTextLen = m_EdtEngine.GetTextLength();
-    if (iTextLen > 0) {
-      CFX_WideString wsText;
-      m_EdtEngine.GetText(wsText, 0);
-      CFX_SizeF sz = CalcTextSize(
-          wsText, m_pProperties->m_pThemeProvider,
-          !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine));
-      rect.Set(0, 0, sz.x, sz.y);
-    }
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
     if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
       if (IsShowScrollBar(true)) {
@@ -115,7 +100,21 @@
         rect.height += kEditMargin;
       }
     }
+    return;
   }
+
+  rect.Set(0, 0, 0, 0);
+
+  int32_t iTextLen = m_EdtEngine.GetTextLength();
+  if (iTextLen > 0) {
+    CFX_WideString wsText;
+    m_EdtEngine.GetText(wsText, 0);
+    CFX_SizeF sz = CalcTextSize(
+        wsText, m_pProperties->m_pThemeProvider,
+        !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine));
+    rect.Set(0, 0, sz.x, sz.y);
+  }
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_Edit::SetStates(uint32_t dwStates, bool bSet) {
@@ -127,16 +126,15 @@
 }
 
 void IFWL_Edit::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   Layout();
-  if (m_rtClient.IsEmpty()) {
+  if (m_rtClient.IsEmpty())
     return;
-  }
+
   UpdateEditEngine();
   UpdateVAlignment();
   UpdateScroll();
@@ -176,9 +174,10 @@
   CFX_RectFArray rectArray;
   CFX_RectF rectText;
   const FDE_TXTEDTPARAMS* txtEdtParams = m_EdtEngine.GetEditParams();
-  FX_FLOAT fAsent = (FX_FLOAT)txtEdtParams->pFont->GetAscent() *
+  FX_FLOAT fAsent = static_cast<FX_FLOAT>(txtEdtParams->pFont->GetAscent()) *
                     txtEdtParams->fFontSize / 1000;
   pPage->CalcRangeRectArray(nStart, nCount, rectArray);
+
   for (int i = 0; i < rectArray.GetSize(); i++) {
     rectText = rectArray.GetAt(i);
     fY = rectText.top + fAsent + fOffSetY;
@@ -188,45 +187,49 @@
     AddSquigglyPath(&PathData, fStartX, fEndX, fY, fStep);
   }
 }
+
 void IFWL_Edit::DrawSpellCheck(CFX_Graphics* pGraphics,
                                const CFX_Matrix* pMatrix) {
   pGraphics->SaveGraphState();
-  if (pMatrix) {
+  if (pMatrix)
     pGraphics->ConcatMatrix(const_cast<CFX_Matrix*>(pMatrix));
-  }
-  FX_ARGB cr = 0xFFFF0000;
-  CFX_Color crLine(cr);
+
+  CFX_Color crLine(0xFFFF0000);
   CFWL_EvtEdtCheckWord checkWordEvent;
   checkWordEvent.m_pSrcTarget = this;
+
   CFX_ByteString sLatinWord;
   CFX_Path pathSpell;
   pathSpell.Create();
+
   int32_t nStart = 0;
   FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
   FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
+
   CFX_WideString wsSpell;
   GetText(wsSpell);
   int32_t nContentLen = wsSpell.GetLength();
   for (int i = 0; i < nContentLen; i++) {
     if (FX_EDIT_ISLATINWORD(wsSpell[i])) {
-      if (sLatinWord.IsEmpty()) {
+      if (sLatinWord.IsEmpty())
         nStart = i;
-      }
       sLatinWord += (FX_CHAR)wsSpell[i];
-    } else {
-      checkWordEvent.bsWord = sLatinWord;
-      checkWordEvent.bCheckWord = true;
-      DispatchEvent(&checkWordEvent);
-      if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
-        AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
-                         fOffSetY);
-      }
-      sLatinWord.clear();
+      continue;
     }
+    checkWordEvent.bsWord = sLatinWord;
+    checkWordEvent.bCheckWord = true;
+    DispatchEvent(&checkWordEvent);
+    if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
+      AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
+                       fOffSetY);
+    }
+    sLatinWord.clear();
   }
+
   checkWordEvent.bsWord = sLatinWord;
   checkWordEvent.bCheckWord = true;
   DispatchEvent(&checkWordEvent);
+
   if (!sLatinWord.IsEmpty() && !checkWordEvent.bCheckWord) {
     AddSpellCheckObj(pathSpell, nStart, sLatinWord.GetLength(), fOffSetX,
                      fOffSetY);
@@ -246,44 +249,39 @@
   }
   pGraphics->RestoreGraphState();
 }
+
 void IFWL_Edit::DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) {
   if (!pGraphics)
     return;
   if (!m_pProperties->m_pThemeProvider)
     return;
-  if (m_rtClient.IsEmpty()) {
+  if (m_rtClient.IsEmpty())
     return;
-  }
-  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (!m_pWidgetMgr->IsFormDisabled()) {
-    DrawTextBk(pGraphics, pTheme, pMatrix);
-  }
 
+  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
+  if (!m_pWidgetMgr->IsFormDisabled())
+    DrawTextBk(pGraphics, pTheme, pMatrix);
   DrawContent(pGraphics, pTheme, pMatrix);
 
   if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
       !(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly)) {
     DrawSpellCheck(pGraphics, pMatrix);
   }
-  if (HasBorder()) {
+  if (HasBorder())
     DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
+  if (HasEdge())
     DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
-  }
 }
+
 void IFWL_Edit::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
   if (!pThemeProvider)
     return;
-  if (m_pHorzScrollBar) {
+  if (m_pHorzScrollBar)
     m_pHorzScrollBar->SetThemeProvider(pThemeProvider);
-  }
-  if (m_pVertScrollBar) {
+  if (m_pVertScrollBar)
     m_pVertScrollBar->SetThemeProvider(pThemeProvider);
-  }
-  if (m_pCaret) {
+  if (m_pCaret)
     m_pCaret->SetThemeProvider(pThemeProvider);
-  }
   m_pProperties->m_pThemeProvider = pThemeProvider;
 }
 
@@ -437,9 +435,8 @@
     }
   }
   if (bRepaintContent || bRepaintScroll) {
-    if (bRepaintContent) {
+    if (bRepaintContent)
       rtInvalid.Union(m_rtEngine);
-    }
     Repaint(&rtInvalid);
   }
 }
@@ -482,6 +479,7 @@
     bNeedUpdate = (bHSelfAdaption && !evt.bHSelfAdaption) ||
                   (bVSelfAdaption && !evt.bVSelfAdaption);
   }
+
   FX_FLOAT fContentWidth1 = fContentWidth;
   FX_FLOAT fContentHeight1 = fContentHeight;
   if (bNeedUpdate) {
@@ -499,6 +497,7 @@
     rtTemp.height = std::max(m_pProperties->m_rtWidget.height, fContentHeight1);
     m_pProperties->m_rtWidget.height = fContentHeight1;
   }
+
   CFWL_EvtEdtTextChanged event;
   event.m_pSrcTarget = this;
   event.nChangeType = ChangeInfo.nChangeType;
@@ -522,6 +521,7 @@
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(nPageIndex);
   if (!pPage)
     return false;
+
   pPage->LoadPage(nullptr, nullptr);
   return true;
 }
@@ -532,6 +532,7 @@
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(nPageIndex);
   if (!pPage)
     return false;
+
   pPage->UnloadPage(nullptr);
   return true;
 }
@@ -543,9 +544,9 @@
 
 bool IFWL_Edit::On_Validate(CFDE_TxtEdtEngine* pEdit, CFX_WideString& wsText) {
   IFWL_Widget* pDst = GetOuter();
-  if (!pDst) {
+  if (!pDst)
     pDst = this;
-  }
+
   CFWL_EvtEdtValidate event;
   event.pDstWidget = pDst;
   event.m_pSrcTarget = this;
@@ -570,18 +571,19 @@
                          ? CFWL_PartState_ReadOnly
                          : CFWL_PartState_Normal;
   uint32_t dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled);
-  if (dwStates) {
+  if (dwStates)
     param.m_dwStates = CFWL_PartState_Disabled;
-  }
   param.m_pGraphics = pGraphics;
   param.m_matrix = *pMatrix;
   param.m_rtPart = m_rtClient;
   pTheme->DrawBackground(&param);
-  if (!IsShowScrollBar(true) || !IsShowScrollBar(false)) {
+
+  if (!IsShowScrollBar(true) || !IsShowScrollBar(false))
     return;
-  }
+
   CFX_RectF rtScorll;
   m_pHorzScrollBar->GetWidgetRect(rtScorll);
+
   CFX_RectF rtStatic;
   rtStatic.Set(m_rtClient.right() - rtScorll.height,
                m_rtClient.bottom() - rtScorll.height, rtScorll.height,
@@ -591,16 +593,18 @@
   param.m_rtPart = rtStatic;
   pTheme->DrawBackground(&param);
 }
+
 void IFWL_Edit::DrawContent(CFX_Graphics* pGraphics,
                             IFWL_ThemeProvider* pTheme,
                             const CFX_Matrix* pMatrix) {
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
+
   pGraphics->SaveGraphState();
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText)
     pGraphics->SaveGraphState();
-  }
+
   CFX_RectF rtClip = m_rtEngine;
   FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
   FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
@@ -610,6 +614,7 @@
     pMatrix->TransformRect(rtClip);
     mt.Concat(*pMatrix);
   }
+
   bool bShowSel = (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoHideSel) ||
                   (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused);
   if (bShowSel) {
@@ -619,6 +624,7 @@
                  FWL_WGTSTATE_Deactivated;
     }
   }
+
   int32_t nSelCount = m_EdtEngine.CountSelRanges();
   if (bShowSel && nSelCount > 0) {
     int32_t nPageCharStart = pPage->GetCharStart();
@@ -631,14 +637,15 @@
     for (i = 0; i < nSelCount; i++) {
       nCharCount = m_EdtEngine.GetSelRange(i, nCharStart);
       int32_t nCharEnd = nCharStart + nCharCount - 1;
-      if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd) {
+      if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd)
         continue;
-      }
+
       int32_t nBgn = std::max(nCharStart, nPageCharStart);
       int32_t nEnd = std::min(nCharEnd, nPageCharEnd);
       pPage->CalcRangeRectArray(nBgn - nPageCharStart, nEnd - nBgn + 1,
                                 rectArr);
     }
+
     int32_t nCount = rectArr.GetSize();
     CFX_Path path;
     path.Create();
@@ -649,6 +656,7 @@
                         rectArr[i].height);
     }
     pGraphics->SetClipRect(rtClip);
+
     CFWL_ThemeBackground param;
     param.m_pGraphics = pGraphics;
     param.m_matrix = *pMatrix;
@@ -657,6 +665,7 @@
     param.m_pPath = &path;
     pTheme->DrawBackground(&param);
   }
+
   CFX_RenderDevice* pRenderDev = pGraphics->GetRenderDevice();
   if (!pRenderDev)
     return;
@@ -667,6 +676,7 @@
   pRenderDevice->SetClipRect(rtClip);
   pRenderContext->StartRender(pRenderDevice.get(), pPage, mt);
   pRenderContext->DoRender(nullptr);
+
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
     pGraphics->RestoreGraphState();
     CFX_Path path;
@@ -678,6 +688,7 @@
       fLeft += fStep;
       path.AddLine(fLeft, m_rtClient.top, fLeft, m_rtClient.bottom());
     }
+
     CFWL_ThemeBackground param;
     param.m_pGraphics = pGraphics;
     param.m_matrix = *pMatrix;
@@ -692,45 +703,36 @@
 void IFWL_Edit::UpdateEditEngine() {
   UpdateEditParams();
   UpdateEditLayout();
-  if (m_nLimit > -1) {
+  if (m_nLimit > -1)
     m_EdtEngine.SetLimit(m_nLimit);
-  }
 }
+
 void IFWL_Edit::UpdateEditParams() {
   FDE_TXTEDTPARAMS params;
   params.nHorzScale = 100;
   params.fPlateWidth = m_rtEngine.width;
   params.fPlateHeight = m_rtEngine.height;
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_RTLLayout) {
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_RTLLayout)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_RTL;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalLayout) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalLayout)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_DocVertical;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalChars) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VerticalChars)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CharVertial;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReverseLine) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReverseLine)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LineReserve;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ArabicShapes) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ArabicShapes)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ArabicShapes;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ExpandTab) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ExpandTab)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_ExpandTab;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_CombText)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_CombText;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_LastLineHeight) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_LastLineHeight)
     params.dwLayoutStyles |= FDE_TEXTEDITLAYOUT_LastLineHeight;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Validate) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Validate)
     params.dwMode |= FDE_TEXTEDITMODE_Validate;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Password) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Password)
     params.dwMode |= FDE_TEXTEDITMODE_Password;
-  }
+
   switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignMask) {
     case FWL_STYLEEXT_EDT_HNear: {
       params.dwAlignment |= FDE_TEXTEDITALIGN_Left;
@@ -744,7 +746,8 @@
       params.dwAlignment |= FDE_TEXTEDITALIGN_Right;
       break;
     }
-    default: {}
+    default:
+      break;
   }
   switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HAlignModeMask) {
     case FWL_STYLEEXT_EDT_Justified: {
@@ -755,7 +758,10 @@
       params.dwAlignment |= FDE_TEXTEDITALIGN_Distributed;
       break;
     }
-    default: { params.dwAlignment |= FDE_TEXTEDITALIGN_Normal; }
+    default: {
+      params.dwAlignment |= FDE_TEXTEDITALIGN_Normal;
+      break;
+    }
   }
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine) {
     params.dwMode |= FDE_TEXTEDITMODE_MultiLines;
@@ -770,40 +776,43 @@
     } else {
       params.fPlateHeight = 0x00FFFFFF;
     }
-  } else {
-    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) == 0) {
-      params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Horz;
-    }
+  } else if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_AutoHScroll) ==
+             0) {
+    params.dwMode |= FDE_TEXTEDITMODE_LimitArea_Horz;
   }
   if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
       (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
     params.dwMode |= FDE_TEXTEDITMODE_ReadOnly;
   }
+
   FX_FLOAT* pFontSize =
       static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::FontSize));
   if (!pFontSize)
     return;
+
   m_fFontSize = *pFontSize;
   uint32_t* pFontColor =
       static_cast<uint32_t*>(GetThemeCapacity(CFWL_WidgetCapacity::TextColor));
   if (!pFontColor)
     return;
+
   params.dwFontColor = *pFontColor;
   FX_FLOAT* pLineHeight =
       static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::LineHeight));
   if (!pLineHeight)
     return;
+
   params.fLineSpace = *pLineHeight;
   CFGAS_GEFont* pFont =
       static_cast<CFGAS_GEFont*>(GetThemeCapacity(CFWL_WidgetCapacity::Font));
   if (!pFont)
     return;
+
   params.pFont = pFont;
   params.fFontSize = m_fFontSize;
   params.nLineCount = (int32_t)(params.fPlateHeight / params.fLineSpace);
-  if (params.nLineCount <= 0) {
+  if (params.nLineCount <= 0)
     params.nLineCount = 1;
-  }
   params.fTabWidth = params.fFontSize * 1;
   params.bTabEquidistant = true;
   params.wLineBreakChar = L'\n';
@@ -884,6 +893,7 @@
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
+
   const CFX_RectF& rtFDE = pPage->GetContentsBox();
   FX_FLOAT fOffsetY = 0.0f;
   FX_FLOAT fSpaceAbove = 0.0f;
@@ -894,12 +904,11 @@
     fSpaceAbove = pSpace->x;
     fSpaceBelow = pSpace->y;
   }
-  if (fSpaceAbove < 0.1f) {
+  if (fSpaceAbove < 0.1f)
     fSpaceAbove = 0;
-  }
-  if (fSpaceBelow < 0.1f) {
+  if (fSpaceBelow < 0.1f)
     fSpaceBelow = 0;
-  }
+
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_VCenter) {
     fOffsetY = (m_rtEngine.height - rtFDE.height) / 2;
     if (fOffsetY < (fSpaceAbove + fSpaceBelow) / 2 &&
@@ -913,33 +922,33 @@
   } else {
     fOffsetY += fSpaceAbove;
   }
-  m_fVAlignOffset = fOffsetY;
-  if (m_fVAlignOffset < 0) {
-    m_fVAlignOffset = 0;
-  }
+  m_fVAlignOffset = std::max(fOffsetY, 0.0f);
 }
+
 void IFWL_Edit::UpdateCaret() {
   CFX_RectF rtFDE;
   m_EdtEngine.GetCaretRect(rtFDE);
+
   rtFDE.Offset(m_rtEngine.left - m_fScrollOffsetX,
                m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset);
   CFX_RectF rtCaret;
   rtCaret.Set(rtFDE.left, rtFDE.top, rtFDE.width, rtFDE.height);
+
   CFX_RectF temp = rtCaret;
   CFX_RectF rtClient;
   GetClientRect(rtClient);
   rtCaret.Intersect(rtClient);
+
   if (rtCaret.left > rtClient.right()) {
     FX_FLOAT right = rtCaret.right();
     rtCaret.left = rtClient.right() - 1;
     rtCaret.width = right - rtCaret.left;
   }
-  bool bIntersect = !rtCaret.IsEmpty();
+
   bool bShow = true;
   bool bShowWhole = false;
-  if (!(m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) || !bIntersect) {
+  if (!(m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) || rtCaret.IsEmpty())
     bShow = false;
-  }
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_HSelfAdaption &&
       temp.right() > m_rtEngine.right()) {
     bShowWhole = true;
@@ -948,13 +957,14 @@
       temp.bottom() > m_rtEngine.bottom()) {
     bShowWhole = true;
   } else {
-    bShow = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && bIntersect);
+    bShow = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused &&
+             !rtCaret.IsEmpty());
   }
-  if (bShowWhole) {
+  if (bShowWhole)
     rtCaret = temp;
-  }
   ShowCaret(bShow, &rtCaret);
 }
+
 IFWL_ScrollBar* IFWL_Edit::UpdateScroll() {
   bool bShowHorz =
       m_pHorzScrollBar &&
@@ -962,12 +972,13 @@
   bool bShowVert =
       m_pVertScrollBar &&
       ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Invisible) == 0);
-  if (!bShowHorz && !bShowVert) {
+  if (!bShowHorz && !bShowVert)
     return nullptr;
-  }
+
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return nullptr;
+
   const CFX_RectF& rtFDE = pPage->GetContentsBox();
   IFWL_ScrollBar* pRepaint = nullptr;
   if (bShowHorz) {
@@ -977,13 +988,8 @@
       m_pHorzScrollBar->LockUpdate();
       FX_FLOAT fRange = rtFDE.width - rtScroll.width;
       m_pHorzScrollBar->SetRange(0.0f, fRange);
-      FX_FLOAT fPos = m_fScrollOffsetX;
-      if (fPos < 0.0f) {
-        fPos = 0.0f;
-      }
-      if (fPos > fRange) {
-        fPos = fRange;
-      }
+
+      FX_FLOAT fPos = std::min(std::max(m_fScrollOffsetX, 0.0f), fRange);
       m_pHorzScrollBar->SetPos(fPos);
       m_pHorzScrollBar->SetTrackPos(fPos);
       m_pHorzScrollBar->SetPageSize(rtScroll.width);
@@ -1001,24 +1007,17 @@
       pRepaint = m_pHorzScrollBar.get();
     }
   }
+
   if (bShowVert) {
     CFX_RectF rtScroll;
     m_pVertScrollBar->GetWidgetRect(rtScroll);
     if (rtScroll.height < rtFDE.height) {
       m_pVertScrollBar->LockUpdate();
       FX_FLOAT fStep = m_EdtEngine.GetEditParams()->fLineSpace;
-      FX_FLOAT fRange = rtFDE.height - m_rtEngine.height;
-      if (fRange < fStep) {
-        fRange = fStep;
-      }
+      FX_FLOAT fRange = std::max(rtFDE.height - m_rtEngine.height, fStep);
+
       m_pVertScrollBar->SetRange(0.0f, fRange);
-      FX_FLOAT fPos = m_fScrollOffsetY;
-      if (fPos < 0.0f) {
-        fPos = 0.0f;
-      }
-      if (fPos > fRange) {
-        fPos = fRange;
-      }
+      FX_FLOAT fPos = std::min(std::max(m_fScrollOffsetY, 0.0f), fRange);
       m_pVertScrollBar->SetPos(fPos);
       m_pVertScrollBar->SetTrackPos(fPos);
       m_pVertScrollBar->SetPageSize(rtScroll.height);
@@ -1038,6 +1037,7 @@
   }
   return pRepaint;
 }
+
 bool IFWL_Edit::IsShowScrollBar(bool bVert) {
   bool bShow =
       (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus)
@@ -1052,12 +1052,14 @@
   return bShow && (m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) &&
          (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine);
 }
+
 bool IFWL_Edit::IsContentHeightOverflow() {
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return false;
   return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f;
 }
+
 int32_t IFWL_Edit::AddDoRecord(IFDE_TxtEdtDoRecord* pRecord) {
   int32_t nCount = pdfium::CollectionSize<int32_t>(m_DoRecords);
   if (m_iCurRecord == nCount - 1) {
@@ -1074,6 +1076,7 @@
   m_iCurRecord = pdfium::CollectionSize<int32_t>(m_DoRecords) - 1;
   return m_iCurRecord;
 }
+
 void IFWL_Edit::Layout() {
   GetClientRect(m_rtClient);
   m_rtEngine = m_rtClient;
@@ -1081,6 +1084,7 @@
       GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
   if (!pfWidth)
     return;
+
   FX_FLOAT fWidth = *pfWidth;
   if (!m_pOuter) {
     CFX_RectF* pUIMargin = static_cast<CFX_RectF*>(
@@ -1100,10 +1104,12 @@
                          pUIMargin->height);
     }
   }
+
   bool bShowVertScrollbar = IsShowScrollBar(true);
   bool bShowHorzScrollbar = IsShowScrollBar(false);
   if (bShowVertScrollbar) {
     InitScrollBar();
+
     CFX_RectF rtVertScr;
     if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
       rtVertScr.Set(m_rtClient.right() + kEditMargin, m_rtClient.top, fWidth,
@@ -1111,19 +1117,21 @@
     } else {
       rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth,
                     m_rtClient.height);
-      if (bShowHorzScrollbar) {
+      if (bShowHorzScrollbar)
         rtVertScr.height -= fWidth;
-      }
       m_rtEngine.width -= fWidth;
     }
+
     m_pVertScrollBar->SetWidgetRect(rtVertScr);
     m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, false);
     m_pVertScrollBar->Update();
   } else if (m_pVertScrollBar) {
     m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, true);
   }
+
   if (bShowHorzScrollbar) {
     InitScrollBar(false);
+
     CFX_RectF rtHoriScr;
     if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_OuterScrollbar) {
       rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() + kEditMargin,
@@ -1131,9 +1139,8 @@
     } else {
       rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth,
                     m_rtClient.width, fWidth);
-      if (bShowVertScrollbar) {
+      if (bShowVertScrollbar)
         rtHoriScr.width -= fWidth;
-      }
       m_rtEngine.height -= fWidth;
     }
     m_pHorzScrollBar->SetWidgetRect(rtHoriScr);
@@ -1143,11 +1150,13 @@
     m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, true);
   }
 }
+
 void IFWL_Edit::LayoutScrollBar() {
   if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ShowScrollbarFocus) ==
       0) {
     return;
   }
+
   FX_FLOAT* pfWidth = nullptr;
   bool bShowVertScrollbar = IsShowScrollBar(true);
   bool bShowHorzScrollbar = IsShowScrollBar(false);
@@ -1164,9 +1173,8 @@
       } else {
         rtVertScr.Set(m_rtClient.right() - fWidth, m_rtClient.top, fWidth,
                       m_rtClient.height);
-        if (bShowHorzScrollbar) {
+        if (bShowHorzScrollbar)
           rtVertScr.height -= fWidth;
-        }
       }
       m_pVertScrollBar->SetWidgetRect(rtVertScr);
       m_pVertScrollBar->Update();
@@ -1175,12 +1183,14 @@
   } else if (m_pVertScrollBar) {
     m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, true);
   }
+
   if (bShowHorzScrollbar) {
     if (!m_pHorzScrollBar) {
       if (!pfWidth) {
         pfWidth = static_cast<FX_FLOAT*>(
             GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
       }
+
       FX_FLOAT fWidth = pfWidth ? *pfWidth : 0;
       InitScrollBar(false);
       CFX_RectF rtHoriScr;
@@ -1190,9 +1200,8 @@
       } else {
         rtHoriScr.Set(m_rtClient.left, m_rtClient.bottom() - fWidth,
                       m_rtClient.width, fWidth);
-        if (bShowVertScrollbar) {
+        if (bShowVertScrollbar)
           rtHoriScr.width -= (fWidth);
-        }
       }
       m_pHorzScrollBar->SetWidgetRect(rtHoriScr);
       m_pHorzScrollBar->Update();
@@ -1201,9 +1210,8 @@
   } else if (m_pHorzScrollBar) {
     m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, true);
   }
-  if (bShowVertScrollbar || bShowHorzScrollbar) {
+  if (bShowVertScrollbar || bShowHorzScrollbar)
     UpdateScroll();
-  }
 }
 
 void IFWL_Edit::DeviceToEngine(CFX_PointF& pt) {
@@ -1212,9 +1220,8 @@
 }
 
 void IFWL_Edit::InitScrollBar(bool bVert) {
-  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) {
+  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar))
     return;
-  }
 
   auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
   prop->m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
@@ -1250,6 +1257,7 @@
     pDocEnvironment->DisplayCaret(pXFAWidget, bVisible, &rt);
     return true;
   }
+
   pDocEnvironment->DisplayCaret(pXFAWidget, bVisible, pRtAnchor);
   return true;
 }
@@ -1257,59 +1265,59 @@
 void IFWL_Edit::ShowCaret(bool bVisible, CFX_RectF* pRect) {
   if (m_pCaret) {
     m_pCaret->ShowCaret(bVisible);
-    if (bVisible && !pRect->IsEmpty()) {
+    if (bVisible && !pRect->IsEmpty())
       m_pCaret->SetWidgetRect(*pRect);
-    }
     Repaint(&m_rtEngine);
-  } else {
-    IFWL_Widget* pOuter = this;
+    return;
+  }
+
+  IFWL_Widget* pOuter = this;
+  if (bVisible) {
+    pRect->Offset(m_pProperties->m_rtWidget.left,
+                  m_pProperties->m_rtWidget.top);
+  }
+  while (pOuter->GetOuter()) {
+    pOuter = pOuter->GetOuter();
     if (bVisible) {
-      pRect->Offset(m_pProperties->m_rtWidget.left,
-                    m_pProperties->m_rtWidget.top);
+      CFX_RectF rtOuter;
+      pOuter->GetWidgetRect(rtOuter);
+      pRect->Offset(rtOuter.left, rtOuter.top);
     }
-    while (pOuter->GetOuter()) {
-      pOuter = pOuter->GetOuter();
-      if (bVisible) {
-        CFX_RectF rtOuter;
-        pOuter->GetWidgetRect(rtOuter);
-        pRect->Offset(rtOuter.left, rtOuter.top);
-      }
-    }
-    FWL_ShowCaret(pOuter, bVisible, pRect);
   }
+  FWL_ShowCaret(pOuter, bVisible, pRect);
 }
+
 bool IFWL_Edit::ValidateNumberChar(FX_WCHAR cNum) {
-  if (!m_bSetRange) {
+  if (!m_bSetRange)
     return true;
-  }
+
   CFX_WideString wsOld, wsText;
   m_EdtEngine.GetText(wsText, 0);
   if (wsText.IsEmpty()) {
-    if (cNum == L'0') {
+    if (cNum == L'0')
       return false;
-    }
     return true;
   }
+
   int32_t caretPos = m_EdtEngine.GetCaretPos();
-  int32_t iSel = CountSelRanges();
-  if (iSel == 0) {
-    if (cNum == L'0' && caretPos == 0) {
+  if (CountSelRanges() == 0) {
+    if (cNum == L'0' && caretPos == 0)
       return false;
-    }
+
     int32_t nLen = wsText.GetLength();
     CFX_WideString l = wsText.Mid(0, caretPos);
     CFX_WideString r = wsText.Mid(caretPos, nLen - caretPos);
     CFX_WideString wsNew = l + cNum + r;
-    if (wsNew.GetInteger() <= m_iMax) {
+    if (wsNew.GetInteger() <= m_iMax)
       return true;
-    }
-  } else {
-    if (wsText.GetInteger() <= m_iMax) {
-      return true;
-    }
+    return false;
   }
+
+  if (wsText.GetInteger() <= m_iMax)
+    return true;
   return false;
 }
+
 void IFWL_Edit::InitCaret() {
   if (!m_pCaret) {
     if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret)) {
@@ -1416,6 +1424,7 @@
   IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
+
   CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
   DeviceToEngine(pt);
   bool bBefore = true;
@@ -1449,13 +1458,15 @@
     }
     ClearRecord();
   }
+
   LayoutScrollBar();
-  if (bRepaint) {
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
-                     m_pProperties->m_rtWidget.height);
-    Repaint(&rtInvalidate);
-  }
+  if (!bRepaint)
+    return;
+
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
+                   m_pProperties->m_rtWidget.height);
+  Repaint(&rtInvalidate);
 }
 
 void IFWL_Edit::OnLButtonDown(CFWL_MsgMouse* pMsg) {
@@ -1467,14 +1478,12 @@
   DoButtonDown(pMsg);
   int32_t nIndex = m_EdtEngine.GetCaretPos();
   bool bRepaint = false;
-  int32_t iCount = m_EdtEngine.CountSelRanges();
-  if (iCount > 0) {
+  if (m_EdtEngine.CountSelRanges() > 0) {
     m_EdtEngine.ClearSelection();
     bRepaint = true;
   }
 
-  bool bShift = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Shift);
-  if (bShift && m_nSelStart != nIndex) {
+  if ((pMsg->m_dwFlags & FWL_KEYFLAG_Shift) && m_nSelStart != nIndex) {
     int32_t iStart = std::min(m_nSelStart, nIndex);
     int32_t iEnd = std::max(m_nSelStart, nIndex);
     m_EdtEngine.AddSelRange(iStart, iEnd - iStart);
@@ -1523,14 +1532,16 @@
   m_EdtEngine.SetCaretPos(nIndex, bBefore);
   nIndex = m_EdtEngine.GetCaretPos();
   m_EdtEngine.ClearSelection();
-  if (nIndex != m_nSelStart) {
-    int32_t nLen = m_EdtEngine.GetTextLength();
-    if (m_nSelStart >= nLen)
-      m_nSelStart = nLen;
 
-    m_EdtEngine.AddSelRange(std::min(m_nSelStart, nIndex),
-                            FXSYS_abs(nIndex - m_nSelStart));
-  }
+  if (nIndex == m_nSelStart)
+    return;
+
+  int32_t nLen = m_EdtEngine.GetTextLength();
+  if (m_nSelStart >= nLen)
+    m_nSelStart = nLen;
+
+  m_EdtEngine.AddSelRange(std::min(m_nSelStart, nIndex),
+                          FXSYS_abs(nIndex - m_nSelStart));
 }
 
 void IFWL_Edit::OnKeyDown(CFWL_MsgKey* pMsg) {
@@ -1598,14 +1609,13 @@
   }
 
   int32_t iError = 0;
-  FX_WCHAR c = (FX_WCHAR)pMsg->m_dwKeyCode;
+  FX_WCHAR c = static_cast<FX_WCHAR>(pMsg->m_dwKeyCode);
   int32_t nCaret = m_EdtEngine.GetCaretPos();
   switch (c) {
     case FWL_VKEY_Back:
       m_EdtEngine.Delete(nCaret, true);
       break;
-    case 0x0A:
-      break;
+    case FWL_VKEY_NewLine:
     case FWL_VKEY_Escape:
       break;
     case FWL_VKEY_Tab: {
@@ -1697,17 +1707,18 @@
     case FWL_SCBCODE::EndScroll:
       return false;
   }
-  if (iCurPos != fPos) {
-    pScrollBar->SetPos(fPos);
-    pScrollBar->SetTrackPos(fPos);
-    UpdateOffset(pScrollBar, fPos - iCurPos);
-    UpdateCaret();
+  if (iCurPos == fPos)
+    return true;
 
-    CFX_RectF rect;
-    GetWidgetRect(rect);
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, rect.width + 2, rect.height + 2);
-    Repaint(&rtInvalidate);
-  }
+  pScrollBar->SetPos(fPos);
+  pScrollBar->SetTrackPos(fPos);
+  UpdateOffset(pScrollBar, fPos - iCurPos);
+  UpdateCaret();
+
+  CFX_RectF rect;
+  GetWidgetRect(rect);
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Set(0, 0, rect.width + 2, rect.height + 2);
+  Repaint(&rtInvalidate);
   return true;
 }
diff --git a/xfa/fwl/core/ifwl_form.cpp b/xfa/fwl/core/ifwl_form.cpp
index 42827ab..989da19 100644
--- a/xfa/fwl/core/ifwl_form.cpp
+++ b/xfa/fwl/core/ifwl_form.cpp
@@ -88,24 +88,27 @@
 }
 
 void IFWL_Form::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Reset();
-    FX_FLOAT fCapHeight = GetCaptionHeight();
-    FX_FLOAT fCXBorder = GetBorderSize(true);
-    FX_FLOAT fCYBorder = GetBorderSize(false);
-    FX_FLOAT fEdge = GetEdgeWidth();
-    rect.height += fCapHeight + fCYBorder + fEdge + fEdge;
-    rect.width += fCXBorder + fCXBorder + fEdge + fEdge;
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Reset();
+  FX_FLOAT fCapHeight = GetCaptionHeight();
+  FX_FLOAT fCXBorder = GetBorderSize(true);
+  FX_FLOAT fCYBorder = GetBorderSize(false);
+  FX_FLOAT fEdge = GetEdgeWidth();
+  rect.height += fCapHeight + fCYBorder + fEdge + fEdge;
+  rect.width += fCXBorder + fCXBorder + fEdge + fEdge;
 }
+
 void IFWL_Form::GetClientRect(CFX_RectF& rect) {
   if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) == 0) {
     rect = m_pProperties->m_rtWidget;
     rect.Offset(-rect.left, -rect.top);
     return;
   }
+
 #ifdef FWL_UseMacSystemBorder
   rect = m_rtRelative;
   CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr();
@@ -134,31 +137,33 @@
   rect.Deflate(x, t, x, y);
 #endif
 }
+
 void IFWL_Form::Update() {
-  if (m_iLock > 0) {
+  if (m_iLock > 0)
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-#ifdef FWL_UseMacSystemBorder
-#else
+
+#ifndef FWL_UseMacSystemBorder
   SetThemeData();
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon)
     UpdateIcon();
-  }
 #endif
+
   UpdateCaption();
   Layout();
 }
+
 FWL_WidgetHit IFWL_Form::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
   GetAvailableTheme();
+
   if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy))
     return FWL_WidgetHit::CloseBox;
   if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy))
     return FWL_WidgetHit::MaxBox;
   if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy))
     return FWL_WidgetHit::MinBox;
+
   CFX_RectF rtCap;
   rtCap.Set(m_rtCaption.left + m_fCYBorder, m_rtCaption.top + m_fCXBorder,
             m_rtCaption.width - kSystemButtonSize * m_iSysBox - 2 * m_fCYBorder,
@@ -169,32 +174,40 @@
       (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize)) {
     FX_FLOAT fWidth = m_rtRelative.width - 2 * (m_fCYBorder + kCornerEnlarge);
     FX_FLOAT fHeight = m_rtRelative.height - 2 * (m_fCXBorder + kCornerEnlarge);
+
     CFX_RectF rt;
     rt.Set(0, m_fCXBorder + kCornerEnlarge, m_fCYBorder, fHeight);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::Left;
+
     rt.Set(m_rtRelative.width - m_fCYBorder, m_fCXBorder + kCornerEnlarge,
            m_fCYBorder, fHeight);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::Right;
+
     rt.Set(m_fCYBorder + kCornerEnlarge, 0, fWidth, m_fCXBorder);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::Top;
+
     rt.Set(m_fCYBorder + kCornerEnlarge, m_rtRelative.height - m_fCXBorder,
            fWidth, m_fCXBorder);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::Bottom;
+
     rt.Set(0, 0, m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::LeftTop;
+
     rt.Set(0, m_rtRelative.height - m_fCXBorder - kCornerEnlarge,
            m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::LeftBottom;
+
     rt.Set(m_rtRelative.width - m_fCYBorder - kCornerEnlarge, 0,
            m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
     if (rt.Contains(fx, fy))
       return FWL_WidgetHit::RightTop;
+
     rt.Set(m_rtRelative.width - m_fCYBorder - kCornerEnlarge,
            m_rtRelative.height - m_fCXBorder - kCornerEnlarge,
            m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
@@ -203,17 +216,19 @@
   }
   return FWL_WidgetHit::Client;
 }
+
 void IFWL_Form::DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) {
   if (!pGraphics)
     return;
   if (!m_pProperties->m_pThemeProvider)
     return;
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
   bool bInactive = !IsActive();
   int32_t iState = bInactive ? CFWL_PartState_Inactive : CFWL_PartState_Normal;
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_NoDrawClient) == 0) {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_NoDrawClient) == 0)
     DrawBackground(pGraphics, pTheme);
-  }
+
 #ifdef FWL_UseMacSystemBorder
   return;
 #endif
@@ -222,9 +237,8 @@
   param.m_dwStates = iState;
   param.m_pGraphics = pGraphics;
   param.m_rtPart = m_rtRelative;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix);
-  }
   if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
     param.m_iPart = CFWL_Part::Border;
     pTheme->DrawBackground(&param);
@@ -253,31 +267,29 @@
   }
   if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
     param.m_iPart = CFWL_Part::Icon;
-    if (HasIcon()) {
+    if (HasIcon())
       DrawIconImage(pGraphics, pTheme, pMatrix);
-    }
   }
+
 #if (_FX_OS_ == _FX_MACOSX_)
   {
     if (m_pCloseBox) {
       param.m_iPart = CFWL_Part::CloseBox;
       param.m_dwStates = m_pCloseBox->GetPartState();
-      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
+      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated)
         param.m_dwStates = CFWL_PartState_Disabled;
-      } else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) {
+      else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn)
         param.m_dwStates = CFWL_PartState_Hovered;
-      }
       param.m_rtPart = m_pCloseBox->m_rtBtn;
       pTheme->DrawBackground(&param);
     }
     if (m_pMaxBox) {
       param.m_iPart = CFWL_Part::MaximizeBox;
       param.m_dwStates = m_pMaxBox->GetPartState();
-      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
+      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated)
         param.m_dwStates = CFWL_PartState_Disabled;
-      } else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) {
+      else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn)
         param.m_dwStates = CFWL_PartState_Hovered;
-      }
       param.m_rtPart = m_pMaxBox->m_rtBtn;
       param.m_bMaximize = m_bMaximized;
       pTheme->DrawBackground(&param);
@@ -285,11 +297,10 @@
     if (m_pMinBox) {
       param.m_iPart = CFWL_Part::MinimizeBox;
       param.m_dwStates = m_pMinBox->GetPartState();
-      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
+      if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated)
         param.m_dwStates = CFWL_PartState_Disabled;
-      } else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) {
+      else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn)
         param.m_dwStates = CFWL_PartState_Hovered;
-      }
       param.m_rtPart = m_pMinBox->m_rtBtn;
       pTheme->DrawBackground(&param);
     }
@@ -336,10 +347,11 @@
   m_bDoModalFlag = true;
   SetStates(FWL_WGTSTATE_Invisible, false);
   pDriver->Run();
-#if (_FX_OS_ == _FX_MACOSX_)
-#else
+
+#if _FX_OS_ != _FX_MACOSX_
   pDriver->PopNoteLoop();
 #endif
+
   m_pNoteLoop.reset();
   return nullptr;
 }
@@ -347,7 +359,9 @@
 void IFWL_Form::EndDoModal() {
   if (!m_pNoteLoop)
     return;
+
   m_bDoModalFlag = false;
+
 #if (_FX_OS_ == _FX_MACOSX_)
   m_pNoteLoop->EndModalLoop();
   const IFWL_App* pApp = GetOwnerApp();
@@ -392,35 +406,29 @@
 }
 
 CFWL_SysBtn* IFWL_Form::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
-  if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
+  if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy))
     return m_pCloseBox;
-  }
-  if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) {
+  if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy))
     return m_pMaxBox;
-  }
-  if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) {
+  if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy))
     return m_pMinBox;
-  }
-  if (m_pCaptionBox && m_pCaptionBox->m_rtBtn.Contains(fx, fy)) {
+  if (m_pCaptionBox && m_pCaptionBox->m_rtBtn.Contains(fx, fy))
     return m_pCaptionBox;
-  }
   return nullptr;
 }
+
 CFWL_SysBtn* IFWL_Form::GetSysBtnByState(uint32_t dwState) {
-  if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState)) {
+  if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState))
     return m_pCloseBox;
-  }
-  if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState)) {
+  if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState))
     return m_pMaxBox;
-  }
-  if (m_pMinBox && (m_pMinBox->m_dwState & dwState)) {
+  if (m_pMinBox && (m_pMinBox->m_dwState & dwState))
     return m_pMinBox;
-  }
-  if (m_pCaptionBox && (m_pCaptionBox->m_dwState & dwState)) {
+  if (m_pCaptionBox && (m_pCaptionBox->m_dwState & dwState))
     return m_pCaptionBox;
-  }
   return nullptr;
 }
+
 CFWL_SysBtn* IFWL_Form::GetSysBtnByIndex(int32_t nIndex) {
   if (nIndex < 0)
     return nullptr;
@@ -428,36 +436,32 @@
   CFX_ArrayTemplate<CFWL_SysBtn*> arrBtn;
   if (m_pMinBox)
     arrBtn.Add(m_pMinBox);
-
   if (m_pMaxBox)
     arrBtn.Add(m_pMaxBox);
-
   if (m_pCloseBox)
     arrBtn.Add(m_pCloseBox);
-
   return arrBtn[nIndex];
 }
+
 int32_t IFWL_Form::GetSysBtnIndex(CFWL_SysBtn* pBtn) {
   CFX_ArrayTemplate<CFWL_SysBtn*> arrBtn;
   if (m_pMinBox)
     arrBtn.Add(m_pMinBox);
-
   if (m_pMaxBox)
     arrBtn.Add(m_pMaxBox);
-
   if (m_pCloseBox)
     arrBtn.Add(m_pCloseBox);
-
   return arrBtn.Find(pBtn);
 }
+
 FX_FLOAT IFWL_Form::GetCaptionHeight() {
   CFWL_WidgetCapacity dwCapacity = CFWL_WidgetCapacity::None;
 
-  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
+  if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption)
     dwCapacity = CFWL_WidgetCapacity::CYCaption;
-  } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
+  else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption)
     dwCapacity = CFWL_WidgetCapacity::CYNarrowCaption;
-  }
+
   if (dwCapacity != CFWL_WidgetCapacity::None) {
     FX_FLOAT* pfCapHeight =
         static_cast<FX_FLOAT*>(GetThemeCapacity(dwCapacity));
@@ -465,23 +469,24 @@
   }
   return 0;
 }
+
 void IFWL_Form::DrawCaptionText(CFX_Graphics* pGs,
                                 IFWL_ThemeProvider* pTheme,
                                 const CFX_Matrix* pMatrix) {
   CFX_WideString wsText;
   IFWL_DataProvider* pData = m_pProperties->m_pDataProvider;
   pData->GetCaption(this, wsText);
-  if (wsText.IsEmpty()) {
+  if (wsText.IsEmpty())
     return;
-  }
+
   CFWL_ThemeText textParam;
   textParam.m_pWidget = this;
   textParam.m_iPart = CFWL_Part::Caption;
   textParam.m_dwStates = CFWL_PartState_Normal;
   textParam.m_pGraphics = pGs;
-  if (pMatrix) {
+  if (pMatrix)
     textParam.m_matrix.Concat(*pMatrix);
-  }
+
   CFX_RectF rtText;
   if (m_bCustomizeLayout) {
     rtText = m_rtCaptionText;
@@ -499,6 +504,7 @@
                                              : FDE_TTOALIGNMENT_CenterLeft;
   pTheme->DrawText(&textParam);
 }
+
 void IFWL_Form::DrawIconImage(CFX_Graphics* pGs,
                               IFWL_ThemeProvider* pTheme,
                               const CFX_Matrix* pMatrix) {
@@ -510,11 +516,11 @@
   param.m_pGraphics = pGs;
   param.m_pImage = pData->GetIcon(this, false);
   param.m_rtPart = m_rtIcon;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&param);
 }
+
 void IFWL_Form::GetEdgeRect(CFX_RectF& rtEdge) {
   rtEdge = m_rtRelative;
   if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
@@ -523,27 +529,32 @@
     rtEdge.Deflate(fCX, m_rtCaption.Height(), fCX, fCY);
   }
 }
+
 void IFWL_Form::SetWorkAreaRect() {
   m_rtRestore = m_pProperties->m_rtWidget;
   CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr();
   if (!pWidgetMgr)
     return;
+
   m_bSetMaximize = true;
   Repaint(&m_rtRelative);
 }
 
 void IFWL_Form::Layout() {
   GetRelativeRect(m_rtRelative);
+
 #ifndef FWL_UseMacSystemBorder
   ResetSysBtn();
 #endif
 }
+
 void IFWL_Form::ResetSysBtn() {
   m_fCXBorder =
       *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CXBorder));
   m_fCYBorder =
       *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CYBorder));
   RemoveSysButtons();
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
   m_bCustomizeLayout = pTheme->IsCustomizedLayout(this);
   FX_FLOAT fCapHeight = GetCaptionHeight();
@@ -551,6 +562,7 @@
     m_rtCaption = m_rtRelative;
     m_rtCaption.height = fCapHeight;
   }
+
   m_iSysBox = 0;
   if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_CloseBox) {
     m_pCloseBox = new CFWL_SysBtn;
@@ -595,6 +607,7 @@
     }
     m_iSysBox++;
   }
+
   IFWL_FormDP* pData =
       static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
   if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon &&
@@ -605,6 +618,7 @@
     }
   }
 }
+
 void IFWL_Form::RegisterForm() {
   const IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
@@ -617,6 +631,7 @@
 
   pDriver->RegisterForm(this);
 }
+
 void IFWL_Form::UnRegisterForm() {
   const IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
@@ -636,15 +651,18 @@
   m_fBigIconSz =
       *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::BigIcon));
 }
+
 bool IFWL_Form::HasIcon() {
   IFWL_FormDP* pData =
       static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
   return !!pData->GetIcon(this, false);
 }
+
 void IFWL_Form::UpdateIcon() {
   CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr();
   if (!pWidgetMgr)
     return;
+
   IFWL_FormDP* pData =
       static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
   CFX_DIBitmap* pBigIcon = pData->GetIcon(this, true);
@@ -654,21 +672,22 @@
   if (pSmallIcon)
     m_pSmallIcon = pSmallIcon;
 }
+
 void IFWL_Form::UpdateCaption() {
   CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr();
   if (!pWidgetMgr)
     return;
+
   IFWL_DataProvider* pData = m_pProperties->m_pDataProvider;
   if (!pData)
     return;
+
   CFX_WideString text;
   pData->GetCaption(this, text);
 }
 
-#ifdef FWL_UseMacSystemBorder
-void IFWL_Form::OnProcessMessage(CFWL_Message* pMessage) {}
-#else
 void IFWL_Form::OnProcessMessage(CFWL_Message* pMessage) {
+#ifndef FWL_UseMacSystemBorder
   if (!pMessage)
     return;
 
@@ -699,8 +718,8 @@
     default:
       break;
   }
-}
 #endif  // FWL_UseMacSystemBorder
+}
 
 void IFWL_Form::OnDrawWidget(CFX_Graphics* pGraphics,
                              const CFX_Matrix* pMatrix) {
@@ -711,8 +730,10 @@
   SetGrab(true);
   m_bLButtonDown = true;
   m_eResizeType = FORM_RESIZETYPE_None;
+
   CFWL_SysBtn* pPressBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
   m_iCaptureBtn = GetSysBtnIndex(pPressBtn);
+
   CFX_RectF rtCap;
   rtCap.Set(m_rtCaption.left + m_fCYBorder, m_rtCaption.top + m_fCXBorder,
             m_rtCaption.width - kSystemButtonSize * m_iSysBox - 2 * m_fCYBorder,
@@ -724,6 +745,7 @@
   } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) {
     m_eResizeType = FORM_RESIZETYPE_Cap;
   }
+
   m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
   m_InfoStart.m_szStart = CFX_SizeF(m_pProperties->m_rtWidget.width,
                                     m_pProperties->m_rtWidget.height);
@@ -763,7 +785,8 @@
   rtInvalidate.Reset();
   CFWL_SysBtn* pPointBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
   CFWL_SysBtn* pOldHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
-#if (_FX_OS_ == _FX_MACOSX_)
+
+#if _FX_OS_ == _FX_MACOSX_
   {
     if (pOldHover && pPointBtn != pOldHover)
       pOldHover->SetNormal();
@@ -803,16 +826,18 @@
     }
   }
 #endif
+
   if (!rtInvalidate.IsEmpty())
     Repaint(&rtInvalidate);
 }
 
 void IFWL_Form::OnMouseLeave(CFWL_MsgMouse* pMsg) {
   CFWL_SysBtn* pHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
-  if (pHover) {
-    pHover->SetNormal();
-    Repaint(&pHover->m_rtBtn);
-  }
+  if (!pHover)
+    return;
+
+  pHover->SetNormal();
+  Repaint(&pHover->m_rtBtn);
 }
 
 void IFWL_Form::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
diff --git a/xfa/fwl/core/ifwl_formproxy.cpp b/xfa/fwl/core/ifwl_formproxy.cpp
index 56194d8..1bdc002 100644
--- a/xfa/fwl/core/ifwl_formproxy.cpp
+++ b/xfa/fwl/core/ifwl_formproxy.cpp
@@ -22,9 +22,8 @@
 }
 
 bool IFWL_FormProxy::IsInstance(const CFX_WideStringC& wsClass) const {
-  if (wsClass == CFX_WideStringC(FWL_CLASS_FormProxy)) {
+  if (wsClass == CFX_WideStringC(FWL_CLASS_FormProxy))
     return true;
-  }
   return IFWL_Form::IsInstance(wsClass);
 }
 
diff --git a/xfa/fwl/core/ifwl_listbox.cpp b/xfa/fwl/core/ifwl_listbox.cpp
index 041e008..6696d4c 100644
--- a/xfa/fwl/core/ifwl_listbox.cpp
+++ b/xfa/fwl/core/ifwl_listbox.cpp
@@ -43,27 +43,26 @@
 }
 
 void IFWL_ListBox::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pThemeProvider) {
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    }
-    CFX_SizeF fs = CalcSize(true);
-    rect.Set(0, 0, fs.x, fs.y);
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Set(0, 0, 0, 0);
+  if (!m_pProperties->m_pThemeProvider)
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+
+  CFX_SizeF fs = CalcSize(true);
+  rect.Set(0, 0, fs.x, fs.y);
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_ListBox::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
-  m_iTTOAligns = FDE_TTOALIGNMENT_Center;
+
   switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_AlignMask) {
     case FWL_STYLEEXT_LTB_LeftAlign: {
       m_iTTOAligns = FDE_TTOALIGNMENT_CenterLeft;
@@ -74,11 +73,14 @@
       break;
     }
     case FWL_STYLEEXT_LTB_CenterAlign:
-    default: { m_iTTOAligns = FDE_TTOALIGNMENT_Center; }
+    default: {
+      m_iTTOAligns = FDE_TTOALIGNMENT_Center;
+      break;
+    }
   }
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading)
     m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
+
   m_dwTTOStyles |= FDE_TTOSTYLE_SingleLine;
   m_fScorllBarWidth = GetScrollWidth();
   CalcSize();
@@ -108,28 +110,26 @@
     return;
   if (!m_pProperties->m_pThemeProvider)
     return;
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
   pGraphics->SaveGraphState();
-  if (HasBorder()) {
+  if (HasBorder())
     DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
+  if (HasEdge())
     DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
-  }
+
   CFX_RectF rtClip(m_rtConent);
-  if (IsShowScrollBar(false)) {
+  if (IsShowScrollBar(false))
     rtClip.height -= m_fScorllBarWidth;
-  }
-  if (IsShowScrollBar(true)) {
+  if (IsShowScrollBar(true))
     rtClip.width -= m_fScorllBarWidth;
-  }
-  if (pMatrix) {
+  if (pMatrix)
     pMatrix->TransformRect(rtClip);
-  }
+
   pGraphics->SetClipRect(rtClip);
-  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_NoBackground) == 0) {
+  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_NoBackground) == 0)
     DrawBkground(pGraphics, pTheme, pMatrix);
-  }
+
   DrawItems(pGraphics, pTheme, pMatrix);
   pGraphics->RestoreGraphState();
 }
@@ -138,69 +138,54 @@
   if (pThemeProvider)
     m_pProperties->m_pThemeProvider = pThemeProvider;
 }
+
 int32_t IFWL_ListBox::CountSelItems() {
   if (!m_pProperties->m_pDataProvider)
     return 0;
+
   int32_t iRet = 0;
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   int32_t iCount = pData->CountItems(this);
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* pItem = pData->GetItem(this, i);
-    if (!pItem) {
+    if (!pItem)
       continue;
-    }
+
     uint32_t dwStyle = pData->GetItemStyles(this, pItem);
-    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
+    if (dwStyle & FWL_ITEMSTATE_LTB_Selected)
       iRet++;
-    }
   }
   return iRet;
 }
 
 CFWL_ListItem* IFWL_ListBox::GetSelItem(int32_t nIndexSel) {
-  if (!m_pProperties->m_pDataProvider)
+  int32_t idx = GetSelIndex(nIndexSel);
+  if (idx < 0)
     return nullptr;
-  int32_t index = 0;
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-  int32_t iCount = pData->CountItems(this);
-  for (int32_t i = 0; i < iCount; i++) {
-    CFWL_ListItem* pItem = pData->GetItem(this, i);
-    if (!pItem) {
-      return nullptr;
-    }
-    uint32_t dwStyle = pData->GetItemStyles(this, pItem);
-    if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
-      if (index == nIndexSel) {
-        return pItem;
-      } else {
-        index++;
-      }
-    }
-  }
-  return nullptr;
+  return pData->GetItem(this, idx);
 }
 
 int32_t IFWL_ListBox::GetSelIndex(int32_t nIndex) {
   if (!m_pProperties->m_pDataProvider)
     return -1;
+
   int32_t index = 0;
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   int32_t iCount = pData->CountItems(this);
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* pItem = pData->GetItem(this, i);
-    if (!pItem) {
+    if (!pItem)
       return -1;
-    }
+
     uint32_t dwStyle = pData->GetItemStyles(this, pItem);
     if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
-      if (index == nIndex) {
+      if (index == nIndex)
         return i;
-      } else {
-        index++;
-      }
+      index++;
     }
   }
   return -1;
@@ -218,20 +203,21 @@
     }
     return;
   }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection)
     SetSelectionDirect(pItem, bSelect);
-  } else {
+  else
     SetSelection(pItem, pItem, bSelect);
-  }
 }
 
 void IFWL_ListBox::GetItemText(CFWL_ListItem* pItem, CFX_WideString& wsText) {
   if (!m_pProperties->m_pDataProvider)
     return;
+
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   if (!pItem)
     return;
+
   pData->GetItemText(this, pItem, wsText);
 }
 
@@ -260,7 +246,8 @@
       hRet = pData->GetItem(this, iDstItem);
       break;
     }
-    default: {}
+    default:
+      break;
   }
   return hRet;
 }
@@ -323,18 +310,18 @@
 }
 
 void IFWL_ListBox::SelectAll() {
-  bool bMulti = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection;
-  if (!bMulti) {
+  if (!m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection)
     return;
-  }
+
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   int32_t iCount = pData->CountItems(this);
-  if (iCount > 0) {
-    CFWL_ListItem* pItemStart = pData->GetItem(this, 0);
-    CFWL_ListItem* pItemEnd = pData->GetItem(this, iCount - 1);
-    SetSelection(pItemStart, pItemEnd, false);
-  }
+  if (iCount <= 0)
+    return;
+
+  CFWL_ListItem* pItemStart = pData->GetItem(this, 0);
+  CFWL_ListItem* pItemEnd = pData->GetItem(this, iCount - 1);
+  SetSelection(pItemStart, pItemEnd, false);
 }
 
 CFWL_ListItem* IFWL_ListBox::GetFocusedItem() {
@@ -345,9 +332,8 @@
     CFWL_ListItem* pItem = pData->GetItem(this, i);
     if (!pItem)
       return nullptr;
-    if (pData->GetItemStyles(this, pItem) & FWL_ITEMSTATE_LTB_Focused) {
+    if (pData->GetItemStyles(this, pItem) & FWL_ITEMSTATE_LTB_Focused)
       return pItem;
-    }
   }
   return nullptr;
 }
@@ -356,44 +342,44 @@
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   CFWL_ListItem* hFocus = GetFocusedItem();
-  if (pItem != hFocus) {
-    if (hFocus) {
-      uint32_t dwStyle = pData->GetItemStyles(this, hFocus);
-      dwStyle &= ~FWL_ITEMSTATE_LTB_Focused;
-      pData->SetItemStyles(this, hFocus, dwStyle);
-    }
-    if (pItem) {
-      uint32_t dwStyle = pData->GetItemStyles(this, pItem);
-      dwStyle |= FWL_ITEMSTATE_LTB_Focused;
-      pData->SetItemStyles(this, pItem, dwStyle);
-    }
+  if (pItem == hFocus)
+    return;
+
+  if (hFocus) {
+    uint32_t dwStyle = pData->GetItemStyles(this, hFocus);
+    dwStyle &= ~FWL_ITEMSTATE_LTB_Focused;
+    pData->SetItemStyles(this, hFocus, dwStyle);
+  }
+  if (pItem) {
+    uint32_t dwStyle = pData->GetItemStyles(this, pItem);
+    dwStyle |= FWL_ITEMSTATE_LTB_Focused;
+    pData->SetItemStyles(this, pItem, dwStyle);
   }
 }
 
 CFWL_ListItem* IFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
   fx -= m_rtConent.left, fy -= m_rtConent.top;
   FX_FLOAT fPosX = 0.0f;
-  if (m_pHorzScrollBar) {
+  if (m_pHorzScrollBar)
     fPosX = m_pHorzScrollBar->GetPos();
-  }
+
   FX_FLOAT fPosY = 0.0;
-  if (m_pVertScrollBar) {
+  if (m_pVertScrollBar)
     fPosY = m_pVertScrollBar->GetPos();
-  }
+
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   int32_t nCount = pData->CountItems(this);
   for (int32_t i = 0; i < nCount; i++) {
     CFWL_ListItem* pItem = pData->GetItem(this, i);
-    if (!pItem) {
+    if (!pItem)
       continue;
-    }
+
     CFX_RectF rtItem;
     pData->GetItemRect(this, pItem, rtItem);
     rtItem.Offset(-fPosX, -fPosY);
-    if (rtItem.Contains(fx, fy)) {
+    if (rtItem.Contains(fx, fy))
       return pItem;
-    }
   }
   return nullptr;
 }
@@ -401,9 +387,9 @@
 bool IFWL_ListBox::GetItemCheckRect(CFWL_ListItem* pItem, CFX_RectF& rtCheck) {
   if (!m_pProperties->m_pDataProvider)
     return false;
-  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
+  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check))
     return false;
-  }
+
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   pData->GetItemCheckRect(this, pItem, rtCheck);
@@ -413,9 +399,9 @@
 bool IFWL_ListBox::GetItemChecked(CFWL_ListItem* pItem) {
   if (!m_pProperties->m_pDataProvider)
     return false;
-  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
+  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check))
     return false;
-  }
+
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   return !!(pData->GetItemCheckState(this, pItem) & FWL_ITEMSTATE_LTB_Checked);
@@ -424,9 +410,9 @@
 bool IFWL_ListBox::SetItemChecked(CFWL_ListItem* pItem, bool bChecked) {
   if (!m_pProperties->m_pDataProvider)
     return false;
-  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) {
+  if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check))
     return false;
-  }
+
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   pData->SetItemCheckState(this, pItem,
@@ -437,10 +423,12 @@
 bool IFWL_ListBox::ScrollToVisible(CFWL_ListItem* pItem) {
   if (!m_pVertScrollBar)
     return false;
+
   CFX_RectF rtItem;
   IFWL_ListBoxDP* pData =
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   pData->GetItemRect(this, pItem, rtItem);
+
   bool bScroll = false;
   FX_FLOAT fPosY = m_pVertScrollBar->GetPos();
   rtItem.Offset(0, -fPosY + m_rtConent.top);
@@ -451,9 +439,9 @@
     fPosY += rtItem.bottom() - m_rtConent.bottom();
     bScroll = true;
   }
-  if (!bScroll) {
+  if (!bScroll)
     return false;
-  }
+
   m_pVertScrollBar->SetPos(fPosY);
   m_pVertScrollBar->SetTrackPos(fPosY);
   Repaint(&m_rtClient);
@@ -467,6 +455,7 @@
     return;
   if (!pTheme)
     return;
+
   CFWL_ThemeBackground param;
   param.m_pWidget = this;
   param.m_iPart = CFWL_Part::Background;
@@ -474,12 +463,11 @@
   param.m_pGraphics = pGraphics;
   param.m_matrix.Concat(*pMatrix);
   param.m_rtPart = m_rtClient;
-  if (IsShowScrollBar(false) && IsShowScrollBar(true)) {
+  if (IsShowScrollBar(false) && IsShowScrollBar(true))
     param.m_pData = &m_rtStatic;
-  }
-  if (!IsEnabled()) {
+  if (!IsEnabled())
     param.m_dwStates = CFWL_PartState_Disabled;
-  }
+
   pTheme->DrawBackground(&param);
 }
 
@@ -487,20 +475,19 @@
                              IFWL_ThemeProvider* pTheme,
                              const CFX_Matrix* pMatrix) {
   FX_FLOAT fPosX = 0.0f;
-  if (m_pHorzScrollBar) {
+  if (m_pHorzScrollBar)
     fPosX = m_pHorzScrollBar->GetPos();
-  }
+
   FX_FLOAT fPosY = 0.0f;
-  if (m_pVertScrollBar) {
+  if (m_pVertScrollBar)
     fPosY = m_pVertScrollBar->GetPos();
-  }
+
   CFX_RectF rtView(m_rtConent);
-  if (m_pHorzScrollBar) {
+  if (m_pHorzScrollBar)
     rtView.height -= m_fScorllBarWidth;
-  }
-  if (m_pVertScrollBar) {
+  if (m_pVertScrollBar)
     rtView.width -= m_fScorllBarWidth;
-  }
+
   bool bMultiCol =
       !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn);
   IFWL_ListBoxDP* pData =
@@ -508,21 +495,19 @@
   int32_t iCount = pData->CountItems(this);
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* pItem = pData->GetItem(this, i);
-    if (!pItem) {
+    if (!pItem)
       continue;
-    }
+
     CFX_RectF rtItem;
     pData->GetItemRect(this, pItem, rtItem);
     rtItem.Offset(m_rtConent.left - fPosX, m_rtConent.top - fPosY);
-    if (rtItem.bottom() < m_rtConent.top) {
+    if (rtItem.bottom() < m_rtConent.top)
       continue;
-    }
-    if (rtItem.top >= m_rtConent.bottom()) {
+    if (rtItem.top >= m_rtConent.bottom())
       break;
-    }
-    if (bMultiCol && rtItem.left > m_rtConent.right()) {
+    if (bMultiCol && rtItem.left > m_rtConent.right())
       break;
-    }
+
     if (GetStylesEx() & FWL_STYLEEXT_LTB_OwnerDraw) {
       CFWL_EvtLtbDrawItem ev;
       ev.m_pSrcTarget = this;
@@ -547,95 +532,94 @@
       static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
   uint32_t dwItemStyles = pData->GetItemStyles(this, pItem);
   uint32_t dwPartStates = CFWL_PartState_Normal;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
     dwPartStates = CFWL_PartState_Disabled;
-  } else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected) {
+  else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected)
     dwPartStates = CFWL_PartState_Selected;
-  }
+
   if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused &&
       dwItemStyles & FWL_ITEMSTATE_LTB_Focused) {
     dwPartStates |= CFWL_PartState_Focused;
   }
-  {
-    CFWL_ThemeBackground param;
-    param.m_pWidget = this;
-    param.m_iPart = CFWL_Part::ListItem;
-    param.m_dwStates = dwPartStates;
-    param.m_pGraphics = pGraphics;
-    param.m_matrix.Concat(*pMatrix);
-    param.m_rtPart = rtItem;
-    param.m_bMaximize = true;
-    CFX_RectF rtFocus(rtItem);
-    param.m_pData = &rtFocus;
-    if (m_pVertScrollBar && !m_pHorzScrollBar &&
-        (dwPartStates & CFWL_PartState_Focused)) {
-      param.m_rtPart.left += 1;
-      param.m_rtPart.width -= (m_fScorllBarWidth + 1);
-      rtFocus.Deflate(0.5, 0.5, 1 + m_fScorllBarWidth, 1);
-    }
-    pTheme->DrawBackground(&param);
+
+  CFWL_ThemeBackground bg_param;
+  bg_param.m_pWidget = this;
+  bg_param.m_iPart = CFWL_Part::ListItem;
+  bg_param.m_dwStates = dwPartStates;
+  bg_param.m_pGraphics = pGraphics;
+  bg_param.m_matrix.Concat(*pMatrix);
+  bg_param.m_rtPart = rtItem;
+  bg_param.m_bMaximize = true;
+  CFX_RectF rtFocus(rtItem);
+  bg_param.m_pData = &rtFocus;
+  if (m_pVertScrollBar && !m_pHorzScrollBar &&
+      (dwPartStates & CFWL_PartState_Focused)) {
+    bg_param.m_rtPart.left += 1;
+    bg_param.m_rtPart.width -= (m_fScorllBarWidth + 1);
+    rtFocus.Deflate(0.5, 0.5, 1 + m_fScorllBarWidth, 1);
   }
-  {
-    bool bHasIcon = !!(GetStylesEx() & FWL_STYLEEXT_LTB_Icon);
-    if (bHasIcon) {
-      CFX_RectF rtDIB;
-      CFX_DIBitmap* pDib = pData->GetItemIcon(this, pItem);
-      rtDIB.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
-      if (pDib) {
-        CFWL_ThemeBackground param;
-        param.m_pWidget = this;
-        param.m_iPart = CFWL_Part::Icon;
-        param.m_pGraphics = pGraphics;
-        param.m_matrix.Concat(*pMatrix);
-        param.m_rtPart = rtDIB;
-        param.m_bMaximize = true;
-        param.m_pImage = pDib;
-        pTheme->DrawBackground(&param);
-      }
-    }
-    bool bHasCheck = !!(GetStylesEx() & FWL_STYLEEXT_LTB_Check);
-    if (bHasCheck) {
-      CFX_RectF rtCheck;
-      rtCheck.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
-      rtCheck.Deflate(2, 2, 2, 2);
-      pData->SetItemCheckRect(this, pItem, rtCheck);
+  pTheme->DrawBackground(&bg_param);
+
+  bool bHasIcon = !!(GetStylesEx() & FWL_STYLEEXT_LTB_Icon);
+  if (bHasIcon) {
+    CFX_RectF rtDIB;
+    CFX_DIBitmap* pDib = pData->GetItemIcon(this, pItem);
+    rtDIB.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
+    if (pDib) {
       CFWL_ThemeBackground param;
       param.m_pWidget = this;
-      param.m_iPart = CFWL_Part::Check;
+      param.m_iPart = CFWL_Part::Icon;
       param.m_pGraphics = pGraphics;
-      if (GetItemChecked(pItem)) {
-        param.m_dwStates = CFWL_PartState_Checked;
-      } else {
-        param.m_dwStates = CFWL_PartState_Normal;
-      }
       param.m_matrix.Concat(*pMatrix);
-      param.m_rtPart = rtCheck;
+      param.m_rtPart = rtDIB;
       param.m_bMaximize = true;
+      param.m_pImage = pDib;
       pTheme->DrawBackground(&param);
     }
-    CFX_WideString wsText;
-    pData->GetItemText(this, pItem, wsText);
-    if (wsText.GetLength() <= 0) {
-      return;
-    }
-    CFX_RectF rtText(rtItem);
-    rtText.Deflate(kItemTextMargin, kItemTextMargin);
-    if (bHasIcon || bHasCheck) {
-      rtText.Deflate(rtItem.height, 0, 0, 0);
-    }
-    CFWL_ThemeText textParam;
-    textParam.m_pWidget = this;
-    textParam.m_iPart = CFWL_Part::ListItem;
-    textParam.m_dwStates = dwPartStates;
-    textParam.m_pGraphics = pGraphics;
-    textParam.m_matrix.Concat(*pMatrix);
-    textParam.m_rtPart = rtText;
-    textParam.m_wsText = wsText;
-    textParam.m_dwTTOStyles = m_dwTTOStyles;
-    textParam.m_iTTOAlign = m_iTTOAligns;
-    textParam.m_bMaximize = true;
-    pTheme->DrawText(&textParam);
   }
+
+  bool bHasCheck = !!(GetStylesEx() & FWL_STYLEEXT_LTB_Check);
+  if (bHasCheck) {
+    CFX_RectF rtCheck;
+    rtCheck.Set(rtItem.left, rtItem.top, rtItem.height, rtItem.height);
+    rtCheck.Deflate(2, 2, 2, 2);
+    pData->SetItemCheckRect(this, pItem, rtCheck);
+    CFWL_ThemeBackground param;
+    param.m_pWidget = this;
+    param.m_iPart = CFWL_Part::Check;
+    param.m_pGraphics = pGraphics;
+    if (GetItemChecked(pItem))
+      param.m_dwStates = CFWL_PartState_Checked;
+    else
+      param.m_dwStates = CFWL_PartState_Normal;
+    param.m_matrix.Concat(*pMatrix);
+    param.m_rtPart = rtCheck;
+    param.m_bMaximize = true;
+    pTheme->DrawBackground(&param);
+  }
+
+  CFX_WideString wsText;
+  pData->GetItemText(this, pItem, wsText);
+  if (wsText.GetLength() <= 0)
+    return;
+
+  CFX_RectF rtText(rtItem);
+  rtText.Deflate(kItemTextMargin, kItemTextMargin);
+  if (bHasIcon || bHasCheck)
+    rtText.Deflate(rtItem.height, 0, 0, 0);
+
+  CFWL_ThemeText textParam;
+  textParam.m_pWidget = this;
+  textParam.m_iPart = CFWL_Part::ListItem;
+  textParam.m_dwStates = dwPartStates;
+  textParam.m_pGraphics = pGraphics;
+  textParam.m_matrix.Concat(*pMatrix);
+  textParam.m_rtPart = rtText;
+  textParam.m_wsText = wsText;
+  textParam.m_dwTTOStyles = m_dwTTOStyles;
+  textParam.m_iTTOAlign = m_iTTOAligns;
+  textParam.m_bMaximize = true;
+  pTheme->DrawText(&textParam);
 }
 
 CFX_SizeF IFWL_ListBox::CalcSize(bool bAutoSize) {
@@ -655,6 +639,7 @@
                          pUIMargin->height);
     }
   }
+
   FX_FLOAT fWidth = 0;
   if (m_pProperties->m_pThemeProvider->IsCustomizedLayout(this)) {
     IFWL_ListBoxDP* pData =
@@ -680,10 +665,9 @@
     if (!bAutoSize) {
       FX_FLOAT fActualWidth =
           m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
-      if (fWidth < fActualWidth) {
-        fWidth = fActualWidth;
-      }
+      fWidth = std::max(fWidth, fActualWidth);
     }
+
     IFWL_ListBoxDP* pData =
         static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
     m_fItemHeight = CalcItemHeight();
@@ -696,9 +680,9 @@
       GetItemSize(fs, htem, fWidth, m_fItemHeight, bAutoSize);
     }
   }
-  if (bAutoSize) {
+  if (bAutoSize)
     return fs;
-  }
+
   FX_FLOAT iWidth = m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
   FX_FLOAT iHeight = m_rtClient.height;
   bool bShowVertScr =
@@ -711,35 +695,30 @@
       (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) == 0) {
     bShowVertScr = (fs.y > iHeight);
   }
-  if (!bShowHorzScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll) {
+  if (!bShowHorzScr && m_pProperties->m_dwStyles & FWL_WGTSTYLE_HScroll)
     bShowHorzScr = (fs.x > iWidth);
-  }
+
   CFX_SizeF szRange;
   if (bShowVertScr) {
-    if (!m_pVertScrollBar) {
+    if (!m_pVertScrollBar)
       InitScrollBar();
-    }
+
     CFX_RectF rtScrollBar;
     rtScrollBar.Set(m_rtClient.right() - m_fScorllBarWidth, m_rtClient.top,
                     m_fScorllBarWidth, m_rtClient.height - 1);
-    if (bShowHorzScr) {
+    if (bShowHorzScr)
       rtScrollBar.height -= m_fScorllBarWidth;
-    }
+
     m_pVertScrollBar->SetWidgetRect(rtScrollBar);
     szRange.x = 0, szRange.y = fs.y - m_rtConent.height;
-    if (szRange.y < m_fItemHeight) {
-      szRange.y = m_fItemHeight;
-    }
+    szRange.y = std::max(szRange.y, m_fItemHeight);
+
     m_pVertScrollBar->SetRange(szRange.x, szRange.y);
     m_pVertScrollBar->SetPageSize(rtScrollBar.height * 9 / 10);
     m_pVertScrollBar->SetStepSize(m_fItemHeight);
-    FX_FLOAT fPos = m_pVertScrollBar->GetPos();
-    if (fPos < 0) {
-      fPos = 0;
-    }
-    if (fPos > szRange.y) {
-      fPos = szRange.y;
-    }
+
+    FX_FLOAT fPos =
+        std::min(std::max(m_pVertScrollBar->GetPos(), 0.f), szRange.y);
     m_pVertScrollBar->SetPos(fPos);
     m_pVertScrollBar->SetTrackPos(fPos);
     if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
@@ -754,27 +733,23 @@
     m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, true);
   }
   if (bShowHorzScr) {
-    if (!m_pHorzScrollBar) {
+    if (!m_pHorzScrollBar)
       InitScrollBar(false);
-    }
+
     CFX_RectF rtScrollBar;
     rtScrollBar.Set(m_rtClient.left, m_rtClient.bottom() - m_fScorllBarWidth,
                     m_rtClient.width, m_fScorllBarWidth);
-    if (bShowVertScr) {
+    if (bShowVertScr)
       rtScrollBar.width -= m_fScorllBarWidth;
-    }
+
     m_pHorzScrollBar->SetWidgetRect(rtScrollBar);
     szRange.x = 0, szRange.y = fs.x - rtScrollBar.width;
     m_pHorzScrollBar->SetRange(szRange.x, szRange.y);
     m_pHorzScrollBar->SetPageSize(fWidth * 9 / 10);
     m_pHorzScrollBar->SetStepSize(fWidth / 10);
-    FX_FLOAT fPos = m_pHorzScrollBar->GetPos();
-    if (fPos < 0) {
-      fPos = 0;
-    }
-    if (fPos > szRange.y) {
-      fPos = szRange.y;
-    }
+
+    FX_FLOAT fPos =
+        std::min(std::max(m_pHorzScrollBar->GetPos(), 0.f), szRange.y);
     m_pHorzScrollBar->SetPos(fPos);
     m_pHorzScrollBar->SetTrackPos(fPos);
     if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_ShowScrollBarFocus) ==
@@ -801,18 +776,18 @@
                                FX_FLOAT fWidth,
                                FX_FLOAT fItemHeight,
                                bool bAutoSize) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) {
-  } else {
-    if (!bAutoSize) {
-      CFX_RectF rtItem;
-      rtItem.Set(0, size.y, fWidth, fItemHeight);
-      IFWL_ListBoxDP* pData =
-          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
-      pData->SetItemRect(this, pItem, rtItem);
-    }
-    size.x = fWidth;
-    size.y += fItemHeight;
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn)
+    return;
+
+  if (!bAutoSize) {
+    CFX_RectF rtItem;
+    rtItem.Set(0, size.y, fWidth, fItemHeight);
+    IFWL_ListBoxDP* pData =
+        static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+    pData->SetItemRect(this, pItem, rtItem);
   }
+  size.x = fWidth;
+  size.y += fItemHeight;
 }
 
 FX_FLOAT IFWL_ListBox::GetMaxTextWidth() {
@@ -822,15 +797,13 @@
   int32_t iCount = pData->CountItems(this);
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* pItem = pData->GetItem(this, i);
-    if (!pItem) {
+    if (!pItem)
       continue;
-    }
+
     CFX_WideString wsText;
     pData->GetItemText(this, pItem, wsText);
     CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider);
-    if (sz.x > fRet) {
-      fRet = sz.x;
-    }
+    fRet = std::max(fRet, sz.x);
   }
   return fRet;
 }
@@ -852,9 +825,9 @@
 }
 
 void IFWL_ListBox::InitScrollBar(bool bVert) {
-  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar)) {
+  if ((bVert && m_pVertScrollBar) || (!bVert && m_pHorzScrollBar))
     return;
-  }
+
   auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
   prop->m_dwStyleExes = bVert ? FWL_STYLEEXT_SCB_Vert : FWL_STYLEEXT_SCB_Horz;
   prop->m_dwStates = FWL_WGTSTATE_Invisible;
@@ -870,9 +843,8 @@
 bool IFWL_ListBox::IsShowScrollBar(bool bVert) {
   IFWL_ScrollBar* pScrollbar =
       bVert ? m_pVertScrollBar.get() : m_pHorzScrollBar.get();
-  if (!pScrollbar || (pScrollbar->GetStates() & FWL_WGTSTATE_Invisible)) {
+  if (!pScrollbar || (pScrollbar->GetStates() & FWL_WGTSTATE_Invisible))
     return false;
-  }
   return !(m_pProperties->m_dwStyleExes &
            FWL_STYLEEXT_LTB_ShowScrollBarFocus) ||
          (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused);
@@ -885,9 +857,8 @@
   int32_t iCount = CountSelItems();
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* item = GetSelItem(i);
-    if (!item) {
+    if (!item)
       continue;
-    }
     selEvent.iarraySels.Add(i);
   }
   DispatchEvent(&selEvent);
@@ -1056,6 +1027,7 @@
 
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) {
     if (bCtrl) {
+      // Do nothing.
     } else if (bShift) {
       if (m_hAnchor)
         SetSelection(m_hAnchor, pItem, true);
diff --git a/xfa/fwl/core/ifwl_monthcalendar.cpp b/xfa/fwl/core/ifwl_monthcalendar.cpp
index cec6c4c..c5c7780 100644
--- a/xfa/fwl/core/ifwl_monthcalendar.cpp
+++ b/xfa/fwl/core/ifwl_monthcalendar.cpp
@@ -160,27 +160,28 @@
 }
 
 void IFWL_MonthCalendar::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    CFX_SizeF fs = CalcSize(true);
-    rect.Set(0, 0, fs.x, fs.y);
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  CFX_SizeF fs = CalcSize(true);
+  rect.Set(0, 0, fs.x, fs.y);
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_MonthCalendar::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   GetCapValue();
   if (!m_bInitialized) {
     InitDate();
     m_bInitialized = true;
   }
+
   ClearDateItem();
   ResetDateItem();
   Layout();
@@ -190,17 +191,16 @@
                                     const CFX_Matrix* pMatrix) {
   if (!pGraphics)
     return;
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
+  if (HasBorder())
     DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
+  if (HasEdge())
     DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
-  }
-  DrawBkground(pGraphics, pTheme, pMatrix);
+
+  DrawBackground(pGraphics, pTheme, pMatrix);
   DrawHeadBK(pGraphics, pTheme, pMatrix);
   DrawLButton(pGraphics, pTheme, pMatrix);
   DrawRButton(pGraphics, pTheme, pMatrix);
@@ -225,18 +225,17 @@
   AddSelDay(iDay);
 }
 
-void IFWL_MonthCalendar::DrawBkground(CFX_Graphics* pGraphics,
-                                      IFWL_ThemeProvider* pTheme,
-                                      const CFX_Matrix* pMatrix) {
+void IFWL_MonthCalendar::DrawBackground(CFX_Graphics* pGraphics,
+                                        IFWL_ThemeProvider* pTheme,
+                                        const CFX_Matrix* pMatrix) {
   CFWL_ThemeBackground params;
   params.m_pWidget = this;
   params.m_iPart = CFWL_Part::Background;
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_rtPart = m_rtClient;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
@@ -249,9 +248,8 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_rtPart = m_rtHead;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
@@ -264,9 +262,8 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = m_iLBtnPartStates;
   params.m_rtPart = m_rtLBtn;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
@@ -279,9 +276,8 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = m_iRBtnPartStates;
   params.m_rtPart = m_rtRBtn;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
@@ -305,9 +301,8 @@
   textParam.m_rtPart = m_rtHeadText;
   textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
   textParam.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
+  if (pMatrix)
     textParam.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawText(&textParam);
 }
 
@@ -320,9 +315,8 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_rtPart = m_rtHSep;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
@@ -333,9 +327,9 @@
   params.m_pWidget = this;
   params.m_iPart = CFWL_Part::DateInBK;
   params.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
+
   int32_t iCount = m_arrDates.GetSize();
   for (int32_t j = 0; j < iCount; j++) {
     DATEINFO* pDataInfo = m_arrDates.GetAt(j);
@@ -346,9 +340,8 @@
           pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
         params.m_dwStates |= CFWL_PartState_Flagged;
       }
-      if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Focused) {
+      if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Focused)
         params.m_dwStates |= CFWL_PartState_Focused;
-      }
     } else if (j == m_iHovered - 1) {
       params.m_dwStates |= CFWL_PartState_Hovered;
     } else if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
@@ -371,9 +364,9 @@
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
   CFX_RectF rtDayOfWeek;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
+
   for (int32_t i = 0; i < 7; i++) {
     rtDayOfWeek.Set(m_rtWeek.left + i * (m_szCell.x + MONTHCAL_HMARGIN * 2),
                     m_rtWeek.top, m_szCell.x, m_szCell.y);
@@ -396,9 +389,9 @@
   CFX_WideString wsWeekNum;
   params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
   params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
+
   int32_t iMonthNum = m_pDateTime->GetMonth();
   int32_t iDayNum = FX_DaysInMonth(m_iCurYear, iMonthNum);
   int32_t iTemp = 0;
@@ -424,36 +417,36 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_rtPart = m_rtWeekNumSep;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
 void IFWL_MonthCalendar::DrawToday(CFX_Graphics* pGraphics,
                                    IFWL_ThemeProvider* pTheme,
                                    const CFX_Matrix* pMatrix) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday)
     return;
-  }
+
   CFWL_ThemeText params;
   params.m_pWidget = this;
   params.m_iPart = CFWL_Part::Today;
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
+
   CFX_WideString* wsDay = static_cast<CFX_WideString*>(
       pTheme->GetCapacity(&params, CFWL_WidgetCapacity::Today));
   CFX_WideString wsText;
   GetTodayText(m_iYear, m_iMonth, m_iDay, wsText);
   params.m_wsText = *wsDay + wsText;
+
   m_szToday = CalcTextSize(params.m_wsText, m_pProperties->m_pThemeProvider);
   CalcTodaySize();
   params.m_rtPart = m_rtToday;
   params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawText(&params);
 }
 
@@ -466,18 +459,17 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
+
   int32_t iCount = m_arrDates.GetSize();
   for (int32_t j = 0; j < iCount; j++) {
     DATEINFO* pDataInfo = m_arrDates.GetAt(j);
     params.m_wsText = pDataInfo->wsDay;
     params.m_rtPart = pDataInfo->rect;
     params.m_dwStates = pDataInfo->dwStates;
-    if (j + 1 == m_iHovered) {
+    if (j + 1 == m_iHovered)
       params.m_dwStates |= CFWL_PartState_Hovered;
-    }
     params.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
     pTheme->DrawText(&params);
   }
@@ -492,43 +484,39 @@
   params.m_pGraphics = pGraphics;
   params.m_dwStates = CFWL_PartState_Normal;
   params.m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawText(&params);
 }
 
 void IFWL_MonthCalendar::DrawDatesInCircle(CFX_Graphics* pGraphics,
                                            IFWL_ThemeProvider* pTheme,
                                            const CFX_Matrix* pMatrix) {
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoTodayCircle)
     return;
-  }
-  if (m_iMonth != m_iCurMonth || m_iYear != m_iCurYear) {
+  if (m_iMonth != m_iCurMonth || m_iYear != m_iCurYear)
     return;
-  }
-  if (m_iDay < 1 || m_iDay > m_arrDates.GetSize()) {
+  if (m_iDay < 1 || m_iDay > m_arrDates.GetSize())
     return;
-  }
+
   DATEINFO* pDate = m_arrDates[m_iDay - 1];
   if (!pDate)
     return;
+
   CFWL_ThemeBackground params;
   params.m_pWidget = this;
   params.m_iPart = CFWL_Part::DateInCircle;
   params.m_pGraphics = pGraphics;
   params.m_rtPart = pDate->rect;
   params.m_dwStates = CFWL_PartState_Normal;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
   pTheme->DrawBackground(&params);
 }
 
 CFX_SizeF IFWL_MonthCalendar::CalcSize(bool bAutoSize) {
   if (!m_pProperties->m_pThemeProvider)
     return CFX_SizeF();
-
   if (!bAutoSize) {
     GetClientRect(m_rtClient);
     return CFX_SizeF(m_rtClient.width, m_rtClient.height);
@@ -572,13 +560,16 @@
     fMonthMaxW = (fMonthMaxW >= sz.x) ? fMonthMaxW : sz.x;
     fMonthMaxH = (fMonthMaxH >= sz.y) ? fMonthMaxH : sz.y;
   }
+
   CFX_WideString wsYear;
   GetHeadText(m_iYear, m_iMonth, wsYear);
+
   CFX_SizeF szYear = CalcTextSize(wsYear, m_pProperties->m_pThemeProvider);
   fMonthMaxH = std::max(fMonthMaxH, szYear.y);
   m_szHead = CFX_SizeF(fMonthMaxW + szYear.x, fMonthMaxH);
   fMonthMaxW = m_szHead.x + MONTHCAL_HEADER_BTN_HMARGIN * 2 + m_szCell.x * 2;
   fs.x = std::max(fs.x, fMonthMaxW);
+
   CFX_WideString wsToday;
   GetTodayText(m_iYear, m_iMonth, m_iDay, wsToday);
   CFX_WideString* wsText = static_cast<CFX_WideString*>(
@@ -614,33 +605,32 @@
 
 void IFWL_MonthCalendar::Layout() {
   GetClientRect(m_rtClient);
-  {
-    m_rtHead.Set(
-        m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, m_rtClient.top,
-        m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
-        m_szCell.x + (MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN) * 2);
-    m_rtWeek.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
-                 m_rtHead.bottom(),
-                 m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
-                 m_szCell.y + MONTHCAL_VMARGIN * 2);
-    m_rtLBtn.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
-                 m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
-                 m_szCell.x);
-    m_rtRBtn.Set(m_rtClient.left + m_rtClient.width -
-                     MONTHCAL_HEADER_BTN_HMARGIN - m_szCell.x,
-                 m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
-                 m_szCell.x);
-    m_rtHSep.Set(
-        m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN,
-        m_rtWeek.bottom() - MONTHCAL_VMARGIN,
-        m_rtClient.width - (MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN) * 2,
-        MONTHCAL_HSEP_HEIGHT);
-    m_rtDates.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
-                  m_rtWeek.bottom(),
-                  m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
-                  m_szCell.y * (MONTHCAL_ROWS - 3) +
-                      MONTHCAL_VMARGIN * (MONTHCAL_ROWS - 3) * 2);
-  }
+
+  m_rtHead.Set(
+      m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, m_rtClient.top,
+      m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
+      m_szCell.x + (MONTHCAL_HEADER_BTN_VMARGIN + MONTHCAL_VMARGIN) * 2);
+  m_rtWeek.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN, m_rtHead.bottom(),
+               m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
+               m_szCell.y + MONTHCAL_VMARGIN * 2);
+  m_rtLBtn.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
+               m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
+               m_szCell.x);
+  m_rtRBtn.Set(m_rtClient.left + m_rtClient.width -
+                   MONTHCAL_HEADER_BTN_HMARGIN - m_szCell.x,
+               m_rtClient.top + MONTHCAL_HEADER_BTN_VMARGIN, m_szCell.x,
+               m_szCell.x);
+  m_rtHSep.Set(
+      m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN,
+      m_rtWeek.bottom() - MONTHCAL_VMARGIN,
+      m_rtClient.width - (MONTHCAL_HEADER_BTN_HMARGIN + MONTHCAL_HMARGIN) * 2,
+      MONTHCAL_HSEP_HEIGHT);
+  m_rtDates.Set(m_rtClient.left + MONTHCAL_HEADER_BTN_HMARGIN,
+                m_rtWeek.bottom(),
+                m_rtClient.width - MONTHCAL_HEADER_BTN_HMARGIN * 2,
+                m_szCell.y * (MONTHCAL_ROWS - 3) +
+                    MONTHCAL_VMARGIN * (MONTHCAL_ROWS - 3) * 2);
+
   CalDateItem();
 }
 
@@ -661,19 +651,17 @@
         fTop + iWeekOfMonth * (m_szCell.y + (MONTHCAL_VMARGIN * 2)),
         m_szCell.x + (MONTHCAL_HMARGIN * 2),
         m_szCell.y + (MONTHCAL_VMARGIN * 2));
-    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
+    if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers)
       pDateInfo->rect.Offset(m_fWeekNumWid, 0);
-    }
-    if (pDateInfo->iDayOfWeek >= 6) {
+    if (pDateInfo->iDayOfWeek >= 6)
       bNewWeek = true;
-    }
   }
 }
 
 void IFWL_MonthCalendar::GetCapValue() {
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
   CFWL_ThemePart part;
   part.m_pWidget = this;
@@ -727,9 +715,9 @@
       pTheme->GetCapacity(&part, CFWL_WidgetCapacity::TodayFlagWidth));
   m_fMCWid = *static_cast<FX_FLOAT*>(
       pTheme->GetCapacity(&part, CFWL_WidgetCapacity::Width));
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_WeekNumbers)
     m_fMCWid += m_fWeekNumWid;
-  }
+
   m_fMCHei = *static_cast<FX_FLOAT*>(
       pTheme->GetCapacity(&part, CFWL_WidgetCapacity::Height));
 }
@@ -759,7 +747,6 @@
 void IFWL_MonthCalendar::ClearDateItem() {
   for (int32_t i = 0; i < m_arrDates.GetSize(); i++)
     delete m_arrDates.GetAt(i);
-
   m_arrDates.RemoveAll();
 }
 
@@ -768,18 +755,17 @@
   int32_t iDays = FX_DaysInMonth(m_iCurYear, m_iCurMonth);
   int32_t iDayOfWeek = m_pDateTime->GetDayOfWeek();
   for (int32_t i = 0; i < iDays; i++) {
-    if (iDayOfWeek >= 7) {
+    if (iDayOfWeek >= 7)
       iDayOfWeek = 0;
-    }
+
     CFX_WideString wsDay;
     wsDay.Format(L"%d", i + 1);
     uint32_t dwStates = 0;
-    if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1)) {
+    if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1))
       dwStates |= FWL_ITEMSTATE_MCD_Flag;
-    }
-    if (m_arrSelDays.Find(i + 1) != -1) {
+    if (m_arrSelDays.Find(i + 1) != -1)
       dwStates |= FWL_ITEMSTATE_MCD_Selected;
-    }
+
     CFX_RectF rtDate;
     rtDate.Set(0, 0, 0, 0);
     m_arrDates.Add(new DATEINFO(i + 1, iDayOfWeek, dwStates, rtDate, wsDay));
@@ -796,9 +782,9 @@
     iMonth++;
   }
   DATE dt(m_iCurYear, m_iCurMonth, 1);
-  if (!(dt < m_dtMax)) {
+  if (!(dt < m_dtMax))
     return;
-  }
+
   m_iCurYear = iYear, m_iCurMonth = iMonth;
   ChangeToMonth(m_iCurYear, m_iCurMonth);
 }
@@ -811,10 +797,11 @@
   } else {
     iMonth--;
   }
+
   DATE dt(m_iCurYear, m_iCurMonth, 1);
-  if (!(dt > m_dtMin)) {
+  if (!(dt > m_dtMin))
     return;
-  }
+
   m_iCurYear = iYear, m_iCurMonth = iMonth;
   ChangeToMonth(m_iCurYear, m_iCurMonth);
 }
@@ -823,6 +810,7 @@
   m_iCurYear = iYear;
   m_iCurMonth = iMonth;
   m_iHovered = -1;
+
   ClearDateItem();
   ResetDateItem();
   CalDateItem();
@@ -830,9 +818,8 @@
 }
 
 void IFWL_MonthCalendar::RemoveSelDay(int32_t iDay, bool bAll) {
-  if (iDay == -1 && !bAll) {
+  if (iDay == -1 && !bAll)
     return;
-  }
   if (bAll) {
     int32_t iCount = m_arrSelDays.GetSize();
     int32_t iDatesCount = m_arrDates.GetSize();
@@ -844,19 +831,20 @@
       }
     }
     m_arrSelDays.RemoveAll();
-  } else {
-    int32_t index = m_arrSelDays.Find(iDay);
-    if (index == -1) {
-      return;
-    }
-    int32_t iSelDay = m_arrSelDays.GetAt(iDay);
-    int32_t iDatesCount = m_arrDates.GetSize();
-    if (iSelDay <= iDatesCount) {
-      DATEINFO* pDateInfo = m_arrDates.GetAt(iSelDay - 1);
-      pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
-    }
-    m_arrSelDays.RemoveAt(index);
+    return;
   }
+
+  int32_t index = m_arrSelDays.Find(iDay);
+  if (index == -1)
+    return;
+
+  int32_t iSelDay = m_arrSelDays.GetAt(iDay);
+  int32_t iDatesCount = m_arrDates.GetSize();
+  if (iSelDay <= iDatesCount) {
+    DATEINFO* pDateInfo = m_arrDates.GetAt(iSelDay - 1);
+    pDateInfo->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
+  }
+  m_arrSelDays.RemoveAt(index);
 }
 
 void IFWL_MonthCalendar::AddSelDay(int32_t iDay) {
@@ -864,14 +852,15 @@
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect)
     return;
 
-  if (m_arrSelDays.Find(iDay) == -1) {
-    RemoveSelDay(-1, true);
-    if (iDay <= m_arrDates.GetSize()) {
-      DATEINFO* pDateInfo = m_arrDates.GetAt(iDay - 1);
-      pDateInfo->dwStates |= FWL_ITEMSTATE_MCD_Selected;
-    }
-    m_arrSelDays.Add(iDay);
+  if (m_arrSelDays.Find(iDay) != -1)
+    return;
+
+  RemoveSelDay(-1, true);
+  if (iDay <= m_arrDates.GetSize()) {
+    DATEINFO* pDateInfo = m_arrDates.GetAt(iDay - 1);
+    pDateInfo->dwStates |= FWL_ITEMSTATE_MCD_Selected;
   }
+  m_arrSelDays.Add(iDay);
 }
 
 void IFWL_MonthCalendar::JumpToToday() {
@@ -880,11 +869,11 @@
     m_iCurMonth = m_iMonth;
     ChangeToMonth(m_iYear, m_iMonth);
     AddSelDay(m_iDay);
-  } else {
-    if (m_arrSelDays.Find(m_iDay) == -1) {
-      AddSelDay(m_iDay);
-    }
+    return;
   }
+
+  if (m_arrSelDays.Find(m_iDay) == -1)
+    AddSelDay(m_iDay);
 }
 
 void IFWL_MonthCalendar::GetHeadText(int32_t iYear,
@@ -909,9 +898,8 @@
   int32_t iCount = m_arrDates.GetSize();
   for (int32_t i = 0; i < iCount; i++) {
     DATEINFO* pDateInfo = m_arrDates.GetAt(i);
-    if (pDateInfo->rect.Contains(x, y)) {
+    if (pDateInfo->rect.Contains(x, y))
       return ++i;
-    }
   }
   return -1;
 }
diff --git a/xfa/fwl/core/ifwl_monthcalendar.h b/xfa/fwl/core/ifwl_monthcalendar.h
index 78b2b6b..096b3a0 100644
--- a/xfa/fwl/core/ifwl_monthcalendar.h
+++ b/xfa/fwl/core/ifwl_monthcalendar.h
@@ -101,9 +101,9 @@
     CFX_WideString wsDay;
   };
 
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix);
+  void DrawBackground(CFX_Graphics* pGraphics,
+                      IFWL_ThemeProvider* pTheme,
+                      const CFX_Matrix* pMatrix);
   void DrawHeadBK(CFX_Graphics* pGraphics,
                   IFWL_ThemeProvider* pTheme,
                   const CFX_Matrix* pMatrix);
diff --git a/xfa/fwl/core/ifwl_picturebox.cpp b/xfa/fwl/core/ifwl_picturebox.cpp
index 19db6f5..38685f7 100644
--- a/xfa/fwl/core/ifwl_picturebox.cpp
+++ b/xfa/fwl/core/ifwl_picturebox.cpp
@@ -26,23 +26,23 @@
 }
 
 void IFWL_PictureBox::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pDataProvider)
-      return;
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Set(0, 0, 0, 0);
+  if (!m_pProperties->m_pDataProvider)
+    return;
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_PictureBox::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   GetClientRect(m_rtClient);
 }
 
@@ -52,20 +52,12 @@
     return;
   if (!m_pProperties->m_pThemeProvider)
     return;
-  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  if (HasBorder()) {
-    DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
-    DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
-  }
-  DrawBkground(pGraphics, pTheme, pMatrix);
-}
 
-void IFWL_PictureBox::DrawBkground(CFX_Graphics* pGraphics,
-                                   IFWL_ThemeProvider* pTheme,
-                                   const CFX_Matrix* pMatrix) {
-  return;
+  IFWL_ThemeProvider* pTheme = GetAvailableTheme();
+  if (HasBorder())
+    DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
+  if (HasEdge())
+    DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
 }
 
 void IFWL_PictureBox::OnDrawWidget(CFX_Graphics* pGraphics,
diff --git a/xfa/fwl/core/ifwl_picturebox.h b/xfa/fwl/core/ifwl_picturebox.h
index 752880f..52ea6ff 100644
--- a/xfa/fwl/core/ifwl_picturebox.h
+++ b/xfa/fwl/core/ifwl_picturebox.h
@@ -47,10 +47,6 @@
                     const CFX_Matrix* pMatrix) override;
 
  private:
-  void DrawBkground(CFX_Graphics* pGraphics,
-                    IFWL_ThemeProvider* pTheme,
-                    const CFX_Matrix* pMatrix = nullptr);
-
   CFX_RectF m_rtClient;
   CFX_RectF m_rtImage;
   CFX_Matrix m_matrix;
diff --git a/xfa/fwl/core/ifwl_pushbutton.cpp b/xfa/fwl/core/ifwl_pushbutton.cpp
index 03bc706..387a01a 100644
--- a/xfa/fwl/core/ifwl_pushbutton.cpp
+++ b/xfa/fwl/core/ifwl_pushbutton.cpp
@@ -33,29 +33,31 @@
 }
 
 void IFWL_PushButton::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pThemeProvider) {
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    }
-    CFX_WideString wsCaption;
-    IFWL_PushButtonDP* pData =
-        static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
-    if (pData) {
-      pData->GetCaption(this, wsCaption);
-    }
-    int32_t iLen = wsCaption.GetLength();
-    if (iLen > 0) {
-      CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
-      rect.Set(0, 0, sz.x, sz.y);
-    }
-    FX_FLOAT* fcaption =
-        static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::Margin));
-    rect.Inflate(*fcaption, *fcaption);
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Set(0, 0, 0, 0);
+  if (!m_pProperties->m_pThemeProvider)
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+
+  CFX_WideString wsCaption;
+  IFWL_PushButtonDP* pData =
+      static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
+  if (pData)
+    pData->GetCaption(this, wsCaption);
+
+  int32_t iLen = wsCaption.GetLength();
+  if (iLen > 0) {
+    CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
+    rect.Set(0, 0, sz.x, sz.y);
+  }
+
+  FX_FLOAT* fcaption =
+      static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::Margin));
+  rect.Inflate(*fcaption, *fcaption);
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_PushButton::SetStates(uint32_t dwStates, bool bSet) {
@@ -67,12 +69,11 @@
 }
 
 void IFWL_PushButton::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   UpdateTextOutStyles();
   GetClientRect(m_rtClient);
   m_rtCaption = m_rtClient;
@@ -87,6 +88,7 @@
     return;
   if (!m_pProperties->m_pThemeProvider)
     return;
+
   IFWL_PushButtonDP* pData =
       static_cast<IFWL_PushButtonDP*>(m_pProperties->m_pDataProvider);
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
@@ -103,9 +105,9 @@
   matrix.Concat(*pMatrix);
 
   CFX_WideString wsCaption;
-  if (pData) {
+  if (pData)
     pData->GetCaption(this, wsCaption);
-  }
+
   CFX_RectF rtText;
   rtText.Set(0, 0, 0, 0);
   if (!wsCaption.IsEmpty())
@@ -129,13 +131,11 @@
   param.m_iPart = CFWL_Part::Background;
   param.m_dwStates = GetPartStates();
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix);
-  }
   param.m_rtPart = m_rtClient;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
     param.m_pData = &m_rtCaption;
-  }
   pTheme->DrawBackground(&param);
 }
 
@@ -144,19 +144,19 @@
                                const CFX_Matrix* pMatrix) {
   if (!m_pProperties->m_pDataProvider)
     return;
+
   CFX_WideString wsCaption;
   m_pProperties->m_pDataProvider->GetCaption(this, wsCaption);
-  if (wsCaption.IsEmpty()) {
+  if (wsCaption.IsEmpty())
     return;
-  }
+
   CFWL_ThemeText param;
   param.m_pWidget = this;
   param.m_iPart = CFWL_Part::Caption;
   param.m_dwStates = GetPartStates();
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix);
-  }
   param.m_rtPart = m_rtCaption;
   param.m_wsText = wsCaption;
   param.m_dwTTOStyles = m_dwTTOStyles;
@@ -166,23 +166,20 @@
 
 uint32_t IFWL_PushButton::GetPartStates() {
   uint32_t dwStates = CFWL_PartState_Normal;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
     dwStates |= CFWL_PartState_Focused;
-  }
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
     dwStates = CFWL_PartState_Disabled;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
+  else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed)
     dwStates |= CFWL_PartState_Pressed;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
+  else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered)
     dwStates |= CFWL_PartState_Hovered;
-  } else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Default) {
+  else if (m_pProperties->m_dwStates & FWL_STATE_PSB_Default)
     dwStates |= CFWL_PartState_Default;
-  }
   return dwStates;
 }
 
 void IFWL_PushButton::UpdateTextOutStyles() {
-  m_iTTOAlign = FDE_TTOALIGNMENT_Center;
   switch (m_pProperties->m_dwStyleExes &
           (FWL_STYLEEXT_PSB_HLayoutMask | FWL_STYLEEXT_PSB_VLayoutMask)) {
     case FWL_STYLEEXT_PSB_Left | FWL_STYLEEXT_PSB_Top: {
@@ -201,10 +198,6 @@
       m_iTTOAlign = FDE_TTOALIGNMENT_CenterLeft;
       break;
     }
-    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_VCenter: {
-      m_iTTOAlign = FDE_TTOALIGNMENT_Center;
-      break;
-    }
     case FWL_STYLEEXT_PSB_Right | FWL_STYLEEXT_PSB_VCenter: {
       m_iTTOAlign = FDE_TTOALIGNMENT_CenterRight;
       break;
@@ -221,13 +214,15 @@
       m_iTTOAlign = FDE_TTOALIGNMENT_BottomRight;
       break;
     }
-    default:
+    case FWL_STYLEEXT_PSB_Center | FWL_STYLEEXT_PSB_VCenter:
+    default: {
+      m_iTTOAlign = FDE_TTOALIGNMENT_Center;
       break;
+    }
   }
   m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading)
     m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
 }
 
 void IFWL_PushButton::OnProcessMessage(CFWL_Message* pMessage) {
diff --git a/xfa/fwl/core/ifwl_scrollbar.cpp b/xfa/fwl/core/ifwl_scrollbar.cpp
index c651abe..db2164b 100644
--- a/xfa/fwl/core/ifwl_scrollbar.cpp
+++ b/xfa/fwl/core/ifwl_scrollbar.cpp
@@ -59,30 +59,29 @@
 }
 
 void IFWL_ScrollBar::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>(
-        GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
-    if (!pfMinWidth)
-      return;
-    if (IsVertical()) {
-      rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3);
-    } else {
-      rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth));
-    }
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Set(0, 0, 0, 0);
+  FX_FLOAT* pfMinWidth = static_cast<FX_FLOAT*>(
+      GetThemeCapacity(CFWL_WidgetCapacity::ScrollBarWidth));
+  if (!pfMinWidth)
+    return;
+  if (IsVertical())
+    rect.Set(0, 0, (*pfMinWidth), (*pfMinWidth) * 3);
+  else
+    rect.Set(0, 0, (*pfMinWidth) * 3, (*pfMinWidth));
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_ScrollBar::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   Layout();
 }
 
@@ -92,13 +91,12 @@
     return;
   if (!m_pProperties->m_pThemeProvider)
     return;
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
-  if (HasBorder()) {
+  if (HasBorder())
     DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
+  if (HasEdge())
     DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
-  }
   DrawTrack(pGraphics, pTheme, true, pMatrix);
   DrawTrack(pGraphics, pTheme, false, pMatrix);
   DrawArrowBtn(pGraphics, pTheme, true, pMatrix);
@@ -148,9 +146,8 @@
   param.m_pGraphics = pGraphics;
   param.m_matrix.Concat(*pMatrix);
   param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn;
-  if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0) {
+  if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0)
     pTheme->DrawBackground(&param);
-  }
 }
 
 void IFWL_ScrollBar::DrawThumb(CFX_Graphics* pGraphics,
@@ -225,54 +222,45 @@
     m_rtThumb.Empty();
     return;
   }
+
   FX_FLOAT fRange = m_fRangeMax - m_fRangeMin;
   memset(&rect, 0, sizeof(CFX_Rect));
   if (fRange < 0) {
-    if (IsVertical()) {
+    if (IsVertical())
       rect.Set(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width, 0);
-    } else {
+    else
       rect.Set(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height);
-    }
     return;
   }
+
   CFX_RectF rtClient = m_rtClient;
   FX_FLOAT fLength = IsVertical() ? rtClient.height : rtClient.width;
   FX_FLOAT fSize = m_fButtonLen;
   if (m_bCustomLayout) {
     if (IsVertical()) {
       fLength = fLength - m_rtMinBtn.height - m_rtMaxBtn.height;
-      if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height) {
+      if (fLength < m_rtMinBtn.height || fLength < m_rtMaxBtn.height)
         fLength = 0.0f;
-      }
     } else {
       fLength = fLength - m_rtMinBtn.width - m_rtMaxBtn.width;
-      if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width) {
+      if (fLength < m_rtMinBtn.width || fLength < m_rtMaxBtn.width)
         fLength = 0.0f;
-      }
     }
   } else {
     fLength -= fSize * 2.0f;
-    if (fLength < fSize) {
+    if (fLength < fSize)
       fLength = 0.0f;
-    }
   }
+
   FX_FLOAT fThumbSize = fLength * fLength / (fRange + fLength);
-  if (fThumbSize < m_fMinThumb) {
-    fThumbSize = m_fMinThumb;
-  }
-  FX_FLOAT fDiff = fLength - fThumbSize;
-  if (fDiff < 0.0f) {
-    fDiff = 0.0f;
-  }
-  FX_FLOAT fTrackPos = m_fTrackPos;
-  if (fTrackPos > m_fRangeMax) {
-    fTrackPos = m_fRangeMax;
-  }
-  if (fTrackPos < m_fRangeMin) {
-    fTrackPos = m_fRangeMin;
-  }
+  fThumbSize = std::max(fThumbSize, m_fMinThumb);
+
+  FX_FLOAT fDiff = std::max(fLength - fThumbSize, 0.0f);
+  FX_FLOAT fTrackPos =
+      std::max(std::min(m_fTrackPos, m_fRangeMax), m_fRangeMin);
   if (!fRange)
     return;
+
   if (m_bCustomLayout) {
     FX_FLOAT iPos = fDiff * (fTrackPos - m_fRangeMin) / fRange;
     rect.left = rtClient.left;
@@ -300,13 +288,13 @@
   } else {
     FX_FLOAT iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange;
     rect.left = rtClient.left;
-    if (!IsVertical()) {
+    if (!IsVertical())
       rect.left += iPos;
-    }
+
     rect.top = rtClient.top;
-    if (IsVertical()) {
+    if (IsVertical())
       rect.top += iPos;
-    }
+
     rect.width = IsVertical() ? rtClient.width : fThumbSize;
     rect.height = IsVertical() ? fThumbSize : rtClient.height;
   }
@@ -317,6 +305,7 @@
     rect.Empty();
     return;
   }
+
   FX_FLOAT fBottom = m_rtThumb.bottom();
   FX_FLOAT fRight = m_rtThumb.right();
   FX_FLOAT ix = (m_rtThumb.left + fRight) / 2;
@@ -326,22 +315,21 @@
   bool bVertical = IsVertical();
   rect.width = bVertical ? m_rtClient.width : ix;
   rect.height = bVertical ? iy : m_rtClient.height;
-  if (m_bCustomLayout) {
-    if (bVertical) {
-      if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
-        rect.top = m_rtClient.top;
-      } else if (m_rtMinBtn.top < m_rtThumb.top) {
-        rect.top = m_rtMinBtn.bottom();
-        rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top);
-      }
-    } else {
-      if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
-        rect.left = m_rtClient.left;
-      } else if (m_rtMinBtn.left < m_rtThumb.left) {
-        rect.left = m_rtMinBtn.right();
-        rect.width -= (m_rtMinBtn.right() - m_rtClient.left);
-      }
+  if (!m_bCustomLayout)
+    return;
+
+  if (bVertical) {
+    if (m_rtMinBtn.height == 0 && m_rtMaxBtn.height == 0) {
+      rect.top = m_rtClient.top;
+    } else if (m_rtMinBtn.top < m_rtThumb.top) {
+      rect.top = m_rtMinBtn.bottom();
+      rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top);
     }
+  } else if (m_rtMinBtn.width == 0 && m_rtMaxBtn.width == 0) {
+    rect.left = m_rtClient.left;
+  } else if (m_rtMinBtn.left < m_rtThumb.left) {
+    rect.left = m_rtMinBtn.right();
+    rect.width -= (m_rtMinBtn.right() - m_rtClient.left);
   }
 }
 
@@ -350,6 +338,7 @@
     rect.Empty();
     return;
   }
+
   FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2;
   FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2;
   bool bVertical = IsVertical();
@@ -357,22 +346,21 @@
   rect.top = bVertical ? iy : m_rtClient.top;
   rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix;
   rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height;
-  if (m_bCustomLayout) {
-    if (bVertical) {
-      if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 &&
-          m_rtMaxBtn.height > 0) {
-        rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top);
-      } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) {
-        rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top);
-      }
-    } else {
-      if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 &&
-          m_rtMaxBtn.width > 0) {
-        rect.width -= (m_rtClient.right() - m_rtMinBtn.left);
-      } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) {
-        rect.width -= (m_rtClient.right() - m_rtMaxBtn.left);
-      }
+  if (!m_bCustomLayout)
+    return;
+
+  if (bVertical) {
+    if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 &&
+        m_rtMaxBtn.height > 0) {
+      rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top);
+    } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) {
+      rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top);
     }
+  } else if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 &&
+             m_rtMaxBtn.width > 0) {
+    rect.width -= (m_rtClient.right() - m_rtMinBtn.left);
+  } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) {
+    rect.width -= (m_rtClient.right() - m_rtMaxBtn.left);
   }
 }
 
@@ -383,7 +371,7 @@
   FX_FLOAT fPos;
   if (m_bCustomLayout) {
     if (IsVertical()) {
-      if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) {
+      if (m_rtMinBtn.height == 0 && m_rtMaxBtn.height == 0) {
         fPos = fRange * fDiffY / (m_rtClient.height - m_rtThumb.height);
       } else if (m_rtMinBtn.bottom() == m_rtMaxBtn.top) {
         fPos = fRange * fDiffY /
@@ -393,7 +381,7 @@
                (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
       }
     } else {
-      if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) {
+      if (m_rtMinBtn.width == 0 && m_rtMaxBtn.width == 0) {
         fPos = fRange * fDiffX / (m_rtClient.width - m_rtThumb.width);
       } else if (m_rtMinBtn.right() == m_rtMaxBtn.left) {
         fPos = fRange * fDiffX /
@@ -413,51 +401,47 @@
     }
   }
   fPos += m_fLastTrackPos;
-  if (fPos < m_fRangeMin) {
-    fPos = m_fRangeMin;
-  }
-  if (fPos > m_fRangeMax) {
-    fPos = m_fRangeMax;
-  }
-  return fPos;
+  return std::min(std::max(fPos, m_fRangeMin), m_fRangeMax);
 }
 
 void IFWL_ScrollBar::GetTrackRect(CFX_RectF& rect, bool bLower) {
   bool bDisabled = !!(m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled);
   if (bDisabled || m_bCustomLayout) {
     rect = bLower ? m_rtMinTrack : m_rtMaxTrack;
-  } else {
-    FX_FLOAT fW = m_rtThumb.width / 2;
-    FX_FLOAT fH = m_rtThumb.height / 2;
-    bool bVert = IsVertical();
-    if (bLower) {
-      if (bVert) {
-        FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height;
-        fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f;
-        rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height,
-                 m_rtMinTrack.width, fMinTrackHeight);
-      } else {
-        FX_FLOAT fMinTrackWidth =
-            m_rtMinTrack.width - fW - m_rtMinBtn.width + 2;
-        fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f;
-        rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top,
-                 fMinTrackWidth, m_rtMinTrack.height);
-      }
-    } else {
-      if (bVert) {
-        FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height;
-        fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f;
-        rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width,
-                 fMaxTrackHeight);
-      } else {
-        FX_FLOAT fMaxTrackWidth =
-            m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2;
-        fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f;
-        rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth,
-                 m_rtMaxTrack.height);
-      }
-    }
+    return;
   }
+
+  FX_FLOAT fW = m_rtThumb.width / 2;
+  FX_FLOAT fH = m_rtThumb.height / 2;
+  bool bVert = IsVertical();
+  if (bLower) {
+    if (bVert) {
+      FX_FLOAT fMinTrackHeight = m_rtMinTrack.height - fH - m_rtMinBtn.height;
+      fMinTrackHeight = (fMinTrackHeight >= 0.0f) ? fMinTrackHeight : 0.0f;
+      rect.Set(m_rtMinTrack.left, m_rtMinTrack.top + m_rtMinBtn.height,
+               m_rtMinTrack.width, fMinTrackHeight);
+      return;
+    }
+
+    FX_FLOAT fMinTrackWidth = m_rtMinTrack.width - fW - m_rtMinBtn.width + 2;
+    fMinTrackWidth = (fMinTrackWidth >= 0.0f) ? fMinTrackWidth : 0.0f;
+    rect.Set(m_rtMinTrack.left + m_rtMinBtn.width - 1, m_rtMinTrack.top,
+             fMinTrackWidth, m_rtMinTrack.height);
+    return;
+  }
+
+  if (bVert) {
+    FX_FLOAT fMaxTrackHeight = m_rtMaxTrack.height - fH - m_rtMaxBtn.height;
+    fMaxTrackHeight = (fMaxTrackHeight >= 0.0f) ? fMaxTrackHeight : 0.0f;
+    rect.Set(m_rtMaxTrack.left, m_rtMaxTrack.top + fH, m_rtMaxTrack.width,
+             fMaxTrackHeight);
+    return;
+  }
+
+  FX_FLOAT fMaxTrackWidth = m_rtMaxTrack.width - fW - m_rtMaxBtn.width + 2;
+  fMaxTrackWidth = (fMaxTrackWidth >= 0.0f) ? fMaxTrackWidth : 0.0f;
+  rect.Set(m_rtMaxTrack.left + fW, m_rtMaxTrack.top, fMaxTrackWidth,
+           m_rtMaxTrack.height);
 }
 
 bool IFWL_ScrollBar::SendEvent() {
@@ -601,6 +585,7 @@
     return;
   if (iState == CFWL_PartState_Pressed)
     return;
+
   iState = CFWL_PartState_Pressed;
   Repaint(&rtItem);
 }
diff --git a/xfa/fwl/core/ifwl_spinbutton.cpp b/xfa/fwl/core/ifwl_spinbutton.cpp
index 0352ed9..6ae2f6a 100644
--- a/xfa/fwl/core/ifwl_spinbutton.cpp
+++ b/xfa/fwl/core/ifwl_spinbutton.cpp
@@ -47,18 +47,19 @@
 }
 
 void IFWL_SpinButton::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, kMinWidth, kMinHeight);
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Set(0, 0, kMinWidth, kMinHeight);
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_SpinButton::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
+
   GetClientRect(m_rtClient);
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXE_SPB_Vert) {
     m_rtUpButton.Set(m_rtClient.top, m_rtClient.left, m_rtClient.width,
diff --git a/xfa/fwl/core/ifwl_tooltip.cpp b/xfa/fwl/core/ifwl_tooltip.cpp
index 8a34a85..5ee594c 100644
--- a/xfa/fwl/core/ifwl_tooltip.cpp
+++ b/xfa/fwl/core/ifwl_tooltip.cpp
@@ -40,37 +40,37 @@
 }
 
 void IFWL_ToolTip::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    rect.Set(0, 0, 0, 0);
-    if (!m_pProperties->m_pThemeProvider) {
-      m_pProperties->m_pThemeProvider = GetAvailableTheme();
-    }
-    CFX_WideString wsCaption;
-    IFWL_ToolTipDP* pData =
-        static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
-    if (pData) {
-      pData->GetCaption(this, wsCaption);
-    }
-    int32_t iLen = wsCaption.GetLength();
-    if (iLen > 0) {
-      CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
-      rect.Set(0, 0, sz.x, sz.y);
-      rect.width += 25;
-      rect.height += 16;
-    }
-    IFWL_Widget::GetWidgetRect(rect, true);
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
   }
+
+  rect.Set(0, 0, 0, 0);
+  if (!m_pProperties->m_pThemeProvider)
+    m_pProperties->m_pThemeProvider = GetAvailableTheme();
+
+  CFX_WideString wsCaption;
+  IFWL_ToolTipDP* pData =
+      static_cast<IFWL_ToolTipDP*>(m_pProperties->m_pDataProvider);
+  if (pData)
+    pData->GetCaption(this, wsCaption);
+
+  int32_t iLen = wsCaption.GetLength();
+  if (iLen > 0) {
+    CFX_SizeF sz = CalcTextSize(wsCaption, m_pProperties->m_pThemeProvider);
+    rect.Set(0, 0, sz.x, sz.y);
+    rect.width += 25;
+    rect.height += 16;
+  }
+  IFWL_Widget::GetWidgetRect(rect, true);
 }
 
 void IFWL_ToolTip::Update() {
-  if (IsLocked()) {
+  if (IsLocked())
     return;
-  }
-  if (!m_pProperties->m_pThemeProvider) {
+  if (!m_pProperties->m_pThemeProvider)
     m_pProperties->m_pThemeProvider = GetAvailableTheme();
-  }
+
   UpdateTextOutStyles();
   GetClientRect(m_rtClient);
   m_rtCaption = m_rtClient;
@@ -112,13 +112,11 @@
   param.m_iPart = CFWL_Part::Background;
   param.m_dwStates = m_pProperties->m_dwStates;
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix);
-  }
   param.m_rtPart = m_rtClient;
-  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
     param.m_pData = &m_rtCaption;
-  }
   pTheme->DrawBackground(&param);
 }
 
@@ -127,19 +125,19 @@
                             const CFX_Matrix* pMatrix) {
   if (!m_pProperties->m_pDataProvider)
     return;
+
   CFX_WideString wsCaption;
   m_pProperties->m_pDataProvider->GetCaption(this, wsCaption);
-  if (wsCaption.IsEmpty()) {
+  if (wsCaption.IsEmpty())
     return;
-  }
+
   CFWL_ThemeText param;
   param.m_pWidget = this;
   param.m_iPart = CFWL_Part::Caption;
   param.m_dwStates = m_pProperties->m_dwStates;
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix);
-  }
   param.m_rtPart = m_rtCaption;
   param.m_wsText = wsCaption;
   param.m_dwTTOStyles = m_dwTTOStyles;
@@ -150,12 +148,10 @@
 void IFWL_ToolTip::UpdateTextOutStyles() {
   m_iTTOAlign = FDE_TTOALIGNMENT_Center;
   m_dwTTOStyles = FDE_TTOSTYLE_SingleLine;
-  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading) {
+  if (m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_RTLReading)
     m_dwTTOStyles |= FDE_TTOSTYLE_RTL;
-  }
-  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_Multiline) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_TTP_Multiline)
     m_dwTTOStyles &= ~FDE_TTOSTYLE_SingleLine;
-  }
 }
 
 void IFWL_ToolTip::SetStates(uint32_t dwStates, bool bSet) {
@@ -178,18 +174,15 @@
     FX_FLOAT fy = rtAnchor.Center().y + 20;
     rtPopup.Set(fx, fy, rtWidget.Width(), rtWidget.Height());
 
-    if (rtPopup.bottom() > 0.0f) {
+    if (rtPopup.bottom() > 0.0f)
       rtPopup.Offset(0, 0.0f - rtPopup.bottom());
-    }
-    if (rtPopup.right() > 0.0f) {
+    if (rtPopup.right() > 0.0f)
       rtPopup.Offset(0.0f - rtPopup.right(), 0);
-    }
-    if (rtPopup.left < 0) {
+    if (rtPopup.left < 0)
       rtPopup.Offset(0 - rtPopup.left, 0);
-    }
-    if (rtPopup.top < 0) {
+    if (rtPopup.top < 0)
       rtPopup.Offset(0, 0 - rtPopup.top);
-    }
+
     SetWidgetRect(rtPopup);
     Update();
   }
diff --git a/xfa/fwl/core/ifwl_widget.cpp b/xfa/fwl/core/ifwl_widget.cpp
index c9decff..b885210 100644
--- a/xfa/fwl/core/ifwl_widget.cpp
+++ b/xfa/fwl/core/ifwl_widget.cpp
@@ -61,17 +61,18 @@
 }
 
 void IFWL_Widget::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
-  if (bAutoSize) {
-    if (HasEdge()) {
-      FX_FLOAT fEdge = GetEdgeWidth();
-      rect.Inflate(fEdge, fEdge);
-    }
-    if (HasBorder()) {
-      FX_FLOAT fBorder = GetBorderSize();
-      rect.Inflate(fBorder, fBorder);
-    }
-  } else {
+  if (!bAutoSize) {
     rect = m_pProperties->m_rtWidget;
+    return;
+  }
+
+  if (HasEdge()) {
+    FX_FLOAT fEdge = GetEdgeWidth();
+    rect.Inflate(fEdge, fEdge);
+  }
+  if (HasBorder()) {
+    FX_FLOAT fBorder = GetBorderSize();
+    rect.Inflate(fBorder, fBorder);
   }
 }
 
@@ -233,31 +234,32 @@
 void IFWL_Widget::GetMatrix(CFX_Matrix& matrix, bool bGlobal) {
   if (!m_pProperties)
     return;
-  if (bGlobal) {
-    IFWL_Widget* parent = GetParent();
-    CFX_ArrayTemplate<IFWL_Widget*> parents;
-    while (parent) {
-      parents.Add(parent);
-      parent = parent->GetParent();
-    }
+  if (!bGlobal) {
     matrix.SetIdentity();
-    CFX_Matrix ctmOnParent;
-    CFX_RectF rect;
-    int32_t count = parents.GetSize();
-    for (int32_t i = count - 2; i >= 0; i--) {
-      parent = parents.GetAt(i);
-      parent->GetMatrix(ctmOnParent, false);
-      parent->GetWidgetRect(rect);
-      matrix.Concat(ctmOnParent, true);
-      matrix.Translate(rect.left, rect.top, true);
-    }
-    CFX_Matrix m;
-    m.SetIdentity();
-    matrix.Concat(m, true);
-    parents.RemoveAll();
-  } else {
-    matrix.SetIdentity();
+    return;
   }
+
+  IFWL_Widget* parent = GetParent();
+  CFX_ArrayTemplate<IFWL_Widget*> parents;
+  while (parent) {
+    parents.Add(parent);
+    parent = parent->GetParent();
+  }
+  matrix.SetIdentity();
+  CFX_Matrix ctmOnParent;
+  CFX_RectF rect;
+  int32_t count = parents.GetSize();
+  for (int32_t i = count - 2; i >= 0; i--) {
+    parent = parents.GetAt(i);
+    parent->GetMatrix(ctmOnParent, false);
+    parent->GetWidgetRect(rect);
+    matrix.Concat(ctmOnParent, true);
+    matrix.Translate(rect.left, rect.top, true);
+  }
+  CFX_Matrix m;
+  m.SetIdentity();
+  matrix.Concat(m, true);
+  parents.RemoveAll();
 }
 
 void IFWL_Widget::DrawWidget(CFX_Graphics* pGraphics,
@@ -317,15 +319,16 @@
   IFWL_ThemeProvider* pTheme = GetAvailableTheme();
   if (!pTheme)
     return nullptr;
+
   CFWL_ThemePart part;
   part.m_pWidget = this;
   return pTheme->GetCapacity(&part, dwCapacity);
 }
 
 IFWL_ThemeProvider* IFWL_Widget::GetAvailableTheme() {
-  if (m_pProperties->m_pThemeProvider) {
+  if (m_pProperties->m_pThemeProvider)
     return m_pProperties->m_pThemeProvider;
-  }
+
   IFWL_Widget* pUp = this;
   do {
     pUp = (pUp->GetStyles() & FWL_WGTSTYLE_Popup)
@@ -344,9 +347,9 @@
   IFWL_Widget* pRet = m_pOuter;
   if (!pRet)
     return nullptr;
-  while (IFWL_Widget* pOuter = pRet->GetOuter()) {
+
+  while (IFWL_Widget* pOuter = pRet->GetOuter())
     pRet = pOuter;
-  }
   return pRet;
 }
 
@@ -400,17 +403,17 @@
     return;
 
   IFWL_Widget* curFocus = pDriver->GetFocus();
-  if (bFocus && curFocus != this) {
+  if (bFocus && curFocus != this)
     pDriver->SetFocus(this);
-  } else if (!bFocus && curFocus == this) {
+  else if (!bFocus && curFocus == this)
     pDriver->SetFocus(nullptr);
-  }
 }
 
 void IFWL_Widget::SetGrab(bool bSet) {
   const IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
     return;
+
   CFWL_NoteDriver* pDriver =
       static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
   pDriver->SetGrab(this, bSet);
@@ -479,19 +482,19 @@
   FX_FLOAT fy = 0;
 
   FX_FLOAT fPopHeight = rtPopup.height;
-  if (rtPopup.height > fMaxHeight) {
+  if (rtPopup.height > fMaxHeight)
     fPopHeight = fMaxHeight;
-  } else if (rtPopup.height < fMinHeight) {
+  else if (rtPopup.height < fMinHeight)
     fPopHeight = fMinHeight;
-  }
+
   FX_FLOAT fWidth = std::max(rtAnchor.width, rtPopup.width);
   FX_FLOAT fBottom = rtAnchor.bottom() + fPopHeight;
   TransformTo(nullptr, fx, fy);
-  if (fBottom + fy > 0.0f) {
+  if (fBottom + fy > 0.0f)
     rtPopup.Set(rtAnchor.left, rtAnchor.top - fPopHeight, fWidth, fPopHeight);
-  } else {
+  else
     rtPopup.Set(rtAnchor.left, rtAnchor.bottom(), fWidth, fPopHeight);
-  }
+
   rtPopup.Offset(fx, fy);
   return true;
 }
@@ -543,6 +546,7 @@
 void IFWL_Widget::DispatchKeyEvent(CFWL_MsgKey* pNote) {
   if (!pNote)
     return;
+
   CFWL_EvtKey* pEvent = new CFWL_EvtKey;
   pEvent->m_pSrcTarget = this;
   pEvent->m_dwCmd = pNote->m_dwCmd;
@@ -560,6 +564,7 @@
   const IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
     return;
+
   CFWL_NoteDriver* pNoteDriver = pApp->GetNoteDriver();
   if (!pNoteDriver)
     return;
@@ -587,9 +592,8 @@
   param.m_pWidget = this;
   param.m_iPart = iPartBk;
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix, true);
-  }
   param.m_rtPart = rtRelative;
   pTheme->DrawBackground(&param);
 }
@@ -604,9 +608,8 @@
   param.m_pWidget = this;
   param.m_iPart = iPartBorder;
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix, true);
-  }
   param.m_rtPart = rtRelative;
   pTheme->DrawBackground(&param);
 }
@@ -621,9 +624,8 @@
   param.m_pWidget = this;
   param.m_iPart = iPartEdge;
   param.m_pGraphics = pGraphics;
-  if (pMatrix) {
+  if (pMatrix)
     param.m_matrix.Concat(*pMatrix, true);
-  }
   param.m_rtPart = rtEdge;
   pTheme->DrawBackground(&param);
 }
