| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fwl/core/ifwl_combobox.h" | 7 #include "xfa/fwl/core/ifwl_combobox.h" |
| 8 | 8 |
| 9 #include "third_party/base/ptr_util.h" |
| 9 #include "xfa/fde/cfde_txtedtengine.h" | 10 #include "xfa/fde/cfde_txtedtengine.h" |
| 10 #include "xfa/fde/tto/fde_textout.h" | 11 #include "xfa/fde/tto/fde_textout.h" |
| 11 #include "xfa/fwl/core/cfwl_message.h" | 12 #include "xfa/fwl/core/cfwl_message.h" |
| 12 #include "xfa/fwl/core/cfwl_themebackground.h" | 13 #include "xfa/fwl/core/cfwl_themebackground.h" |
| 13 #include "xfa/fwl/core/cfwl_themepart.h" | 14 #include "xfa/fwl/core/cfwl_themepart.h" |
| 14 #include "xfa/fwl/core/cfwl_themetext.h" | 15 #include "xfa/fwl/core/cfwl_themetext.h" |
| 15 #include "xfa/fwl/core/cfwl_widgetmgr.h" | 16 #include "xfa/fwl/core/cfwl_widgetmgr.h" |
| 16 #include "xfa/fwl/core/fwl_noteimp.h" | 17 #include "xfa/fwl/core/fwl_noteimp.h" |
| 17 #include "xfa/fwl/core/ifwl_app.h" | 18 #include "xfa/fwl/core/ifwl_app.h" |
| 18 #include "xfa/fwl/core/ifwl_comboedit.h" | 19 #include "xfa/fwl/core/ifwl_comboedit.h" |
| 19 #include "xfa/fwl/core/ifwl_combolist.h" | 20 #include "xfa/fwl/core/ifwl_combolist.h" |
| 20 #include "xfa/fwl/core/ifwl_formproxy.h" | 21 #include "xfa/fwl/core/ifwl_formproxy.h" |
| 21 #include "xfa/fwl/core/ifwl_themeprovider.h" | 22 #include "xfa/fwl/core/ifwl_themeprovider.h" |
| 22 | 23 |
| 23 IFWL_ComboBox::IFWL_ComboBox(const IFWL_App* app, | 24 IFWL_ComboBox::IFWL_ComboBox(const IFWL_App* app, |
| 24 const CFWL_WidgetImpProperties& properties) | 25 const CFWL_WidgetImpProperties& properties) |
| 25 : IFWL_Widget(app, properties, nullptr), | 26 : IFWL_Widget(app, properties, nullptr), |
| 26 m_pForm(nullptr), | 27 m_pForm(nullptr), |
| 27 m_bLButtonDown(FALSE), | 28 m_bLButtonDown(FALSE), |
| 28 m_iCurSel(-1), | 29 m_iCurSel(-1), |
| 29 m_iBtnState(CFWL_PartState_Normal), | 30 m_iBtnState(CFWL_PartState_Normal), |
| 30 m_fComboFormHandler(0), | 31 m_fComboFormHandler(0), |
| 31 m_bNeedShowList(FALSE) { | 32 m_bNeedShowList(FALSE) { |
| 32 m_rtClient.Reset(); | 33 m_rtClient.Reset(); |
| 33 m_rtBtn.Reset(); | 34 m_rtBtn.Reset(); |
| 34 m_rtHandler.Reset(); | 35 m_rtHandler.Reset(); |
| 35 } | |
| 36 | 36 |
| 37 IFWL_ComboBox::~IFWL_ComboBox() {} | 37 SetDelegate(pdfium::MakeUnique<CFWL_ComboBoxImpDelegate>(this)); |
| 38 | |
| 39 void IFWL_ComboBox::Initialize() { | |
| 40 IFWL_Widget::Initialize(); | |
| 41 m_pDelegate = new CFWL_ComboBoxImpDelegate(this); | |
| 42 | 38 |
| 43 if (m_pWidgetMgr->IsFormDisabled()) { | 39 if (m_pWidgetMgr->IsFormDisabled()) { |
| 44 DisForm_InitComboList(); | 40 DisForm_InitComboList(); |
| 45 DisForm_InitComboEdit(); | 41 DisForm_InitComboEdit(); |
| 46 return; | 42 return; |
| 47 } | 43 } |
| 48 | 44 |
| 49 CFWL_WidgetImpProperties prop; | 45 CFWL_WidgetImpProperties prop; |
| 50 prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; | 46 prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; |
| 51 prop.m_dwStyles |= FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll; | 47 prop.m_dwStyles |= FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll; |
| 52 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListItemIconText) | 48 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_ListItemIconText) |
| 53 prop.m_dwStyleExes |= FWL_STYLEEXT_LTB_Icon; | 49 prop.m_dwStyleExes |= FWL_STYLEEXT_LTB_Icon; |
| 54 | 50 |
| 55 prop.m_pDataProvider = m_pProperties->m_pDataProvider; | 51 prop.m_pDataProvider = m_pProperties->m_pDataProvider; |
| 56 m_pListBox.reset(new IFWL_ComboList(m_pOwnerApp, prop, this)); | 52 m_pListBox.reset(new IFWL_ComboList(m_pOwnerApp, prop, this)); |
| 57 m_pListBox->Initialize(); | |
| 58 if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) && !m_pEdit) { | 53 if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_CMB_DropDown) && !m_pEdit) { |
| 59 CFWL_WidgetImpProperties prop2; | 54 CFWL_WidgetImpProperties prop2; |
| 60 m_pEdit.reset(new IFWL_ComboEdit(m_pOwnerApp, prop2, this)); | 55 m_pEdit.reset(new IFWL_ComboEdit(m_pOwnerApp, prop2, this)); |
| 61 m_pEdit->Initialize(); | |
| 62 m_pEdit->SetOuter(this); | 56 m_pEdit->SetOuter(this); |
| 63 } | 57 } |
| 64 if (m_pEdit) | 58 if (m_pEdit) |
| 65 m_pEdit->SetParent(this); | 59 m_pEdit->SetParent(this); |
| 66 | 60 |
| 67 SetStates(m_pProperties->m_dwStates); | 61 SetStates(m_pProperties->m_dwStates); |
| 68 } | 62 } |
| 69 | 63 |
| 70 void IFWL_ComboBox::Finalize() { | 64 IFWL_ComboBox::~IFWL_ComboBox() {} |
| 71 if (m_pEdit) | |
| 72 m_pEdit->Finalize(); | |
| 73 | |
| 74 m_pListBox->Finalize(); | |
| 75 delete m_pDelegate; | |
| 76 m_pDelegate = nullptr; | |
| 77 IFWL_Widget::Finalize(); | |
| 78 } | |
| 79 | 65 |
| 80 FWL_Type IFWL_ComboBox::GetClassID() const { | 66 FWL_Type IFWL_ComboBox::GetClassID() const { |
| 81 return FWL_Type::ComboBox; | 67 return FWL_Type::ComboBox; |
| 82 } | 68 } |
| 83 | 69 |
| 84 FWL_Error IFWL_ComboBox::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) { | 70 FWL_Error IFWL_ComboBox::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) { |
| 85 if (bAutoSize) { | 71 if (bAutoSize) { |
| 86 rect.Reset(); | 72 rect.Reset(); |
| 87 FX_BOOL bIsDropDown = IsDropDownStyle(); | 73 FX_BOOL bIsDropDown = IsDropDownStyle(); |
| 88 if (bIsDropDown && m_pEdit) { | 74 if (bIsDropDown && m_pEdit) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 109 FWL_Error IFWL_ComboBox::ModifyStylesEx(uint32_t dwStylesExAdded, | 95 FWL_Error IFWL_ComboBox::ModifyStylesEx(uint32_t dwStylesExAdded, |
| 110 uint32_t dwStylesExRemoved) { | 96 uint32_t dwStylesExRemoved) { |
| 111 if (m_pWidgetMgr->IsFormDisabled()) { | 97 if (m_pWidgetMgr->IsFormDisabled()) { |
| 112 return DisForm_ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); | 98 return DisForm_ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); |
| 113 } | 99 } |
| 114 bool bAddDropDown = !!(dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown); | 100 bool bAddDropDown = !!(dwStylesExAdded & FWL_STYLEEXT_CMB_DropDown); |
| 115 bool bRemoveDropDown = !!(dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown); | 101 bool bRemoveDropDown = !!(dwStylesExRemoved & FWL_STYLEEXT_CMB_DropDown); |
| 116 if (bAddDropDown && !m_pEdit) { | 102 if (bAddDropDown && !m_pEdit) { |
| 117 CFWL_WidgetImpProperties prop; | 103 CFWL_WidgetImpProperties prop; |
| 118 m_pEdit.reset(new IFWL_ComboEdit(m_pOwnerApp, prop, nullptr)); | 104 m_pEdit.reset(new IFWL_ComboEdit(m_pOwnerApp, prop, nullptr)); |
| 119 m_pEdit->Initialize(); | |
| 120 m_pEdit->SetOuter(this); | 105 m_pEdit->SetOuter(this); |
| 121 m_pEdit->SetParent(this); | 106 m_pEdit->SetParent(this); |
| 122 } else if (bRemoveDropDown && m_pEdit) { | 107 } else if (bRemoveDropDown && m_pEdit) { |
| 123 m_pEdit->SetStates(FWL_WGTSTATE_Invisible, TRUE); | 108 m_pEdit->SetStates(FWL_WGTSTATE_Invisible, TRUE); |
| 124 } | 109 } |
| 125 return IFWL_Widget::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); | 110 return IFWL_Widget::ModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); |
| 126 } | 111 } |
| 127 | 112 |
| 128 FWL_Error IFWL_ComboBox::Update() { | 113 FWL_Error IFWL_ComboBox::Update() { |
| 129 if (m_pWidgetMgr->IsFormDisabled()) { | 114 if (m_pWidgetMgr->IsFormDisabled()) { |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 return; | 693 return; |
| 709 if (!m_pListBox) | 694 if (!m_pListBox) |
| 710 return; | 695 return; |
| 711 | 696 |
| 712 CFWL_WidgetImpProperties propForm; | 697 CFWL_WidgetImpProperties propForm; |
| 713 propForm.m_pOwner = this; | 698 propForm.m_pOwner = this; |
| 714 propForm.m_dwStyles = FWL_WGTSTYLE_Popup; | 699 propForm.m_dwStyles = FWL_WGTSTYLE_Popup; |
| 715 propForm.m_dwStates = FWL_WGTSTATE_Invisible; | 700 propForm.m_dwStates = FWL_WGTSTATE_Invisible; |
| 716 | 701 |
| 717 m_pForm = new IFWL_FormProxy(m_pOwnerApp, propForm, m_pListBox.get()); | 702 m_pForm = new IFWL_FormProxy(m_pOwnerApp, propForm, m_pListBox.get()); |
| 718 m_pForm->Initialize(); | |
| 719 m_pListBox->SetParent(m_pForm); | 703 m_pListBox->SetParent(m_pForm); |
| 720 m_pListProxyDelegate = new CFWL_ComboProxyImpDelegate(m_pForm, this); | 704 m_pListProxyDelegate = new CFWL_ComboProxyImpDelegate(m_pForm, this); |
| 721 m_pForm->SetCurrentDelegate(m_pListProxyDelegate); | 705 m_pForm->SetCurrentDelegate(m_pListProxyDelegate); |
| 722 } | 706 } |
| 723 | 707 |
| 724 void IFWL_ComboBox::DisForm_InitComboList() { | 708 void IFWL_ComboBox::DisForm_InitComboList() { |
| 725 if (m_pListBox) | 709 if (m_pListBox) |
| 726 return; | 710 return; |
| 727 | 711 |
| 728 CFWL_WidgetImpProperties prop; | 712 CFWL_WidgetImpProperties prop; |
| 729 prop.m_pParent = this; | 713 prop.m_pParent = this; |
| 730 prop.m_dwStyles = FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll; | 714 prop.m_dwStyles = FWL_WGTSTYLE_Border | FWL_WGTSTYLE_VScroll; |
| 731 prop.m_dwStates = FWL_WGTSTATE_Invisible; | 715 prop.m_dwStates = FWL_WGTSTATE_Invisible; |
| 732 prop.m_pDataProvider = m_pProperties->m_pDataProvider; | 716 prop.m_pDataProvider = m_pProperties->m_pDataProvider; |
| 733 prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; | 717 prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; |
| 734 m_pListBox.reset(new IFWL_ComboList(m_pOwnerApp, prop, this)); | 718 m_pListBox.reset(new IFWL_ComboList(m_pOwnerApp, prop, this)); |
| 735 m_pListBox->Initialize(); | |
| 736 } | 719 } |
| 737 | 720 |
| 738 void IFWL_ComboBox::DisForm_InitComboEdit() { | 721 void IFWL_ComboBox::DisForm_InitComboEdit() { |
| 739 if (m_pEdit) | 722 if (m_pEdit) |
| 740 return; | 723 return; |
| 741 | 724 |
| 742 CFWL_WidgetImpProperties prop; | 725 CFWL_WidgetImpProperties prop; |
| 743 prop.m_pParent = this; | 726 prop.m_pParent = this; |
| 744 prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; | 727 prop.m_pThemeProvider = m_pProperties->m_pThemeProvider; |
| 745 m_pEdit.reset(new IFWL_ComboEdit(m_pOwnerApp, prop, this)); | 728 m_pEdit.reset(new IFWL_ComboEdit(m_pOwnerApp, prop, this)); |
| 746 m_pEdit->Initialize(); | |
| 747 m_pEdit->SetOuter(this); | 729 m_pEdit->SetOuter(this); |
| 748 } | 730 } |
| 749 | 731 |
| 750 void IFWL_ComboBox::DisForm_ShowDropList(FX_BOOL bActivate) { | 732 void IFWL_ComboBox::DisForm_ShowDropList(FX_BOOL bActivate) { |
| 751 FX_BOOL bDropList = DisForm_IsDropListShowed(); | 733 FX_BOOL bDropList = DisForm_IsDropListShowed(); |
| 752 if (bDropList == bActivate) { | 734 if (bDropList == bActivate) { |
| 753 return; | 735 return; |
| 754 } | 736 } |
| 755 if (bActivate) { | 737 if (bActivate) { |
| 756 CFWL_EvtCmbPreDropDown preEvent; | 738 CFWL_EvtCmbPreDropDown preEvent; |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1409 } | 1391 } |
| 1410 | 1392 |
| 1411 void CFWL_ComboProxyImpDelegate::OnFocusChanged(CFWL_MsgKillFocus* pMsg, | 1393 void CFWL_ComboProxyImpDelegate::OnFocusChanged(CFWL_MsgKillFocus* pMsg, |
| 1412 FX_BOOL bSet) { | 1394 FX_BOOL bSet) { |
| 1413 if (!bSet) { | 1395 if (!bSet) { |
| 1414 if (!pMsg->m_pSetFocus) { | 1396 if (!pMsg->m_pSetFocus) { |
| 1415 m_pComboBox->ShowDropList(FALSE); | 1397 m_pComboBox->ShowDropList(FALSE); |
| 1416 } | 1398 } |
| 1417 } | 1399 } |
| 1418 } | 1400 } |
| OLD | NEW |