summaryrefslogtreecommitdiff
path: root/xfa/src/fdp/src/fde/fde_iterator.cpp
blob: e49fdafe95becb7293e516c41544671dd0830531 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../../../foxitlib.h"
#include "fde_iterator.h"
IFDE_VisualSetIterator* IFDE_VisualSetIterator::Create()
{
    return new CFDE_VisualSetIterator;
}
CFDE_VisualSetIterator::CFDE_VisualSetIterator()
    : m_dwFilter(0)
{
}
CFDE_VisualSetIterator::~CFDE_VisualSetIterator()
{
    m_CanvasStack.RemoveAll();
}
FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet *pCanvas)
{
    FXSYS_assert(pCanvas != NULL);
    m_CanvasStack.RemoveAll();
    FDE_CANVASITEM canvas;
    canvas.hCanvas = NULL;
    canvas.pCanvas = pCanvas;
    canvas.hPos = pCanvas->GetFirstPosition(NULL);
    if (canvas.hPos == NULL) {
        return FALSE;
    }
    return m_CanvasStack.Push(canvas) == 0;
}
FX_BOOL CFDE_VisualSetIterator::FilterObjects(FX_DWORD dwObjects )
{
    if (m_CanvasStack.GetSize() == 0) {
        return FALSE;
    }
    while (m_CanvasStack.GetSize() > 1) {
        m_CanvasStack.Pop();
    }
    m_dwFilter = dwObjects & ~(FX_DWORD)FDE_VISUALOBJ_Widget;
    if (dwObjects & FDE_VISUALOBJ_Widget) {
        m_dwFilter |= 0xFF00;
    }
    FDE_LPCANVASITEM pCanvas = m_CanvasStack.GetTopElement();
    FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
    pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition(NULL);
    return pCanvas->hPos != NULL;
}
void CFDE_VisualSetIterator::Reset()
{
    FilterObjects(m_dwFilter);
}
FDE_HVISUALOBJ CFDE_VisualSetIterator::GetNext(IFDE_VisualSet *&pVisualSet, FDE_HVISUALOBJ *phCanvasObj , IFDE_CanvasSet **ppCanvasSet )
{
    while (m_CanvasStack.GetSize() > 0) {
        FDE_LPCANVASITEM pCanvas = m_CanvasStack.GetTopElement();
        FXSYS_assert(pCanvas != NULL && pCanvas->pCanvas != NULL);
        if (pCanvas->hPos == NULL) {
            if (m_CanvasStack.GetSize() == 1) {
                break;
            }
            m_CanvasStack.Pop();
            continue;
        }
        do {
            FDE_HVISUALOBJ hObj = pCanvas->pCanvas->GetNext(pCanvas->hCanvas, pCanvas->hPos, pVisualSet);
            FXSYS_assert(hObj != NULL);
            FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
            if (eType == FDE_VISUALOBJ_Canvas) {
                FDE_CANVASITEM canvas;
                canvas.hCanvas = hObj;
                canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet;
                canvas.hPos = canvas.pCanvas->GetFirstPosition(hObj);
                m_CanvasStack.Push(canvas);
                break;
            }
            FX_DWORD dwObj = (eType == FDE_VISUALOBJ_Widget)
                             ? (FX_DWORD)((IFDE_WidgetSet*)pVisualSet)->GetWidgetType(hObj)
                             : (FX_DWORD)eType;
            if ((m_dwFilter & dwObj) != 0) {
                if (ppCanvasSet) {
                    *ppCanvasSet = pCanvas->pCanvas;
                }
                if (phCanvasObj) {
                    *phCanvasObj = pCanvas->hCanvas;
                }
                return hObj;
            }
        } while (pCanvas->hPos != NULL);
    }
    if (ppCanvasSet) {
        *ppCanvasSet = NULL;
    }
    if (phCanvasObj) {
        *phCanvasObj = NULL;
    }
    pVisualSet = NULL;
    return NULL;
}