Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fdp / src / fde / fde_iterator.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../foxitlib.h"\r
8 #include "fde_iterator.h"\r
9 IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create()\r
10 {\r
11     return FDE_New CFDE_VisualSetIterator;\r
12 }\r
13 CFDE_VisualSetIterator::CFDE_VisualSetIterator()\r
14     : m_dwFilter(0)\r
15 {\r
16 }\r
17 CFDE_VisualSetIterator::~CFDE_VisualSetIterator()\r
18 {\r
19     m_CanvasStack.RemoveAll();\r
20 }\r
21 FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet *pCanvas)\r
22 {\r
23     FXSYS_assert(pCanvas != NULL);\r
24     m_CanvasStack.RemoveAll();\r
25     FDE_CANVASITEM canvas;\r
26     canvas.hCanvas = NULL;\r
27     canvas.pCanvas = pCanvas;\r
28     canvas.hPos = pCanvas->GetFirstPosition(NULL);\r
29     if (canvas.hPos == NULL) {\r
30         return FALSE;\r
31     }\r
32     return m_CanvasStack.Push(canvas) == 0;\r
33 }\r
34 FX_BOOL CFDE_VisualSetIterator::FilterObjects(FX_DWORD dwObjects )\r
35 {\r
36     if (m_CanvasStack.GetSize() == 0) {\r
37         return FALSE;\r
38     }\r
39     while (m_CanvasStack.GetSize() > 1) {\r
40         m_CanvasStack.Pop();\r
41     }\r
42     m_dwFilter = dwObjects & ~(FX_DWORD)FDE_VISUALOBJ_Widget;\r
43     if (dwObjects & FDE_VISUALOBJ_Widget) {\r
44         m_dwFilter |= 0xFF00;\r
45     }\r
46     FDE_LPCANVASITEM pCanvas = m_CanvasStack.GetTopElement();\r
47     FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);\r
48     pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL);\r
49     return pCanvas->hPos != NULL;\r
50 }\r
51 void CFDE_VisualSetIterator::Reset()\r
52 {\r
53     FilterObjects(m_dwFilter);\r
54 }\r
55 FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet *&pVisualSet, FDE_HVISUALOBJ *phCanvasObj , IFDE_CanvasSet **ppCanvasSet )\r
56 {\r
57     while (m_CanvasStack.GetSize() > 0) {\r
58         FDE_LPCANVASITEM pCanvas = m_CanvasStack.GetTopElement();\r
59         FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);\r
60         if (pCanvas->hPos == NULL) {\r
61             if (m_CanvasStack.GetSize() == 1) {\r
62                 break;\r
63             }\r
64             m_CanvasStack.Pop();\r
65             continue;\r
66         }\r
67         do {\r
68             FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(pCanvas->hCanvas, pCanvas->hPos, pVisualSet);\r
69             FXSYS_assert(hObj != NULL);\r
70             FDE_VISUALOBJTYPE eType = pVisualSet->GetType();\r
71             if (eType == FDE_VISUALOBJ_Canvas) {\r
72                 FDE_CANVASITEM canvas;\r
73                 canvas.hCanvas = hObj;\r
74                 canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet;\r
75                 canvas.hPos = canvas.pCanvas->GetFirstPosition(hObj);\r
76                 m_CanvasStack.Push(canvas);\r
77                 break;\r
78             }\r
79             FX_DWORD dwObj = (eType == FDE_VISUALOBJ_Widget)\r
80                              ? (FX_DWORD)((IFDE_WidgetSet*)pVisualSet)->GetWidgetType(hObj)\r
81                              : (FX_DWORD)eType;\r
82             if ((m_dwFilter & dwObj) != 0) {\r
83                 if (ppCanvasSet) {\r
84                     *ppCanvasSet = pCanvas->pCanvas;\r
85                 }\r
86                 if (phCanvasObj) {\r
87                     *phCanvasObj = pCanvas->hCanvas;\r
88                 }\r
89                 return hObj;\r
90             }\r
91         } while (pCanvas->hPos != NULL);\r
92     }\r
93     if (ppCanvasSet) {\r
94         *ppCanvasSet = NULL;\r
95     }\r
96     if (phCanvasObj) {\r
97         *phCanvasObj = NULL;\r
98     }\r
99     pVisualSet = NULL;\r
100     return NULL;\r
101 }\r