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

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

Issue 1890563003: Simplify XFA event handling. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: simplifiy code Created 4 years, 8 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
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/app/xfa_ffnotify.h" 7 #include "xfa/fxfa/app/xfa_ffnotify.h"
8 8
9 #include "xfa/fxfa/app/xfa_ffbarcode.h" 9 #include "xfa/fxfa/app/xfa_ffbarcode.h"
10 #include "xfa/fxfa/app/xfa_ffcheckbutton.h" 10 #include "xfa/fxfa/app/xfa_ffcheckbutton.h"
(...skipping 21 matching lines...) Expand all
32 32
33 static void XFA_FFDeleteWidgetAcc(void* pData) { 33 static void XFA_FFDeleteWidgetAcc(void* pData) {
34 delete static_cast<CXFA_WidgetAcc*>(pData); 34 delete static_cast<CXFA_WidgetAcc*>(pData);
35 } 35 }
36 36
37 static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteWidgetAcc = { 37 static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteWidgetAcc = {
38 XFA_FFDeleteWidgetAcc, nullptr}; 38 XFA_FFDeleteWidgetAcc, nullptr};
39 39
40 CXFA_FFNotify::CXFA_FFNotify(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {} 40 CXFA_FFNotify::CXFA_FFNotify(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
41 CXFA_FFNotify::~CXFA_FFNotify() {} 41 CXFA_FFNotify::~CXFA_FFNotify() {}
42
42 void CXFA_FFNotify::OnPageEvent(CXFA_ContainerLayoutItem* pSender, 43 void CXFA_FFNotify::OnPageEvent(CXFA_ContainerLayoutItem* pSender,
43 XFA_PAGEEVENT eEvent, 44 uint32_t dwEvent) {
44 void* pParam) {
45 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pSender->GetLayout()); 45 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pSender->GetLayout());
46 if (!pDocView) { 46 if (pDocView)
47 pDocView->OnPageEvent(pSender, dwEvent);
48 }
49
50 void CXFA_FFNotify::OnWidgetListItemAdded(CXFA_WidgetData* pSender,
51 const FX_WCHAR* pLabel,
52 const FX_WCHAR* pValue,
53 int32_t iIndex) {
54 CXFA_WidgetAcc* pWidgetAcc = static_cast<CXFA_WidgetAcc*>(pSender);
55 if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
47 return; 56 return;
48 } 57 }
49 pDocView->OnPageEvent(pSender, eEvent, (int32_t)(uintptr_t)pParam); 58 CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
50 } 59 while (pWidget) {
51 void CXFA_FFNotify::OnNodeEvent(CXFA_Node* pSender, 60 if (pWidget->IsLoaded()) {
52 XFA_NODEEVENT eEvent, 61 if (pWidgetAcc->IsListBox()) {
53 void* pParam, 62 static_cast<CXFA_FFListBox*>(pWidget)->InsertItem(pLabel, iIndex);
54 void* pParam2, 63 } else {
55 void* pParam3, 64 static_cast<CXFA_FFComboBox*>(pWidget)->InsertItem(pLabel, iIndex);
56 void* pParam4) { 65 }
57 switch (eEvent) { 66 }
58 case XFA_NODEEVENT_Ready: 67 pWidget = pWidgetAcc->GetNextWidget(pWidget);
59 OnNodeReady(pSender);
60 break;
61 case XFA_NODEEVENT_ValueChanging:
62 OnValueChanging(pSender, pParam, pParam2);
63 break;
64 case XFA_NODEEVENT_ValueChanged:
65 OnValueChanged(pSender, pParam, pParam2, pParam3, pParam4);
66 break;
67 case XFA_NODEEVENT_ChildAdded:
68 OnChildAdded(pSender, pParam, pParam2);
69 break;
70 case XFA_NODEEVENT_ChildRemoved:
71 OnChildRemoved(pSender, pParam, pParam2);
72 break;
73 } 68 }
74 } 69 }
75 void CXFA_FFNotify::OnWidgetDataEvent(CXFA_WidgetData* pSender, 70
76 uint32_t dwEvent, 71 void CXFA_FFNotify::OnWidgetListItemRemoved(CXFA_WidgetData* pSender,
77 void* pParam, 72 int32_t iIndex) {
78 void* pAdditional,
79 void* pAdditional2) {
80 CXFA_WidgetAcc* pWidgetAcc = static_cast<CXFA_WidgetAcc*>(pSender); 73 CXFA_WidgetAcc* pWidgetAcc = static_cast<CXFA_WidgetAcc*>(pSender);
81 switch (dwEvent) { 74 if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
82 case XFA_WIDGETEVENT_ListItemAdded: { 75 return;
83 if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) { 76 }
84 return; 77 CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
78 while (pWidget) {
79 if (pWidget->IsLoaded()) {
80 if (pWidgetAcc->IsListBox()) {
81 static_cast<CXFA_FFListBox*>(pWidget)->DeleteItem(iIndex);
82 } else {
83 static_cast<CXFA_FFComboBox*>(pWidget)->DeleteItem(iIndex);
85 } 84 }
86 FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify(); 85 }
87 CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL); 86 pWidget = pWidgetAcc->GetNextWidget(pWidget);
88 if (!pWidget) {
89 if (bStaticNotify) {
90 pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
91 pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam,
92 pAdditional);
93 }
94 return;
95 }
96 while (pWidget) {
97 if (pWidget->IsLoaded()) {
98 if (pWidgetAcc->IsListBox()) {
99 static_cast<CXFA_FFListBox*>(pWidget)
100 ->InsertItem((const CFX_WideStringC&)(const FX_WCHAR*)pParam,
101 (int32_t)(uintptr_t)pAdditional2);
102 } else {
103 static_cast<CXFA_FFComboBox*>(pWidget)
104 ->InsertItem((const CFX_WideStringC&)(const FX_WCHAR*)pParam,
105 (int32_t)(uintptr_t)pAdditional2);
106 }
107 }
108 if (bStaticNotify) {
109 pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
110 pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemAdded, pParam,
111 pAdditional);
112 }
113 pWidget = pWidgetAcc->GetNextWidget(pWidget);
114 }
115 } break;
116 case XFA_WIDGETEVENT_ListItemRemoved: {
117 if (pWidgetAcc->GetUIType() != XFA_ELEMENT_ChoiceList) {
118 return;
119 }
120 FX_BOOL bStaticNotify = pWidgetAcc->GetDocView()->IsStaticNotify();
121 CXFA_FFWidget* pWidget = pWidgetAcc->GetNextWidget(NULL);
122 if (!pWidget) {
123 if (bStaticNotify) {
124 pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
125 pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam,
126 pAdditional);
127 }
128 return;
129 }
130 while (pWidget) {
131 if (pWidget->IsLoaded()) {
132 if (pWidgetAcc->IsListBox()) {
133 static_cast<CXFA_FFListBox*>(pWidget)
134 ->DeleteItem((int32_t)(uintptr_t)pParam);
135 } else {
136 static_cast<CXFA_FFComboBox*>(pWidget)
137 ->DeleteItem((int32_t)(uintptr_t)pParam);
138 }
139 }
140 if (bStaticNotify) {
141 pWidgetAcc->GetDoc()->GetDocProvider()->WidgetEvent(
142 pWidget, pWidgetAcc, XFA_WIDGETEVENT_ListItemRemoved, pParam,
143 pAdditional);
144 }
145 pWidget = pWidgetAcc->GetNextWidget(pWidget);
146 }
147 } break;
148 } 87 }
149 } 88 }
89
150 CXFA_LayoutItem* CXFA_FFNotify::OnCreateLayoutItem(CXFA_Node* pNode) { 90 CXFA_LayoutItem* CXFA_FFNotify::OnCreateLayoutItem(CXFA_Node* pNode) {
151 CXFA_LayoutProcessor* pLayout = m_pDoc->GetXFADoc()->GetDocLayout(); 91 CXFA_LayoutProcessor* pLayout = m_pDoc->GetXFADoc()->GetDocLayout();
152 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout); 92 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
153 XFA_ELEMENT eType = pNode->GetClassID(); 93 XFA_ELEMENT eType = pNode->GetClassID();
154 if (eType == XFA_ELEMENT_PageArea) { 94 if (eType == XFA_ELEMENT_PageArea)
155 return new CXFA_FFPageView(pDocView, pNode); 95 return new CXFA_FFPageView(pDocView, pNode);
156 } 96
157 if (eType == XFA_ELEMENT_ContentArea) { 97 if (eType == XFA_ELEMENT_ContentArea)
158 return new CXFA_ContainerLayoutItem(pNode); 98 return new CXFA_ContainerLayoutItem(pNode);
159 } 99
160 CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData()); 100 CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData());
161 if (!pAcc) { 101 if (!pAcc)
162 return new CXFA_ContentLayoutItem(pNode); 102 return new CXFA_ContentLayoutItem(pNode);
163 } 103
164 CXFA_FFPageView* pPageView = NULL; 104 CXFA_FFWidget* pWidget;
165 CXFA_FFWidget* pWidget = NULL;
166 switch (pAcc->GetUIType()) { 105 switch (pAcc->GetUIType()) {
167 case XFA_ELEMENT_Barcode: 106 case XFA_ELEMENT_Barcode:
168 pWidget = new CXFA_FFBarcode(pPageView, pAcc); 107 pWidget = new CXFA_FFBarcode(nullptr, pAcc);
169 break; 108 break;
170 case XFA_ELEMENT_Button: 109 case XFA_ELEMENT_Button:
171 pWidget = new CXFA_FFPushButton(pPageView, pAcc); 110 pWidget = new CXFA_FFPushButton(nullptr, pAcc);
172 break; 111 break;
173 case XFA_ELEMENT_CheckButton: 112 case XFA_ELEMENT_CheckButton:
174 pWidget = new CXFA_FFCheckButton(pPageView, pAcc); 113 pWidget = new CXFA_FFCheckButton(nullptr, pAcc);
175 break; 114 break;
176 case XFA_ELEMENT_ChoiceList: { 115 case XFA_ELEMENT_ChoiceList: {
177 if (pAcc->IsListBox()) { 116 if (pAcc->IsListBox()) {
178 pWidget = new CXFA_FFListBox(pPageView, pAcc); 117 pWidget = new CXFA_FFListBox(nullptr, pAcc);
179 } else { 118 } else {
180 pWidget = new CXFA_FFComboBox(pPageView, pAcc); 119 pWidget = new CXFA_FFComboBox(nullptr, pAcc);
181 } 120 }
182 } break; 121 } break;
183 case XFA_ELEMENT_DateTimeEdit: 122 case XFA_ELEMENT_DateTimeEdit:
184 pWidget = new CXFA_FFDateTimeEdit(pPageView, pAcc); 123 pWidget = new CXFA_FFDateTimeEdit(nullptr, pAcc);
185 break; 124 break;
186 case XFA_ELEMENT_ImageEdit: 125 case XFA_ELEMENT_ImageEdit:
187 pWidget = new CXFA_FFImageEdit(pPageView, pAcc); 126 pWidget = new CXFA_FFImageEdit(nullptr, pAcc);
188 break; 127 break;
189 case XFA_ELEMENT_NumericEdit: 128 case XFA_ELEMENT_NumericEdit:
190 pWidget = new CXFA_FFNumericEdit(pPageView, pAcc); 129 pWidget = new CXFA_FFNumericEdit(nullptr, pAcc);
191 break; 130 break;
192 case XFA_ELEMENT_PasswordEdit: 131 case XFA_ELEMENT_PasswordEdit:
193 pWidget = new CXFA_FFPasswordEdit(pPageView, pAcc); 132 pWidget = new CXFA_FFPasswordEdit(nullptr, pAcc);
194 break; 133 break;
195 case XFA_ELEMENT_Signature: 134 case XFA_ELEMENT_Signature:
196 pWidget = new CXFA_FFSignature(pPageView, pAcc); 135 pWidget = new CXFA_FFSignature(nullptr, pAcc);
197 break; 136 break;
198 case XFA_ELEMENT_TextEdit: 137 case XFA_ELEMENT_TextEdit:
199 pWidget = new CXFA_FFTextEdit(pPageView, pAcc); 138 pWidget = new CXFA_FFTextEdit(nullptr, pAcc);
200 break; 139 break;
201 case XFA_ELEMENT_Arc: 140 case XFA_ELEMENT_Arc:
202 pWidget = new CXFA_FFArc(pPageView, pAcc); 141 pWidget = new CXFA_FFArc(nullptr, pAcc);
203 break; 142 break;
204 case XFA_ELEMENT_Line: 143 case XFA_ELEMENT_Line:
205 pWidget = new CXFA_FFLine(pPageView, pAcc); 144 pWidget = new CXFA_FFLine(nullptr, pAcc);
206 break; 145 break;
207 case XFA_ELEMENT_Rectangle: 146 case XFA_ELEMENT_Rectangle:
208 pWidget = new CXFA_FFRectangle(pPageView, pAcc); 147 pWidget = new CXFA_FFRectangle(nullptr, pAcc);
209 break; 148 break;
210 case XFA_ELEMENT_Text: 149 case XFA_ELEMENT_Text:
211 pWidget = new CXFA_FFText(pPageView, pAcc); 150 pWidget = new CXFA_FFText(nullptr, pAcc);
212 break; 151 break;
213 case XFA_ELEMENT_Image: 152 case XFA_ELEMENT_Image:
214 pWidget = new CXFA_FFImage(pPageView, pAcc); 153 pWidget = new CXFA_FFImage(nullptr, pAcc);
215 break; 154 break;
216 case XFA_ELEMENT_Draw: 155 case XFA_ELEMENT_Draw:
217 pWidget = new CXFA_FFDraw(pPageView, pAcc); 156 pWidget = new CXFA_FFDraw(nullptr, pAcc);
218 break; 157 break;
219 case XFA_ELEMENT_Subform: 158 case XFA_ELEMENT_Subform:
220 pWidget = new CXFA_FFSubForm(pPageView, pAcc); 159 pWidget = new CXFA_FFSubForm(nullptr, pAcc);
221 break; 160 break;
222 case XFA_ELEMENT_ExclGroup: 161 case XFA_ELEMENT_ExclGroup:
223 pWidget = new CXFA_FFExclGroup(pPageView, pAcc); 162 pWidget = new CXFA_FFExclGroup(nullptr, pAcc);
224 break; 163 break;
225 case XFA_ELEMENT_DefaultUi: 164 case XFA_ELEMENT_DefaultUi:
226 default: 165 default:
227 pWidget = NULL; 166 pWidget = nullptr;
228 break; 167 break;
229 } 168 }
230 if (!pWidget) { 169
231 return NULL; 170 if (pWidget)
232 } 171 pWidget->SetDocView(pDocView);
233 pWidget->SetDocView(pDocView);
234 return pWidget; 172 return pWidget;
235 } 173 }
236 void CXFA_FFNotify::OnLayoutEvent(CXFA_LayoutProcessor* pLayout, 174
237 CXFA_LayoutItem* pSender,
238 XFA_LAYOUTEVENT eEvent,
239 void* pParam,
240 void* pParam2) {
241 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
242 if (!pDocView || !XFA_GetWidgetFromLayoutItem(pSender)) {
243 return;
244 }
245 switch (eEvent) {
246 case XFA_LAYOUTEVENT_ItemAdded:
247 OnLayoutItemAdd(pDocView, pLayout, pSender, pParam, pParam2);
248 break;
249 case XFA_LAYOUTEVENT_ItemRemoving:
250 OnLayoutItemRemoving(pDocView, pLayout, pSender, pParam, pParam2);
251 break;
252 case XFA_LAYOUTEVENT_RectChanged:
253 OnLayoutItemRectChanged(pDocView, pLayout, pSender, pParam, pParam2);
254 break;
255 case XFA_LAYOUTEVENT_StatusChanged:
256 OnLayoutItemStatustChanged(pDocView, pLayout, pSender, pParam, pParam2);
257 break;
258 }
259 }
260 void CXFA_FFNotify::StartFieldDrawLayout(CXFA_Node* pItem, 175 void CXFA_FFNotify::StartFieldDrawLayout(CXFA_Node* pItem,
261 FX_FLOAT& fCalcWidth, 176 FX_FLOAT& fCalcWidth,
262 FX_FLOAT& fCalcHeight) { 177 FX_FLOAT& fCalcHeight) {
263 CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pItem->GetWidgetData()); 178 CXFA_WidgetAcc* pAcc = static_cast<CXFA_WidgetAcc*>(pItem->GetWidgetData());
264 if (!pAcc) { 179 if (!pAcc) {
265 return; 180 return;
266 } 181 }
267 pAcc->StartWidgetLayout(fCalcWidth, fCalcHeight); 182 pAcc->StartWidgetLayout(fCalcWidth, fCalcHeight);
268 } 183 }
269 FX_BOOL CXFA_FFNotify::FindSplitPos(CXFA_Node* pItem, 184 FX_BOOL CXFA_FFNotify::FindSplitPos(CXFA_Node* pItem,
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 } 308 }
394 void CXFA_FFNotify::SetFocusWidgetNode(CXFA_Node* pNode) { 309 void CXFA_FFNotify::SetFocusWidgetNode(CXFA_Node* pNode) {
395 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); 310 CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
396 if (!pDocView) { 311 if (!pDocView) {
397 return; 312 return;
398 } 313 }
399 CXFA_WidgetAcc* pAcc = 314 CXFA_WidgetAcc* pAcc =
400 pNode ? static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData()) : nullptr; 315 pNode ? static_cast<CXFA_WidgetAcc*>(pNode->GetWidgetData()) : nullptr;
401 pDocView->SetFocusWidgetAcc(pAcc); 316 pDocView->SetFocusWidgetAcc(pAcc);
402 } 317 }
318
403 void CXFA_FFNotify::OnNodeReady(CXFA_Node* pNode) { 319 void CXFA_FFNotify::OnNodeReady(CXFA_Node* pNode) {
404 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); 320 CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
405 if (!pDocView) { 321 if (!pDocView) {
406 return; 322 return;
407 } 323 }
408 XFA_ELEMENT iType = pNode->GetClassID(); 324 XFA_ELEMENT iType = pNode->GetClassID();
409 if (XFA_IsCreateWidget(iType)) { 325 if (XFA_IsCreateWidget(iType)) {
410 CXFA_WidgetAcc* pAcc = new CXFA_WidgetAcc(pDocView, pNode); 326 CXFA_WidgetAcc* pAcc = new CXFA_WidgetAcc(pDocView, pNode);
411 pNode->SetObject(XFA_ATTRIBUTE_WidgetData, pAcc, &gs_XFADeleteWidgetAcc); 327 pNode->SetObject(XFA_ATTRIBUTE_WidgetData, pAcc, &gs_XFADeleteWidgetAcc);
412 return; 328 return;
413 } 329 }
414 switch (iType) { 330 switch (iType) {
415 case XFA_ELEMENT_BindItems: 331 case XFA_ELEMENT_BindItems:
416 pDocView->m_bindItems.Add(pNode); 332 pDocView->m_bindItems.Add(pNode);
417 break; 333 break;
418 case XFA_ELEMENT_Validate: { 334 case XFA_ELEMENT_Validate: {
419 pNode->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE); 335 pNode->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE);
420 } break; 336 } break;
421 default: 337 default:
422 break; 338 break;
423 } 339 }
424 } 340 }
425 void CXFA_FFNotify::OnValueChanging(CXFA_Node* pSender, 341
426 void* pParam, 342 void CXFA_FFNotify::OnValueChanging(CXFA_Node* pSender, XFA_ATTRIBUTE eAttr) {
427 void* pParam2) { 343 if (eAttr != XFA_ATTRIBUTE_Presence)
344 return;
345
346 if (pSender->GetPacketID() & XFA_XDPPACKET_Datasets)
347 return;
348
349 if (!pSender->IsFormContainer())
350 return;
351
428 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); 352 CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
429 if (!pDocView) { 353 if (!pDocView)
430 return; 354 return;
431 } 355
432 if (pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End) { 356 if (pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End)
433 return; 357 return;
434 } 358
435 uint32_t dwPacket = pSender->GetPacketID(); 359 CXFA_WidgetAcc* pWidgetAcc =
436 if (dwPacket & XFA_XDPPACKET_Datasets) { 360 static_cast<CXFA_WidgetAcc*>(pSender->GetWidgetData());
437 } else if (pSender->IsFormContainer()) { 361 if (!pWidgetAcc)
438 XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(uintptr_t)pParam; 362 return;
439 if (eAttr == XFA_ATTRIBUTE_Presence) { 363
440 CXFA_WidgetAcc* pWidgetAcc = 364 CXFA_FFWidget* pWidget = nullptr;
441 static_cast<CXFA_WidgetAcc*>(pSender->GetWidgetData()); 365 while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
442 if (!pWidgetAcc) { 366 if (pWidget->IsLoaded()) {
Tom Sepez 2016/04/14 22:45:44 nit: {} not needed
Lei Zhang 2016/04/15 01:16:41 Done.
443 return; 367 pWidget->AddInvalidateRect();
444 }
445 CXFA_FFWidget* pWidget = NULL;
446 while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
447 if (pWidget->IsLoaded()) {
448 pWidget->AddInvalidateRect();
449 }
450 }
451 } 368 }
452 } 369 }
453 } 370 }
371
454 void CXFA_FFNotify::OnValueChanged(CXFA_Node* pSender, 372 void CXFA_FFNotify::OnValueChanged(CXFA_Node* pSender,
455 void* pParam, 373 XFA_ATTRIBUTE eAttr,
456 void* pParam2, 374 CXFA_Node* pParentNode,
457 void* pParam3, 375 CXFA_Node* pWidgetNode) {
458 void* pParam4) {
459 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); 376 CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
460 if (!pDocView) { 377 if (!pDocView)
378 return;
379
380 if (!(pSender->GetPacketID() & XFA_XDPPACKET_Form)) {
381 if (eAttr == XFA_ATTRIBUTE_Value)
382 pDocView->AddCalculateNodeNotify(pSender);
461 return; 383 return;
462 } 384 }
463 uint32_t dwPacket = pSender->GetPacketID(); 385
464 XFA_ATTRIBUTE eAttr = (XFA_ATTRIBUTE)(uintptr_t)pParam; 386 XFA_ELEMENT ePType = pParentNode->GetClassID();
465 if (dwPacket & XFA_XDPPACKET_Form) { 387 FX_BOOL bIsContainerNode = pParentNode->IsContainerNode();
466 CXFA_Node* pParentNode = static_cast<CXFA_Node*>(pParam3); 388 CXFA_WidgetAcc* pWidgetAcc =
467 CXFA_Node* pWidgetNode = static_cast<CXFA_Node*>(pParam4); 389 static_cast<CXFA_WidgetAcc*>(pWidgetNode->GetWidgetData());
468 XFA_ELEMENT ePType = pParentNode->GetClassID(); 390 if (!pWidgetAcc) {
469 FX_BOOL bIsContainerNode = pParentNode->IsContainerNode(); 391 return;
470 CXFA_WidgetAcc* pWidgetAcc = 392 }
471 static_cast<CXFA_WidgetAcc*>(pWidgetNode->GetWidgetData()); 393 FX_BOOL bUpdateProperty = FALSE;
472 if (!pWidgetAcc) { 394 pDocView->SetChangeMark();
395 switch (ePType) {
396 case XFA_ELEMENT_Caption: {
397 CXFA_TextLayout* pCapOut = pWidgetAcc->GetCaptionTextLayout();
398 if (!pCapOut) {
Tom Sepez 2016/04/14 22:45:44 maybe just if (pCapOut) pCapOut->Unload();
Lei Zhang 2016/04/15 01:16:41 But the return skips all the extra work after the
399 return;
400 }
401 pCapOut->Unload();
402 } break;
403 case XFA_ELEMENT_Ui:
404 case XFA_ELEMENT_Para:
405 bUpdateProperty = TRUE;
406 break;
407 case XFA_ELEMENT_Font:
408 case XFA_ELEMENT_Margin:
409 case XFA_ELEMENT_Value:
410 case XFA_ELEMENT_Items:
411 break;
412 default:
413 break;
414 }
415 if (bIsContainerNode && eAttr == XFA_ATTRIBUTE_Access)
416 bUpdateProperty = TRUE;
417
418 if (eAttr == XFA_ATTRIBUTE_Value) {
419 pDocView->AddCalculateNodeNotify(pSender);
420 if (ePType == XFA_ELEMENT_Value || bIsContainerNode) {
421 if (bIsContainerNode) {
422 pWidgetAcc->UpdateUIDisplay();
423 pDocView->AddCalculateWidgetAcc(pWidgetAcc);
424 pDocView->AddValidateWidget(pWidgetAcc);
425 } else if (pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent)->GetClassID() ==
426 XFA_ELEMENT_ExclGroup) {
427 pWidgetAcc->UpdateUIDisplay();
428 }
473 return; 429 return;
474 } 430 }
475 FX_BOOL bUpdateProperty = FALSE; 431 }
476 pDocView->SetChangeMark(); 432 CXFA_FFWidget* pWidget = NULL;
477 switch (ePType) { 433 while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
478 case XFA_ELEMENT_Caption: { 434 if (!pWidget->IsLoaded()) {
479 CXFA_TextLayout* pCapOut = pWidgetAcc->GetCaptionTextLayout(); 435 continue;
480 if (!pCapOut) {
481 return;
482 }
483 pCapOut->Unload();
484 } break;
485 case XFA_ELEMENT_Ui:
486 case XFA_ELEMENT_Para:
487 bUpdateProperty = TRUE;
488 break;
489 case XFA_ELEMENT_Font:
490 case XFA_ELEMENT_Margin:
491 case XFA_ELEMENT_Value:
492 case XFA_ELEMENT_Items:
493 break;
494 default:
495 break;
496 } 436 }
497 if (bIsContainerNode && eAttr == XFA_ATTRIBUTE_Access) { 437 if (bUpdateProperty) {
498 bUpdateProperty = TRUE; 438 pWidget->UpdateWidgetProperty();
499 FX_BOOL bNotify = pDocView->IsStaticNotify();
500 if (bNotify) {
501 pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_AccessChanged, NULL, pParam2,
502 NULL);
503 }
504 } 439 }
505 if (eAttr == XFA_ATTRIBUTE_Value) { 440 pWidget->PerformLayout();
506 pDocView->AddCalculateNodeNotify(pSender); 441 pWidget->AddInvalidateRect();
507 if (ePType == XFA_ELEMENT_Value || bIsContainerNode) {
508 FX_BOOL bNotify = pDocView->IsStaticNotify();
509 if (bIsContainerNode) {
510 pWidgetAcc->UpdateUIDisplay();
511 pDocView->AddCalculateWidgetAcc(pWidgetAcc);
512 pDocView->AddValidateWidget(pWidgetAcc);
513 } else if (pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent)
514 ->GetClassID() == XFA_ELEMENT_ExclGroup) {
515 pWidgetAcc->UpdateUIDisplay();
516 }
517 if (bNotify) {
518 pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL,
519 NULL, NULL);
520 }
521 return;
522 }
523 }
524 CXFA_FFWidget* pWidget = NULL;
525 while ((pWidget = pWidgetAcc->GetNextWidget(pWidget))) {
526 if (!pWidget->IsLoaded()) {
527 continue;
528 }
529 if (bUpdateProperty) {
530 pWidget->UpdateWidgetProperty();
531 }
532 pWidget->PerformLayout();
533 pWidget->AddInvalidateRect();
534 }
535 } else {
536 if (eAttr == XFA_ATTRIBUTE_Value) {
537 pDocView->AddCalculateNodeNotify(pSender);
538 }
539 } 442 }
540 } 443 }
541 void CXFA_FFNotify::OnChildAdded(CXFA_Node* pSender, 444
542 void* pParam, 445 void CXFA_FFNotify::OnChildAdded(CXFA_Node* pSender) {
543 void* pParam2) {
544 if (!pSender->IsFormContainer()) { 446 if (!pSender->IsFormContainer()) {
545 return; 447 return;
546 } 448 }
547 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(); 449 CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
548 if (!pDocView) { 450 if (!pDocView) {
549 return; 451 return;
550 } 452 }
551 FX_BOOL bLayoutReady = 453 FX_BOOL bLayoutReady =
552 !(pDocView->m_bInLayoutStatus) && 454 !(pDocView->m_bInLayoutStatus) &&
553 (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End); 455 (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End);
554 if (bLayoutReady) { 456 if (bLayoutReady) {
555 m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc); 457 m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
556 } 458 }
557 } 459 }
558 void CXFA_FFNotify::OnChildRemoved(CXFA_Node* pSender, 460
559 void* pParam, 461 void CXFA_FFNotify::OnChildRemoved() {
560 void* pParam2) { 462 CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
561 if (CXFA_FFDocView* pDocView = m_pDoc->GetDocView()) { 463 if (!pDocView)
562 FX_BOOL bLayoutReady = 464 return;
563 !(pDocView->m_bInLayoutStatus) && 465
564 (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End); 466 bool bLayoutReady =
565 if (bLayoutReady) { 467 !(pDocView->m_bInLayoutStatus) &&
566 m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc); 468 (pDocView->GetLayoutStatus() == XFA_DOCVIEW_LAYOUTSTATUS_End);
567 } 469 if (bLayoutReady) {
Tom Sepez 2016/04/14 22:45:44 nit: {}
Lei Zhang 2016/04/15 01:16:41 Done.
470 m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
568 } 471 }
569 } 472 }
570 void CXFA_FFNotify::OnLayoutItemAdd(CXFA_FFDocView* pDocView, 473
571 CXFA_LayoutProcessor* pLayout, 474 void CXFA_FFNotify::OnLayoutItemAdd(CXFA_LayoutProcessor* pLayout,
572 CXFA_LayoutItem* pSender, 475 CXFA_LayoutItem* pSender,
573 void* pParam, 476 int32_t iPageIdx,
574 void* pParam2) { 477 uint32_t dwStatus) {
575 CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender); 478 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
576 int32_t iPageIdx = (int32_t)(uintptr_t)pParam; 479 if (!pDocView)
480 return;
481
482 CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pSender);
483 if (!pWidget)
484 return;
485
577 CXFA_FFPageView* pNewPageView = pDocView->GetPageView(iPageIdx); 486 CXFA_FFPageView* pNewPageView = pDocView->GetPageView(iPageIdx);
578 uint32_t dwStatus = (uint32_t)(uintptr_t)pParam2;
579 uint32_t dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable | 487 uint32_t dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable |
580 XFA_WIDGETSTATUS_Printable; 488 XFA_WIDGETSTATUS_Printable;
581 pWidget->ModifyStatus(dwStatus, dwFilter); 489 pWidget->ModifyStatus(dwStatus, dwFilter);
582 CXFA_FFPageView* pPrePageView = pWidget->GetPageView(); 490 CXFA_FFPageView* pPrePageView = pWidget->GetPageView();
583 if (pPrePageView != pNewPageView || 491 if (pPrePageView != pNewPageView ||
584 (dwStatus & (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) == 492 (dwStatus & (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) ==
585 (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) { 493 (XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable)) {
586 pWidget->SetPageView(pNewPageView); 494 pWidget->SetPageView(pNewPageView);
587 m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(), 495 m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(),
588 XFA_WIDGETEVENT_PostAdded, 496 XFA_WIDGETEVENT_PostAdded);
589 pNewPageView, pPrePageView);
590 } 497 }
591 if (pDocView->GetLayoutStatus() != XFA_DOCVIEW_LAYOUTSTATUS_End || 498 if (pDocView->GetLayoutStatus() != XFA_DOCVIEW_LAYOUTSTATUS_End ||
592 !(dwStatus & XFA_WIDGETSTATUS_Visible)) { 499 !(dwStatus & XFA_WIDGETSTATUS_Visible)) {
593 return; 500 return;
594 } 501 }
595 if (pWidget->IsLoaded()) { 502 if (pWidget->IsLoaded()) {
596 CFX_RectF rtOld; 503 CFX_RectF rtOld;
597 pWidget->GetWidgetRect(rtOld); 504 pWidget->GetWidgetRect(rtOld);
598 if (rtOld != pWidget->ReCacheWidgetRect()) 505 if (rtOld != pWidget->ReCacheWidgetRect())
599 pWidget->PerformLayout(); 506 pWidget->PerformLayout();
600 } else { 507 } else {
601 pWidget->LoadWidget(); 508 pWidget->LoadWidget();
602 } 509 }
603 pWidget->AddInvalidateRect(nullptr); 510 pWidget->AddInvalidateRect(nullptr);
604 } 511 }
605 void CXFA_FFNotify::OnLayoutItemRemoving(CXFA_FFDocView* pDocView, 512
606 CXFA_LayoutProcessor* pLayout, 513 void CXFA_FFNotify::OnLayoutItemRemoving(CXFA_LayoutProcessor* pLayout,
607 CXFA_LayoutItem* pSender, 514 CXFA_LayoutItem* pSender) {
608 void* pParam, 515 CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
609 void* pParam2) { 516 if (!pDocView)
610 CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender); 517 return;
518
519 CXFA_FFWidget* pWidget = XFA_GetWidgetFromLayoutItem(pSender);
520 if (!pWidget)
521 return;
522
611 pDocView->DeleteLayoutItem(pWidget); 523 pDocView->DeleteLayoutItem(pWidget);
612 m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(), 524 m_pDoc->GetDocProvider()->WidgetEvent(pWidget, pWidget->GetDataAcc(),
613 XFA_WIDGETEVENT_PreRemoved, nullptr, 525 XFA_WIDGETEVENT_PreRemoved);
614 pWidget->GetPageView());
615 pWidget->AddInvalidateRect(nullptr); 526 pWidget->AddInvalidateRect(nullptr);
616 } 527 }
617 void CXFA_FFNotify::OnLayoutItemRectChanged(CXFA_FFDocView* pDocView,
618 CXFA_LayoutProcessor* pLayout,
619 CXFA_LayoutItem* pSender,
620 void* pParam,
621 void* pParam2) {}
622 void CXFA_FFNotify::OnLayoutItemStatustChanged(CXFA_FFDocView* pDocView,
623 CXFA_LayoutProcessor* pLayout,
624 CXFA_LayoutItem* pSender,
625 void* pParam,
626 void* pParam2) {
627 CXFA_FFWidget* pWidget = static_cast<CXFA_FFWidget*>(pSender);
628 if (!pWidget) {
629 return;
630 }
631 uint32_t dwStatus = (uint32_t)(uintptr_t)pParam;
632 if (dwStatus == 0) {
633 CXFA_LayoutItem* pPreItem = pSender->GetPrev();
634 if (pPreItem) {
635 CXFA_FFWidget* pPreWidget = static_cast<CXFA_FFWidget*>(pPreItem);
636 if (pPreWidget) {
637 dwStatus = pPreWidget->GetStatus();
638 }
639 }
640 }
641 uint32_t dwOldStatus = pWidget->GetStatus();
642 uint32_t dwFilter = XFA_WIDGETSTATUS_Visible | XFA_WIDGETSTATUS_Viewable |
643 XFA_WIDGETSTATUS_Printable;
644 if ((dwOldStatus & dwFilter) == dwStatus) {
645 return;
646 }
647 pWidget->ModifyStatus(dwStatus, dwFilter);
648 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698