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