Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 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 | |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 7 | #include "xfa/fxfa/cxfa_ffpageview.h" |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 8 | |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 9 | #include <algorithm> |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 10 | #include <memory> |
| 11 | #include <vector> |
| 12 | |
| 13 | #include "third_party/base/ptr_util.h" |
| 14 | #include "third_party/base/stl_util.h" |
Dan Sinclair | 24ef633 | 2017-07-24 10:52:57 -0400 | [diff] [blame] | 15 | #include "xfa/fxfa/cxfa_ffcheckbutton.h" |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 16 | #include "xfa/fxfa/cxfa_ffdoc.h" |
| 17 | #include "xfa/fxfa/cxfa_ffdocview.h" |
Dan Sinclair | 24ef633 | 2017-07-24 10:52:57 -0400 | [diff] [blame] | 18 | #include "xfa/fxfa/cxfa_fffield.h" |
| 19 | #include "xfa/fxfa/cxfa_ffimageedit.h" |
| 20 | #include "xfa/fxfa/cxfa_ffpushbutton.h" |
Dan Sinclair | 80c4878 | 2017-03-23 12:11:20 -0400 | [diff] [blame] | 21 | #include "xfa/fxfa/cxfa_ffwidget.h" |
Dan Sinclair | 24ef633 | 2017-07-24 10:52:57 -0400 | [diff] [blame] | 22 | #include "xfa/fxfa/cxfa_fwladapterwidgetmgr.h" |
Dan Sinclair | efcae5d | 2017-03-29 14:47:46 -0400 | [diff] [blame] | 23 | #include "xfa/fxfa/parser/cxfa_node.h" |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 24 | |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 25 | namespace { |
| 26 | |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 27 | CFX_Matrix GetPageMatrix(const CFX_RectF& docPageRect, |
| 28 | const CFX_Rect& devicePageRect, |
| 29 | int32_t iRotate, |
| 30 | uint32_t dwCoordinatesType) { |
dsinclair | 43854a5 | 2016-04-27 12:26:00 -0700 | [diff] [blame] | 31 | ASSERT(iRotate >= 0 && iRotate <= 3); |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 32 | |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 33 | bool bFlipX = (dwCoordinatesType & 0x01) != 0; |
| 34 | bool bFlipY = (dwCoordinatesType & 0x02) != 0; |
Dan Sinclair | bba2a7c | 2017-02-07 16:36:39 -0500 | [diff] [blame] | 35 | CFX_Matrix m((bFlipX ? -1.0f : 1.0f), 0, 0, (bFlipY ? -1.0f : 1.0f), 0, 0); |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 36 | if (iRotate == 0 || iRotate == 2) { |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 37 | m.a *= (float)devicePageRect.width / docPageRect.width; |
| 38 | m.d *= (float)devicePageRect.height / docPageRect.height; |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 39 | } else { |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 40 | m.a *= (float)devicePageRect.height / docPageRect.width; |
| 41 | m.d *= (float)devicePageRect.width / docPageRect.height; |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 42 | } |
| 43 | m.Rotate(iRotate * 1.57079632675f); |
| 44 | switch (iRotate) { |
| 45 | case 0: |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 46 | m.e = bFlipX ? (float)devicePageRect.right() : (float)devicePageRect.left; |
| 47 | m.f = bFlipY ? (float)devicePageRect.bottom() : (float)devicePageRect.top; |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 48 | break; |
| 49 | case 1: |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 50 | m.e = bFlipY ? (float)devicePageRect.left : (float)devicePageRect.right(); |
| 51 | m.f = bFlipX ? (float)devicePageRect.bottom() : (float)devicePageRect.top; |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 52 | break; |
| 53 | case 2: |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 54 | m.e = bFlipX ? (float)devicePageRect.left : (float)devicePageRect.right(); |
| 55 | m.f = bFlipY ? (float)devicePageRect.top : (float)devicePageRect.bottom(); |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 56 | break; |
| 57 | case 3: |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 58 | m.e = bFlipY ? (float)devicePageRect.right() : (float)devicePageRect.left; |
| 59 | m.f = bFlipX ? (float)devicePageRect.top : (float)devicePageRect.bottom(); |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 60 | break; |
| 61 | default: |
| 62 | break; |
| 63 | } |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 64 | return m; |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 65 | } |
| 66 | |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 67 | bool PageWidgetFilter(CXFA_FFWidget* pWidget, |
| 68 | uint32_t dwFilter, |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 69 | bool bTraversal, |
| 70 | bool bIgnorerelevant) { |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 71 | CXFA_WidgetAcc* pWidgetAcc = pWidget->GetDataAcc(); |
| 72 | |
| 73 | if (!!(dwFilter & XFA_WidgetStatus_Focused) && |
dsinclair | 070fcdf | 2016-06-22 22:04:54 -0700 | [diff] [blame] | 74 | pWidgetAcc->GetElementType() != XFA_Element::Field) { |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 75 | return false; |
| 76 | } |
| 77 | |
| 78 | uint32_t dwStatus = pWidget->GetStatus(); |
| 79 | if (bTraversal && (dwStatus & XFA_WidgetStatus_Disabled)) |
| 80 | return false; |
| 81 | if (bIgnorerelevant) |
| 82 | return !!(dwStatus & XFA_WidgetStatus_Visible); |
| 83 | |
| 84 | dwFilter &= (XFA_WidgetStatus_Visible | XFA_WidgetStatus_Viewable | |
| 85 | XFA_WidgetStatus_Printable); |
| 86 | return (dwFilter & dwStatus) == dwFilter; |
| 87 | } |
| 88 | |
dsinclair | d1cf239 | 2016-07-11 06:46:59 -0700 | [diff] [blame] | 89 | bool IsLayoutElement(XFA_Element eElement, bool bLayoutContainer) { |
| 90 | switch (eElement) { |
| 91 | case XFA_Element::Draw: |
| 92 | case XFA_Element::Field: |
| 93 | case XFA_Element::InstanceManager: |
| 94 | return !bLayoutContainer; |
| 95 | case XFA_Element::Area: |
| 96 | case XFA_Element::Subform: |
| 97 | case XFA_Element::ExclGroup: |
| 98 | case XFA_Element::SubformSet: |
| 99 | case XFA_Element::PageArea: |
| 100 | case XFA_Element::Form: |
| 101 | return true; |
| 102 | default: |
| 103 | return false; |
| 104 | } |
| 105 | } |
| 106 | |
dsinclair | acd0d59 | 2016-04-21 11:06:27 -0700 | [diff] [blame] | 107 | } // namespace |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 108 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 109 | CXFA_FFPageView::CXFA_FFPageView(CXFA_FFDocView* pDocView, CXFA_Node* pPageArea) |
thestig | 9f3dbbc | 2016-04-13 13:18:21 -0700 | [diff] [blame] | 110 | : CXFA_ContainerLayoutItem(pPageArea), m_pDocView(pDocView) {} |
| 111 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 112 | CXFA_FFPageView::~CXFA_FFPageView() {} |
thestig | 9f3dbbc | 2016-04-13 13:18:21 -0700 | [diff] [blame] | 113 | |
| 114 | CXFA_FFDocView* CXFA_FFPageView::GetDocView() const { |
Tom Sepez | 797ca5c | 2017-05-25 12:03:18 -0700 | [diff] [blame] | 115 | return m_pDocView.Get(); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 116 | } |
thestig | 9f3dbbc | 2016-04-13 13:18:21 -0700 | [diff] [blame] | 117 | |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 118 | CFX_RectF CXFA_FFPageView::GetPageViewRect() const { |
| 119 | return CFX_RectF(0, 0, GetPageSize()); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 120 | } |
dsinclair | 0b851ff | 2016-07-21 12:03:01 -0700 | [diff] [blame] | 121 | |
Dan Sinclair | 1b08df1 | 2017-02-09 09:17:20 -0500 | [diff] [blame] | 122 | CFX_Matrix CXFA_FFPageView::GetDisplayMatrix(const CFX_Rect& rtDisp, |
| 123 | int32_t iRotate) const { |
| 124 | return GetPageMatrix(CFX_RectF(0, 0, GetPageSize()), rtDisp, iRotate, 0); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 125 | } |
thestig | 9f3dbbc | 2016-04-13 13:18:21 -0700 | [diff] [blame] | 126 | |
Tom Sepez | 40badde | 2017-05-01 13:21:39 -0700 | [diff] [blame] | 127 | std::unique_ptr<IXFA_WidgetIterator> CXFA_FFPageView::CreateWidgetIterator( |
tsepez | 736f28a | 2016-03-25 14:19:51 -0700 | [diff] [blame] | 128 | uint32_t dwTraverseWay, |
| 129 | uint32_t dwWidgetFilter) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 130 | switch (dwTraverseWay) { |
| 131 | case XFA_TRAVERSEWAY_Tranvalse: |
Tom Sepez | 40badde | 2017-05-01 13:21:39 -0700 | [diff] [blame] | 132 | return pdfium::MakeUnique<CXFA_FFTabOrderPageWidgetIterator>( |
| 133 | this, dwWidgetFilter); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 134 | case XFA_TRAVERSEWAY_Form: |
Tom Sepez | 40badde | 2017-05-01 13:21:39 -0700 | [diff] [blame] | 135 | return pdfium::MakeUnique<CXFA_FFPageWidgetIterator>(this, |
| 136 | dwWidgetFilter); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 137 | } |
thestig | 9f3dbbc | 2016-04-13 13:18:21 -0700 | [diff] [blame] | 138 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 139 | } |
thestig | 9f3dbbc | 2016-04-13 13:18:21 -0700 | [diff] [blame] | 140 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 141 | CXFA_FFPageWidgetIterator::CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, |
Tom Sepez | 312ce17 | 2017-03-06 14:00:07 -0800 | [diff] [blame] | 142 | uint32_t dwFilter) |
| 143 | : m_pPageView(pPageView), m_dwFilter(dwFilter), m_sIterator(pPageView) { |
tsepez | 20d6b76 | 2016-06-09 11:46:16 -0700 | [diff] [blame] | 144 | m_bIgnorerelevant = |
| 145 | m_pPageView->GetDocView()->GetDoc()->GetXFADoc()->GetCurVersionMode() < |
| 146 | XFA_VERSION_205; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 147 | } |
Tom Sepez | 312ce17 | 2017-03-06 14:00:07 -0800 | [diff] [blame] | 148 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 149 | CXFA_FFPageWidgetIterator::~CXFA_FFPageWidgetIterator() {} |
Tom Sepez | 312ce17 | 2017-03-06 14:00:07 -0800 | [diff] [blame] | 150 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 151 | void CXFA_FFPageWidgetIterator::Reset() { |
| 152 | m_sIterator.Reset(); |
| 153 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 154 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 155 | CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToFirst() { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 156 | m_sIterator.Reset(); |
| 157 | for (CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); pLayoutItem; |
| 158 | pLayoutItem = m_sIterator.MoveToNext()) { |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 159 | if (CXFA_FFWidget* hWidget = GetWidget(pLayoutItem)) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 160 | return hWidget; |
| 161 | } |
| 162 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 163 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 164 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 165 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 166 | CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToLast() { |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 167 | m_sIterator.SetCurrent(nullptr); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 168 | return MoveToPrevious(); |
| 169 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 170 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 171 | CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToNext() { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 172 | for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToNext(); pLayoutItem; |
| 173 | pLayoutItem = m_sIterator.MoveToNext()) { |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 174 | if (CXFA_FFWidget* hWidget = GetWidget(pLayoutItem)) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 175 | return hWidget; |
| 176 | } |
| 177 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 178 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 179 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 180 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 181 | CXFA_FFWidget* CXFA_FFPageWidgetIterator::MoveToPrevious() { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 182 | for (CXFA_LayoutItem* pLayoutItem = m_sIterator.MoveToPrev(); pLayoutItem; |
| 183 | pLayoutItem = m_sIterator.MoveToPrev()) { |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 184 | if (CXFA_FFWidget* hWidget = GetWidget(pLayoutItem)) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 185 | return hWidget; |
| 186 | } |
| 187 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 188 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 189 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 190 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 191 | CXFA_FFWidget* CXFA_FFPageWidgetIterator::GetCurrentWidget() { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 192 | CXFA_LayoutItem* pLayoutItem = m_sIterator.GetCurrent(); |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 193 | return pLayoutItem ? XFA_GetWidgetFromLayoutItem(pLayoutItem) : nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 194 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 195 | |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 196 | bool CXFA_FFPageWidgetIterator::SetCurrentWidget(CXFA_FFWidget* hWidget) { |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 197 | return hWidget && m_sIterator.SetCurrent(hWidget); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 198 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 199 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 200 | CXFA_FFWidget* CXFA_FFPageWidgetIterator::GetWidget( |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 201 | CXFA_LayoutItem* pLayoutItem) { |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 202 | CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem); |
| 203 | if (!pWidget) |
| 204 | return nullptr; |
| 205 | |
| 206 | if (!PageWidgetFilter(pWidget, m_dwFilter, false, m_bIgnorerelevant)) |
| 207 | return nullptr; |
| 208 | |
| 209 | if (!pWidget->IsLoaded() && |
| 210 | !!(pWidget->GetStatus() & XFA_WidgetStatus_Visible)) { |
Ryan Harrison | 73bed4e | 2017-09-22 10:53:34 -0400 | [diff] [blame] | 211 | if (!pWidget->LoadWidget()) |
| 212 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 213 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 214 | return pWidget; |
| 215 | } |
| 216 | |
| 217 | void CXFA_TabParam::AppendTabParam(CXFA_TabParam* pParam) { |
| 218 | m_Children.push_back(pParam->GetWidget()); |
| 219 | m_Children.insert(m_Children.end(), pParam->GetChildren().begin(), |
| 220 | pParam->GetChildren().end()); |
| 221 | } |
| 222 | |
| 223 | void CXFA_TabParam::ClearChildren() { |
| 224 | m_Children.clear(); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 225 | } |
tsepez | cc4d6d8 | 2016-05-16 13:21:03 -0700 | [diff] [blame] | 226 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 227 | CXFA_FFTabOrderPageWidgetIterator::CXFA_FFTabOrderPageWidgetIterator( |
| 228 | CXFA_FFPageView* pPageView, |
tsepez | 736f28a | 2016-03-25 14:19:51 -0700 | [diff] [blame] | 229 | uint32_t dwFilter) |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 230 | : m_pPageView(pPageView), m_dwFilter(dwFilter), m_iCurWidget(-1) { |
tsepez | 20d6b76 | 2016-06-09 11:46:16 -0700 | [diff] [blame] | 231 | m_bIgnorerelevant = |
| 232 | m_pPageView->GetDocView()->GetDoc()->GetXFADoc()->GetCurVersionMode() < |
| 233 | XFA_VERSION_205; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 234 | Reset(); |
| 235 | } |
tsepez | cc4d6d8 | 2016-05-16 13:21:03 -0700 | [diff] [blame] | 236 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 237 | CXFA_FFTabOrderPageWidgetIterator::~CXFA_FFTabOrderPageWidgetIterator() {} |
tsepez | cc4d6d8 | 2016-05-16 13:21:03 -0700 | [diff] [blame] | 238 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 239 | void CXFA_FFTabOrderPageWidgetIterator::Reset() { |
| 240 | CreateTabOrderWidgetArray(); |
| 241 | m_iCurWidget = -1; |
| 242 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 243 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 244 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToFirst() { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 245 | for (int32_t i = 0; |
| 246 | i < pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) { |
| 247 | if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, |
| 248 | m_bIgnorerelevant)) { |
| 249 | m_iCurWidget = i; |
| 250 | return m_TabOrderWidgetArray[m_iCurWidget]; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 251 | } |
| 252 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 253 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 254 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 255 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 256 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToLast() { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 257 | for (int32_t i = pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray) - 1; |
| 258 | i >= 0; i--) { |
| 259 | if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, |
| 260 | m_bIgnorerelevant)) { |
| 261 | m_iCurWidget = i; |
| 262 | return m_TabOrderWidgetArray[m_iCurWidget]; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 263 | } |
| 264 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 265 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 266 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 267 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 268 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToNext() { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 269 | for (int32_t i = m_iCurWidget + 1; |
| 270 | i < pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray); i++) { |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 271 | if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 272 | m_bIgnorerelevant)) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 273 | m_iCurWidget = i; |
| 274 | return m_TabOrderWidgetArray[m_iCurWidget]; |
| 275 | } |
| 276 | } |
| 277 | m_iCurWidget = -1; |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 278 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 279 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 280 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 281 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::MoveToPrevious() { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 282 | for (int32_t i = m_iCurWidget - 1; i >= 0; i--) { |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 283 | if (PageWidgetFilter(m_TabOrderWidgetArray[i], m_dwFilter, true, |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 284 | m_bIgnorerelevant)) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 285 | m_iCurWidget = i; |
| 286 | return m_TabOrderWidgetArray[m_iCurWidget]; |
| 287 | } |
| 288 | } |
| 289 | m_iCurWidget = -1; |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 290 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 291 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 292 | |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 293 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetCurrentWidget() { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 294 | return m_iCurWidget >= 0 ? m_TabOrderWidgetArray[m_iCurWidget] : nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 295 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 296 | |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 297 | bool CXFA_FFTabOrderPageWidgetIterator::SetCurrentWidget( |
dsinclair | df4bc59 | 2016-03-31 20:34:43 -0700 | [diff] [blame] | 298 | CXFA_FFWidget* hWidget) { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 299 | auto it = std::find(m_TabOrderWidgetArray.begin(), |
| 300 | m_TabOrderWidgetArray.end(), hWidget); |
| 301 | if (it == m_TabOrderWidgetArray.end()) |
| 302 | return false; |
| 303 | |
| 304 | m_iCurWidget = it - m_TabOrderWidgetArray.begin(); |
| 305 | return true; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 306 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 307 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 308 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetTraverseWidget( |
| 309 | CXFA_FFWidget* pWidget) { |
| 310 | CXFA_WidgetAcc* pAcc = pWidget->GetDataAcc(); |
dsinclair | 56a8b19 | 2016-06-21 14:15:25 -0700 | [diff] [blame] | 311 | CXFA_Node* pTraversal = pAcc->GetNode()->GetChild(0, XFA_Element::Traversal); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 312 | if (pTraversal) { |
dsinclair | 56a8b19 | 2016-06-21 14:15:25 -0700 | [diff] [blame] | 313 | CXFA_Node* pTraverse = pTraversal->GetChild(0, XFA_Element::Traverse); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 314 | if (pTraverse) { |
Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 315 | WideString wsTraverseWidgetName; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 316 | if (pTraverse->GetAttribute(XFA_ATTRIBUTE_Ref, wsTraverseWidgetName)) { |
tsepez | 70c5520 | 2016-04-14 15:32:35 -0700 | [diff] [blame] | 317 | return FindWidgetByName(wsTraverseWidgetName, pWidget); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 318 | } |
| 319 | } |
| 320 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 321 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 322 | } |
| 323 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::FindWidgetByName( |
Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 324 | const WideString& wsWidgetName, |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 325 | CXFA_FFWidget* pRefWidget) { |
| 326 | return pRefWidget->GetDocView()->GetWidgetByName(wsWidgetName, pRefWidget); |
| 327 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 328 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 329 | void CXFA_FFTabOrderPageWidgetIterator::CreateTabOrderWidgetArray() { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 330 | m_TabOrderWidgetArray.clear(); |
| 331 | |
| 332 | std::vector<CXFA_FFWidget*> SpaceOrderWidgetArray; |
| 333 | CreateSpaceOrderWidgetArray(&SpaceOrderWidgetArray); |
| 334 | if (SpaceOrderWidgetArray.empty()) |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 335 | return; |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 336 | |
| 337 | int32_t nWidgetCount = pdfium::CollectionSize<int32_t>(SpaceOrderWidgetArray); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 338 | CXFA_FFWidget* hWidget = SpaceOrderWidgetArray[0]; |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 339 | while (pdfium::CollectionSize<int32_t>(m_TabOrderWidgetArray) < |
| 340 | nWidgetCount) { |
| 341 | if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) { |
| 342 | m_TabOrderWidgetArray.push_back(hWidget); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 343 | CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc(); |
dsinclair | 56a8b19 | 2016-06-21 14:15:25 -0700 | [diff] [blame] | 344 | if (pWidgetAcc->GetUIType() == XFA_Element::ExclGroup) { |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 345 | auto it = std::find(SpaceOrderWidgetArray.begin(), |
| 346 | SpaceOrderWidgetArray.end(), hWidget); |
| 347 | int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end() |
| 348 | ? it - SpaceOrderWidgetArray.begin() + 1 |
| 349 | : 0; |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 350 | while (true) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 351 | CXFA_FFWidget* pRadio = |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 352 | SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount]; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 353 | if (pRadio->GetDataAcc()->GetExclGroup() != pWidgetAcc) { |
| 354 | break; |
| 355 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 356 | if (!pdfium::ContainsValue(m_TabOrderWidgetArray, hWidget)) { |
| 357 | m_TabOrderWidgetArray.push_back(pRadio); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 358 | } |
| 359 | iWidgetIndex++; |
| 360 | } |
| 361 | } |
| 362 | if (CXFA_FFWidget* hTraverseWidget = GetTraverseWidget(hWidget)) { |
| 363 | hWidget = hTraverseWidget; |
| 364 | continue; |
| 365 | } |
| 366 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 367 | auto it = std::find(SpaceOrderWidgetArray.begin(), |
| 368 | SpaceOrderWidgetArray.end(), hWidget); |
| 369 | int32_t iWidgetIndex = it != SpaceOrderWidgetArray.end() |
| 370 | ? it - SpaceOrderWidgetArray.begin() + 1 |
| 371 | : 0; |
| 372 | hWidget = SpaceOrderWidgetArray[iWidgetIndex % nWidgetCount]; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 373 | } |
| 374 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 375 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 376 | void CXFA_FFTabOrderPageWidgetIterator::OrderContainer( |
| 377 | CXFA_LayoutItemIterator* sIterator, |
| 378 | CXFA_LayoutItem* pContainerItem, |
| 379 | CXFA_TabParam* pContainer, |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 380 | bool& bCurrentItem, |
| 381 | bool& bContentArea, |
| 382 | bool bMarsterPage) { |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 383 | std::vector<std::unique_ptr<CXFA_TabParam>> tabParams; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 384 | CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext(); |
| 385 | while (pSearchItem) { |
| 386 | if (!pSearchItem->IsContentLayoutItem()) { |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 387 | bContentArea = true; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 388 | pSearchItem = sIterator->MoveToNext(); |
| 389 | continue; |
| 390 | } |
| 391 | if (bMarsterPage && bContentArea) { |
| 392 | break; |
| 393 | } |
| 394 | if (bMarsterPage || bContentArea) { |
| 395 | CXFA_FFWidget* hWidget = GetWidget(pSearchItem); |
| 396 | if (!hWidget) { |
| 397 | pSearchItem = sIterator->MoveToNext(); |
| 398 | continue; |
| 399 | } |
| 400 | if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) { |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 401 | bCurrentItem = true; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 402 | break; |
| 403 | } |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 404 | tabParams.push_back(pdfium::MakeUnique<CXFA_TabParam>(hWidget)); |
dsinclair | d1cf239 | 2016-07-11 06:46:59 -0700 | [diff] [blame] | 405 | if (IsLayoutElement(pSearchItem->GetFormNode()->GetElementType(), true)) { |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 406 | OrderContainer(sIterator, pSearchItem, tabParams.back().get(), |
| 407 | bCurrentItem, bContentArea, bMarsterPage); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 408 | } |
| 409 | } |
| 410 | if (bCurrentItem) { |
| 411 | pSearchItem = sIterator->GetCurrent(); |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 412 | bCurrentItem = false; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 413 | } else { |
| 414 | pSearchItem = sIterator->MoveToNext(); |
| 415 | } |
| 416 | } |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 417 | std::sort(tabParams.begin(), tabParams.end(), |
| 418 | [](const std::unique_ptr<CXFA_TabParam>& arg1, |
| 419 | const std::unique_ptr<CXFA_TabParam>& arg2) { |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 420 | const CFX_RectF& rt1 = arg1->GetWidget()->GetWidgetRect(); |
| 421 | const CFX_RectF& rt2 = arg2->GetWidget()->GetWidgetRect(); |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 422 | if (rt1.top - rt2.top >= XFA_FLOAT_PERCISION) |
| 423 | return rt1.top < rt2.top; |
| 424 | return rt1.left < rt2.left; |
| 425 | }); |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 426 | for (const auto& pParam : tabParams) |
| 427 | pContainer->AppendTabParam(pParam.get()); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 428 | } |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 429 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 430 | void CXFA_FFTabOrderPageWidgetIterator::CreateSpaceOrderWidgetArray( |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 431 | std::vector<CXFA_FFWidget*>* WidgetArray) { |
Tom Sepez | 312ce17 | 2017-03-06 14:00:07 -0800 | [diff] [blame] | 432 | CXFA_LayoutItemIterator sIterator(m_pPageView); |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 433 | auto pParam = pdfium::MakeUnique<CXFA_TabParam>(nullptr); |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 434 | bool bCurrentItem = false; |
| 435 | bool bContentArea = false; |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 436 | OrderContainer(&sIterator, nullptr, pParam.get(), bCurrentItem, bContentArea); |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 437 | WidgetArray->insert(WidgetArray->end(), pParam->GetChildren().begin(), |
| 438 | pParam->GetChildren().end()); |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 439 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 440 | sIterator.Reset(); |
tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 441 | bCurrentItem = false; |
| 442 | bContentArea = false; |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 443 | pParam->ClearChildren(); |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 444 | OrderContainer(&sIterator, nullptr, pParam.get(), bCurrentItem, bContentArea, |
| 445 | true); |
Lei Zhang | afc8eb3 | 2017-03-28 14:32:13 -0700 | [diff] [blame] | 446 | WidgetArray->insert(WidgetArray->end(), pParam->GetChildren().begin(), |
| 447 | pParam->GetChildren().end()); |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 448 | } |
tsepez | a0b2d23 | 2017-01-23 11:32:36 -0800 | [diff] [blame] | 449 | |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 450 | CXFA_FFWidget* CXFA_FFTabOrderPageWidgetIterator::GetWidget( |
| 451 | CXFA_LayoutItem* pLayoutItem) { |
| 452 | if (CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pLayoutItem)) { |
| 453 | if (!pWidget->IsLoaded() && |
dsinclair | 935d8d5 | 2016-05-17 10:32:18 -0700 | [diff] [blame] | 454 | (pWidget->GetStatus() & XFA_WidgetStatus_Visible)) { |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 455 | pWidget->LoadWidget(); |
| 456 | } |
| 457 | return pWidget; |
| 458 | } |
dsinclair | 85d1f2c | 2016-06-23 12:40:16 -0700 | [diff] [blame] | 459 | return nullptr; |
Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 460 | } |
weili | 47bcd4c | 2016-06-16 08:00:06 -0700 | [diff] [blame] | 461 | |
Tom Sepez | b822782 | 2017-03-24 13:10:14 -0700 | [diff] [blame] | 462 | CXFA_TabParam::CXFA_TabParam(CXFA_FFWidget* pWidget) : m_pWidget(pWidget) {} |
weili | 47bcd4c | 2016-06-16 08:00:06 -0700 | [diff] [blame] | 463 | |
| 464 | CXFA_TabParam::~CXFA_TabParam() {} |