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/fwl/cfwl_combobox.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fde/cfde_texteditengine.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fde/cfde_textout.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_app.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_event.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_eventselectchanged.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_eventtextchanged.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_formproxy.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_listbox.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagekey.h"
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagekillfocus.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagemouse.h"
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagesetfocus.h"
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_notedriver.h"
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_themebackground.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_themepart.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_themetext.h"
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_widgetmgr.h"
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/ifwl_themeprovider.h"
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFWL_ComboBox::CFWL_ComboBox(const CFWL_App* app)
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : CFWL_Widget(app, pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr),
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pComboBoxProxy(nullptr),
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bLButtonDown(false),
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iCurSel(-1),
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iBtnState(CFWL_PartState_Normal) {
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtClient.Reset();
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtBtn.Reset();
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtHandler.Reset();
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled()) {
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_InitComboList();
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_InitComboEdit();
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_pThemeProvider = m_pProperties->m_pThemeProvider;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_dwStyles |= FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll;
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pListBox = pdfium::MakeUnique<CFWL_ComboList>(m_pOwnerApp.Get(),
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                  std::move(prop), this);
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) && !m_pEdit) {
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit = pdfium::MakeUnique<CFWL_ComboEdit>(
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        m_pOwnerApp.Get(), pdfium::MakeUnique<CFWL_WidgetProperties>(), this);
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetOuter(this);
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetParent(this);
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetStates(m_pProperties->m_dwStates);
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFWL_ComboBox::~CFWL_ComboBox() {}
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFWL_Type CFWL_ComboBox::GetClassID() const {
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FWL_Type::ComboBox;
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ComboBox::AddString(const WideStringView& wsText) {
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->AddString(wsText);
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::RemoveAt(int32_t iIndex) {
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->RemoveAt(iIndex);
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::RemoveAll() {
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->DeleteAll();
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::ModifyStylesEx(uint32_t dwStylesExAdded,
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                   uint32_t dwStylesExRemoved) {
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled()) {
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bAddDropDown = !!(dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown);
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bRemoveDropDown = !!(dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown);
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bAddDropDown && !m_pEdit) {
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit = pdfium::MakeUnique<CFWL_ComboEdit>(
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        m_pOwnerApp.Get(), pdfium::MakeUnique<CFWL_WidgetProperties>(),
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        nullptr);
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetOuter(this);
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetParent(this);
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (bRemoveDropDown && m_pEdit) {
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetStates(FWL_WGTSTATE_Invisible);
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Widget::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::Update() {
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled()) {
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_Update();
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsLocked())
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ResetTheme();
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropDownStyle() && m_pEdit)
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ResetEditAlignment();
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pProperties->m_pThemeProvider)
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pProperties->m_pThemeProvider = GetAvailableTheme();
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Layout();
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
12233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannFWL_WidgetHit CFWL_ComboBox::HitTest(const CFX_PointF& point) {
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled())
12433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return DisForm_HitTest(point);
12533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  return CFWL_Widget::HitTest(point);
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ComboBox::DrawWidget(CXFA_Graphics* pGraphics,
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                               const CFX_Matrix& matrix) {
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled()) {
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    DisForm_DrawWidget(pGraphics, &matrix);
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pGraphics)
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pProperties->m_pThemeProvider)
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (HasBorder())
142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    DrawBorder(pGraphics, CFWL_Part::Border, pTheme, matrix);
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsDropDownStyle()) {
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_RectF rtTextBk(m_rtClient);
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rtTextBk.width -= m_rtBtn.width;
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_ThemeBackground param;
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pWidget = this;
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_iPart = CFWL_Part::Background;
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pGraphics = pGraphics;
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    param.m_matrix.Concat(matrix);
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_rtPart = rtTextBk;
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      param.m_dwStates = CFWL_PartState_Disabled;
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann               (m_iCurSel >= 0)) {
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      param.m_dwStates = CFWL_PartState_Selected;
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      param.m_dwStates = CFWL_PartState_Normal;
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pTheme->DrawBackground(&param);
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_iCurSel >= 0) {
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!m_pListBox)
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_ThemeText theme_text;
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_pWidget = this;
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_iPart = CFWL_Part::Caption;
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_dwStates = m_iBtnState;
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_pGraphics = pGraphics;
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      theme_text.m_matrix.Concat(matrix);
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_rtPart = rtTextBk;
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused)
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  ? CFWL_PartState_Selected
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  : CFWL_PartState_Normal;
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      theme_text.m_wsText = hItem ? hItem->GetText() : L"";
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      theme_text.m_dwTTOStyles.single_line_ = true;
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      theme_text.m_iTTOAlign = FDE_TextAlignment::kCenterLeft;
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pTheme->DrawText(&theme_text);
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ThemeBackground param;
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pWidget = this;
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_iPart = CFWL_Part::DropDownButton;
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         ? CFWL_PartState_Disabled
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         : m_iBtnState;
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pGraphics = pGraphics;
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  param.m_matrix.Concat(matrix);
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_rtPart = m_rtBtn;
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTheme->DrawBackground(&param);
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pThemeProvider)
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pProperties->m_pThemeProvider = pThemeProvider;
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListBox)
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->SetThemeProvider(pThemeProvider);
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetThemeProvider(pThemeProvider);
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFWL_ComboBox::GetTextByIndex(int32_t iIndex) const {
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* pItem = static_cast<CFWL_ListItem*>(
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pListBox->GetItem(m_pListBox.get(), iIndex));
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pItem ? pItem->GetText() : L"";
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::SetCurSel(int32_t iSel) {
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCount = m_pListBox->CountItems(nullptr);
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bClearSel = iSel < 0 || iSel >= iCount;
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropDownStyle() && m_pEdit) {
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bClearSel) {
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pEdit->SetText(WideString());
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_ListItem* hItem = m_pListBox->GetItem(this, iSel);
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->SetText(hItem ? hItem->GetText() : L"");
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->Update();
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iCurSel = bClearSel ? -1 : iSel;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::SetStates(uint32_t dwStates) {
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropDownStyle() && m_pEdit)
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetStates(dwStates);
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListBox)
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->SetStates(dwStates);
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Widget::SetStates(dwStates);
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::RemoveStates(uint32_t dwStates) {
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropDownStyle() && m_pEdit)
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->RemoveStates(dwStates);
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListBox)
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->RemoveStates(dwStates);
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Widget::RemoveStates(dwStates);
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ComboBox::SetEditText(const WideString& wsText) {
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pEdit)
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetText(wsText);
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->Update();
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CFWL_ComboBox::GetEditText() const {
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pEdit->GetText();
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pListBox)
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return L"";
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return hItem ? hItem->GetText() : L"";
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OpenDropDownList(bool bActivate) {
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ShowDropList(bActivate);
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ComboBox::GetBBox() const {
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled())
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return DisForm_GetBBox();
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rect = m_pProperties->m_rtWidget;
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pListBox || !IsDropListVisible())
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return rect;
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rtList = m_pListBox->GetWidgetRect();
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rtList.Offset(rect.left, rect.top);
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Union(rtList);
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return rect;
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::EditModifyStylesEx(uint32_t dwStylesExAdded,
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       uint32_t dwStylesExRemoved) {
2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ComboBox::DrawStretchHandler(CXFA_Graphics* pGraphics,
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       const CFX_Matrix* pMatrix) {
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ThemeBackground param;
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pGraphics = pGraphics;
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_iPart = CFWL_Part::StretchHandler;
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_dwStates = CFWL_PartState_Normal;
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pWidget = this;
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pMatrix)
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_matrix.Concat(*pMatrix);
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_rtPart = m_rtHandler;
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pProperties->m_pThemeProvider->DrawBackground(&param);
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::ShowDropList(bool bActivate) {
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled())
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return DisForm_ShowDropList(bActivate);
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropListVisible() == bActivate)
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pComboBoxProxy)
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    InitProxyForm();
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pComboBoxProxy->Reset();
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!bActivate) {
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pComboBoxProxy->EndDoModal();
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bLButtonDown = false;
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->SetNotifyOwner(true);
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    SetFocus(true);
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->ChangeSelected(m_iCurSel);
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ResetListItemAlignment();
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwStyleAdd = m_pProperties->m_dwStyleExes &
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        (FWL_STYLEEXT_CMB_Sort | FWL_STYLEEXT_CMB_OwnerDraw);
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->ModifyStylesEx(dwStyleAdd, 0);
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtList = m_pListBox->GetAutosizedWidgetRect();
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
32933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_RectF rtAnchor(0, 0, m_pProperties->m_rtWidget.width,
33033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                     m_pProperties->m_rtWidget.height);
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtList.width = std::max(m_rtList.width, m_rtClient.width);
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtProxy = m_rtList;
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  GetPopupPos(0, m_rtProxy.height, rtAnchor, m_rtProxy);
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pComboBoxProxy->SetWidgetRect(m_rtProxy);
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pComboBoxProxy->Update();
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->SetWidgetRect(m_rtList);
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->Update();
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Event ev(CFWL_Event::Type::PreDropDown, this);
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DispatchEvent(&ev);
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->SetFocus(true);
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pComboBoxProxy->DoModal();
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->SetFocus(false);
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::MatchEditText() {
351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsText = m_pEdit->GetText();
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iMatch = m_pListBox->MatchItem(wsText);
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iMatch != m_iCurSel) {
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->ChangeSelected(iMatch);
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iMatch >= 0)
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      SyncEditText(iMatch);
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (iMatch >= 0) {
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetSelected();
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iCurSel = iMatch;
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::SyncEditText(int32_t iListItem) {
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* hItem = m_pListBox->GetItem(this, iListItem);
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetText(hItem ? hItem->GetText() : L"");
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->Update();
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetSelected();
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::Layout() {
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled())
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return DisForm_Layout();
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtClient = GetClientRect();
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* theme = GetAvailableTheme();
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!theme)
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fBtn = theme->GetScrollBarWidth();
38033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_rtBtn = CFX_RectF(m_rtClient.right() - fBtn, m_rtClient.top, fBtn,
38133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                      m_rtClient.height);
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsDropDownStyle() || !m_pEdit)
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
38533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_RectF rtEdit(m_rtClient.left, m_rtClient.top, m_rtClient.width - fBtn,
38633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                   m_rtClient.height);
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetWidgetRect(rtEdit);
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iCurSel >= 0) {
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->LockUpdate();
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetText(hItem ? hItem->GetText() : L"");
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->UnlockUpdate();
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->Update();
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::ResetTheme() {
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pTheme) {
4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pTheme = GetAvailableTheme();
4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pProperties->m_pThemeProvider = pTheme;
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListBox && !m_pListBox->GetThemeProvider())
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->SetThemeProvider(pTheme);
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit && !m_pEdit->GetThemeProvider())
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetThemeProvider(pTheme);
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::ResetEditAlignment() {
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pEdit)
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwAdd = 0;
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_EditHAlignMask) {
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FWL_STYLEEXT_CMB_EditHCenter: {
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_EDT_HCenter;
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default: {
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_EDT_HNear;
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_EditVAlignMask) {
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FWL_STYLEEXT_CMB_EditVCenter: {
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_EDT_VCenter;
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FWL_STYLEEXT_CMB_EditVFar: {
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_EDT_VFar;
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default: {
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_EDT_VNear;
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_EditJustified)
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    dwAdd |= FWL_STYLEEXT_EDT_Justified;
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->ModifyStylesEx(dwAdd, FWL_STYLEEXT_EDT_HAlignMask |
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     FWL_STYLEEXT_EDT_HAlignModeMask |
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     FWL_STYLEEXT_EDT_VAlignMask);
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::ResetListItemAlignment() {
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pListBox)
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwAdd = 0;
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListItemAlignMask) {
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case FWL_STYLEEXT_CMB_ListItemCenterAlign: {
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_LTB_CenterAlign;
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default: {
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      dwAdd |= FWL_STYLEEXT_LTB_LeftAlign;
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->ModifyStylesEx(dwAdd, FWL_STYLEEXT_CMB_ListItemAlignMask);
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::ProcessSelChanged(bool bLButtonUp) {
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iCurSel = m_pListBox->GetItemIndex(this, m_pListBox->GetSelItem(0));
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsDropDownStyle()) {
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RepaintRect(m_rtClient);
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!hItem)
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit) {
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetText(hItem->GetText());
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->Update();
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetSelected();
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_EventSelectChanged ev(this);
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ev.bLButtonUp = bLButtonUp;
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DispatchEvent(&ev);
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::InitProxyForm() {
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pComboBoxProxy)
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pListBox)
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_pOwner = this;
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_dwStyles = FWL_WGTSTYLE_Popup;
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_dwStates = FWL_WGTSTATE_Invisible;
4964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // TODO(dsinclair): Does this leak? I don't see a delete, but I'm not sure
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // if the SetParent call is going to transfer ownership.
499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pComboBoxProxy = new CFWL_ComboBoxProxy(this, m_pOwnerApp.Get(),
500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                            std::move(prop), m_pListBox.get());
5014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pListBox->SetParent(m_pComboBoxProxy);
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_InitComboList() {
5054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListBox)
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_pParent = this;
5104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_dwStyles = FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll;
5114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_dwStates = FWL_WGTSTATE_Invisible;
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_pThemeProvider = m_pProperties->m_pThemeProvider;
513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pListBox = pdfium::MakeUnique<CFWL_ComboList>(m_pOwnerApp.Get(),
514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                  std::move(prop), this);
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_InitComboEdit() {
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  auto prop = pdfium::MakeUnique<CFWL_WidgetProperties>();
5224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_pParent = this;
5234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  prop->m_pThemeProvider = m_pProperties->m_pThemeProvider;
5244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pEdit = pdfium::MakeUnique<CFWL_ComboEdit>(m_pOwnerApp.Get(),
526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                               std::move(prop), this);
5274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetOuter(this);
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_ShowDropList(bool bActivate) {
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (DisForm_IsDropListVisible() == bActivate)
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bActivate) {
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_Event preEvent(CFWL_Event::Type::PreDropDown, this);
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DispatchEvent(&preEvent);
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_ComboList* pComboList = m_pListBox.get();
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iItems = pComboList->CountItems(nullptr);
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iItems < 1)
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
5424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ResetListItemAlignment();
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pComboList->ChangeSelected(m_iCurSel);
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fItemHeight = pComboList->CalcItemHeight();
547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fBorder = GetBorderSize(true);
548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fPopupMin = 0.0f;
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iItems > 3)
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fPopupMin = fItemHeight * 3 + fBorder * 2;
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fPopupMax = fItemHeight * iItems + fBorder * 2;
55333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_RectF rtList(m_rtClient.left, 0, m_pProperties->m_rtWidget.width, 0);
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    GetPopupPos(fPopupMin, fPopupMax, m_pProperties->m_rtWidget, rtList);
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->SetWidgetRect(rtList);
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->Update();
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    SetFocus(true);
5604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bActivate) {
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->RemoveStates(FWL_WGTSTATE_Invisible);
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_Event postEvent(CFWL_Event::Type::PostDropDown, this);
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DispatchEvent(&postEvent);
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListBox->SetStates(FWL_WGTSTATE_Invisible);
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rect = m_pListBox->GetWidgetRect();
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Inflate(2, 2);
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(rect);
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_ModifyStylesEx(uint32_t dwStylesExAdded,
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           uint32_t dwStylesExRemoved) {
5774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pEdit)
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_InitComboEdit();
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bAddDropDown = !!(dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown);
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bDelDropDown = !!(dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown);
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  dwStylesExRemoved &= ~FWL_STYLEEXT_CMB_DropDown;
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pProperties->m_dwStyleExes |= FWL_STYLEEXT_CMB_DropDown;
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bAddDropDown)
5874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->ModifyStylesEx(0, FWL_STYLEEXT_EDT_ReadOnly);
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  else if (bDelDropDown)
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->ModifyStylesEx(FWL_STYLEEXT_EDT_ReadOnly, 0);
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Widget::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_Update() {
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iLock)
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ResetEditAlignment();
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ResetTheme();
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Layout();
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
60233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. MoltmannFWL_WidgetHit CFWL_ComboBox::DisForm_HitTest(const CFX_PointF& point) {
60333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_RectF rect(0, 0, m_pProperties->m_rtWidget.width - m_rtBtn.width,
60433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                 m_pProperties->m_rtWidget.height);
60533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (rect.Contains(point))
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return FWL_WidgetHit::Edit;
60733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (m_rtBtn.Contains(point))
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return FWL_WidgetHit::Client;
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (DisForm_IsDropListVisible()) {
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect = m_pListBox->GetWidgetRect();
61133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (rect.Contains(point))
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return FWL_WidgetHit::Client;
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FWL_WidgetHit::Unknown;
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ComboBox::DisForm_DrawWidget(CXFA_Graphics* pGraphics,
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       const CFX_Matrix* pMatrix) {
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix mtOrg;
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pMatrix)
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    mtOrg = *pMatrix;
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGraphics->SaveGraphState();
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGraphics->ConcatMatrix(&mtOrg);
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_rtBtn.IsEmpty(0.1f)) {
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_ThemeBackground param;
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pWidget = this;
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_iPart = CFWL_Part::DropDownButton;
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_dwStates = m_iBtnState;
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_pGraphics = pGraphics;
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    param.m_rtPart = m_rtBtn;
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pTheme->DrawBackground(&param);
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pGraphics->RestoreGraphState();
6364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit) {
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_RectF rtEdit = m_pEdit->GetWidgetRect();
63933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_Matrix mt(1, 0, 0, 1, rtEdit.left, rtEdit.top);
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    mt.Concat(mtOrg);
641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pEdit->DrawWidget(pGraphics, mt);
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListBox && DisForm_IsDropListVisible()) {
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_RectF rtList = m_pListBox->GetWidgetRect();
64533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    CFX_Matrix mt(1, 0, 0, 1, rtList.left, rtList.top);
6464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    mt.Concat(mtOrg);
647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pListBox->DrawWidget(pGraphics, mt);
6484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ComboBox::DisForm_GetBBox() const {
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rect = m_pProperties->m_rtWidget;
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pListBox || !DisForm_IsDropListVisible())
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return rect;
6554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rtList = m_pListBox->GetWidgetRect();
6574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rtList.Offset(rect.left, rect.top);
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.Union(rtList);
6594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return rect;
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_Layout() {
6634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtClient = GetClientRect();
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtContent = m_rtClient;
6654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* theme = GetAvailableTheme();
6664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!theme)
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float borderWidth = 1;
670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fBtn = theme->GetScrollBarWidth();
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!(GetStylesEx() & FWL_STYLEEXT_CMB_ReadOnly)) {
67233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    m_rtBtn =
67333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        CFX_RectF(m_rtClient.right() - fBtn, m_rtClient.top + borderWidth,
67433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                  fBtn - borderWidth, m_rtClient.height - 2 * borderWidth);
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ThemePart part;
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  part.m_pWidget = this;
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF pUIMargin = theme->GetUIMargin(&part);
6804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtContent.Deflate(pUIMargin.left, pUIMargin.top, pUIMargin.width,
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      pUIMargin.height);
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsDropDownStyle() || !m_pEdit)
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
6854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
68633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_RectF rtEdit(m_rtContent.left, m_rtContent.top, m_rtContent.width - fBtn,
68733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                   m_rtContent.height);
6884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->SetWidgetRect(rtEdit);
6894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iCurSel >= 0) {
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->LockUpdate();
6934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->SetText(hItem ? hItem->GetText() : L"");
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->UnlockUpdate();
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->Update();
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnProcessMessage(CFWL_Message* pMessage) {
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pWidgetMgr->IsFormDisabled()) {
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_OnProcessMessage(pMessage);
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pMessage)
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (pMessage->GetType()) {
7084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::SetFocus:
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      OnFocusChanged(pMessage, true);
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::KillFocus:
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      OnFocusChanged(pMessage, false);
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::Mouse: {
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      switch (pMsg->m_dwCmd) {
7174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        case FWL_MouseCommand::LeftButtonDown:
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          OnLButtonDown(pMsg);
7194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        case FWL_MouseCommand::LeftButtonUp:
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          OnLButtonUp(pMsg);
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        case FWL_MouseCommand::Move:
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          OnMouseMove(pMsg);
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        case FWL_MouseCommand::Leave:
7274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          OnMouseLeave(pMsg);
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        default:
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::Key:
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      OnKey(static_cast<CFWL_MessageKey*>(pMessage));
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
7384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Widget::OnProcessMessage(pMessage);
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnProcessEvent(CFWL_Event* pEvent) {
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Event::Type type = pEvent->GetType();
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (type == CFWL_Event::Type::Scroll) {
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_EventScroll* pScrollEvent = static_cast<CFWL_EventScroll*>(pEvent);
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_EventScroll pScrollEv(this);
7494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pScrollEv.m_iScrollCode = pScrollEvent->m_iScrollCode;
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pScrollEv.m_fPos = pScrollEvent->m_fPos;
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DispatchEvent(&pScrollEv);
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (type == CFWL_Event::Type::TextChanged) {
7534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_Event pTemp(CFWL_Event::Type::EditChanged, this);
7544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DispatchEvent(&pTemp);
7554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ComboBox::OnDrawWidget(CXFA_Graphics* pGraphics,
759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                 const CFX_Matrix& matrix) {
760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawWidget(pGraphics, matrix);
7614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnFocusChanged(CFWL_Message* pMsg, bool bSet) {
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSet) {
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
7664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (IsDropDownStyle() && pMsg->m_pSrcTarget != m_pListBox.get()) {
7674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!m_pEdit)
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
7694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->SetSelected();
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RepaintRect(m_rtClient);
7744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsDropDownStyle() || pMsg->m_pDstTarget == m_pListBox.get()) {
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RepaintRect(m_rtClient);
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pEdit)
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->FlagFocus(false);
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pEdit->ClearSelected();
7874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnLButtonDown(CFWL_MessageMouse* pMsg) {
7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
7914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF& rtBtn = IsDropDownStyle() ? m_rtBtn : m_rtClient;
79433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (!rtBtn.Contains(pMsg->m_pos))
7954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropDownStyle() && m_pEdit)
7984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    MatchEditText();
7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bLButtonDown = true;
8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iBtnState = CFWL_PartState_Pressed;
8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(m_rtClient);
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ShowDropList(true);
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iBtnState = CFWL_PartState_Normal;
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(m_rtClient);
8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnLButtonUp(CFWL_MessageMouse* pMsg) {
8104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bLButtonDown = false;
81133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (m_rtBtn.Contains(pMsg->m_pos))
8124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iBtnState = CFWL_PartState_Hovered;
8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  else
8144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iBtnState = CFWL_PartState_Normal;
8154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(m_rtBtn);
8174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnMouseMove(CFWL_MessageMouse* pMsg) {
8204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iOldState = m_iBtnState;
82133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (m_rtBtn.Contains(pMsg->m_pos)) {
8224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iBtnState =
8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_bLButtonDown ? CFWL_PartState_Pressed : CFWL_PartState_Hovered;
8244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
8254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iBtnState = CFWL_PartState_Normal;
8264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((iOldState != m_iBtnState) &&
8284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      !((m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
8294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        FWL_WGTSTATE_Disabled)) {
8304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RepaintRect(m_rtBtn);
8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnMouseLeave(CFWL_MessageMouse* pMsg) {
8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsDropListVisible() &&
8364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      !((m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
8374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        FWL_WGTSTATE_Disabled)) {
8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iBtnState = CFWL_PartState_Normal;
8394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RepaintRect(m_rtBtn);
8404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::OnKey(CFWL_MessageKey* pMsg) {
8444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwKeyCode = pMsg->m_dwKeyCode;
8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (dwKeyCode == FWL_VKEY_Tab)
8464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
8474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pMsg->m_pDstTarget == this)
8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DoSubCtrlKey(pMsg);
8494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DoSubCtrlKey(CFWL_MessageKey* pMsg) {
8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwKeyCode = pMsg->m_dwKeyCode;
8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bUp = dwKeyCode == FWL_VKEY_Up;
8544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bDown = dwKeyCode == FWL_VKEY_Down;
8554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bUp || bDown) {
8564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iCount = m_pListBox->CountItems(nullptr);
8574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iCount < 1)
8584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bMatchEqual = false;
8614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iCurSel = m_iCurSel;
8624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bDropDown = IsDropDownStyle();
8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bDropDown && m_pEdit) {
864d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsText = m_pEdit->GetText();
8654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iCurSel = m_pListBox->MatchItem(wsText);
8664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (iCurSel >= 0) {
8674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFWL_ListItem* hItem = m_pListBox->GetItem(this, iCurSel);
8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bMatchEqual = wsText == (hItem ? hItem->GetText() : L"");
8694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iCurSel < 0) {
8724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iCurSel = 0;
8734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (!bDropDown || bMatchEqual) {
8744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1))
8754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
8764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bUp)
8774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iCurSel--;
8784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
8794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iCurSel++;
8804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
8814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iCurSel = iCurSel;
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bDropDown && m_pEdit)
8834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      SyncEditText(m_iCurSel);
8844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    else
8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      RepaintRect(m_rtClient);
8864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
8874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
8884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsDropDownStyle())
8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
8914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_OnProcessMessage(CFWL_Message* pMessage) {
8944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pMessage)
8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool backDefault = true;
8984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (pMessage->GetType()) {
8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::SetFocus: {
9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      backDefault = false;
9014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      DisForm_OnFocusChanged(pMessage, true);
9024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
9034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::KillFocus: {
9054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      backDefault = false;
9064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      DisForm_OnFocusChanged(pMessage, false);
9074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
9084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::Mouse: {
9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      backDefault = false;
9114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      switch (pMsg->m_dwCmd) {
9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        case FWL_MouseCommand::LeftButtonDown:
9144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          DisForm_OnLButtonDown(pMsg);
9154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        case FWL_MouseCommand::LeftButtonUp:
9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          OnLButtonUp(pMsg);
9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
9194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        default:
9204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
9214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case CFWL_Message::Type::Key: {
9254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      backDefault = false;
9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_MessageKey* pKey = static_cast<CFWL_MessageKey*>(pMessage);
9274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pKey->m_dwCmd == FWL_KeyCommand::KeyUp)
9284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
9294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (DisForm_IsDropListVisible() &&
9304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pKey->m_dwCmd == FWL_KeyCommand::KeyDown) {
9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bool bListKey = pKey->m_dwKeyCode == FWL_VKEY_Up ||
9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        pKey->m_dwKeyCode == FWL_VKEY_Down ||
9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        pKey->m_dwKeyCode == FWL_VKEY_Return ||
9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        pKey->m_dwKeyCode == FWL_VKEY_Escape;
9354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bListKey) {
9364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pListBox->GetDelegate()->OnProcessMessage(pMessage);
9374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          break;
9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
9394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      DisForm_OnKey(pKey);
9414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
9424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
9454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (backDefault)
9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_Widget::OnProcessMessage(pMessage);
9484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_OnLButtonDown(CFWL_MessageMouse* pMsg) {
9514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bDropDown = DisForm_IsDropListVisible();
9524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF& rtBtn = bDropDown ? m_rtBtn : m_rtClient;
95333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (!rtBtn.Contains(pMsg->m_pos))
9544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (DisForm_IsDropListVisible()) {
9574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_ShowDropList(false);
9584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
9614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    MatchEditText();
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DisForm_ShowDropList(true);
9634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_OnFocusChanged(CFWL_Message* pMsg, bool bSet) {
9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bSet) {
9674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if ((m_pEdit->GetStates() & FWL_WGTSTATE_Focused) == 0) {
9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFWL_MessageSetFocus msg(nullptr, m_pEdit.get());
9704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pEdit->GetDelegate()->OnProcessMessage(&msg);
9714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
9744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DisForm_ShowDropList(false);
9754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_MessageKillFocus msg(m_pEdit.get());
9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->GetDelegate()->OnProcessMessage(&msg);
9774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
9784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ComboBox::DisForm_OnKey(CFWL_MessageKey* pMsg) {
9814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwKeyCode = pMsg->m_dwKeyCode;
9824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bUp = dwKeyCode == FWL_VKEY_Up;
9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const bool bDown = dwKeyCode == FWL_VKEY_Down;
9844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bUp || bDown) {
9854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_ComboList* pComboList = m_pListBox.get();
9864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iCount = pComboList->CountItems(nullptr);
9874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iCount < 1)
9884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bool bMatchEqual = false;
9914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iCurSel = m_iCurSel;
9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_pEdit) {
993d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsText = m_pEdit->GetText();
9944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iCurSel = pComboList->MatchItem(wsText);
9954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (iCurSel >= 0) {
9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CFWL_ListItem* item = m_pListBox->GetSelItem(iCurSel);
9974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bMatchEqual = wsText == (item ? item->GetText() : L"");
9984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
9994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iCurSel < 0) {
10014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      iCurSel = 0;
10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if (bMatchEqual) {
10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1))
10044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
10054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bUp)
10064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iCurSel--;
10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iCurSel++;
10094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
10104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_iCurSel = iCurSel;
10114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    SyncEditText(m_iCurSel);
10124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
10134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
10144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pEdit)
10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
10164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1017