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

Side by Side Diff: xfa/src/fxfa/app/xfa_fftextedit.cpp

Issue 1803723002: Move xfa/src up to xfa/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 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
« no previous file with comments | « xfa/src/fxfa/app/xfa_fftextedit.h ('k') | xfa/src/fxfa/app/xfa_ffwidget.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
7 #include "xfa/src/fxfa/app/xfa_fftextedit.h"
8
9 #include <vector>
10
11 #include "xfa/include/fwl/basewidget/fwl_datetimepicker.h"
12 #include "xfa/include/fwl/basewidget/fwl_edit.h"
13 #include "xfa/include/fwl/lightwidget/datetimepicker.h"
14 #include "xfa/include/fwl/lightwidget/edit.h"
15 #include "xfa/src/fxfa/app/xfa_ffapp.h"
16 #include "xfa/src/fxfa/app/xfa_ffdoc.h"
17 #include "xfa/src/fxfa/app/xfa_ffdocview.h"
18 #include "xfa/src/fxfa/app/xfa_fffield.h"
19 #include "xfa/src/fxfa/app/xfa_ffpageview.h"
20 #include "xfa/src/fxfa/app/xfa_ffwidget.h"
21 #include "xfa/src/fxfa/app/xfa_fwladapter.h"
22 #include "xfa/src/fxfa/app/xfa_textlayout.h"
23 #include "xfa/src/fxfa/parser/xfa_localevalue.h"
24
25 CXFA_FFTextEdit::CXFA_FFTextEdit(CXFA_FFPageView* pPageView,
26 CXFA_WidgetAcc* pDataAcc)
27 : CXFA_FFField(pPageView, pDataAcc), m_pOldDelegate(NULL) {}
28 CXFA_FFTextEdit::~CXFA_FFTextEdit() {
29 if (m_pNormalWidget) {
30 IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
31 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
32 pNoteDriver->UnregisterEventTarget(pWidget);
33 }
34 }
35 FX_BOOL CXFA_FFTextEdit::LoadWidget() {
36 CFWL_Edit* pFWLEdit = CFWL_Edit::Create();
37 pFWLEdit->Initialize();
38 m_pNormalWidget = pFWLEdit;
39 IFWL_Widget* pWidget = m_pNormalWidget->GetWidget();
40 m_pNormalWidget->SetPrivateData(pWidget, this, NULL);
41 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
42 pNoteDriver->RegisterEventTarget(pWidget, pWidget);
43 m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
44 m_pNormalWidget->LockUpdate();
45 UpdateWidgetProperty();
46 CFX_WideString wsText;
47 m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
48 pFWLEdit->SetText(wsText);
49 m_pNormalWidget->UnlockUpdate();
50 return CXFA_FFField::LoadWidget();
51 }
52 void CXFA_FFTextEdit::UpdateWidgetProperty() {
53 CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
54 if (!pWidget) {
55 return;
56 }
57 FX_DWORD dwStyle = 0;
58 FX_DWORD dwExtendedStyle = FWL_STYLEEXT_EDT_ShowScrollbarFocus |
59 FWL_STYLEEXT_EDT_OuterScrollbar |
60 FWL_STYLEEXT_EDT_LastLineHeight;
61 dwExtendedStyle |= UpdateUIProperty();
62 if (m_pDataAcc->IsMultiLine()) {
63 dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine | FWL_STYLEEXT_EDT_WantReturn;
64 if (m_pDataAcc->GetVerticalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
65 dwStyle |= FWL_WGTSTYLE_VScroll;
66 dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoVScroll;
67 }
68 } else if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
69 dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
70 }
71 if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
72 !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
73 dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
74 dwExtendedStyle |= FWL_STYLEEXT_EDT_MultiLine;
75 }
76 XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN;
77 int32_t iMaxChars = m_pDataAcc->GetMaxChars(eType);
78 if (eType == XFA_ELEMENT_ExData) {
79 iMaxChars = 0;
80 }
81 int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
82 if (iNumCells == 0) {
83 dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
84 pWidget->SetLimit(iMaxChars > 0 ? iMaxChars : 1);
85 } else if (iNumCells > 0) {
86 dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
87 pWidget->SetLimit(iNumCells);
88 } else {
89 pWidget->SetLimit(iMaxChars);
90 }
91 dwExtendedStyle |= GetAlignment();
92 m_pNormalWidget->ModifyStyles(dwStyle, 0xFFFFFFFF);
93 m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
94 }
95 FX_BOOL CXFA_FFTextEdit::OnLButtonDown(FX_DWORD dwFlags,
96 FX_FLOAT fx,
97 FX_FLOAT fy) {
98 if (!PtInActiveRect(fx, fy)) {
99 return FALSE;
100 }
101 if (!IsFocused()) {
102 m_dwStatus |= XFA_WIDGETSTATUS_Focused;
103 UpdateFWLData();
104 AddInvalidateRect();
105 }
106 SetButtonDown(TRUE);
107 CFWL_MsgMouse ms;
108 ms.m_dwCmd = FWL_MSGMOUSECMD_LButtonDown;
109 ms.m_dwFlags = dwFlags;
110 ms.m_fx = fx;
111 ms.m_fy = fy;
112 ms.m_pDstTarget = m_pNormalWidget->m_pIface;
113 FWLToClient(ms.m_fx, ms.m_fy);
114 TranslateFWLMessage(&ms);
115 return TRUE;
116 }
117 FX_BOOL CXFA_FFTextEdit::OnRButtonDown(FX_DWORD dwFlags,
118 FX_FLOAT fx,
119 FX_FLOAT fy) {
120 if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
121 return FALSE;
122 }
123 if (!PtInActiveRect(fx, fy)) {
124 return FALSE;
125 }
126 if (!IsFocused()) {
127 m_dwStatus |= XFA_WIDGETSTATUS_Focused;
128 UpdateFWLData();
129 AddInvalidateRect();
130 }
131 SetButtonDown(TRUE);
132 CFWL_MsgMouse ms;
133 ms.m_dwCmd = FWL_MSGMOUSECMD_RButtonDown;
134 ms.m_dwFlags = dwFlags;
135 ms.m_fx = fx;
136 ms.m_fy = fy;
137 FWLToClient(ms.m_fx, ms.m_fy);
138 TranslateFWLMessage(&ms);
139 return TRUE;
140 }
141 FX_BOOL CXFA_FFTextEdit::OnRButtonUp(FX_DWORD dwFlags,
142 FX_FLOAT fx,
143 FX_FLOAT fy) {
144 if (!CXFA_FFField::OnRButtonUp(dwFlags, fx, fy))
145 return FALSE;
146
147 GetDoc()->GetDocProvider()->PopupMenu(this, CFX_PointF(fx, fy), nullptr);
148 return TRUE;
149 }
150 FX_BOOL CXFA_FFTextEdit::OnSetFocus(CXFA_FFWidget* pOldWidget) {
151 m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged;
152 if (!IsFocused()) {
153 m_dwStatus |= XFA_WIDGETSTATUS_Focused;
154 UpdateFWLData();
155 AddInvalidateRect();
156 }
157 CXFA_FFWidget::OnSetFocus(pOldWidget);
158 CFWL_MsgSetFocus ms;
159 ms.m_pDstTarget = m_pNormalWidget->m_pIface;
160 ms.m_pSrcTarget = NULL;
161 TranslateFWLMessage(&ms);
162 return TRUE;
163 }
164 FX_BOOL CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
165 CFWL_MsgKillFocus ms;
166 ms.m_pDstTarget = m_pNormalWidget->m_pIface;
167 ms.m_pSrcTarget = NULL;
168 TranslateFWLMessage(&ms);
169 m_dwStatus &= ~XFA_WIDGETSTATUS_Focused;
170 SetEditScrollOffset();
171 ProcessCommittedData();
172 UpdateFWLData();
173 AddInvalidateRect();
174 CXFA_FFWidget::OnKillFocus(pNewWidget);
175 m_dwStatus &= ~XFA_WIDGETSTATUS_TextEditValueChanged;
176 return TRUE;
177 }
178 FX_BOOL CXFA_FFTextEdit::CommitData() {
179 CFX_WideString wsText;
180 ((CFWL_Edit*)m_pNormalWidget)->GetText(wsText);
181 if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
182 m_pDataAcc->UpdateUIDisplay(this);
183 return TRUE;
184 }
185 ValidateNumberField(wsText);
186 return FALSE;
187 }
188 void CXFA_FFTextEdit::ValidateNumberField(const CFX_WideString& wsText) {
189 CXFA_WidgetAcc* pAcc = GetDataAcc();
190 if (pAcc && pAcc->GetUIType() == XFA_ELEMENT_NumericEdit) {
191 IXFA_AppProvider* pAppProvider = GetApp()->GetAppProvider();
192 if (pAppProvider) {
193 CFX_WideString wsTitle;
194 pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
195 CFX_WideString wsMessage;
196 CFX_WideString wsError;
197 pAppProvider->LoadString(XFA_IDS_ValidateNumberError, wsError);
198 CFX_WideString wsSomField;
199 pAcc->GetNode()->GetSOMExpression(wsSomField);
200 wsMessage.Format(wsError, (const FX_WCHAR*)wsText,
201 (const FX_WCHAR*)wsSomField);
202 pAppProvider->MsgBox(wsMessage, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
203 }
204 }
205 }
206 FX_BOOL CXFA_FFTextEdit::IsDataChanged() {
207 return (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) != 0;
208 }
209 FX_DWORD CXFA_FFTextEdit::GetAlignment() {
210 FX_DWORD dwExtendedStyle = 0;
211 if (CXFA_Para para = m_pDataAcc->GetPara()) {
212 int32_t iHorz = para.GetHorizontalAlign();
213 switch (iHorz) {
214 case XFA_ATTRIBUTEENUM_Center:
215 dwExtendedStyle |= FWL_STYLEEXT_EDT_HCenter;
216 break;
217 case XFA_ATTRIBUTEENUM_Justify:
218 dwExtendedStyle |= FWL_STYLEEXT_EDT_Justified;
219 break;
220 case XFA_ATTRIBUTEENUM_JustifyAll:
221 break;
222 case XFA_ATTRIBUTEENUM_Radix:
223 break;
224 case XFA_ATTRIBUTEENUM_Right:
225 dwExtendedStyle |= FWL_STYLEEXT_EDT_HFar;
226 break;
227 default:
228 dwExtendedStyle |= FWL_STYLEEXT_EDT_HNear;
229 break;
230 }
231 int32_t iVert = para.GetVerticalAlign();
232 switch (iVert) {
233 case XFA_ATTRIBUTEENUM_Middle:
234 dwExtendedStyle |= FWL_STYLEEXT_EDT_VCenter;
235 break;
236 case XFA_ATTRIBUTEENUM_Bottom:
237 dwExtendedStyle |= FWL_STYLEEXT_EDT_VFar;
238 break;
239 default:
240 dwExtendedStyle |= FWL_STYLEEXT_EDT_VNear;
241 break;
242 }
243 }
244 return dwExtendedStyle;
245 }
246 FX_BOOL CXFA_FFTextEdit::UpdateFWLData() {
247 if (!m_pNormalWidget) {
248 return FALSE;
249 }
250 XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display;
251 if (IsFocused()) {
252 eType = XFA_VALUEPICTURE_Edit;
253 }
254 FX_BOOL bUpdate = FALSE;
255 if (m_pDataAcc->GetUIType() == XFA_ELEMENT_TextEdit &&
256 m_pDataAcc->GetNumberOfCells() < 0) {
257 XFA_ELEMENT elementType = XFA_ELEMENT_UNKNOWN;
258 int32_t iMaxChars = m_pDataAcc->GetMaxChars(elementType);
259 if (elementType == XFA_ELEMENT_ExData) {
260 iMaxChars = eType == XFA_VALUEPICTURE_Edit ? iMaxChars : 0;
261 }
262 if (((CFWL_Edit*)m_pNormalWidget)->GetLimit() != iMaxChars) {
263 ((CFWL_Edit*)m_pNormalWidget)->SetLimit(iMaxChars);
264 bUpdate = TRUE;
265 }
266 }
267 if (m_pDataAcc->GetUIType() == XFA_ELEMENT_Barcode) {
268 int32_t nDataLen = 0;
269 if (eType == XFA_VALUEPICTURE_Edit)
270 m_pDataAcc->GetBarcodeAttribute_DataLength(nDataLen);
271 static_cast<CFWL_Edit*>(m_pNormalWidget)->SetLimit(nDataLen);
272 bUpdate = TRUE;
273 }
274 CFX_WideString wsText;
275 m_pDataAcc->GetValue(wsText, eType);
276 CFX_WideString wsOldText;
277 ((CFWL_Edit*)m_pNormalWidget)->GetText(wsOldText);
278 if (wsText != wsOldText || (eType == XFA_VALUEPICTURE_Edit && bUpdate)) {
279 ((CFWL_Edit*)m_pNormalWidget)->SetText(wsText);
280 bUpdate = TRUE;
281 }
282 if (bUpdate) {
283 m_pNormalWidget->Update();
284 }
285 return TRUE;
286 }
287 FX_BOOL CXFA_FFTextEdit::CanUndo() {
288 return ((CFWL_Edit*)m_pNormalWidget)->CanUndo();
289 }
290 FX_BOOL CXFA_FFTextEdit::CanRedo() {
291 return ((CFWL_Edit*)m_pNormalWidget)->CanRedo();
292 }
293 FX_BOOL CXFA_FFTextEdit::Undo() {
294 return ((CFWL_Edit*)m_pNormalWidget)->Undo();
295 }
296 FX_BOOL CXFA_FFTextEdit::Redo() {
297 return ((CFWL_Edit*)m_pNormalWidget)->Redo();
298 }
299 FX_BOOL CXFA_FFTextEdit::CanCopy() {
300 int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
301 return nCount > 0;
302 }
303 FX_BOOL CXFA_FFTextEdit::CanCut() {
304 if (m_pNormalWidget->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
305 return FALSE;
306 }
307 int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
308 return nCount > 0;
309 }
310 FX_BOOL CXFA_FFTextEdit::CanPaste() {
311 return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
312 }
313 FX_BOOL CXFA_FFTextEdit::CanSelectAll() {
314 return ((CFWL_Edit*)m_pNormalWidget)->GetTextLength() > 0;
315 }
316 FX_BOOL CXFA_FFTextEdit::Copy(CFX_WideString& wsCopy) {
317 return ((CFWL_Edit*)m_pNormalWidget)->Copy(wsCopy);
318 }
319 FX_BOOL CXFA_FFTextEdit::Cut(CFX_WideString& wsCut) {
320 return ((CFWL_Edit*)m_pNormalWidget)->Cut(wsCut);
321 }
322 FX_BOOL CXFA_FFTextEdit::Paste(const CFX_WideString& wsPaste) {
323 return ((CFWL_Edit*)m_pNormalWidget)->Paste(wsPaste);
324 }
325 FX_BOOL CXFA_FFTextEdit::SelectAll() {
326 int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->GetTextLength();
327 return ((CFWL_Edit*)m_pNormalWidget)->AddSelRange(0, nCount);
328 }
329 FX_BOOL CXFA_FFTextEdit::Delete() {
330 return ((CFWL_Edit*)m_pNormalWidget)->Delete();
331 }
332 FX_BOOL CXFA_FFTextEdit::DeSelect() {
333 return ((CFWL_Edit*)m_pNormalWidget)->ClearSelections();
334 }
335 FX_BOOL CXFA_FFTextEdit::GetSuggestWords(
336 CFX_PointF pointf,
337 std::vector<CFX_ByteString>& sSuggest) {
338 if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
339 return FALSE;
340 }
341 FWLToClient(pointf.x, pointf.y);
342 return ((CFWL_Edit*)m_pNormalWidget)->GetSuggestWords(pointf, sSuggest);
343 }
344 FX_BOOL CXFA_FFTextEdit::ReplaceSpellCheckWord(
345 CFX_PointF pointf,
346 const CFX_ByteStringC& bsReplace) {
347 if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
348 return FALSE;
349 }
350 FWLToClient(pointf.x, pointf.y);
351 return ((CFWL_Edit*)m_pNormalWidget)
352 ->ReplaceSpellCheckWord(pointf, bsReplace);
353 }
354 void CXFA_FFTextEdit::OnTextChanged(IFWL_Widget* pWidget,
355 const CFX_WideString& wsChanged,
356 const CFX_WideString& wsPrevText) {
357 m_dwStatus |= XFA_WIDGETSTATUS_TextEditValueChanged;
358 CXFA_EventParam eParam;
359 eParam.m_eType = XFA_EVENT_Change;
360 eParam.m_wsChange = wsChanged;
361 eParam.m_pTarget = m_pDataAcc;
362 eParam.m_wsPrevText = wsPrevText;
363 CFWL_Edit* pEdit = ((CFWL_Edit*)m_pNormalWidget);
364 if (m_pDataAcc->GetUIType() == XFA_ELEMENT_DateTimeEdit) {
365 CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)pEdit;
366 pDateTime->GetEditText(eParam.m_wsNewText);
367 int32_t iSels = pDateTime->CountSelRanges();
368 if (iSels) {
369 eParam.m_iSelEnd = pDateTime->GetSelRange(0, eParam.m_iSelStart);
370 }
371 } else {
372 pEdit->GetText(eParam.m_wsNewText);
373 int32_t iSels = pEdit->CountSelRanges();
374 if (iSels) {
375 eParam.m_iSelEnd = pEdit->GetSelRange(0, eParam.m_iSelStart);
376 }
377 }
378 m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
379 }
380 void CXFA_FFTextEdit::OnTextFull(IFWL_Widget* pWidget) {
381 CXFA_EventParam eParam;
382 eParam.m_eType = XFA_EVENT_Full;
383 eParam.m_pTarget = m_pDataAcc;
384 m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Full, &eParam);
385 }
386
387 FX_BOOL CXFA_FFTextEdit::CheckWord(const CFX_ByteStringC& sWord) {
388 if (sWord.IsEmpty() || m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
389 return TRUE;
390 }
391 return GetDoc()->GetDocProvider()->CheckWord(GetDoc(), sWord);
392 }
393 FX_BOOL CXFA_FFTextEdit::GetSuggestWords(
394 const CFX_ByteStringC& sWord,
395 std::vector<CFX_ByteString>& sSuggest) {
396 if (m_pDataAcc->GetUIType() != XFA_ELEMENT_TextEdit) {
397 return FALSE;
398 }
399 return GetDoc()->GetDocProvider()->GetSuggestWords(GetDoc(), sWord, sSuggest);
400 }
401 int32_t CXFA_FFTextEdit::OnProcessMessage(CFWL_Message* pMessage) {
402 return m_pOldDelegate->OnProcessMessage(pMessage);
403 }
404 FWL_ERR CXFA_FFTextEdit::OnProcessEvent(CFWL_Event* pEvent) {
405 CXFA_FFField::OnProcessEvent(pEvent);
406 FX_DWORD dwEventID = pEvent->GetClassID();
407 switch (dwEventID) {
408 case FWL_EVTHASH_EDT_TextChanged: {
409 CFWL_EvtEdtTextChanged* event = (CFWL_EvtEdtTextChanged*)pEvent;
410 CFX_WideString wsChange;
411 OnTextChanged(m_pNormalWidget->GetWidget(), wsChange, event->wsPrevText);
412 break;
413 }
414 case FWL_EVTHASH_EDT_TextFull: {
415 OnTextFull(m_pNormalWidget->GetWidget());
416 break;
417 }
418 case FWL_EVTHASH_EDT_CheckWord: {
419 CFX_WideString wstr(L"FWL_EVENT_DTP_SelectChanged");
420 CFWL_EvtEdtCheckWord* event = (CFWL_EvtEdtCheckWord*)pEvent;
421 event->bCheckWord = CheckWord(event->bsWord);
422 break;
423 }
424 case FWL_EVTHASH_EDT_GetSuggestWords: {
425 CFWL_EvtEdtGetSuggestWords* event = (CFWL_EvtEdtGetSuggestWords*)pEvent;
426 event->bSuggestWords =
427 GetSuggestWords(event->bsWord, event->bsArraySuggestWords);
428 break;
429 }
430 default: {}
431 }
432 return m_pOldDelegate->OnProcessEvent(pEvent);
433 }
434 FWL_ERR CXFA_FFTextEdit::OnDrawWidget(CFX_Graphics* pGraphics,
435 const CFX_Matrix* pMatrix) {
436 return m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
437 }
438 CXFA_FFNumericEdit::CXFA_FFNumericEdit(CXFA_FFPageView* pPageView,
439 CXFA_WidgetAcc* pDataAcc)
440 : CXFA_FFTextEdit(pPageView, pDataAcc) {}
441 CXFA_FFNumericEdit::~CXFA_FFNumericEdit() {}
442 FX_BOOL CXFA_FFNumericEdit::LoadWidget() {
443 CFWL_Edit* pWidget = CFWL_Edit::Create();
444 pWidget->Initialize();
445 m_pNormalWidget = (CFWL_Widget*)pWidget;
446 IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
447 m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
448 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
449 pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
450 m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
451 m_pNormalWidget->LockUpdate();
452 CFX_WideString wsText;
453 m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
454 pWidget->SetText(wsText);
455 UpdateWidgetProperty();
456 m_pNormalWidget->UnlockUpdate();
457 return CXFA_FFField::LoadWidget();
458 }
459 void CXFA_FFNumericEdit::UpdateWidgetProperty() {
460 CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
461 if (!pWidget) {
462 return;
463 }
464 FX_DWORD dwExtendedStyle =
465 FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
466 FWL_STYLEEXT_EDT_Validate | FWL_STYLEEXT_EDT_Number |
467 FWL_STYLEEXT_EDT_LastLineHeight;
468 dwExtendedStyle |= UpdateUIProperty();
469 if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
470 dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
471 }
472 int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
473 if (iNumCells > 0) {
474 dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
475 pWidget->SetLimit(iNumCells);
476 }
477 dwExtendedStyle |= GetAlignment();
478 if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
479 !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
480 dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
481 }
482 m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
483 }
484 FWL_ERR CXFA_FFNumericEdit::OnProcessEvent(CFWL_Event* pEvent) {
485 FX_DWORD dwEventID = pEvent->GetClassID();
486 if (dwEventID == FWL_EVTHASH_EDT_Validate) {
487 CFWL_EvtEdtValidate* event = (CFWL_EvtEdtValidate*)pEvent;
488 CFX_WideString wsChange = event->wsInsert;
489 event->bValidate = OnValidate(m_pNormalWidget->GetWidget(), wsChange);
490 return event->bValidate;
491 } else {
492 return CXFA_FFTextEdit::OnProcessEvent(pEvent);
493 }
494 }
495 FX_BOOL CXFA_FFNumericEdit::OnValidate(IFWL_Widget* pWidget,
496 CFX_WideString& wsText) {
497 CFX_WideString wsPattern;
498 m_pDataAcc->GetPictureContent(wsPattern, XFA_VALUEPICTURE_Edit);
499 if (!wsPattern.IsEmpty()) {
500 return TRUE;
501 }
502 int32_t iLeads = 0;
503 m_pDataAcc->GetLeadDigits(iLeads);
504 int32_t iFracs = 0;
505 m_pDataAcc->GetFracDigits(iFracs);
506 CFX_WideString wsFormat;
507 CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(m_pDataAcc);
508 widgetValue.GetNumbericFormat(wsFormat, iLeads, iFracs);
509 return widgetValue.ValidateNumericTemp(wsText, wsFormat,
510 m_pDataAcc->GetLocal());
511 }
512 CXFA_FFPasswordEdit::CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView,
513 CXFA_WidgetAcc* pDataAcc)
514 : CXFA_FFTextEdit(pPageView, pDataAcc) {}
515 CXFA_FFPasswordEdit::~CXFA_FFPasswordEdit() {}
516 FX_BOOL CXFA_FFPasswordEdit::LoadWidget() {
517 CFWL_Edit* pWidget = CFWL_Edit::Create();
518 pWidget->Initialize();
519 m_pNormalWidget = (CFWL_Widget*)pWidget;
520 IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
521 m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
522 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
523 pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
524 m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
525 m_pNormalWidget->LockUpdate();
526 CFX_WideString wsText;
527 m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
528 pWidget->SetText(wsText);
529 UpdateWidgetProperty();
530 m_pNormalWidget->UnlockUpdate();
531 return CXFA_FFField::LoadWidget();
532 }
533 void CXFA_FFPasswordEdit::UpdateWidgetProperty() {
534 CFWL_Edit* pWidget = (CFWL_Edit*)m_pNormalWidget;
535 if (!pWidget) {
536 return;
537 }
538 FX_DWORD dwExtendedStyle =
539 FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
540 FWL_STYLEEXT_EDT_Password | FWL_STYLEEXT_EDT_LastLineHeight;
541 dwExtendedStyle |= UpdateUIProperty();
542 CFX_WideString wsPassWord;
543 m_pDataAcc->GetPasswordChar(wsPassWord);
544 if (!wsPassWord.IsEmpty()) {
545 pWidget->SetAliasChar(wsPassWord.GetAt(0));
546 }
547 if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
548 dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
549 }
550 if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
551 !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
552 dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
553 }
554 dwExtendedStyle |= GetAlignment();
555 m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
556 }
557 CXFA_FFDateTimeEdit::CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView,
558 CXFA_WidgetAcc* pDataAcc)
559 : CXFA_FFTextEdit(pPageView, pDataAcc) {}
560
561 CXFA_FFDateTimeEdit::~CXFA_FFDateTimeEdit() {}
562
563 FX_BOOL CXFA_FFDateTimeEdit::GetBBox(CFX_RectF& rtBox,
564 FX_DWORD dwStatus,
565 FX_BOOL bDrawFocus) {
566 if (bDrawFocus)
567 return FALSE;
568 return CXFA_FFWidget::GetBBox(rtBox, dwStatus);
569 }
570
571 FX_BOOL CXFA_FFDateTimeEdit::PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) {
572 if (!m_pNormalWidget) {
573 return FALSE;
574 }
575 CFX_RectF rtWidget;
576 ((CFWL_DateTimePicker*)m_pNormalWidget)->GetBBox(rtWidget);
577 if (rtWidget.Contains(fx, fy)) {
578 return TRUE;
579 }
580 return FALSE;
581 }
582 FX_BOOL CXFA_FFDateTimeEdit::LoadWidget() {
583 CFWL_DateTimePicker* pWidget = CFWL_DateTimePicker::Create();
584 pWidget->Initialize();
585 m_pNormalWidget = (CFWL_Widget*)pWidget;
586 IFWL_Widget* pIWidget = m_pNormalWidget->GetWidget();
587 m_pNormalWidget->SetPrivateData(pIWidget, this, NULL);
588 IFWL_NoteDriver* pNoteDriver = FWL_GetApp()->GetNoteDriver();
589 pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
590 m_pOldDelegate = m_pNormalWidget->SetDelegate(this);
591 m_pNormalWidget->LockUpdate();
592 CFX_WideString wsText;
593 m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
594 pWidget->SetEditText(wsText);
595 if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
596 switch (value.GetChildValueClassID()) {
597 case XFA_ELEMENT_Date: {
598 if (!wsText.IsEmpty()) {
599 CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc);
600 CFX_Unitime date = lcValue.GetDate();
601 if ((FX_UNITIME)date != 0) {
602 pWidget->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay());
603 }
604 }
605 } break;
606 default:
607 break;
608 }
609 }
610 UpdateWidgetProperty();
611 m_pNormalWidget->UnlockUpdate();
612 return CXFA_FFField::LoadWidget();
613 }
614 void CXFA_FFDateTimeEdit::UpdateWidgetProperty() {
615 CFWL_DateTimePicker* pWidget = (CFWL_DateTimePicker*)m_pNormalWidget;
616 if (!pWidget) {
617 return;
618 }
619 FX_DWORD dwExtendedStyle = FWL_STYLEEXT_DTP_ShortDateFormat;
620 dwExtendedStyle |= UpdateUIProperty();
621 dwExtendedStyle |= GetAlignment();
622 m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
623 FX_DWORD dwEditStyles = FWL_STYLEEXT_EDT_LastLineHeight;
624 int32_t iNumCells = m_pDataAcc->GetNumberOfCells();
625 if (iNumCells > 0) {
626 dwEditStyles |= FWL_STYLEEXT_EDT_CombText;
627 pWidget->SetEditLimit(iNumCells);
628 }
629 if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
630 !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
631 dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
632 }
633 if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
634 dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll;
635 }
636 pWidget->ModifyEditStylesEx(dwEditStyles, 0xFFFFFFFF);
637 }
638 FX_DWORD CXFA_FFDateTimeEdit::GetAlignment() {
639 FX_DWORD dwExtendedStyle = 0;
640 if (CXFA_Para para = m_pDataAcc->GetPara()) {
641 int32_t iHorz = para.GetHorizontalAlign();
642 switch (iHorz) {
643 case XFA_ATTRIBUTEENUM_Center:
644 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHCenter;
645 break;
646 case XFA_ATTRIBUTEENUM_Justify:
647 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditJustified;
648 break;
649 case XFA_ATTRIBUTEENUM_JustifyAll:
650 break;
651 case XFA_ATTRIBUTEENUM_Radix:
652 break;
653 case XFA_ATTRIBUTEENUM_Right:
654 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHFar;
655 break;
656 default:
657 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditHNear;
658 break;
659 }
660 int32_t iVert = para.GetVerticalAlign();
661 switch (iVert) {
662 case XFA_ATTRIBUTEENUM_Middle:
663 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVCenter;
664 break;
665 case XFA_ATTRIBUTEENUM_Bottom:
666 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVFar;
667 break;
668 default:
669 dwExtendedStyle |= FWL_STYLEEXT_DTP_EditVNear;
670 break;
671 }
672 }
673 return dwExtendedStyle;
674 }
675 FX_BOOL CXFA_FFDateTimeEdit::CommitData() {
676 CFX_WideString wsText;
677 ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
678 if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
679 m_pDataAcc->UpdateUIDisplay(this);
680 return TRUE;
681 }
682 return FALSE;
683 }
684 FX_BOOL CXFA_FFDateTimeEdit::UpdateFWLData() {
685 if (!m_pNormalWidget) {
686 return FALSE;
687 }
688 XFA_VALUEPICTURE eType = XFA_VALUEPICTURE_Display;
689 if (IsFocused()) {
690 eType = XFA_VALUEPICTURE_Edit;
691 }
692 CFX_WideString wsText;
693 m_pDataAcc->GetValue(wsText, eType);
694 ((CFWL_DateTimePicker*)m_pNormalWidget)->SetEditText(wsText);
695 if (IsFocused() && !wsText.IsEmpty()) {
696 CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc);
697 CFX_Unitime date = lcValue.GetDate();
698 if (lcValue.IsValid()) {
699 if ((FX_UNITIME)date != 0) {
700 ((CFWL_DateTimePicker*)m_pNormalWidget)
701 ->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay());
702 }
703 }
704 }
705 m_pNormalWidget->Update();
706 return TRUE;
707 }
708 FX_BOOL CXFA_FFDateTimeEdit::IsDataChanged() {
709 if (m_dwStatus & XFA_WIDGETSTATUS_TextEditValueChanged) {
710 return TRUE;
711 }
712 CFX_WideString wsText;
713 ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
714 CFX_WideString wsOldValue;
715 m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Edit);
716 return wsOldValue != wsText;
717 }
718 FX_BOOL CXFA_FFDateTimeEdit::CanUndo() {
719 return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanUndo();
720 }
721 FX_BOOL CXFA_FFDateTimeEdit::CanRedo() {
722 return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanRedo();
723 }
724 FX_BOOL CXFA_FFDateTimeEdit::Undo() {
725 return ((CFWL_DateTimePicker*)m_pNormalWidget)->Undo();
726 }
727 FX_BOOL CXFA_FFDateTimeEdit::Redo() {
728 return ((CFWL_DateTimePicker*)m_pNormalWidget)->Redo();
729 }
730 FX_BOOL CXFA_FFDateTimeEdit::CanCopy() {
731 return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCopy();
732 }
733 FX_BOOL CXFA_FFDateTimeEdit::CanCut() {
734 if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
735 return FALSE;
736 }
737 return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCut();
738 }
739 FX_BOOL CXFA_FFDateTimeEdit::CanPaste() {
740 return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
741 }
742 FX_BOOL CXFA_FFDateTimeEdit::CanSelectAll() {
743 return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanSelectAll();
744 }
745 FX_BOOL CXFA_FFDateTimeEdit::Copy(CFX_WideString& wsCopy) {
746 return ((CFWL_DateTimePicker*)m_pNormalWidget)->Copy(wsCopy);
747 }
748 FX_BOOL CXFA_FFDateTimeEdit::Cut(CFX_WideString& wsCut) {
749 return ((CFWL_DateTimePicker*)m_pNormalWidget)->Cut(wsCut);
750 }
751 FX_BOOL CXFA_FFDateTimeEdit::Paste(const CFX_WideString& wsPaste) {
752 return ((CFWL_DateTimePicker*)m_pNormalWidget)->Paste(wsPaste);
753 }
754 FX_BOOL CXFA_FFDateTimeEdit::SelectAll() {
755 return ((CFWL_DateTimePicker*)m_pNormalWidget)->SelectAll();
756 }
757 FX_BOOL CXFA_FFDateTimeEdit::Delete() {
758 return ((CFWL_DateTimePicker*)m_pNormalWidget)->Delete();
759 }
760 FX_BOOL CXFA_FFDateTimeEdit::DeSelect() {
761 return ((CFWL_DateTimePicker*)m_pNormalWidget)->DeSelect();
762 }
763 void CXFA_FFDateTimeEdit::OnSelectChanged(IFWL_Widget* pWidget,
764 int32_t iYear,
765 int32_t iMonth,
766 int32_t iDay) {
767 CFX_WideString wsPicture;
768 m_pDataAcc->GetPictureContent(wsPicture, XFA_VALUEPICTURE_Edit);
769 CXFA_LocaleValue date(XFA_VT_DATE, GetDoc()->GetXFADoc()->GetLocalMgr());
770 CFX_Unitime dt;
771 dt.Set(iYear, iMonth, iDay);
772 date.SetDate(dt);
773 CFX_WideString wsDate;
774 date.FormatPatterns(wsDate, wsPicture, m_pDataAcc->GetLocal(),
775 XFA_VALUEPICTURE_Edit);
776 CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)m_pNormalWidget;
777 pDateTime->SetEditText(wsDate);
778 pDateTime->Update();
779 GetDoc()->GetDocProvider()->SetFocusWidget(GetDoc(), NULL);
780 CXFA_EventParam eParam;
781 eParam.m_eType = XFA_EVENT_Change;
782 eParam.m_pTarget = m_pDataAcc;
783 m_pDataAcc->GetValue(eParam.m_wsNewText, XFA_VALUEPICTURE_Raw);
784 m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
785 }
786 FWL_ERR CXFA_FFDateTimeEdit::OnProcessEvent(CFWL_Event* pEvent) {
787 FX_DWORD dwEventID = pEvent->GetClassID();
788 if (dwEventID == FWL_EVTHASH_DTP_SelectChanged) {
789 CFWL_Event_DtpSelectChanged* event = (CFWL_Event_DtpSelectChanged*)pEvent;
790 OnSelectChanged(m_pNormalWidget->GetWidget(), event->iYear, event->iMonth,
791 event->iDay);
792 return TRUE;
793 } else {
794 return CXFA_FFTextEdit::OnProcessEvent(pEvent);
795 }
796 }
OLDNEW
« no previous file with comments | « xfa/src/fxfa/app/xfa_fftextedit.h ('k') | xfa/src/fxfa/app/xfa_ffwidget.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698