| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| 6 | |
| 7 #include "fpdfsdk/include/formfiller/FFL_ListBox.h" | |
| 8 | |
| 9 #include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h" | |
| 10 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h" | |
| 11 #include "fpdfsdk/include/formfiller/FFL_IFormFiller.h" | |
| 12 #include "fpdfsdk/include/fsdk_common.h" | |
| 13 #include "fpdfsdk/include/fsdk_mgr.h" | |
| 14 #include "fpdfsdk/include/pdfwindow/PWL_ListBox.h" | |
| 15 | |
| 16 #define FFL_DEFAULTLISTBOXFONTSIZE 12.0f | |
| 17 | |
| 18 CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) | |
| 19 : CFFL_FormFiller(pApp, pWidget), m_pFontMap(NULL) {} | |
| 20 | |
| 21 CFFL_ListBox::~CFFL_ListBox() { | |
| 22 delete m_pFontMap; | |
| 23 } | |
| 24 | |
| 25 PWL_CREATEPARAM CFFL_ListBox::GetCreateParam() { | |
| 26 PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); | |
| 27 | |
| 28 FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags(); | |
| 29 | |
| 30 if (dwFieldFlag & FIELDFLAG_MULTISELECT) { | |
| 31 cp.dwFlags |= PLBS_MULTIPLESEL; | |
| 32 } | |
| 33 | |
| 34 cp.dwFlags |= PWS_VSCROLL; | |
| 35 | |
| 36 if (cp.dwFlags & PWS_AUTOFONTSIZE) | |
| 37 cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE; | |
| 38 | |
| 39 if (!m_pFontMap) | |
| 40 m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler()); | |
| 41 cp.pFontMap = m_pFontMap; | |
| 42 | |
| 43 return cp; | |
| 44 } | |
| 45 | |
| 46 CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, | |
| 47 CPDFSDK_PageView* pPageView) { | |
| 48 CPWL_ListBox* pWnd = new CPWL_ListBox(); | |
| 49 pWnd->AttachFFLData(this); | |
| 50 pWnd->Create(cp); | |
| 51 | |
| 52 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); | |
| 53 pWnd->SetFillerNotify(pIFormFiller); | |
| 54 | |
| 55 for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) | |
| 56 pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str()); | |
| 57 | |
| 58 if (pWnd->HasFlag(PLBS_MULTIPLESEL)) { | |
| 59 m_OriginSelections.clear(); | |
| 60 | |
| 61 FX_BOOL bSetCaret = FALSE; | |
| 62 for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { | |
| 63 if (m_pWidget->IsOptionSelected(i)) { | |
| 64 if (!bSetCaret) { | |
| 65 pWnd->SetCaret(i); | |
| 66 bSetCaret = TRUE; | |
| 67 } | |
| 68 pWnd->Select(i); | |
| 69 m_OriginSelections.insert(i); | |
| 70 } | |
| 71 } | |
| 72 } else { | |
| 73 for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { | |
| 74 if (m_pWidget->IsOptionSelected(i)) { | |
| 75 pWnd->Select(i); | |
| 76 break; | |
| 77 } | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex()); | |
| 82 | |
| 83 return pWnd; | |
| 84 } | |
| 85 | |
| 86 FX_BOOL CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, | |
| 87 FX_UINT nChar, | |
| 88 FX_UINT nFlags) { | |
| 89 return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); | |
| 90 } | |
| 91 | |
| 92 FX_BOOL CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView) { | |
| 93 CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE); | |
| 94 if (!pListBox) | |
| 95 return FALSE; | |
| 96 | |
| 97 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { | |
| 98 size_t nSelCount = 0; | |
| 99 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; ++i) { | |
| 100 if (pListBox->IsItemSelected(i)) { | |
| 101 if (m_OriginSelections.count(i) == 0) | |
| 102 return TRUE; | |
| 103 | |
| 104 ++nSelCount; | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 return nSelCount != m_OriginSelections.size(); | |
| 109 } | |
| 110 return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0); | |
| 111 } | |
| 112 | |
| 113 void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView) { | |
| 114 ASSERT(m_pWidget); | |
| 115 | |
| 116 if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { | |
| 117 CFX_IntArray aOldSelect, aNewSelect; | |
| 118 | |
| 119 { | |
| 120 for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { | |
| 121 if (m_pWidget->IsOptionSelected(i)) { | |
| 122 aOldSelect.Add(i); | |
| 123 } | |
| 124 } | |
| 125 } | |
| 126 | |
| 127 int32_t nNewTopIndex = pListBox->GetTopVisibleIndex(); | |
| 128 | |
| 129 m_pWidget->ClearSelection(FALSE); | |
| 130 | |
| 131 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { | |
| 132 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { | |
| 133 if (pListBox->IsItemSelected(i)) { | |
| 134 m_pWidget->SetOptionSelection(i, TRUE, FALSE); | |
| 135 aNewSelect.Add(i); | |
| 136 } | |
| 137 } | |
| 138 } else { | |
| 139 m_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRUE, FALSE); | |
| 140 aNewSelect.Add(pListBox->GetCurSel()); | |
| 141 } | |
| 142 | |
| 143 m_pWidget->SetTopVisibleIndex(nNewTopIndex); | |
| 144 m_pWidget->ResetFieldAppearance(TRUE); | |
| 145 m_pWidget->UpdateField(); | |
| 146 SetChangeMark(); | |
| 147 } | |
| 148 } | |
| 149 | |
| 150 void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, | |
| 151 CPDF_AAction::AActionType type, | |
| 152 PDFSDK_FieldAction& fa) { | |
| 153 switch (type) { | |
| 154 case CPDF_AAction::Validate: | |
| 155 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { | |
| 156 fa.sValue = L""; | |
| 157 } else { | |
| 158 if (CPWL_ListBox* pListBox = | |
| 159 (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { | |
| 160 int32_t nCurSel = pListBox->GetCurSel(); | |
| 161 if (nCurSel >= 0) | |
| 162 fa.sValue = m_pWidget->GetOptionLabel(nCurSel); | |
| 163 } | |
| 164 } | |
| 165 break; | |
| 166 case CPDF_AAction::LoseFocus: | |
| 167 case CPDF_AAction::GetFocus: | |
| 168 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { | |
| 169 fa.sValue = L""; | |
| 170 } else { | |
| 171 int32_t nCurSel = m_pWidget->GetSelectedIndex(0); | |
| 172 if (nCurSel >= 0) | |
| 173 fa.sValue = m_pWidget->GetOptionLabel(nCurSel); | |
| 174 } | |
| 175 break; | |
| 176 default: | |
| 177 break; | |
| 178 } | |
| 179 } | |
| 180 | |
| 181 void CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, | |
| 182 CPDF_AAction::AActionType type, | |
| 183 const PDFSDK_FieldAction& fa) {} | |
| 184 | |
| 185 void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView) { | |
| 186 ASSERT(pPageView); | |
| 187 | |
| 188 if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { | |
| 189 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { | |
| 190 if (pListBox->IsItemSelected(i)) { | |
| 191 m_State.Add(i); | |
| 192 } | |
| 193 } | |
| 194 } | |
| 195 } | |
| 196 | |
| 197 void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView) { | |
| 198 if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { | |
| 199 for (int i = 0, sz = m_State.GetSize(); i < sz; i++) | |
| 200 pListBox->Select(m_State[i]); | |
| 201 } | |
| 202 } | |
| 203 | |
| 204 CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, | |
| 205 FX_BOOL bRestoreValue) { | |
| 206 if (bRestoreValue) | |
| 207 SaveState(pPageView); | |
| 208 | |
| 209 DestroyPDFWindow(pPageView); | |
| 210 | |
| 211 CPWL_Wnd* pRet = NULL; | |
| 212 | |
| 213 if (bRestoreValue) { | |
| 214 RestoreState(pPageView); | |
| 215 pRet = GetPDFWindow(pPageView, FALSE); | |
| 216 } else { | |
| 217 pRet = GetPDFWindow(pPageView, TRUE); | |
| 218 } | |
| 219 | |
| 220 m_pWidget->UpdateField(); | |
| 221 | |
| 222 return pRet; | |
| 223 } | |
| OLD | NEW |