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

Side by Side Diff: fpdfsdk/src/formfiller/FFL_FormFiller.cpp

Issue 1265503005: clang-format all pdfium code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: sigh Created 5 years, 4 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
8 #include "../../include/formfiller/FFL_FormFiller.h" 7 #include "../../include/formfiller/FFL_FormFiller.h"
9 #include "../../include/formfiller/FFL_Notify.h" 8 #include "../../include/formfiller/FFL_Notify.h"
10 #include "../../include/formfiller/FFL_CBA_Fontmap.h" 9 #include "../../include/formfiller/FFL_CBA_Fontmap.h"
11 10
12 #define GetRed(rgb) ((uint8_t)(rgb)) 11 #define GetRed(rgb) ((uint8_t)(rgb))
13 #define GetGreen(rgb) ((uint8_t)(((FX_WORD)(rgb)) >> 8)) 12 #define GetGreen(rgb) ((uint8_t)(((FX_WORD)(rgb)) >> 8))
14 #define GetBlue(rgb) ((uint8_t)((rgb)>>16)) 13 #define GetBlue(rgb) ((uint8_t)((rgb) >> 16))
15 14
16 #define FFL_HINT_ELAPSE 800 15 #define FFL_HINT_ELAPSE 800
17 16
18 /* ------------------------- CFFL_FormFiller ------------------------- */ 17 /* ------------------------- CFFL_FormFiller ------------------------- */
19 18
20 CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnno t) 19 CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp,
21 : m_pApp(pApp), 20 CPDFSDK_Annot* pAnnot)
22 m_pAnnot(pAnnot), 21 : m_pApp(pApp), m_pAnnot(pAnnot), m_bValid(FALSE), m_ptOldPos(0, 0) {
23 m_bValid(FALSE), 22 m_pWidget = (CPDFSDK_Widget*)pAnnot;
24 m_ptOldPos(0,0) 23 }
25 { 24
26 m_pWidget = (CPDFSDK_Widget*) pAnnot; 25 CFFL_FormFiller::~CFFL_FormFiller() {
27 } 26 for (auto& it : m_Maps) {
28 27 CPWL_Wnd* pWnd = it.second;
29 CFFL_FormFiller::~CFFL_FormFiller()
30 {
31 for (auto& it : m_Maps) {
32 CPWL_Wnd* pWnd = it.second;
33 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
34 pWnd->Destroy();
35 delete pWnd;
36 delete pData;
37 }
38 m_Maps.clear();
39 }
40
41 void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect & rcWindow)
42 {
43 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
44 {
45 pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);
46 }
47 }
48
49 CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView)
50 {
51 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
52 {
53 return pWnd->GetWindowRect();
54 }
55
56 return CPDF_Rect(0,0,0,0);
57 }
58
59 FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
60 {
61 ASSERT(pPageView != NULL);
62 ASSERT(pAnnot != NULL);
63
64 CPDF_Rect rcAnnot = m_pWidget->GetRect();
65
66 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
67 {
68 CPDF_Rect rcWindow = pWnd->GetWindowRect();
69 rcAnnot = PWLtoFFL(rcWindow);
70 }
71
72 CPDF_Rect rcWin = rcAnnot;
73
74 CPDF_Rect rcFocus = GetFocusBox(pPageView);
75 if (!rcFocus.IsEmpty())
76 rcWin.Union(rcFocus);
77
78 CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1);
79
80 return rect.GetOutterRect();
81 }
82
83 void CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
84 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Devic e,
85 FX_DWORD dwFlags)
86 {
87 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
88
89 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
90 {
91 CPDF_Matrix mt = GetCurMatrix();
92 mt.Concat(*pUser2Device);
93 pWnd->DrawAppearance(pDevice,&mt);
94 }
95 else
96 {
97 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
98 if (CFFL_IFormFiller::IsVisible(pWidget))
99 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, N ULL);
100 }
101 }
102
103 void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
104 CFX_RenderDevice* pDevice, CPDF_Matrix* pUs er2Device,
105 FX_DWORD dwFlags)
106 {
107 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
108 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
109 }
110
111
112 void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
113 {
114 }
115
116 void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
117 {
118 }
119
120 void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
121 {
122 }
123
124 void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* p Annot)
125 {
126 }
127
128 void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pA nnot)
129 {
130 EndTimer();
131 ASSERT(m_pWidget != NULL);
132 }
133
134 FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Anno t* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
135 {
136 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
137 {
138 m_bValid = TRUE;
139 FX_RECT rect = GetViewBBox(pPageView,pAnnot);
140 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
141
142 if(!rect.Contains((int)point.x, (int)point.y))
143 return FALSE;
144
145 return pWnd->OnLButtonDown(WndtoPWL(pPageView, point),nFlags);
146 }
147
148 return FALSE;
149 }
150
151 FX_BOOL CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
152 {
153 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
154 {
155 FX_RECT rcFFL = GetViewBBox(pPageView, pAnnot);
156 InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
157 pWnd->OnLButtonUp(WndtoPWL(pPageView, point),nFlags);
158 return TRUE;
159 }
160
161 return FALSE;
162 }
163
164 FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_An not* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
165 {
166 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
167 {
168 pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point),nFlags);
169 return TRUE;
170 }
171
172 return FALSE;
173 }
174
175 FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
176 {
177 if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y))
178 {
179 m_ptOldPos = point;
180 }
181
182 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
183 {
184 pWnd->OnMouseMove(WndtoPWL(pPageView, point),nFlags);
185 return TRUE;
186 }
187
188 return FALSE;
189 }
190
191 FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot * pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
192 {
193 if (!IsValid()) return FALSE;
194
195 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
196 {
197 return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point),nFlags);
198 }
199
200 return FALSE;
201 }
202
203 FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Anno t* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
204 {
205 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
206 {
207 pWnd->OnRButtonDown(WndtoPWL(pPageView, point),nFlags);
208 return TRUE;
209 }
210
211 return FALSE;
212 }
213
214 FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
215 {
216 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
217 {
218 pWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags);
219 return TRUE;
220 }
221
222 return FALSE;
223 }
224
225 FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_U INT nFlags)
226 {
227 if (IsValid())
228 {
229 CPDFSDK_PageView* pPageView = GetCurPageView();
230 ASSERT(pPageView != NULL);
231
232 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
233 {
234 return pWnd->OnKeyDown(nKeyCode,nFlags);
235 }
236 }
237
238 return FALSE;
239 }
240
241 FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nF lags)
242 {
243 if (IsValid())
244 {
245 CPDFSDK_PageView* pPageView = GetCurPageView();
246 ASSERT(pPageView != NULL);
247
248 if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
249 {
250 return pWnd->OnChar(nChar,nFlags);
251 }
252 }
253
254 return FALSE;
255 }
256
257 FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
258 {
259 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
260 CPDF_Page* pPage = pWidget->GetPDFPage();
261 CPDFSDK_Document* pDoc = m_pApp->GetSDKDocument();
262 CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);
263 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE))
264 pWnd->SetFocus();
265
266 m_bValid = TRUE;
267 FX_RECT rcRect = GetViewBBox(pPageView,pAnnot);
268 InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
269 return TRUE;
270 }
271
272 FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
273 {
274 if (!IsValid())
275 return TRUE;
276
277 CPDFSDK_PageView* pPageView = GetCurPageView();
278 CommitData(pPageView, nFlag);
279
280 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
281 pWnd->KillFocus();
282
283 switch (m_pWidget->GetFieldType())
284 {
285 case FIELDTYPE_PUSHBUTTON:
286 case FIELDTYPE_CHECKBOX:
287 case FIELDTYPE_RADIOBUTTON:
288 EscapeFiller(pPageView, TRUE);
289 break;
290 default:
291 EscapeFiller(pPageView, FALSE);
292 break;
293 }
294 return TRUE;
295 }
296
297 FX_BOOL CFFL_FormFiller::IsValid() const
298 {
299 return m_bValid;
300 }
301
302 PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam()
303 {
304 ASSERT(m_pApp != NULL);
305
306 PWL_CREATEPARAM cp;
307 cp.pParentWnd = NULL;
308 cp.pProvider = this;
309 cp.rcRectWnd = GetPDFWindowRect();
310
311 FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
312 FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
313 if (dwFieldFlag & FIELDFLAG_READONLY)
314 {
315 dwCreateFlags |= PWS_READONLY;
316 }
317
318 FX_COLORREF color;
319 if (m_pWidget->GetFillColor(color))
320 {
321 cp.sBackgroundColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue (color));
322 }
323
324 if (m_pWidget->GetBorderColor(color))
325 {
326 cp.sBorderColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(col or));
327 }
328
329 cp.sTextColor = CPWL_Color(COLORTYPE_GRAY,0);
330
331 if (m_pWidget->GetTextColor(color))
332 {
333 cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color ));
334 }
335
336 cp.fFontSize = m_pWidget->GetFontSize();
337 cp.dwBorderWidth = m_pWidget->GetBorderWidth();
338
339 int nBorderStyle = m_pWidget->GetBorderStyle();
340
341 switch (nBorderStyle)
342 {
343 case BBS_SOLID:
344 cp.nBorderStyle = PBS_SOLID;
345 break;
346 case BBS_DASH:
347 cp.nBorderStyle = PBS_DASH;
348 cp.sDash = CPWL_Dash(3,3,0);
349 break;
350 case BBS_BEVELED:
351 cp.nBorderStyle = PBS_BEVELED;
352 cp.dwBorderWidth *= 2;
353 break;
354 case BBS_INSET:
355 cp.nBorderStyle = PBS_INSET;
356 cp.dwBorderWidth *= 2;
357 break;
358 case BBS_UNDERLINE:
359 cp.nBorderStyle = PBS_UNDERLINED;
360 break;
361 }
362
363 if (cp.fFontSize <= 0)
364 {
365 dwCreateFlags |= PWS_AUTOFONTSIZE;
366 }
367
368 cp.dwFlags = dwCreateFlags;
369 cp.pSystemHandler = m_pApp->GetSysHandler();
370 return cp;
371 }
372
373 CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNe w)
374 {
375 ASSERT(pPageView);
376
377 auto it = m_Maps.find(pPageView);
378 const bool found = it != m_Maps.end();
379 CPWL_Wnd* pWnd = found ? it->second : nullptr;
380 if (!bNew)
381 return pWnd;
382
383 if (found) {
384 CFFL_PrivateData* pPrivateData =
385 (CFFL_PrivateData*)pWnd->GetAttachedData();
386 if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge()) {
387 return ResetPDFWindow(
388 pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge);
389 }
390 } else {
391 PWL_CREATEPARAM cp = GetCreateParam();
392 cp.hAttachedWnd = (FX_HWND)m_pWidget;
393
394 CFFL_PrivateData* pPrivateData = new CFFL_PrivateData;
395 pPrivateData->pWidget = m_pWidget;
396 pPrivateData->pPageView = pPageView;
397 pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge();
398 pPrivateData->nValueAge = 0;
399
400 cp.pAttachedData = pPrivateData;
401
402 pWnd = NewPDFWindow(cp, pPageView);
403 m_Maps[pPageView] = pWnd;
404 }
405
406 return pWnd;
407 }
408
409 void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView)
410 {
411 auto it = m_Maps.find(pPageView);
412 if (it == m_Maps.end())
413 return;
414
415 CPWL_Wnd* pWnd = it->second;
416 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData(); 28 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
417 pWnd->Destroy(); 29 pWnd->Destroy();
418 delete pWnd; 30 delete pWnd;
419 delete pData; 31 delete pData;
420 32 }
421 m_Maps.erase(it); 33 m_Maps.clear();
422 } 34 }
423 35
424 CPDF_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData) 36 void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView,
425 { 37 const CPDF_Rect& rcWindow) {
426 if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData) 38 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
427 { 39 pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);
428 if (pPrivateData->pPageView) 40 }
429 { 41 }
430 CPDF_Matrix mtPageView; 42
431 pPrivateData->pPageView->GetCurrentMatrix(mtPageView); 43 CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView) {
432 CPDF_Matrix mt = GetCurMatrix(); 44 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
433 mt.Concat(mtPageView); 45 return pWnd->GetWindowRect();
434 46 }
435 return mt; 47
436 } 48 return CPDF_Rect(0, 0, 0, 0);
437 } 49 }
438 return CPDF_Matrix(1,0,0,1,0,0); 50
439 } 51 FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView* pPageView,
440 52 CPDFSDK_Annot* pAnnot) {
441 CPDF_Matrix CFFL_FormFiller::GetCurMatrix() 53 ASSERT(pPageView != NULL);
442 { 54 ASSERT(pAnnot != NULL);
443 CPDF_Matrix mt; 55
444 56 CPDF_Rect rcAnnot = m_pWidget->GetRect();
445 ASSERT(m_pWidget != NULL); 57
446 58 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
447 CPDF_Rect rcDA ; 59 CPDF_Rect rcWindow = pWnd->GetWindowRect();
448 m_pWidget->GetPDFAnnot()->GetRect(rcDA); 60 rcAnnot = PWLtoFFL(rcWindow);
449 61 }
450 62
451 switch (m_pWidget->GetRotate()) 63 CPDF_Rect rcWin = rcAnnot;
452 { 64
453 default: 65 CPDF_Rect rcFocus = GetFocusBox(pPageView);
454 case 0: 66 if (!rcFocus.IsEmpty())
455 mt = CPDF_Matrix(1,0,0,1,0,0); 67 rcWin.Union(rcFocus);
456 break; 68
457 case 90: 69 CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin, 1);
458 mt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0); 70
459 break; 71 return rect.GetOutterRect();
460 case 180: 72 }
461 mt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom ); 73
462 break; 74 void CFFL_FormFiller::OnDraw(CPDFSDK_PageView* pPageView,
463 case 270: 75 CPDFSDK_Annot* pAnnot,
464 mt = CPDF_Matrix(0,-1,1,0,0,rcDA.top - rcDA.bottom); 76 CFX_RenderDevice* pDevice,
465 break; 77 CPDF_Matrix* pUser2Device,
466 } 78 FX_DWORD dwFlags) {
467 mt.e += rcDA.left; 79 ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
468 mt.f += rcDA.bottom; 80
469 81 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
470 return mt;
471 }
472
473 CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex)
474 {
475 ASSERT(m_pApp != NULL);
476
477 return L"";
478 }
479
480 CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const
481 {
482 CPDF_Rect rectAnnot;
483 m_pWidget->GetPDFAnnot()->GetRect(rectAnnot);
484
485 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
486 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
487 if ((m_pWidget->GetRotate() / 90) & 0x01)
488 return CPDF_Rect(0, 0, fHeight, fWidth);
489
490 return CPDF_Rect(0, 0, fWidth, fHeight);
491 }
492
493 CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView()
494 {
495 CPDF_Page* pPage = m_pAnnot->GetPDFPage();
496 CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument();
497 return pSDKDoc ? pSDKDoc->GetPageView(pPage) : nullptr;
498 }
499
500 CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView)
501 {
502 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
503 {
504 CPDF_Rect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
505 CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();
506 if (rcPage.Contains(rcFocus))
507 return rcFocus;
508 }
509 return CPDF_Rect(0,0,0,0);
510 }
511
512 CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect)
513 {
514 CPDF_Matrix mt;
515 mt.SetReverse(GetCurMatrix());
516
517 CPDF_Rect temp = rect;
518 mt.TransformRect(temp);
519
520 return temp;
521 }
522
523 CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect)
524 {
525 CPDF_Matrix mt = GetCurMatrix(); 82 CPDF_Matrix mt = GetCurMatrix();
526 83 mt.Concat(*pUser2Device);
527 CPDF_Rect temp = rect; 84 pWnd->DrawAppearance(pDevice, &mt);
528 mt.TransformRect(temp); 85 } else {
529 86 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
530 return temp; 87 if (CFFL_IFormFiller::IsVisible(pWidget))
531 } 88 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
532 89 }
533 CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point) 90 }
534 { 91
535 CPDF_Matrix mt; 92 void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView* pPageView,
536 mt.SetReverse(GetCurMatrix()); 93 CPDFSDK_Annot* pAnnot,
537 94 CFX_RenderDevice* pDevice,
538 CPDF_Point pt = point; 95 CPDF_Matrix* pUser2Device,
539 mt.Transform(pt.x,pt.y); 96 FX_DWORD dwFlags) {
540 97 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
541 return pt; 98 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
542 } 99 }
543 100
544 CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point) 101 void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot) {}
545 { 102
546 CPDF_Matrix mt = GetCurMatrix(); 103 void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot) {}
547 104
548 CPDF_Point pt = point; 105 void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot) {}
549 mt.Transform(pt.x,pt.y); 106
550 107 void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView,
551 return pt; 108 CPDFSDK_Annot* pAnnot) {}
552 } 109
553 110 void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView* pPageView,
554 CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Poi nt& pt) 111 CPDFSDK_Annot* pAnnot) {
555 { 112 EndTimer();
556 return FFLtoPWL(pt); 113 ASSERT(m_pWidget != NULL);
557 } 114 }
558 115
559 CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect) 116 FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView,
560 { 117 CPDFSDK_Annot* pAnnot,
561 return rect; 118 FX_UINT nFlags,
562 } 119 const CPDF_Point& point) {
563 120 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) {
564 FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)
565 {
566 if (IsDataChanged(pPageView))
567 {
568 FX_BOOL bRC = TRUE;
569 FX_BOOL bExit = FALSE;
570 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
571 pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag) ;
572 if (bExit)
573 return TRUE;
574 if (!bRC)
575 {
576 ResetPDFWindow(pPageView, FALSE);
577 return TRUE;
578 }
579
580 pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);
581 if (bExit)
582 return TRUE;
583 if (!bRC)
584 {
585 ResetPDFWindow(pPageView, FALSE);
586 return TRUE;
587 }
588
589 SaveData(pPageView);
590 pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit,nFlag);
591 if (bExit)
592 return TRUE;
593
594 pIFormFiller->OnFormat(m_pWidget, pPageView, bExit,nFlag);
595 }
596 return TRUE;
597 }
598
599 FX_BOOL CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView)
600 {
601 return FALSE;
602 }
603
604 void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView)
605 {
606 }
607
608 void CFFL_FormFiller::SetChangeMark()
609 {
610 m_pApp->FFI_OnChange();
611 }
612
613 void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::A ActionType type,
614 PDFSDK_FieldAction& fa)
615 {
616 fa.sValue = m_pWidget->GetValue();
617 }
618
619 void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::A ActionType type,
620 const PDFSDK_FieldAction& fa)
621 {
622 }
623
624 FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, con st PDFSDK_FieldAction& faOld,
625 const PDFSDK_FieldAction& faNew)
626 {
627 return FALSE;
628 }
629
630 void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)
631 {
632 }
633
634 void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)
635 {
636 }
637
638 CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
639 {
640 return GetPDFWindow(pPageView, FALSE);
641 }
642
643 void CFFL_FormFiller::TimerProc()
644 {
645
646 }
647
648 IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const
649 {
650 return m_pApp->GetSysHandler();
651 }
652
653 void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
654 {
655 }
656
657 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroy PDFWindow)
658 {
659 m_bValid = FALSE;
660
661 FX_RECT rcRect = GetViewBBox(pPageView, m_pWidget);
662 InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
663
664 if(bDestroyPDFWindow)
665 DestroyPDFWindow(pPageView);
666 }
667
668 FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
669 {
670 return FALSE;
671 }
672
673 FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
674 {
675 return FALSE;
676 }
677
678 FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
679 {
680 return FALSE;
681 }
682
683 void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
684 {
685 }
686
687 void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
688 {
689 }
690
691 void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
692 {
693 }
694
695 void CFFL_FormFiller::InvalidateRect(double left, double top, double right, doub le bottom)
696 {
697 CPDF_Page * pPage = m_pWidget->GetPDFPage();
698 m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
699 }
700
701 /* ------------------------- CFFL_Button ------------------------- */
702
703 CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
704 CFFL_FormFiller(pApp, pWidget),
705 m_bMouseIn(FALSE),
706 m_bMouseDown(FALSE)
707 {
708 }
709
710 CFFL_Button::~CFFL_Button()
711 {
712 }
713
714 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnno t)
715 {
716 m_bMouseIn = TRUE;
717 FX_RECT rect = GetViewBBox(pPageView,pAnnot);
718 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
719 }
720
721 void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot )
722 {
723 m_bMouseIn = FALSE;
724
725 FX_RECT rect = GetViewBBox(pPageView,pAnnot);
726 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
727 EndTimer();
728 ASSERT(m_pWidget != NULL);
729 }
730
731 FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* p Annot, FX_UINT nFlags, const CPDF_Point& point)
732 {
733 CPDF_Rect rcAnnot = pAnnot->GetRect();
734 if(!rcAnnot.Contains(point.x, point.y))
735 return FALSE;
736
737 m_bMouseDown = TRUE;
738 m_bValid = TRUE; 121 m_bValid = TRUE;
739 FX_RECT rect = GetViewBBox(pPageView, pAnnot); 122 FX_RECT rect = GetViewBBox(pPageView, pAnnot);
740 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom); 123 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
124
125 if (!rect.Contains((int)point.x, (int)point.y))
126 return FALSE;
127
128 return pWnd->OnLButtonDown(WndtoPWL(pPageView, point), nFlags);
129 }
130
131 return FALSE;
132 }
133
134 FX_BOOL CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView,
135 CPDFSDK_Annot* pAnnot,
136 FX_UINT nFlags,
137 const CPDF_Point& point) {
138 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
139 FX_RECT rcFFL = GetViewBBox(pPageView, pAnnot);
140 InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
141 pWnd->OnLButtonUp(WndtoPWL(pPageView, point), nFlags);
741 return TRUE; 142 return TRUE;
742 } 143 }
743 144
744 FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAn not, FX_UINT nFlags, const CPDF_Point& point) 145 return FALSE;
745 { 146 }
746 CPDF_Rect rcAnnot = pAnnot->GetRect(); 147
747 if(!rcAnnot.Contains(point.x, point.y)) 148 FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
748 return FALSE; 149 CPDFSDK_Annot* pAnnot,
749 150 FX_UINT nFlags,
750 m_bMouseDown = FALSE; 151 const CPDF_Point& point) {
751 m_pWidget->GetPDFPage(); 152 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
752 153 pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point), nFlags);
753
754 FX_RECT rect = GetViewBBox(pPageView, pAnnot);
755 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
756 return TRUE; 154 return TRUE;
757 } 155 }
758 156
759 FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAn not, FX_UINT nFlags, const CPDF_Point& point) 157 return FALSE;
760 { 158 }
761 ASSERT(m_pApp != NULL); 159
762 160 FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView* pPageView,
161 CPDFSDK_Annot* pAnnot,
162 FX_UINT nFlags,
163 const CPDF_Point& point) {
164 if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y)) {
165 m_ptOldPos = point;
166 }
167
168 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
169 pWnd->OnMouseMove(WndtoPWL(pPageView, point), nFlags);
763 return TRUE; 170 return TRUE;
764 } 171 }
765 172
766 void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, 173 return FALSE;
767 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 174 }
768 FX_DWORD dwFlags) 175
769 { 176 FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView,
177 CPDFSDK_Annot* pAnnot,
178 FX_UINT nFlags,
179 short zDelta,
180 const CPDF_Point& point) {
181 if (!IsValid())
182 return FALSE;
183
184 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) {
185 return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point), nFlags);
186 }
187
188 return FALSE;
189 }
190
191 FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView,
192 CPDFSDK_Annot* pAnnot,
193 FX_UINT nFlags,
194 const CPDF_Point& point) {
195 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE)) {
196 pWnd->OnRButtonDown(WndtoPWL(pPageView, point), nFlags);
197 return TRUE;
198 }
199
200 return FALSE;
201 }
202
203 FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView,
204 CPDFSDK_Annot* pAnnot,
205 FX_UINT nFlags,
206 const CPDF_Point& point) {
207 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
208 pWnd->OnRButtonUp(WndtoPWL(pPageView, point), nFlags);
209 return TRUE;
210 }
211
212 return FALSE;
213 }
214
215 FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot,
216 FX_UINT nKeyCode,
217 FX_UINT nFlags) {
218 if (IsValid()) {
219 CPDFSDK_PageView* pPageView = GetCurPageView();
770 ASSERT(pPageView != NULL); 220 ASSERT(pPageView != NULL);
771 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot; 221
772 CPDF_FormControl* pCtrl = pWidget->GetFormControl(); 222 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
773 CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode(); 223 return pWnd->OnKeyDown(nKeyCode, nFlags);
774
775 if (eHM == CPDF_FormControl::Push)
776 {
777 if (m_bMouseDown)
778 {
779 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))
780 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);
781 else
782 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Norma l, NULL);
783 }
784 else if (m_bMouseIn)
785 {
786 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))
787 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollo ver, NULL);
788 else
789 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Norma l, NULL);
790 }
791 else
792 {
793 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, N ULL);
794 }
795 } 224 }
796 else 225 }
797 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL) ; 226
798 } 227 return FALSE;
799 228 }
800 229
801 void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAn not, 230 FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot,
802 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2D evice, 231 FX_UINT nChar,
803 FX_DWORD dwFlags) 232 FX_UINT nFlags) {
804 { 233 if (IsValid()) {
805 OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); 234 CPDFSDK_PageView* pPageView = GetCurPageView();
806 } 235 ASSERT(pPageView != NULL);
236
237 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
238 return pWnd->OnChar(nChar, nFlags);
239 }
240 }
241
242 return FALSE;
243 }
244
245 FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
246 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
247 CPDF_Page* pPage = pWidget->GetPDFPage();
248 CPDFSDK_Document* pDoc = m_pApp->GetSDKDocument();
249 CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);
250 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE))
251 pWnd->SetFocus();
252
253 m_bValid = TRUE;
254 FX_RECT rcRect = GetViewBBox(pPageView, pAnnot);
255 InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
256 return TRUE;
257 }
258
259 FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
260 if (!IsValid())
261 return TRUE;
262
263 CPDFSDK_PageView* pPageView = GetCurPageView();
264 CommitData(pPageView, nFlag);
265
266 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
267 pWnd->KillFocus();
268
269 switch (m_pWidget->GetFieldType()) {
270 case FIELDTYPE_PUSHBUTTON:
271 case FIELDTYPE_CHECKBOX:
272 case FIELDTYPE_RADIOBUTTON:
273 EscapeFiller(pPageView, TRUE);
274 break;
275 default:
276 EscapeFiller(pPageView, FALSE);
277 break;
278 }
279 return TRUE;
280 }
281
282 FX_BOOL CFFL_FormFiller::IsValid() const {
283 return m_bValid;
284 }
285
286 PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam() {
287 ASSERT(m_pApp != NULL);
288
289 PWL_CREATEPARAM cp;
290 cp.pParentWnd = NULL;
291 cp.pProvider = this;
292 cp.rcRectWnd = GetPDFWindowRect();
293
294 FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
295 FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
296 if (dwFieldFlag & FIELDFLAG_READONLY) {
297 dwCreateFlags |= PWS_READONLY;
298 }
299
300 FX_COLORREF color;
301 if (m_pWidget->GetFillColor(color)) {
302 cp.sBackgroundColor =
303 CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
304 }
305
306 if (m_pWidget->GetBorderColor(color)) {
307 cp.sBorderColor =
308 CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
309 }
310
311 cp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
312
313 if (m_pWidget->GetTextColor(color)) {
314 cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
315 }
316
317 cp.fFontSize = m_pWidget->GetFontSize();
318 cp.dwBorderWidth = m_pWidget->GetBorderWidth();
319
320 int nBorderStyle = m_pWidget->GetBorderStyle();
321
322 switch (nBorderStyle) {
323 case BBS_SOLID:
324 cp.nBorderStyle = PBS_SOLID;
325 break;
326 case BBS_DASH:
327 cp.nBorderStyle = PBS_DASH;
328 cp.sDash = CPWL_Dash(3, 3, 0);
329 break;
330 case BBS_BEVELED:
331 cp.nBorderStyle = PBS_BEVELED;
332 cp.dwBorderWidth *= 2;
333 break;
334 case BBS_INSET:
335 cp.nBorderStyle = PBS_INSET;
336 cp.dwBorderWidth *= 2;
337 break;
338 case BBS_UNDERLINE:
339 cp.nBorderStyle = PBS_UNDERLINED;
340 break;
341 }
342
343 if (cp.fFontSize <= 0) {
344 dwCreateFlags |= PWS_AUTOFONTSIZE;
345 }
346
347 cp.dwFlags = dwCreateFlags;
348 cp.pSystemHandler = m_pApp->GetSysHandler();
349 return cp;
350 }
351
352 CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView,
353 FX_BOOL bNew) {
354 ASSERT(pPageView);
355
356 auto it = m_Maps.find(pPageView);
357 const bool found = it != m_Maps.end();
358 CPWL_Wnd* pWnd = found ? it->second : nullptr;
359 if (!bNew)
360 return pWnd;
361
362 if (found) {
363 CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData();
364 if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge()) {
365 return ResetPDFWindow(
366 pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge);
367 }
368 } else {
369 PWL_CREATEPARAM cp = GetCreateParam();
370 cp.hAttachedWnd = (FX_HWND)m_pWidget;
371
372 CFFL_PrivateData* pPrivateData = new CFFL_PrivateData;
373 pPrivateData->pWidget = m_pWidget;
374 pPrivateData->pPageView = pPageView;
375 pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge();
376 pPrivateData->nValueAge = 0;
377
378 cp.pAttachedData = pPrivateData;
379
380 pWnd = NewPDFWindow(cp, pPageView);
381 m_Maps[pPageView] = pWnd;
382 }
383
384 return pWnd;
385 }
386
387 void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView) {
388 auto it = m_Maps.find(pPageView);
389 if (it == m_Maps.end())
390 return;
391
392 CPWL_Wnd* pWnd = it->second;
393 CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
394 pWnd->Destroy();
395 delete pWnd;
396 delete pData;
397
398 m_Maps.erase(it);
399 }
400
401 CPDF_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData) {
402 if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData) {
403 if (pPrivateData->pPageView) {
404 CPDF_Matrix mtPageView;
405 pPrivateData->pPageView->GetCurrentMatrix(mtPageView);
406 CPDF_Matrix mt = GetCurMatrix();
407 mt.Concat(mtPageView);
408
409 return mt;
410 }
411 }
412 return CPDF_Matrix(1, 0, 0, 1, 0, 0);
413 }
414
415 CPDF_Matrix CFFL_FormFiller::GetCurMatrix() {
416 CPDF_Matrix mt;
417
418 ASSERT(m_pWidget != NULL);
419
420 CPDF_Rect rcDA;
421 m_pWidget->GetPDFAnnot()->GetRect(rcDA);
422
423 switch (m_pWidget->GetRotate()) {
424 default:
425 case 0:
426 mt = CPDF_Matrix(1, 0, 0, 1, 0, 0);
427 break;
428 case 90:
429 mt = CPDF_Matrix(0, 1, -1, 0, rcDA.right - rcDA.left, 0);
430 break;
431 case 180:
432 mt = CPDF_Matrix(-1, 0, 0, -1, rcDA.right - rcDA.left,
433 rcDA.top - rcDA.bottom);
434 break;
435 case 270:
436 mt = CPDF_Matrix(0, -1, 1, 0, 0, rcDA.top - rcDA.bottom);
437 break;
438 }
439 mt.e += rcDA.left;
440 mt.f += rcDA.bottom;
441
442 return mt;
443 }
444
445 CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex) {
446 ASSERT(m_pApp != NULL);
447
448 return L"";
449 }
450
451 CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const {
452 CPDF_Rect rectAnnot;
453 m_pWidget->GetPDFAnnot()->GetRect(rectAnnot);
454
455 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
456 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
457 if ((m_pWidget->GetRotate() / 90) & 0x01)
458 return CPDF_Rect(0, 0, fHeight, fWidth);
459
460 return CPDF_Rect(0, 0, fWidth, fHeight);
461 }
462
463 CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView() {
464 CPDF_Page* pPage = m_pAnnot->GetPDFPage();
465 CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument();
466 return pSDKDoc ? pSDKDoc->GetPageView(pPage) : nullptr;
467 }
468
469 CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView) {
470 if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE)) {
471 CPDF_Rect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
472 CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();
473 if (rcPage.Contains(rcFocus))
474 return rcFocus;
475 }
476 return CPDF_Rect(0, 0, 0, 0);
477 }
478
479 CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect) {
480 CPDF_Matrix mt;
481 mt.SetReverse(GetCurMatrix());
482
483 CPDF_Rect temp = rect;
484 mt.TransformRect(temp);
485
486 return temp;
487 }
488
489 CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect) {
490 CPDF_Matrix mt = GetCurMatrix();
491
492 CPDF_Rect temp = rect;
493 mt.TransformRect(temp);
494
495 return temp;
496 }
497
498 CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point) {
499 CPDF_Matrix mt;
500 mt.SetReverse(GetCurMatrix());
501
502 CPDF_Point pt = point;
503 mt.Transform(pt.x, pt.y);
504
505 return pt;
506 }
507
508 CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point& point) {
509 CPDF_Matrix mt = GetCurMatrix();
510
511 CPDF_Point pt = point;
512 mt.Transform(pt.x, pt.y);
513
514 return pt;
515 }
516
517 CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView,
518 const CPDF_Point& pt) {
519 return FFLtoPWL(pt);
520 }
521
522 CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView,
523 const CPDF_Rect& rect) {
524 return rect;
525 }
526
527 FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView,
528 FX_UINT nFlag) {
529 if (IsDataChanged(pPageView)) {
530 FX_BOOL bRC = TRUE;
531 FX_BOOL bExit = FALSE;
532 CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
533 pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag);
534 if (bExit)
535 return TRUE;
536 if (!bRC) {
537 ResetPDFWindow(pPageView, FALSE);
538 return TRUE;
539 }
540
541 pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);
542 if (bExit)
543 return TRUE;
544 if (!bRC) {
545 ResetPDFWindow(pPageView, FALSE);
546 return TRUE;
547 }
548
549 SaveData(pPageView);
550 pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit, nFlag);
551 if (bExit)
552 return TRUE;
553
554 pIFormFiller->OnFormat(m_pWidget, pPageView, bExit, nFlag);
555 }
556 return TRUE;
557 }
558
559 FX_BOOL CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView) {
560 return FALSE;
561 }
562
563 void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView) {}
564
565 void CFFL_FormFiller::SetChangeMark() {
566 m_pApp->FFI_OnChange();
567 }
568
569 void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView,
570 CPDF_AAction::AActionType type,
571 PDFSDK_FieldAction& fa) {
572 fa.sValue = m_pWidget->GetValue();
573 }
574
575 void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView,
576 CPDF_AAction::AActionType type,
577 const PDFSDK_FieldAction& fa) {}
578
579 FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type,
580 const PDFSDK_FieldAction& faOld,
581 const PDFSDK_FieldAction& faNew) {
582 return FALSE;
583 }
584
585 void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView) {}
586
587 void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView) {}
588
589 CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView,
590 FX_BOOL bRestoreValue) {
591 return GetPDFWindow(pPageView, FALSE);
592 }
593
594 void CFFL_FormFiller::TimerProc() {}
595
596 IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const {
597 return m_pApp->GetSysHandler();
598 }
599
600 void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown) {}
601
602 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView,
603 FX_BOOL bDestroyPDFWindow) {
604 m_bValid = FALSE;
605
606 FX_RECT rcRect = GetViewBBox(pPageView, m_pWidget);
607 InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
608
609 if (bDestroyPDFWindow)
610 DestroyPDFWindow(pPageView);
611 }
612
613 FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument) {
614 return FALSE;
615 }
616
617 FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument) {
618 return FALSE;
619 }
620
621 FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument) {
622 return FALSE;
623 }
624
625 void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument) {}
626
627 void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument) {}
628
629 void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument) {}
630
631 void CFFL_FormFiller::InvalidateRect(double left,
632 double top,
633 double right,
634 double bottom) {
635 CPDF_Page* pPage = m_pWidget->GetPDFPage();
636 m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
637 }
638
639 /* ------------------------- CFFL_Button ------------------------- */
640
641 CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget)
642 : CFFL_FormFiller(pApp, pWidget), m_bMouseIn(FALSE), m_bMouseDown(FALSE) {}
643
644 CFFL_Button::~CFFL_Button() {}
645
646 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView* pPageView,
647 CPDFSDK_Annot* pAnnot) {
648 m_bMouseIn = TRUE;
649 FX_RECT rect = GetViewBBox(pPageView, pAnnot);
650 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
651 }
652
653 void CFFL_Button::OnMouseExit(CPDFSDK_PageView* pPageView,
654 CPDFSDK_Annot* pAnnot) {
655 m_bMouseIn = FALSE;
656
657 FX_RECT rect = GetViewBBox(pPageView, pAnnot);
658 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
659 EndTimer();
660 ASSERT(m_pWidget != NULL);
661 }
662
663 FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView* pPageView,
664 CPDFSDK_Annot* pAnnot,
665 FX_UINT nFlags,
666 const CPDF_Point& point) {
667 CPDF_Rect rcAnnot = pAnnot->GetRect();
668 if (!rcAnnot.Contains(point.x, point.y))
669 return FALSE;
670
671 m_bMouseDown = TRUE;
672 m_bValid = TRUE;
673 FX_RECT rect = GetViewBBox(pPageView, pAnnot);
674 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
675 return TRUE;
676 }
677
678 FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView* pPageView,
679 CPDFSDK_Annot* pAnnot,
680 FX_UINT nFlags,
681 const CPDF_Point& point) {
682 CPDF_Rect rcAnnot = pAnnot->GetRect();
683 if (!rcAnnot.Contains(point.x, point.y))
684 return FALSE;
685
686 m_bMouseDown = FALSE;
687 m_pWidget->GetPDFPage();
688
689 FX_RECT rect = GetViewBBox(pPageView, pAnnot);
690 InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
691 return TRUE;
692 }
693
694 FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView* pPageView,
695 CPDFSDK_Annot* pAnnot,
696 FX_UINT nFlags,
697 const CPDF_Point& point) {
698 ASSERT(m_pApp != NULL);
699
700 return TRUE;
701 }
702
703 void CFFL_Button::OnDraw(CPDFSDK_PageView* pPageView,
704 CPDFSDK_Annot* pAnnot,
705 CFX_RenderDevice* pDevice,
706 CPDF_Matrix* pUser2Device,
707 FX_DWORD dwFlags) {
708 ASSERT(pPageView != NULL);
709 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
710 CPDF_FormControl* pCtrl = pWidget->GetFormControl();
711 CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();
712
713 if (eHM == CPDF_FormControl::Push) {
714 if (m_bMouseDown) {
715 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))
716 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);
717 else
718 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal,
719 NULL);
720 } else if (m_bMouseIn) {
721 if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))
722 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover,
723 NULL);
724 else
725 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal,
726 NULL);
727 } else {
728 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
729 }
730 } else
731 pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
732 }
733
734 void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView* pPageView,
735 CPDFSDK_Annot* pAnnot,
736 CFX_RenderDevice* pDevice,
737 CPDF_Matrix* pUser2Device,
738 FX_DWORD dwFlags) {
739 OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
740 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698