Tom Sepez | 99ffdb0 | 2016-01-26 14:51:21 -0800 | [diff] [blame] | 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 | |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 7 | #ifndef XFA_FWL_CFWL_EDIT_H_ |
| 8 | #define XFA_FWL_CFWL_EDIT_H_ |
Tom Sepez | ab27768 | 2016-02-17 10:07:21 -0800 | [diff] [blame] | 9 | |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 10 | #include <deque> |
| 11 | #include <memory> |
Tom Sepez | ab27768 | 2016-02-17 10:07:21 -0800 | [diff] [blame] | 12 | #include <vector> |
| 13 | |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 14 | #include "xfa/fde/cfde_txtedtengine.h" |
| 15 | #include "xfa/fde/ifde_txtedtdorecord.h" |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 16 | #include "xfa/fwl/cfwl_event.h" |
| 17 | #include "xfa/fwl/cfwl_scrollbar.h" |
| 18 | #include "xfa/fwl/cfwl_widget.h" |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 19 | #include "xfa/fxgraphics/cxfa_path.h" |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 20 | |
| 21 | #define FWL_STYLEEXT_EDT_ReadOnly (1L << 0) |
| 22 | #define FWL_STYLEEXT_EDT_MultiLine (1L << 1) |
| 23 | #define FWL_STYLEEXT_EDT_WantReturn (1L << 2) |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 24 | #define FWL_STYLEEXT_EDT_AutoHScroll (1L << 4) |
| 25 | #define FWL_STYLEEXT_EDT_AutoVScroll (1L << 5) |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 26 | #define FWL_STYLEEXT_EDT_Validate (1L << 7) |
| 27 | #define FWL_STYLEEXT_EDT_Password (1L << 8) |
| 28 | #define FWL_STYLEEXT_EDT_Number (1L << 9) |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 29 | #define FWL_STYLEEXT_EDT_CombText (1L << 17) |
dsinclair | aefbe4b | 2016-12-14 13:21:18 -0800 | [diff] [blame] | 30 | #define FWL_STYLEEXT_EDT_HNear 0 |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 31 | #define FWL_STYLEEXT_EDT_HCenter (1L << 18) |
| 32 | #define FWL_STYLEEXT_EDT_HFar (2L << 18) |
dsinclair | aefbe4b | 2016-12-14 13:21:18 -0800 | [diff] [blame] | 33 | #define FWL_STYLEEXT_EDT_VNear 0 |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 34 | #define FWL_STYLEEXT_EDT_VCenter (1L << 20) |
| 35 | #define FWL_STYLEEXT_EDT_VFar (2L << 20) |
| 36 | #define FWL_STYLEEXT_EDT_Justified (1L << 22) |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 37 | #define FWL_STYLEEXT_EDT_HAlignMask (3L << 18) |
| 38 | #define FWL_STYLEEXT_EDT_VAlignMask (3L << 20) |
| 39 | #define FWL_STYLEEXT_EDT_HAlignModeMask (3L << 22) |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 40 | #define FWL_STYLEEXT_EDT_ShowScrollbarFocus (1L << 25) |
| 41 | #define FWL_STYLEEXT_EDT_OuterScrollbar (1L << 26) |
| 42 | #define FWL_STYLEEXT_EDT_LastLineHeight (1L << 27) |
Tom Sepez | ab27768 | 2016-02-17 10:07:21 -0800 | [diff] [blame] | 43 | |
dsinclair | be9b894 | 2016-05-18 06:09:33 -0700 | [diff] [blame] | 44 | class IFDE_TxtEdtDoRecord; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 45 | class CFWL_Edit; |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 46 | class CFWL_MessageMouse; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 47 | class CFWL_WidgetProperties; |
| 48 | class CFWL_Caret; |
Tom Sepez | ab27768 | 2016-02-17 10:07:21 -0800 | [diff] [blame] | 49 | |
Tom Sepez | 99ffdb0 | 2016-01-26 14:51:21 -0800 | [diff] [blame] | 50 | class CFWL_Edit : public CFWL_Widget { |
| 51 | public: |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 52 | CFWL_Edit(const CFWL_App* app, |
| 53 | std::unique_ptr<CFWL_WidgetProperties> properties, |
| 54 | CFWL_Widget* pOuter); |
weili | 4ce94e1 | 2016-06-18 06:21:57 -0700 | [diff] [blame] | 55 | ~CFWL_Edit() override; |
| 56 | |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 57 | // CFWL_Widget: |
| 58 | FWL_Type GetClassID() const override; |
dsinclair | da911bc | 2016-12-07 18:47:00 -0800 | [diff] [blame] | 59 | CFX_RectF GetAutosizedWidgetRect() override; |
| 60 | CFX_RectF GetWidgetRect() override; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 61 | void Update() override; |
Dan Sinclair | b45ea1f | 2017-02-21 14:27:59 -0500 | [diff] [blame] | 62 | FWL_WidgetHit HitTest(const CFX_PointF& point) override; |
dsinclair | 7fa190d | 2016-12-07 17:23:28 -0800 | [diff] [blame] | 63 | void SetStates(uint32_t dwStates) override; |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 64 | void DrawWidget(CXFA_Graphics* pGraphics, const CFX_Matrix* pMatrix) override; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 65 | void SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override; |
| 66 | void OnProcessMessage(CFWL_Message* pMessage) override; |
| 67 | void OnProcessEvent(CFWL_Event* pEvent) override; |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 68 | void OnDrawWidget(CXFA_Graphics* pGraphics, |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 69 | const CFX_Matrix* pMatrix) override; |
dsinclair | 2085538 | 2016-10-31 07:29:34 -0700 | [diff] [blame] | 70 | |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 71 | virtual void SetText(const CFX_WideString& wsText); |
| 72 | |
| 73 | int32_t GetTextLength() const; |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 74 | CFX_WideString GetText() const; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 75 | void ClearText(); |
dsinclair | 38eaf4b | 2016-11-15 12:33:06 -0800 | [diff] [blame] | 76 | |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 77 | void AddSelRange(int32_t nStart); |
dsinclair | 38eaf4b | 2016-11-15 12:33:06 -0800 | [diff] [blame] | 78 | int32_t CountSelRanges() const; |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 79 | int32_t GetSelRange(int32_t nIndex, int32_t* nStart) const; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 80 | void ClearSelections(); |
dsinclair | 38eaf4b | 2016-11-15 12:33:06 -0800 | [diff] [blame] | 81 | int32_t GetLimit() const; |
dsinclair | 522c3d4 | 2016-11-10 14:01:19 -0800 | [diff] [blame] | 82 | void SetLimit(int32_t nLimit); |
Dan Sinclair | 812e96c | 2017-03-13 16:43:37 -0400 | [diff] [blame] | 83 | void SetAliasChar(wchar_t wAlias); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 84 | bool Copy(CFX_WideString& wsCopy); |
| 85 | bool Cut(CFX_WideString& wsCut); |
| 86 | bool Paste(const CFX_WideString& wsPaste); |
| 87 | bool Redo(const IFDE_TxtEdtDoRecord* pRecord); |
| 88 | bool Undo(const IFDE_TxtEdtDoRecord* pRecord); |
| 89 | bool Undo(); |
| 90 | bool Redo(); |
| 91 | bool CanUndo(); |
| 92 | bool CanRedo(); |
dsinclair | 38eaf4b | 2016-11-15 12:33:06 -0800 | [diff] [blame] | 93 | |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 94 | void SetOuter(CFWL_Widget* pOuter); |
| 95 | |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 96 | void OnCaretChanged(); |
| 97 | void OnTextChanged(const FDE_TXTEDT_TEXTCHANGE_INFO& ChangeInfo); |
| 98 | void OnSelChanged(); |
| 99 | bool OnPageLoad(int32_t nPageIndex); |
| 100 | bool OnPageUnload(int32_t nPageIndex); |
| 101 | void OnAddDoRecord(std::unique_ptr<IFDE_TxtEdtDoRecord> pRecord); |
| 102 | bool OnValidate(const CFX_WideString& wsText); |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 103 | void SetScrollOffset(float fScrollOffset); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 104 | |
| 105 | protected: |
dsinclair | 919c084 | 2016-12-07 17:12:59 -0800 | [diff] [blame] | 106 | void ShowCaret(CFX_RectF* pRect); |
| 107 | void HideCaret(CFX_RectF* pRect); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 108 | const CFX_RectF& GetRTClient() const { return m_rtClient; } |
| 109 | CFDE_TxtEdtEngine* GetTxtEdtEngine() { return &m_EdtEngine; } |
| 110 | |
| 111 | private: |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 112 | void DrawTextBk(CXFA_Graphics* pGraphics, |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 113 | IFWL_ThemeProvider* pTheme, |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 114 | const CFX_Matrix* pMatrix); |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 115 | void DrawContent(CXFA_Graphics* pGraphics, |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 116 | IFWL_ThemeProvider* pTheme, |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 117 | const CFX_Matrix* pMatrix); |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 118 | void DrawSpellCheck(CXFA_Graphics* pGraphics, const CFX_Matrix* pMatrix); |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 119 | |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 120 | void UpdateEditEngine(); |
| 121 | void UpdateEditParams(); |
| 122 | void UpdateEditLayout(); |
| 123 | bool UpdateOffset(); |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 124 | bool UpdateOffset(CFWL_ScrollBar* pScrollBar, float fPosChanged); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 125 | void UpdateVAlignment(); |
| 126 | void UpdateCaret(); |
| 127 | CFWL_ScrollBar* UpdateScroll(); |
| 128 | void Layout(); |
| 129 | void LayoutScrollBar(); |
Dan Sinclair | b45ea1f | 2017-02-21 14:27:59 -0500 | [diff] [blame] | 130 | CFX_PointF DeviceToEngine(const CFX_PointF& pt); |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 131 | void InitVerticalScrollBar(); |
| 132 | void InitHorizontalScrollBar(); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 133 | void InitEngine(); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 134 | void InitCaret(); |
Dan Sinclair | 812e96c | 2017-03-13 16:43:37 -0400 | [diff] [blame] | 135 | bool ValidateNumberChar(wchar_t cNum); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 136 | void ClearRecord(); |
| 137 | bool IsShowScrollBar(bool bVert); |
| 138 | bool IsContentHeightOverflow(); |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 139 | int32_t AddDoRecord(std::unique_ptr<IFDE_TxtEdtDoRecord> pRecord); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 140 | void ProcessInsertError(int32_t iError); |
Dan Sinclair | 2b918c8 | 2017-07-13 14:47:10 -0400 | [diff] [blame] | 141 | void AddSpellCheckObj(CXFA_Path& PathData, |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 142 | int32_t nStart, |
| 143 | int32_t nCount, |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 144 | float fOffSetX, |
| 145 | float fOffSetY); |
dsinclair | 442997c | 2016-12-07 17:58:41 -0800 | [diff] [blame] | 146 | |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 147 | void DoButtonDown(CFWL_MessageMouse* pMsg); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 148 | void OnFocusChanged(CFWL_Message* pMsg, bool bSet); |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 149 | void OnLButtonDown(CFWL_MessageMouse* pMsg); |
| 150 | void OnLButtonUp(CFWL_MessageMouse* pMsg); |
| 151 | void OnButtonDblClk(CFWL_MessageMouse* pMsg); |
| 152 | void OnMouseMove(CFWL_MessageMouse* pMsg); |
| 153 | void OnKeyDown(CFWL_MessageKey* pMsg); |
| 154 | void OnChar(CFWL_MessageKey* pMsg); |
dsinclair | 4614b45 | 2016-12-07 17:01:58 -0800 | [diff] [blame] | 155 | bool OnScroll(CFWL_ScrollBar* pScrollBar, |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 156 | CFWL_EventScroll::Code dwCode, |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 157 | float fPos); |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 158 | |
| 159 | CFX_RectF m_rtClient; |
| 160 | CFX_RectF m_rtEngine; |
| 161 | CFX_RectF m_rtStatic; |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 162 | float m_fVAlignOffset; |
| 163 | float m_fScrollOffsetX; |
| 164 | float m_fScrollOffsetY; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 165 | CFDE_TxtEdtEngine m_EdtEngine; |
| 166 | bool m_bLButtonDown; |
| 167 | int32_t m_nSelStart; |
| 168 | int32_t m_nLimit; |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 169 | float m_fFontSize; |
dsinclair | 2c489cc | 2016-11-23 16:17:20 -0800 | [diff] [blame] | 170 | bool m_bSetRange; |
| 171 | int32_t m_iMax; |
| 172 | std::unique_ptr<CFWL_ScrollBar> m_pVertScrollBar; |
| 173 | std::unique_ptr<CFWL_ScrollBar> m_pHorzScrollBar; |
| 174 | std::unique_ptr<CFWL_Caret> m_pCaret; |
| 175 | CFX_WideString m_wsCache; |
| 176 | CFX_WideString m_wsFont; |
| 177 | std::deque<std::unique_ptr<IFDE_TxtEdtDoRecord>> m_DoRecords; |
| 178 | int32_t m_iCurRecord; |
| 179 | int32_t m_iMaxRecord; |
Tom Sepez | 99ffdb0 | 2016-01-26 14:51:21 -0800 | [diff] [blame] | 180 | }; |
Tom Sepez | ab27768 | 2016-02-17 10:07:21 -0800 | [diff] [blame] | 181 | |
dsinclair | 447b1f3 | 2016-12-08 10:06:32 -0800 | [diff] [blame] | 182 | #endif // XFA_FWL_CFWL_EDIT_H_ |