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 #ifndef _FXFA_FORMFILLER_WIDGET_IMP_H 8 #define _FXFA_FORMFILLER_WIDGET_IMP_H 9 10 #include "xfa/include/fxfa/fxfa.h" 11 12 class CXFA_FFPageView; 13 class CXFA_FFDocView; 14 class CXFA_FFDoc; 15 class CXFA_FFApp; 16 17 #define XFA_GOTO_POSITION_IF_FAIL(arg, pos) \ 18 { \ 19 if (!(arg)) \ 20 goto pos; \ 21 } 22 inline FX_FLOAT XFA_UnitPx2Pt(FX_FLOAT fPx, FX_FLOAT fDpi) { 23 return fPx * 72.0f / fDpi; 24 } 25 #define XFA_FLOAT_PERCISION 0.001f 26 enum XFA_WIDGETITEM { 27 XFA_WIDGETITEM_Parent, 28 XFA_WIDGETITEM_FirstChild, 29 XFA_WIDGETITEM_NextSibling, 30 XFA_WIDGETITEM_PrevSibling, 31 }; 32 class CXFA_CalcData { 33 public: 34 CXFA_CalcData() : m_iRefCount(0) {} 35 ~CXFA_CalcData() { m_Globals.RemoveAll(); } 36 CFX_PtrArray m_Globals; 37 int32_t m_iRefCount; 38 }; 39 class CXFA_FFWidget : public IXFA_Widget, 40 public CFX_PrivateData, 41 public CXFA_ContentLayoutItem { 42 public: 43 CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc); 44 virtual ~CXFA_FFWidget(); 45 IXFA_PageView* GetPageView(); 46 void SetPageView(IXFA_PageView* pPageView); 47 void GetWidgetRect(CFX_RectF& rtWidget); 48 CFX_RectF ReCacheWidgetRect(); 49 FX_DWORD GetStatus(); 50 void ModifyStatus(FX_DWORD dwAdded, FX_DWORD dwRemoved); 51 virtual FX_BOOL GetBBox(CFX_RectF& rtBox, 52 FX_DWORD dwStatus, 53 FX_BOOL bDrawFocus = FALSE); 54 CXFA_WidgetAcc* GetDataAcc(); 55 FX_BOOL GetToolTip(CFX_WideString& wsToolTip); 56 virtual void RenderWidget(CFX_Graphics* pGS, 57 CFX_Matrix* pMatrix = NULL, 58 FX_DWORD dwStatus = 0, 59 int32_t iRotate = 0); 60 61 virtual FX_BOOL IsLoaded(); 62 virtual FX_BOOL LoadWidget(); 63 virtual void UnloadWidget(); 64 virtual FX_BOOL PerformLayout(); 65 virtual FX_BOOL UpdateFWLData(); 66 virtual void UpdateWidgetProperty(); 67 virtual FX_BOOL OnMouseEnter(); 68 virtual FX_BOOL OnMouseExit(); 69 virtual FX_BOOL OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 70 virtual FX_BOOL OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 71 virtual FX_BOOL OnLButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 72 virtual FX_BOOL OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 73 virtual FX_BOOL OnMouseWheel(FX_DWORD dwFlags, 74 int16_t zDelta, 75 FX_FLOAT fx, 76 FX_FLOAT fy); 77 virtual FX_BOOL OnRButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 78 virtual FX_BOOL OnRButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 79 virtual FX_BOOL OnRButtonDblClk(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy); 80 81 virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget); 82 virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget); 83 virtual FX_BOOL OnKeyDown(FX_DWORD dwKeyCode, FX_DWORD dwFlags); 84 virtual FX_BOOL OnKeyUp(FX_DWORD dwKeyCode, FX_DWORD dwFlags); 85 virtual FX_BOOL OnChar(FX_DWORD dwChar, FX_DWORD dwFlags); 86 virtual FX_DWORD OnHitTest(FX_FLOAT fx, FX_FLOAT fy); 87 virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy); 88 virtual FX_BOOL CanUndo() { return FALSE; } 89 virtual FX_BOOL CanRedo() { return FALSE; } 90 virtual FX_BOOL Undo() { return FALSE; } 91 virtual FX_BOOL Redo() { return FALSE; } 92 virtual FX_BOOL CanCopy() { return FALSE; } 93 virtual FX_BOOL CanCut() { return FALSE; } 94 virtual FX_BOOL CanPaste() { return FALSE; } 95 virtual FX_BOOL CanSelectAll() { return FALSE; } 96 virtual FX_BOOL CanDelete() { return CanCut(); } 97 virtual FX_BOOL CanDeSelect() { return CanCopy(); } 98 virtual FX_BOOL Copy(CFX_WideString& wsCopy) { return FALSE; } 99 virtual FX_BOOL Cut(CFX_WideString& wsCut) { return FALSE; } 100 virtual FX_BOOL Paste(const CFX_WideString& wsPaste) { return FALSE; } 101 virtual FX_BOOL SelectAll() { return FALSE; } 102 virtual FX_BOOL Delete() { return FALSE; } 103 virtual FX_BOOL DeSelect() { return FALSE; } 104 virtual FX_BOOL GetSuggestWords(CFX_PointF pointf, 105 CFX_ByteStringArray& sSuggest) { 106 return FALSE; 107 } 108 virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf, 109 const CFX_ByteStringC& bsReplace) { 110 return FALSE; 111 } 112 CXFA_FFDocView* GetDocView(); 113 void SetDocView(CXFA_FFDocView* pDocView) { m_pDocView = pDocView; } 114 CXFA_FFDoc* GetDoc(); 115 CXFA_FFApp* GetApp(); 116 IXFA_AppProvider* GetAppProvider(); 117 void InvalidateWidget(const CFX_RectF* pRect = NULL); 118 void AddInvalidateRect(const CFX_RectF* pRect = NULL); 119 FX_BOOL GetCaptionText(CFX_WideString& wsCap); 120 FX_BOOL IsFocused(); 121 void Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy); 122 void GetRotateMatrix(CFX_Matrix& mt); 123 FX_BOOL IsLayoutRectEmpty(); 124 CXFA_FFWidget* GetParent(); 125 FX_BOOL IsAncestorOf(CXFA_FFWidget* pWidget); 126 127 protected: 128 virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy); 129 void DrawBorder(CFX_Graphics* pGS, 130 CXFA_Box box, 131 const CFX_RectF& rtBorder, 132 CFX_Matrix* pMatrix, 133 FX_DWORD dwFlags = 0); 134 void GetMinMaxWidth(FX_FLOAT fMinWidth, FX_FLOAT fMaxWidth); 135 void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight); 136 void GetRectWithoutRotate(CFX_RectF& rtWidget); 137 FX_BOOL IsMatchVisibleStatus(FX_DWORD dwStatus); 138 139 void EventKillFocus(); 140 FX_BOOL IsButtonDown(); 141 void SetButtonDown(FX_BOOL bSet); 142 CXFA_FFDocView* m_pDocView; 143 CXFA_FFPageView* m_pPageView; 144 CXFA_WidgetAcc* m_pDataAcc; 145 CFX_RectF m_rtWidget; 146 }; 147 int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics, 148 int32_t iStrokeType, 149 int32_t iCapType); 150 CFX_GraphStateData::LineCap XFA_LineCapToFXGE(int32_t iLineCap); 151 void XFA_DrawImage(CFX_Graphics* pGS, 152 const CFX_RectF& rtImage, 153 CFX_Matrix* pMatrix, 154 CFX_DIBitmap* pDIBitmap, 155 int32_t iAspect, 156 int32_t iImageXDpi, 157 int32_t iImageYDpi, 158 int32_t iHorzAlign = XFA_ATTRIBUTEENUM_Left, 159 int32_t iVertAlign = XFA_ATTRIBUTEENUM_Top); 160 CFX_DIBitmap* XFA_LoadImageData(CXFA_FFDoc* pDoc, 161 CXFA_Image* pImage, 162 FX_BOOL& bNameImage, 163 int32_t& iImageXDpi, 164 int32_t& iImageYDpi); 165 CFX_DIBitmap* XFA_LoadImageFromBuffer(IFX_FileRead* pImageFileRead, 166 FXCODEC_IMAGE_TYPE type, 167 int32_t& iImageXDpi, 168 int32_t& iImageYDpi); 169 FXCODEC_IMAGE_TYPE XFA_GetImageType(const CFX_WideStringC& wsType); 170 FX_CHAR* XFA_Base64Encode(const uint8_t* buf, int32_t buf_len); 171 void XFA_RectWidthoutMargin(CFX_RectF& rt, 172 const CXFA_Margin& mg, 173 FX_BOOL bUI = FALSE); 174 FX_FLOAT XFA_GetEdgeThickness(const CXFA_StrokeArray& strokes, 175 FX_BOOL b3DStyle, 176 int32_t nIndex); 177 CXFA_FFWidget* XFA_GetWidgetFromLayoutItem(CXFA_LayoutItem* pLayoutItem); 178 FX_BOOL XFA_IsCreateWidget(XFA_ELEMENT iType); 179 #define XFA_DRAWBOX_ForceRound 1 180 #define XFA_DRAWBOX_Lowered3D 2 181 void XFA_DrawBox(CXFA_Box box, 182 CFX_Graphics* pGS, 183 const CFX_RectF& rtWidget, 184 CFX_Matrix* pMatrix, 185 FX_DWORD dwFlags = 0); 186 #endif 187