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(¶m); 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(¶m); 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(¶m); 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(¶m); 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