Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: xfa/fxfa/app/xfa_ffpageview.cpp

Issue 2648773003: Replace CXFA_StrokeArray and CXFA_WidgetArray with std::vector (Closed)
Patch Set: pass by pointer Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | xfa/fxfa/app/xfa_ffwidget.cpp » ('j') | xfa/fxfa/app/xfa_ffwidget.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/fxfa/xfa_ffpageview.h" 7 #include "xfa/fxfa/xfa_ffpageview.h"
8 8
9 #include <memory>
10 #include <vector>
11
12 #include "third_party/base/ptr_util.h"
13 #include "third_party/base/stl_util.h"
9 #include "xfa/fde/fde_render.h" 14 #include "xfa/fde/fde_render.h"
10 #include "xfa/fxfa/app/xfa_ffcheckbutton.h" 15 #include "xfa/fxfa/app/xfa_ffcheckbutton.h"
11 #include "xfa/fxfa/app/xfa_ffchoicelist.h" 16 #include "xfa/fxfa/app/xfa_ffchoicelist.h"
12 #include "xfa/fxfa/app/xfa_fffield.h" 17 #include "xfa/fxfa/app/xfa_fffield.h"
13 #include "xfa/fxfa/app/xfa_ffimageedit.h" 18 #include "xfa/fxfa/app/xfa_ffimageedit.h"
14 #include "xfa/fxfa/app/xfa_ffpushbutton.h" 19 #include "xfa/fxfa/app/xfa_ffpushbutton.h"
15 #include "xfa/fxfa/app/xfa_fftextedit.h" 20 #include "xfa/fxfa/app/xfa_fftextedit.h"
16 #include "xfa/fxfa/app/xfa_fwladapter.h" 21 #include "xfa/fxfa/app/xfa_fwladapter.h"
17 #include "xfa/fxfa/xfa_ffdoc.h" 22 #include "xfa/fxfa/xfa_ffdoc.h"
18 #include "xfa/fxfa/xfa_ffdocview.h" 23 #include "xfa/fxfa/xfa_ffdocview.h"
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 XFA_VERSION_205; 226 XFA_VERSION_205;
222 Reset(); 227 Reset();
223 } 228 }
224 229
225 CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {} 230 CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {}
226 231
227 void CXFA_FFTabOrderPageWidgetIterator::Reset() { 232 void CXFA_FFTabOrderPageWidgetIterator::Reset() {
228 CreateTabOrderWidgetArray(); 233 CreateTabOrderWidgetArray();
229 m_iCurWidget = -1; 234 m_iCurWidget = -1;
230 } 235 }
236
231 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() { 237 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() {
232 if (m_TabOrderWidgetArray.GetSize() > 0) { 238 for (int32_t i = 0;
233 for (int32_t i = 0; i < m_TabOrderWidgetArray.GetSize(); i++) { 239 i < pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) {
234 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, 240 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
235 m_bIgnorerelevant)) { 241 m_bIgnorerelevant)) {
236 m_iCurWidget = i; 242 m_iCurWidget = i;
237 return m_TabOrderWidgetArray[m_iCurWidget]; 243 return m_TabOrderWidgetArray[m_iCurWidget];
238 }
239 } 244 }
240 } 245 }
241 return nullptr; 246 return nullptr;
242 } 247 }
248
243 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() { 249 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() {
244 if (m_TabOrderWidgetArray.GetSize() > 0) { 250 if (!m_TabOrderWidgetArray.empty()) {
npm 2017/01/23 14:49:50 Do you need this if, or can it also be deleted?
Tom Sepez 2017/01/23 18:36:51 I kept it so that if we decide to go to signed ind
npm 2017/01/23 18:51:51 Won't it be -1, since you are using int? Also, why
Tom Sepez 2017/01/23 18:59:45 Fixed.
245 for (int32_t i = m_TabOrderWidgetArray.GetSize() - 1; i >= 0; i--) { 251 for (int32_t i = pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray) - 1;
252 i >= 0; i--) {
246 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, 253 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
247 m_bIgnorerelevant)) { 254 m_bIgnorerelevant)) {
248 m_iCurWidget = i; 255 m_iCurWidget = i;
249 return m_TabOrderWidgetArray[m_iCurWidget]; 256 return m_TabOrderWidgetArray[m_iCurWidget];
250 } 257 }
251 } 258 }
252 } 259 }
253 return nullptr; 260 return nullptr;
254 } 261 }
262
255 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() { 263 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() {
256 for (int32_t i = m_iCurWidget + 1; i < m_TabOrderWidgetArray.GetSize(); i++) { 264 for (int32_t i = m_iCurWidget + 1;
265 i < pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) {
257 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, 266 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
258 m_bIgnorerelevant)) { 267 m_bIgnorerelevant)) {
259 m_iCurWidget = i; 268 m_iCurWidget = i;
260 return m_TabOrderWidgetArray[m_iCurWidget]; 269 return m_TabOrderWidgetArray[m_iCurWidget];
261 } 270 }
262 } 271 }
263 m_iCurWidget = -1; 272 m_iCurWidget = -1;
264 return nullptr; 273 return nullptr;
265 } 274 }
275
266 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() { 276 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() {
267 for (int32_t i = m_iCurWidget - 1; i >= 0; i--) { 277 for (int32_t i = m_iCurWidget - 1; i >= 0; i--) {
268 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, 278 if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true,
269 m_bIgnorerelevant)) { 279 m_bIgnorerelevant)) {
270 m_iCurWidget = i; 280 m_iCurWidget = i;
271 return m_TabOrderWidgetArray[m_iCurWidget]; 281 return m_TabOrderWidgetArray[m_iCurWidget];
272 } 282 }
273 } 283 }
274 m_iCurWidget = -1; 284 m_iCurWidget = -1;
275 return nullptr; 285 return nullptr;
276 } 286 }
287
277 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() { 288 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() {
278 if (m_iCurWidget >= 0) { 289 return m_iCurWidget >= 0 ? m_TabOrderWidgetArray[m_iCurWidget] : nullptr;
279 return m_TabOrderWidgetArray[m_iCurWidget];
280 }
281 return nullptr;
282 } 290 }
291
283 bool CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget( 292 bool CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget(
284 CXFA_FFWidget* hWidget) { 293 CXFA_FFWidget* hWidget) {
285 int32_t iWidgetIndex = m_TabOrderWidgetArray.Find(hWidget); 294 auto it = std::find(m_TabOrderWidgetArray.begin(),
286 if (iWidgetIndex >= 0) { 295 m_TabOrderWidgetArray.end(), hWidget);
287 m_iCurWidget = iWidgetIndex; 296 if (it == m_TabOrderWidgetArray.end())
288 return true; 297 return false;
289 } 298
290 return false; 299 m_iCurWidget = it - m_TabOrderWidgetArray.begin();
300 return true;
291 } 301 }
302
292 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget( 303 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget(
293 CXFA_FFWidget* pWidget) { 304 CXFA_FFWidget* pWidget) {
294 CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc(); 305 CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc();
295 CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_Element::Traversal); 306 CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_Element::Traversal);
296 if (pTraversal) { 307 if (pTraversal) {
297 CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_Element::Traverse); 308 CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_Element::Traverse);
298 if (pTraverse) { 309 if (pTraverse) {
299 CFX_WideString wsTraverseWidgetName; 310 CFX_WideString wsTraverseWidgetName;
300 if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) { 311 if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) {
301 return FindWidgetByName(wsTraverseWidgetName, pWidget); 312 return FindWidgetByName(wsTraverseWidgetName, pWidget);
302 } 313 }
303 } 314 }
304 } 315 }
305 return nullptr; 316 return nullptr;
306 } 317 }
307 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName( 318 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName(
308 const CFX_WideString& wsWidgetName, 319 const CFX_WideString& wsWidgetName,
309 CXFA_FFWidget* pRefWidget) { 320 CXFA_FFWidget* pRefWidget) {
310 return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget); 321 return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget);
311 } 322 }
323
312 void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() { 324 void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() {
313 m_TabOrderWidgetArray.RemoveAll(); 325 m_TabOrderWidgetArray.clear();
314 CXFA_WidgetArray SpaceOrderWidgetArray; 326
315 CreateSpaceOrderWidgetArray(SpaceOrderWidgetArray); 327 std::vector<CXFA_FFWidget*> SpaceOrderWidgetArray;
316 int32_t nWidgetCount = SpaceOrderWidgetArray.GetSize(); 328 CreateSpaceOrderWidgetArray(&SpaceOrderWidgetArray);
317 if (nWidgetCount < 1) { 329 if (SpaceOrderWidgetArray.empty())
318 return; 330 return;
319 } 331
332 int32_t nWidgetCount = pdfium::CollectionSize<int32_t>(SpaceOrderWidgetArray);
320 CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0]; 333 CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0];
321 for (; m_TabOrderWidgetArray.GetSize() < nWidgetCount;) { 334 while (pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray) <
322 if (m_TabOrderWidgetArray.Find(hWidget) < 0) { 335 nWidgetCount) {
323 m_TabOrderWidgetArray.Add(hWidget); 336 if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) {
337 m_TabOrderWidgetArray.push_back(hWidget);
324 CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc(); 338 CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
325 if (pWidgetAcc->GetUIType() == XFA_Element::ExclGroup) { 339 if (pWidgetAcc->GetUIType() == XFA_Element::ExclGroup) {
326 int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget) + 1; 340 auto it = std::find(SpaceOrderWidgetArray.begin(),
341 SpaceOrderWidgetArray.end(), hWidget);
342 int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end()
343 ? it - SpaceOrderWidgetArray.begin() + 1
344 : 0;
327 while (true) { 345 while (true) {
328 CXFA_FFWidget* pRadio = 346 CXFA_FFWidget* pRadio =
329 SpaceOrderWidgetArray[(iWidgetIndex) % nWidgetCount]; 347 SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount];
330 if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) { 348 if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) {
331 break; 349 break;
332 } 350 }
333 if (m_TabOrderWidgetArray.Find(hWidget) < 0) { 351 if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) {
334 m_TabOrderWidgetArray.Add(pRadio); 352 m_TabOrderWidgetArray.push_back(pRadio);
335 } 353 }
336 iWidgetIndex++; 354 iWidgetIndex++;
337 } 355 }
338 } 356 }
339 if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) { 357 if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) {
340 hWidget = hTraverseWidget; 358 hWidget = hTraverseWidget;
341 continue; 359 continue;
342 } 360 }
343 } 361 }
344 int32_t iWidgetIndex = SpaceOrderWidgetArray.Find(hWidget); 362 auto it = std::find(SpaceOrderWidgetArray.begin(),
345 hWidget = SpaceOrderWidgetArray[(iWidgetIndex + 1) % nWidgetCount]; 363 SpaceOrderWidgetArray.end(), hWidget);
364 int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end()
365 ? it - SpaceOrderWidgetArray.begin() + 1
366 : 0;
367 hWidget = SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount];
346 } 368 }
347 } 369 }
370
348 static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1, 371 static int32_t XFA_TabOrderWidgetComparator(const void* phWidget1,
349 const void* phWidget2) { 372 const void* phWidget2) {
350 CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget; 373 CXFA_FFWidget* pWidget1 = (*(CXFA_TabParam**)phWidget1)->m_pWidget;
351 CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget; 374 CXFA_FFWidget* pWidget2 = (*(CXFA_TabParam**)phWidget2)->m_pWidget;
352 CFX_RectF rt1, rt2; 375 CFX_RectF rt1, rt2;
353 pWidget1->GetWidgetRect(rt1); 376 pWidget1->GetWidgetRect(rt1);
354 pWidget2->GetWidgetRect(rt2); 377 pWidget2->GetWidgetRect(rt2);
355 FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top; 378 FX_FLOAT x1 = rt1.left, y1 = rt1.top, x2 = rt2.left, y2 = rt2.top;
356 if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) { 379 if (y1 < y2 || (y1 - y2 < XFA_FLOAT_PERCISION && x1 < x2)) {
357 return -1; 380 return -1;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 } else { 423 } else {
401 pSearchItem = sIterator->MoveToNext(); 424 pSearchItem = sIterator->MoveToNext();
402 } 425 }
403 } 426 }
404 int32_t iChildren = tabParams.GetSize(); 427 int32_t iChildren = tabParams.GetSize();
405 if (iChildren > 1) { 428 if (iChildren > 1) {
406 FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*), 429 FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*),
407 XFA_TabOrderWidgetComparator); 430 XFA_TabOrderWidgetComparator);
408 } 431 }
409 for (int32_t iStart = 0; iStart < iChildren; iStart++) { 432 for (int32_t iStart = 0; iStart < iChildren; iStart++) {
410 CXFA_TabParam* pParam = tabParams[iStart]; 433 std::unique_ptr<CXFA_TabParam> pParam(tabParams[iStart]);
411 pContainer->m_Children.Add(pParam->m_pWidget); 434 pContainer->m_Children.push_back(pParam->m_pWidget);
412 if (pParam->m_Children.GetSize() > 0) { 435 pContainer->m_Children.insert(pContainer->m_Children.end(),
413 pContainer->m_Children.Append(pParam->m_Children); 436 pParam->m_Children.begin(),
414 } 437 pParam->m_Children.end());
415 delete pParam;
416 } 438 }
417 tabParams.RemoveAll(); 439 tabParams.RemoveAll();
418 } 440 }
419 void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray( 441 void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray(
420 CXFA_WidgetArray& WidgetArray) { 442 std::vector<CXFA_FFWidget*>* WidgetArray) {
421 CXFA_LayoutItemIterator sIterator; 443 CXFA_LayoutItemIterator sIterator;
422 sIterator.Init(m_pPageView); 444 sIterator.Init(m_pPageView);
423 CXFA_TabParam* pParam = new CXFA_TabParam; 445 auto pParam = pdfium::MakeUnique<CXFA_TabParam>();
424 bool bCurrentItem = false; 446 bool bCurrentItem = false;
425 bool bContentArea = false; 447 bool bContentArea = false;
426 OrderContainer(&sIterator, nullptr, pParam, bCurrentItem, bContentArea); 448 OrderContainer(&sIterator, nullptr, pParam.get(), bCurrentItem, bContentArea);
427 if (pParam->m_Children.GetSize() > 0) { 449 WidgetArray->insert(WidgetArray->end(), pParam->m_Children.begin(),
428 WidgetArray.Append(pParam->m_Children); 450 pParam->m_Children.end());
429 } 451
430 sIterator.Reset(); 452 sIterator.Reset();
431 bCurrentItem = false; 453 bCurrentItem = false;
432 bContentArea = false; 454 bContentArea = false;
433 pParam->m_Children.RemoveAll(); 455 pParam->m_Children.clear();
434 OrderContainer(&sIterator, nullptr, pParam, bCurrentItem, bContentArea, true); 456 OrderContainer(&sIterator, nullptr, pParam.get(), bCurrentItem, bContentArea,
435 if (pParam->m_Children.GetSize() > 0) { 457 true);
436 WidgetArray.Append(pParam->m_Children); 458 WidgetArray->insert(WidgetArray->end(), pParam->m_Children.begin(),
437 } 459 pParam->m_Children.end());
438 delete pParam;
439 } 460 }
461
440 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget( 462 CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget(
441 CXFA_LayoutItem* pLayoutItem) { 463 CXFA_LayoutItem* pLayoutItem) {
442 if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) { 464 if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) {
443 if (!pWidget->IsLoaded() && 465 if (!pWidget->IsLoaded() &&
444 (pWidget->GetStatus() & XFA_WidgetStatus_Visible)) { 466 (pWidget->GetStatus() & XFA_WidgetStatus_Visible)) {
445 pWidget->LoadWidget(); 467 pWidget->LoadWidget();
446 } 468 }
447 return pWidget; 469 return pWidget;
448 } 470 }
449 return nullptr; 471 return nullptr;
450 } 472 }
451 473
452 CXFA_TabParam::CXFA_TabParam() : m_pWidget(nullptr) {} 474 CXFA_TabParam::CXFA_TabParam() : m_pWidget(nullptr) {}
453 475
454 CXFA_TabParam::~CXFA_TabParam() {} 476 CXFA_TabParam::~CXFA_TabParam() {}
OLDNEW
« no previous file with comments | « no previous file | xfa/fxfa/app/xfa_ffwidget.cpp » ('j') | xfa/fxfa/app/xfa_ffwidget.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698