// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef XFA_FXFA_INCLUDE_XFA_FFWIDGET_H_ #define XFA_FXFA_INCLUDE_XFA_FFWIDGET_H_ #include <vector> #include "core/fxcodec/include/fx_codec_def.h" #include "core/fxge/include/fx_ge.h" #include "xfa/fxfa/include/fxfa.h" #include "xfa/fxfa/parser/xfa_doclayout.h" class CXFA_FFPageView; class CXFA_FFDocView; class CXFA_FFDoc; class CXFA_FFApp; enum class FWL_WidgetHit; inline FX_FLOAT XFA_UnitPx2Pt(FX_FLOAT fPx, FX_FLOAT fDpi) { return fPx * 72.0f / fDpi; } #define XFA_FLOAT_PERCISION 0.001f enum XFA_WIDGETITEM { XFA_WIDGETITEM_Parent, XFA_WIDGETITEM_FirstChild, XFA_WIDGETITEM_NextSibling, XFA_WIDGETITEM_PrevSibling, }; class CXFA_CalcData { public: CXFA_CalcData(); ~CXFA_CalcData(); CFX_ArrayTemplate<CXFA_WidgetAcc*> m_Globals; int32_t m_iRefCount; }; class CXFA_FFWidget : public CXFA_ContentLayoutItem { public: CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); ~CXFA_FFWidget() override; virtual FX_BOOL GetBBox(CFX_RectF& rtBox, uint32_t dwStatus, FX_BOOL bDrawFocus = FALSE); virtual void RenderWidget(CFX_Graphics* pGS, CFX_Matrix* pMatrix, uint32_t dwStatus); virtual FX_BOOL IsLoaded(); virtual FX_BOOL LoadWidget(); virtual void UnloadWidget(); virtual FX_BOOL PerformLayout(); virtual FX_BOOL UpdateFWLData(); virtual void UpdateWidgetProperty(); virtual FX_BOOL OnMouseEnter(); virtual FX_BOOL OnMouseExit(); virtual FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnLButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnMouseWheel(uint32_t dwFlags, int16_t zDelta, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnRButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget); virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); virtual FX_BOOL OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags); virtual FX_BOOL OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags); virtual FX_BOOL OnChar(uint32_t dwChar, uint32_t dwFlags); virtual FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy); virtual FX_BOOL CanUndo(); virtual FX_BOOL CanRedo(); virtual FX_BOOL Undo(); virtual FX_BOOL Redo(); virtual FX_BOOL CanCopy(); virtual FX_BOOL CanCut(); virtual FX_BOOL CanPaste(); virtual FX_BOOL CanSelectAll(); virtual FX_BOOL CanDelete(); virtual FX_BOOL CanDeSelect(); virtual FX_BOOL Copy(CFX_WideString& wsCopy); virtual FX_BOOL Cut(CFX_WideString& wsCut); virtual FX_BOOL Paste(const CFX_WideString& wsPaste); virtual FX_BOOL SelectAll(); virtual FX_BOOL Delete(); virtual FX_BOOL DeSelect(); virtual FX_BOOL GetSuggestWords(CFX_PointF pointf, std::vector<CFX_ByteString>& sSuggest); virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf, const CFX_ByteStringC& bsReplace); CXFA_FFPageView* GetPageView(); void SetPageView(CXFA_FFPageView* pPageView); void GetWidgetRect(CFX_RectF& rtWidget); CFX_RectF ReCacheWidgetRect(); uint32_t GetStatus(); void ModifyStatus(uint32_t dwAdded, uint32_t dwRemoved); CXFA_WidgetAcc* GetDataAcc(); FX_BOOL GetToolTip(CFX_WideString& wsToolTip); CXFA_FFDocView* GetDocView(); void SetDocView(CXFA_FFDocView* pDocView); CXFA_FFDoc* GetDoc(); CXFA_FFApp* GetApp(); IXFA_AppProvider* GetAppProvider(); void InvalidateWidget(const CFX_RectF* pRect = NULL); void AddInvalidateRect(const CFX_RectF* pRect = NULL); FX_BOOL GetCaptionText(CFX_WideString& wsCap); bool IsFocused(); void Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy); void GetRotateMatrix(CFX_Matrix& mt); FX_BOOL IsLayoutRectEmpty(); CXFA_FFWidget* GetParent(); FX_BOOL IsAncestorOf(CXFA_FFWidget* pWidget); protected: virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy); void DrawBorder(CFX_Graphics* pGS, CXFA_Box box, const CFX_RectF& rtBorder, CFX_Matrix* pMatrix, uint32_t dwFlags = 0); void GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth); void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight); void GetRectWithoutRotate(CFX_RectF& rtWidget); bool IsMatchVisibleStatus(uint32_t dwStatus); void EventKillFocus(); FX_BOOL IsButtonDown(); void SetButtonDown(FX_BOOL bSet); CXFA_FFDocView* m_pDocView; CXFA_FFPageView* m_pPageView; CXFA_WidgetAcc* m_pDataAcc; CFX_RectF m_rtWidget; }; int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics, int32_t iStrokeType, int32_t iCapType); CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap); void XFA_DrawImage(CFX_Graphics* pGS, const CFX_RectF& rtImage, CFX_Matrix* pMatrix, CFX_DIBitmap* pDIBitmap, int32_t iAspect, int32_t iImageXDpi, int32_t iImageYDpi, int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left, int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top); CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc, CXFA_Image* pImage, FX_BOOL& bNameImage, int32_t& iImageXDpi, int32_t& iImageYDpi); CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead, FXCODEC_IMAGE_TYPE type, int32_t& iImageXDpi, int32_t& iImageYDpi); FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideString& wsType); FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len); void XFA_RectWidthoutMargin(CFX_RectF& rt, const CXFA_Margin& mg, FX_BOOL bUI = FALSE); CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem); FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType); #define XFA_DRAWBOX_ForceRound 1 #define XFA_DRAWBOX_Lowered3D 2 void XFA_DrawBox(CXFA_Box box, CFX_Graphics* pGS, const CFX_RectF& rtWidget, CFX_Matrix* pMatrix, uint32_t dwFlags = 0); #endif // XFA_FXFA_INCLUDE_XFA_FFWIDGET_H_