14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/xfa_ffcheckbutton.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_checkbox.h"
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagemouse.h"
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_notedriver.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_widgetmgr.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/xfa_ffexclgroup.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/app/xfa_fffield.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffapp.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffdoc.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffdocview.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffpageview.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/xfa_ffwidget.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
215ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. MoltmannCXFA_FFCheckButton::CXFA_FFCheckButton(CXFA_WidgetAcc* pDataAcc)
225ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    : CXFA_FFField(pDataAcc), m_pOldDelegate(nullptr) {}
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_FFCheckButton::~CXFA_FFCheckButton() {}
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFCheckButton::LoadWidget() {
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_CheckBox* pCheckBox = new CFWL_CheckBox(GetFWLApp());
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pNormalWidget = pCheckBox;
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pNormalWidget->SetLayoutItem(this);
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_NoteDriver* pNoteDriver =
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pNormalWidget->GetOwnerApp()->GetNoteDriver();
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pNoteDriver->RegisterEventTarget(m_pNormalWidget, m_pNormalWidget);
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldDelegate = m_pNormalWidget->GetDelegate();
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pNormalWidget->SetDelegate(this);
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pDataAcc->IsRadioButton())
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pCheckBox->ModifyStylesEx(FWL_STYLEEXT_CKB_RadioButton, 0xFFFFFFFF);
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pNormalWidget->LockUpdate();
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  UpdateWidgetProperty();
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetFWLCheckState(m_pDataAcc->GetCheckState());
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pNormalWidget->UnlockUpdate();
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CXFA_FFField::LoadWidget();
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::UpdateWidgetProperty() {
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_CheckBox* pCheckBox = (CFWL_CheckBox*)m_pNormalWidget;
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pNormalWidget) {
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fSize = m_pDataAcc->GetCheckButtonSize();
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCheckBox->SetBoxSize(fSize);
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCross;
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCheckMark = m_pDataAcc->GetCheckButtonMark();
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (iCheckMark) {
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Check:
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCheck;
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Circle:
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle;
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Cross:
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Diamond:
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeDiamond;
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Square:
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeSquare;
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Star:
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwStyleEx = FWL_STYLEEXT_CKB_SignShapeStar;
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default: {
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      int32_t iShape = m_pDataAcc->GetCheckButtonShape();
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (iShape == XFA_ATTRIBUTEENUM_Round) {
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        dwStyleEx = FWL_STYLEEXT_CKB_SignShapeCircle;
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pDataAcc->IsAllowNeutral()) {
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    dwStyleEx |= FWL_STYLEEXT_CKB_3State;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pCheckBox->ModifyStylesEx(
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwStyleEx, FWL_STYLEEXT_CKB_SignShapeMask | FWL_STYLEEXT_CKB_3State);
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFCheckButton::PerformLayout() {
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_FFWidget::PerformLayout();
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fCheckSize = m_pDataAcc->GetCheckButtonSize();
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Margin mgWidget = m_pDataAcc->GetMargin();
915ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_RectF rtWidget = GetRectWithoutRotate();
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (mgWidget) {
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    XFA_RectWidthoutMargin(rtWidget, mgWidget);
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCapPlacement = -1;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fCapReserve = 0;
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Caption caption = m_pDataAcc->GetCaption();
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (caption && caption.GetPresence()) {
995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    m_rtCaption = rtWidget;
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iCapPlacement = caption.GetPlacementType();
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fCapReserve = caption.GetReserve();
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (fCapReserve <= 0) {
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          iCapPlacement == XFA_ATTRIBUTEENUM_Bottom) {
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fCapReserve = rtWidget.height - fCheckSize;
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fCapReserve = rtWidget.width - fCheckSize;
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (CXFA_Para para = m_pDataAcc->GetPara()) {
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iHorzAlign = para.GetHorizontalAlign();
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iVertAlign = para.GetVerticalAlign();
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtUI = rtWidget;
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Margin mgCap = caption.GetMargin();
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (iCapPlacement) {
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Left: {
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtCaption.width = fCapReserve;
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CapLeftRightPlacement(mgCap);
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.width -= fCapReserve;
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.left += fCapReserve;
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Top: {
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtCaption.height = fCapReserve;
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      XFA_RectWidthoutMargin(m_rtCaption, mgCap);
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.height -= fCapReserve;
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.top += fCapReserve;
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Right: {
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtCaption.left = m_rtCaption.right() - fCapReserve;
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtCaption.width = fCapReserve;
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CapLeftRightPlacement(mgCap);
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.width -= fCapReserve;
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Bottom: {
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtCaption.top = m_rtCaption.bottom() - fCapReserve;
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtCaption.height = fCapReserve;
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      XFA_RectWidthoutMargin(m_rtCaption, mgCap);
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.height -= fCapReserve;
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } break;
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_ATTRIBUTEENUM_Inline:
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iHorzAlign = XFA_ATTRIBUTEENUM_Right;
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iHorzAlign == XFA_ATTRIBUTEENUM_Center) {
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.left += (m_rtUI.width - fCheckSize) / 2;
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (iHorzAlign == XFA_ATTRIBUTEENUM_Right) {
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.left = m_rtUI.right() - fCheckSize;
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iVertAlign == XFA_ATTRIBUTEENUM_Middle) {
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.top += (m_rtUI.height - fCheckSize) / 2;
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (iVertAlign == XFA_ATTRIBUTEENUM_Bottom) {
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.top = m_rtUI.bottom() - fCheckSize;
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtUI.width = fCheckSize;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtUI.height = fCheckSize;
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddUIMargin(iCapPlacement);
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtCheckBox = m_rtUI;
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (borderUI) {
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_Margin margin = borderUI.GetMargin();
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (margin) {
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      XFA_RectWidthoutMargin(m_rtUI, margin);
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtUI.Normalize();
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  LayoutCaption();
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetFWLRect();
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pNormalWidget) {
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pNormalWidget->Update();
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::CapLeftRightPlacement(CXFA_Margin mgCap) {
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_RectWidthoutMargin(m_rtCaption, mgCap);
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_rtCaption.height < 0) {
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtCaption.top += m_rtCaption.height;
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_rtCaption.width < 0) {
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtCaption.left += m_rtCaption.width;
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtCaption.width = -m_rtCaption.width;
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::AddUIMargin(int32_t iCapPlacement) {
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rtUIMargin = m_pDataAcc->GetUIMargin();
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtUI.top -= rtUIMargin.top / 2 - rtUIMargin.height / 2;
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fLeftAddRight = rtUIMargin.left + rtUIMargin.width;
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_FLOAT fTopAddBottom = rtUIMargin.top + rtUIMargin.height;
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_rtUI.width < fLeftAddRight) {
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right ||
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iCapPlacement == XFA_ATTRIBUTEENUM_Left) {
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.left -= fLeftAddRight - m_rtUI.width;
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.left -= 2 * (fLeftAddRight - m_rtUI.width);
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.width += 2 * (fLeftAddRight - m_rtUI.width);
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_rtUI.height < fTopAddBottom) {
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iCapPlacement == XFA_ATTRIBUTEENUM_Right) {
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_rtUI.left -= fTopAddBottom - m_rtUI.height;
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.top -= fTopAddBottom - m_rtUI.height;
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_rtUI.height += 2 * (fTopAddBottom - m_rtUI.height);
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::RenderWidget(CFX_Graphics* pGS,
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      CFX_Matrix* pMatrix,
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      uint32_t dwStatus) {
2145ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  if (!IsMatchVisibleStatus(dwStatus))
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2165ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann
2175ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_Matrix mtRotate = GetRotateMatrix();
2185ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  if (pMatrix)
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    mtRotate.Concat(*pMatrix);
2205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_FFWidget::RenderWidget(pGS, &mtRotate, dwStatus);
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Border borderUI = m_pDataAcc->GetUIBorder();
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DrawBorder(pGS, borderUI, m_rtUI, &mtRotate,
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann             m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 ? XFA_DRAWBOX_ForceRound
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 : 0);
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RenderCaption(pGS, &mtRotate);
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DrawHighlight(pGS, &mtRotate, dwStatus,
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                m_pDataAcc->GetCheckButtonShape() == XFA_ATTRIBUTEENUM_Round);
2305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_Matrix mt(1, 0, 0, 1, m_rtCheckBox.left, m_rtCheckBox.top);
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  mt.Concat(mtRotate);
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GetApp()->GetWidgetMgrDelegate()->OnDrawWidget(m_pNormalWidget, pGS, &mt);
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFCheckButton::OnLButtonUp(uint32_t dwFlags,
2355ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     const CFX_PointF& point) {
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pNormalWidget || !IsButtonDown())
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetButtonDown(false);
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_MessageMouse ms(nullptr, m_pNormalWidget);
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ms.m_dwCmd = FWL_MouseCommand::LeftButtonUp;
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ms.m_dwFlags = dwFlags;
2435ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  ms.m_pos = FWLToClient(point);
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  TranslateFWLMessage(&ms);
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannXFA_CHECKSTATE CXFA_FFCheckButton::FWLState2XFAState() {
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwState = m_pNormalWidget->GetStates();
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (dwState & FWL_STATE_CKB_Checked)
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_CHECKSTATE_On;
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (dwState & FWL_STATE_CKB_Neutral)
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_CHECKSTATE_Neutral;
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return XFA_CHECKSTATE_Off;
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFCheckButton::CommitData() {
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_CHECKSTATE eCheckState = FWLState2XFAState();
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pDataAcc->SetCheckState(eCheckState, true);
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFCheckButton::IsDataChanged() {
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_CHECKSTATE eCheckState = FWLState2XFAState();
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pDataAcc->GetCheckState() != eCheckState;
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::SetFWLCheckState(XFA_CHECKSTATE eCheckState) {
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (eCheckState == XFA_CHECKSTATE_Neutral) {
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pNormalWidget->SetStates(FWL_STATE_CKB_Neutral);
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (eCheckState == XFA_CHECKSTATE_On)
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pNormalWidget->SetStates(FWL_STATE_CKB_Checked);
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    else
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pNormalWidget->RemoveStates(FWL_STATE_CKB_Checked);
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFCheckButton::UpdateFWLData() {
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pNormalWidget) {
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_CHECKSTATE eState = m_pDataAcc->GetCheckState();
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetFWLCheckState(eState);
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pNormalWidget->Update();
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::OnProcessMessage(CFWL_Message* pMessage) {
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldDelegate->OnProcessMessage(pMessage);
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::OnProcessEvent(CFWL_Event* pEvent) {
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_FFField::OnProcessEvent(pEvent);
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (pEvent->GetType()) {
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Event::Type::CheckStateChanged: {
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CXFA_EventParam eParam;
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      eParam.m_eType = XFA_EVENT_Change;
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw);
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CXFA_WidgetAcc* pFFExclGroup = m_pDataAcc->GetExclGroup();
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (ProcessCommittedData()) {
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        eParam.m_pTarget = pFFExclGroup;
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pFFExclGroup) {
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pDocView->AddValidateWidget(pFFExclGroup);
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pDocView->AddCalculateWidgetAcc(pFFExclGroup);
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        eParam.m_pTarget = m_pDataAcc;
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        SetFWLCheckState(m_pDataAcc->GetCheckState());
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pFFExclGroup) {
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        eParam.m_pTarget = pFFExclGroup;
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pFFExclGroup->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      eParam.m_pTarget = m_pDataAcc;
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Click, &eParam);
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldDelegate->OnProcessEvent(pEvent);
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFCheckButton::OnDrawWidget(CFX_Graphics* pGraphics,
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      const CFX_Matrix* pMatrix) {
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
329