Home | History | Annotate | Download | only in app
      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