| 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 "../../include/formfiller/FormFiller.h" | 7 #include "../../include/formfiller/FormFiller.h" |
| 8 #include "../../include/formfiller/FFL_FormFiller.h" | 8 #include "../../include/formfiller/FFL_FormFiller.h" |
| 9 #include "../../include/formfiller/FFL_ListBox.h" | 9 #include "../../include/formfiller/FFL_ListBox.h" |
| 10 //#include "../../include/formfiller/FFL_Module.h" | 10 //#include "../../include/formfiller/FFL_Module.h" |
| 11 #include "../../include/formfiller/FFL_IFormFiller.h" | 11 #include "../../include/formfiller/FFL_IFormFiller.h" |
| 12 //#include "../../include/formfiller/FFL_Undo.h" | 12 //#include "../../include/formfiller/FFL_Undo.h" |
| 13 #include "../../include/formfiller/FFL_CBA_Fontmap.h" | 13 #include "../../include/formfiller/FFL_CBA_Fontmap.h" |
| 14 | 14 |
| 15 | 15 #define FFL_DEFAULTLISTBOXFONTSIZE 12.0f |
| 16 #define»FFL_DEFAULTLISTBOXFONTSIZE» » 12.0f | 16 |
| 17 | 17 /* ------------------------------- CFFL_ListBox ------------------------------- |
| 18 | 18 */ |
| 19 /* ------------------------------- CFFL_ListBox -------------------------------
*/ | 19 |
| 20 | 20 CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) |
| 21 CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) : | 21 : CFFL_FormFiller(pApp, pWidget), m_pFontMap(NULL) {} |
| 22 » CFFL_FormFiller(pApp, pWidget), | 22 |
| 23 » m_pFontMap(NULL) | 23 CFFL_ListBox::~CFFL_ListBox() { |
| 24 { | 24 delete m_pFontMap; |
| 25 } | 25 } |
| 26 | 26 |
| 27 CFFL_ListBox::~CFFL_ListBox() | 27 PWL_CREATEPARAM CFFL_ListBox::GetCreateParam() { |
| 28 { | 28 PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); |
| 29 delete m_pFontMap; | 29 |
| 30 } | 30 ASSERT(m_pWidget != NULL); |
| 31 | 31 FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags(); |
| 32 PWL_CREATEPARAM»CFFL_ListBox::GetCreateParam() | 32 |
| 33 { | 33 if (dwFieldFlag & FIELDFLAG_MULTISELECT) { |
| 34 » PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam(); | 34 cp.dwFlags |= PLBS_MULTIPLESEL; |
| 35 | 35 } |
| 36 » ASSERT(m_pWidget != NULL); | 36 |
| 37 » FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags(); | 37 cp.dwFlags |= PWS_VSCROLL; |
| 38 | 38 |
| 39 » if (dwFieldFlag & FIELDFLAG_MULTISELECT) | 39 if (cp.dwFlags & PWS_AUTOFONTSIZE) |
| 40 » { | 40 cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE; |
| 41 » » cp.dwFlags |= PLBS_MULTIPLESEL; | 41 |
| 42 » } | 42 if (!m_pFontMap) { |
| 43 | 43 m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler()); |
| 44 » cp.dwFlags |= PWS_VSCROLL; | 44 m_pFontMap->Initial(); |
| 45 | 45 } |
| 46 » if (cp.dwFlags & PWS_AUTOFONTSIZE) | 46 cp.pFontMap = m_pFontMap; |
| 47 » » cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE; | 47 |
| 48 | 48 return cp; |
| 49 » if (!m_pFontMap) | 49 } |
| 50 » { | 50 |
| 51 » » m_pFontMap = new CBA_FontMap(m_pWidget, m_pApp->GetSysHandler())
; | 51 CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, |
| 52 » » m_pFontMap->Initial(); | 52 CPDFSDK_PageView* pPageView) { |
| 53 » } | 53 CPWL_ListBox* pWnd = new CPWL_ListBox(); |
| 54 » cp.pFontMap = m_pFontMap; | 54 pWnd->AttachFFLData(this); |
| 55 | 55 pWnd->Create(cp); |
| 56 » return cp; | 56 |
| 57 } | 57 ASSERT(m_pApp != NULL); |
| 58 | 58 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); |
| 59 CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView
* pPageView) | 59 pWnd->SetFillerNotify(pIFormFiller); |
| 60 { | 60 |
| 61 » CPWL_ListBox* pWnd = new CPWL_ListBox(); | 61 for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) |
| 62 » pWnd->AttachFFLData(this); | 62 pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str()); |
| 63 » pWnd->Create(cp); | 63 |
| 64 | 64 if (pWnd->HasFlag(PLBS_MULTIPLESEL)) { |
| 65 » ASSERT(m_pApp != NULL); | 65 m_OriginSelections.clear(); |
| 66 » CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller(); | 66 |
| 67 » pWnd->SetFillerNotify(pIFormFiller); | 67 FX_BOOL bSetCaret = FALSE; |
| 68 | 68 for (int32_t i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { |
| 69 » for (int32_t i=0,sz=m_pWidget->CountOptions(); i<sz; i++) | 69 if (m_pWidget->IsOptionSelected(i)) { |
| 70 » » pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str()); | 70 if (!bSetCaret) { |
| 71 | 71 pWnd->SetCaret(i); |
| 72 » if (pWnd->HasFlag(PLBS_MULTIPLESEL)) | 72 bSetCaret = TRUE; |
| 73 » { | 73 } |
| 74 » » m_OriginSelections.clear(); | 74 pWnd->Select(i); |
| 75 | 75 m_OriginSelections.insert(i); |
| 76 » » FX_BOOL bSetCaret = FALSE; | 76 } |
| 77 » » for (int32_t i=0,sz=m_pWidget->CountOptions(); i<sz; i++) | 77 } |
| 78 » » { | 78 } else { |
| 79 » » » if (m_pWidget->IsOptionSelected(i)) | 79 for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { |
| 80 » » » { | 80 if (m_pWidget->IsOptionSelected(i)) { |
| 81 » » » » if (!bSetCaret) | 81 pWnd->Select(i); |
| 82 » » » » { | 82 break; |
| 83 » » » » » pWnd->SetCaret(i); | 83 } |
| 84 » » » » » bSetCaret = TRUE; | 84 } |
| 85 » » » » } | 85 } |
| 86 » » » » pWnd->Select(i); | 86 |
| 87 » » » » m_OriginSelections.insert(i); | 87 pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex()); |
| 88 » » » } | 88 |
| 89 » » } | 89 return pWnd; |
| 90 » } | 90 } |
| 91 » else | 91 |
| 92 » { | 92 FX_BOOL CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, |
| 93 » » for (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++) | 93 FX_UINT nChar, |
| 94 » » { | 94 FX_UINT nFlags) { |
| 95 » » » if (m_pWidget->IsOptionSelected(i)) | 95 return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); |
| 96 » » » { | 96 } |
| 97 » » » » pWnd->Select(i); | 97 |
| 98 » » » » break; | 98 FX_BOOL CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView) { |
| 99 » » » } | 99 CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE); |
| 100 » » } | 100 if (!pListBox) |
| 101 » } | 101 return FALSE; |
| 102 | 102 |
| 103 » pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex()); | 103 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { |
| 104 | 104 int nSelCount = 0; |
| 105 » return pWnd; | 105 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; ++i) { |
| 106 } | 106 if (pListBox->IsItemSelected(i)) { |
| 107 | 107 if (m_OriginSelections.count(i) == 0) |
| 108 | 108 return TRUE; |
| 109 FX_BOOL»CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlag
s) | 109 |
| 110 { | 110 nSelCount++; |
| 111 » return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags); | 111 } |
| 112 } | 112 } |
| 113 | 113 |
| 114 FX_BOOL CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView) | 114 return nSelCount != m_OriginSelections.size(); |
| 115 { | 115 } |
| 116 CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE); | 116 return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0); |
| 117 if (!pListBox) | 117 } |
| 118 return FALSE; | 118 |
| 119 void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView) { |
| 120 ASSERT(m_pWidget != NULL); |
| 121 |
| 122 if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { |
| 123 CFX_IntArray aOldSelect, aNewSelect; |
| 124 |
| 125 { |
| 126 for (int i = 0, sz = m_pWidget->CountOptions(); i < sz; i++) { |
| 127 if (m_pWidget->IsOptionSelected(i)) { |
| 128 aOldSelect.Add(i); |
| 129 } |
| 130 } |
| 131 } |
| 132 |
| 133 int32_t nNewTopIndex = pListBox->GetTopVisibleIndex(); |
| 134 |
| 135 m_pWidget->ClearSelection(FALSE); |
| 119 | 136 |
| 120 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { | 137 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { |
| 121 int nSelCount = 0; | 138 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { |
| 122 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; ++i) { | 139 if (pListBox->IsItemSelected(i)) { |
| 123 if (pListBox->IsItemSelected(i)) { | 140 m_pWidget->SetOptionSelection(i, TRUE, FALSE); |
| 124 if (m_OriginSelections.count(i) == 0) | 141 aNewSelect.Add(i); |
| 125 return TRUE; | 142 } |
| 126 | 143 } |
| 127 nSelCount++; | 144 } else { |
| 128 } | 145 m_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRUE, FALSE); |
| 129 } | 146 aNewSelect.Add(pListBox->GetCurSel()); |
| 130 | 147 } |
| 131 return nSelCount != m_OriginSelections.size(); | 148 |
| 132 } | 149 m_pWidget->SetTopVisibleIndex(nNewTopIndex); |
| 133 return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0); | 150 m_pWidget->ResetFieldAppearance(TRUE); |
| 134 } | 151 m_pWidget->UpdateField(); |
| 135 | 152 SetChangeMark(); |
| 136 void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView) | 153 } |
| 137 { | 154 } |
| 138 » ASSERT(m_pWidget != NULL); | 155 |
| 139 | 156 void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, |
| 140 » if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALS
E)) | 157 CPDF_AAction::AActionType type, |
| 141 » { | 158 PDFSDK_FieldAction& fa) { |
| 142 » » CFX_IntArray aOldSelect, aNewSelect; | 159 switch (type) { |
| 143 | 160 case CPDF_AAction::Validate: |
| 144 » » { | 161 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { |
| 145 » » » for (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++) | 162 fa.sValue = L""; |
| 146 » » » { | 163 } else { |
| 147 » » » » if (m_pWidget->IsOptionSelected(i)) | 164 if (CPWL_ListBox* pListBox = |
| 148 » » » » { | 165 (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { |
| 149 » » » » » aOldSelect.Add(i); | 166 ASSERT(m_pWidget != NULL); |
| 150 » » » » } | 167 int32_t nCurSel = pListBox->GetCurSel(); |
| 151 » » » } | 168 if (nCurSel >= 0) |
| 152 » » } | 169 fa.sValue = m_pWidget->GetOptionLabel(nCurSel); |
| 153 | 170 } |
| 154 | 171 } |
| 155 » » int32_t nNewTopIndex = pListBox->GetTopVisibleIndex(); | 172 break; |
| 156 | 173 case CPDF_AAction::LoseFocus: |
| 157 » » m_pWidget->ClearSelection(FALSE); | 174 case CPDF_AAction::GetFocus: |
| 158 | 175 if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) { |
| 159 » » if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) | 176 fa.sValue = L""; |
| 160 » » { | 177 } else { |
| 161 » » » for (int32_t i=0,sz=pListBox->GetCount(); i<sz; i++) | 178 ASSERT(m_pWidget != NULL); |
| 162 » » » { | 179 int32_t nCurSel = m_pWidget->GetSelectedIndex(0); |
| 163 » » » » if (pListBox->IsItemSelected(i)) | 180 if (nCurSel >= 0) |
| 164 » » » » { | 181 fa.sValue = m_pWidget->GetOptionLabel(nCurSel); |
| 165 » » » » » m_pWidget->SetOptionSelection(i, TRUE, F
ALSE); | 182 } |
| 166 » » » » » aNewSelect.Add(i); | 183 break; |
| 167 » » » » } | 184 default: |
| 168 » » » } | 185 break; |
| 169 » » } | 186 } |
| 170 » » else | 187 } |
| 171 » » { | 188 |
| 172 » » » m_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRU
E, FALSE); | 189 void CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, |
| 173 » » » aNewSelect.Add(pListBox->GetCurSel()); | 190 CPDF_AAction::AActionType type, |
| 174 » » } | 191 const PDFSDK_FieldAction& fa) {} |
| 175 | 192 |
| 176 » » m_pWidget->SetTopVisibleIndex(nNewTopIndex); | 193 void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView) { |
| 177 » » m_pWidget->ResetFieldAppearance(TRUE); | 194 ASSERT(pPageView != NULL); |
| 178 » » m_pWidget->UpdateField(); | 195 |
| 179 » » SetChangeMark(); | 196 if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { |
| 180 » } | 197 for (int32_t i = 0, sz = pListBox->GetCount(); i < sz; i++) { |
| 181 } | 198 if (pListBox->IsItemSelected(i)) { |
| 182 | 199 m_State.Add(i); |
| 183 void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AAct
ionType type, | 200 } |
| 184 » » » » » » PDFSDK_FieldAction& fa) | 201 } |
| 185 { | 202 } |
| 186 » switch (type) | 203 } |
| 187 » { | 204 |
| 188 » case CPDF_AAction::Validate: | 205 void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView) { |
| 189 » » if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) | 206 if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE)) { |
| 190 » » { | 207 for (int i = 0, sz = m_State.GetSize(); i < sz; i++) |
| 191 » » » fa.sValue = L""; | 208 pListBox->Select(m_State[i]); |
| 192 » » } | 209 } |
| 193 » » else | 210 } |
| 194 » » { | 211 |
| 195 » » » if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow
(pPageView, FALSE)) | 212 CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, |
| 196 » » » { | 213 FX_BOOL bRestoreValue) { |
| 197 » » » » ASSERT(m_pWidget != NULL); | 214 if (bRestoreValue) |
| 198 » » » » int32_t nCurSel = pListBox->GetCurSel(); | 215 SaveState(pPageView); |
| 199 » » » » if (nCurSel >= 0) | 216 |
| 200 » » » » » fa.sValue = m_pWidget->GetOptionLabel(nC
urSel); | 217 DestroyPDFWindow(pPageView); |
| 201 » » » } | 218 |
| 202 » » } | 219 CPWL_Wnd* pRet = NULL; |
| 203 » » break; | 220 |
| 204 » case CPDF_AAction::LoseFocus: | 221 if (bRestoreValue) { |
| 205 » case CPDF_AAction::GetFocus: | 222 RestoreState(pPageView); |
| 206 » » if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) | 223 pRet = GetPDFWindow(pPageView, FALSE); |
| 207 » » { | 224 } else |
| 208 » » » fa.sValue = L""; | 225 pRet = GetPDFWindow(pPageView, TRUE); |
| 209 » » } | 226 |
| 210 » » else | 227 m_pWidget->UpdateField(); |
| 211 » » { | 228 |
| 212 » » » ASSERT(m_pWidget != NULL); | 229 return pRet; |
| 213 » » » int32_t nCurSel = m_pWidget->GetSelectedIndex(0); | 230 } |
| 214 » » » if (nCurSel >= 0) | 231 |
| 215 » » » » fa.sValue = m_pWidget->GetOptionLabel(nCurSel); | 232 void CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) { |
| 216 » » } | 233 ASSERT(m_pWidget != NULL); |
| 217 » » break; | 234 |
| 218 » default: | 235 int nFlags = m_pWidget->GetFieldFlags(); |
| 219 » » break; | 236 |
| 220 » } | 237 if (nFlags & FIELDFLAG_COMMITONSELCHANGE) { |
| 221 } | 238 if (m_bValid) { |
| 222 | 239 CPDFSDK_PageView* pPageView = GetCurPageView(); |
| 223 | 240 ASSERT(pPageView != NULL); |
| 224 void CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AAct
ionType type, | 241 |
| 225 » » » » » » » » const PDFSDK_Fie
ldAction& fa) | 242 if (CommitData(pPageView, nFlag)) { |
| 226 { | 243 DestroyPDFWindow(pPageView); |
| 227 } | 244 m_bValid = FALSE; |
| 228 | 245 } |
| 229 void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView) | 246 } |
| 230 { | 247 } |
| 231 » ASSERT(pPageView != NULL); | 248 } |
| 232 | |
| 233 » if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALS
E)) | |
| 234 » { | |
| 235 » » for (int32_t i=0,sz=pListBox->GetCount(); i<sz; i++) | |
| 236 » » { | |
| 237 » » » if (pListBox->IsItemSelected(i)) | |
| 238 » » » { | |
| 239 » » » » m_State.Add(i); | |
| 240 » » » } | |
| 241 » » } | |
| 242 » } | |
| 243 } | |
| 244 | |
| 245 void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView) | |
| 246 { | |
| 247 » if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALS
E)) | |
| 248 » { | |
| 249 » » for (int i=0,sz=m_State.GetSize(); i<sz; i++) | |
| 250 » » » pListBox->Select(m_State[i]); | |
| 251 » } | |
| 252 } | |
| 253 | |
| 254 CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRes
toreValue) | |
| 255 { | |
| 256 » if (bRestoreValue) | |
| 257 » » SaveState(pPageView); | |
| 258 | |
| 259 » DestroyPDFWindow(pPageView); | |
| 260 | |
| 261 » CPWL_Wnd* pRet = NULL; | |
| 262 | |
| 263 » if (bRestoreValue) | |
| 264 » { | |
| 265 » » RestoreState(pPageView); | |
| 266 » » pRet = GetPDFWindow(pPageView, FALSE); | |
| 267 » } | |
| 268 » else | |
| 269 » » pRet = GetPDFWindow(pPageView, TRUE); | |
| 270 | |
| 271 » m_pWidget->UpdateField(); | |
| 272 | |
| 273 » return pRet; | |
| 274 } | |
| 275 | |
| 276 void CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag) | |
| 277 { | |
| 278 » ASSERT(m_pWidget != NULL); | |
| 279 | |
| 280 » int nFlags = m_pWidget->GetFieldFlags(); | |
| 281 | |
| 282 » if (nFlags & FIELDFLAG_COMMITONSELCHANGE) | |
| 283 » { | |
| 284 » » if (m_bValid) | |
| 285 » » { | |
| 286 » » » CPDFSDK_PageView* pPageView = GetCurPageView(); | |
| 287 » » » ASSERT(pPageView != NULL); | |
| 288 | |
| 289 » » » if (CommitData(pPageView, nFlag)) | |
| 290 » » » { | |
| 291 » » » » DestroyPDFWindow(pPageView); | |
| 292 » » » » m_bValid = FALSE; | |
| 293 » » » } | |
| 294 » » } | |
| 295 » } | |
| 296 } | |
| 297 | |
| OLD | NEW |