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 _FDE_TXTEDTBLOCK_H
8 #define _FDE_TXTEDTBLOCK_H
9 #ifdef FDE_USEFORMATBLOCK
10 class CFDE_TxtEdtEngine;
11 class CFDE_TxtEdtBlock;
12 class CFDE_TxtEdtFieldFormatParser;
13 class CFDE_TxtEdtField;
14 class CFDE_TxtEdtField_Integer;
15 class CFDE_TxtEdtField_Float;
16 class CFDE_TxtEdtField_Password;
17 class CFDE_TxtEdtField_String;
18 class CFDE_TxtEdtField_Fixed;
19 #define FDE_FORMAT_EDIT_FIELD_HADERSIZE 3
20 #define FDE_FORMAT_EDIT_FIELD_TAILSIZE 1
21 enum FDE_FORMAT_FIELD_INSERT_RET {
22   FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL = 0,
23   FDE_FORMAT_FIELD_INSERT_RET_S_FULL,
24   FDE_FORMAT_FIELD_INSERT_RET_F_FULL,
25   FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE,
26 };
27 enum FDE_FORMAT_FIELD_DELETE_RET {
28   FDE_FORMAT_FIELD_DELETE_RET_S = 0,
29   FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE,
30   FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY,
31 };
32 enum FDE_FORMAT_FIELD_VALIDATE_RET {
33   FDE_FORMAT_FIELD_VALIDATE_S = 0,
34   FDE_FORMAT_FIELD_VALIDATE_F_FULL,
35   FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE,
36 };
37 enum FDE_FORMAT_CARET_DIRECTION {
38   FDE_FORMAT_CARET_FORWARD,
39   FDE_FORMAT_CARET_MIDDLE,
40   FDE_FORMAT_CARET_BACKWARD
41 };
42 class CFDE_TxtEdtBlock {
43  public:
44   CFDE_TxtEdtBlock(CFDE_TxtEdtEngine* pEngine,
45                    const CFX_WideString& wsBlock,
46                    int32_t nPosition);
47   ~CFDE_TxtEdtBlock();
48   void GetDisplayText(CFX_WideString& wsDisplay);
49   int32_t GetLength() const;
50   void GetBlockText(CFX_WideString& wsBlock);
51   int32_t CountField() const;
52   void GetFieldText(int32_t nIndex, CFX_WideString& wsField);
53   int32_t GetFieldTextLength() const;
54 
55   int32_t GetPos() const;
56   void GetRealText(CFX_WideString& wsText) const;
57   void Backup();
58   void Restore();
SetIndex(int32_t nIndex)59   void SetIndex(int32_t nIndex) { m_nIndex = nIndex; }
GetIndex()60   int32_t GetIndex() const { return m_nIndex; }
61 
62  private:
63   CFDE_TxtEdtEngine* m_pEngine;
64   int32_t m_nDisplayLength;
65   int32_t m_nIndex;
66 
67   int32_t m_nPosition;
68   CFX_ArrayTemplate<CFDE_TxtEdtField*> m_FieldArr;
69   CFX_ArrayTemplate<CFDE_TxtEdtField*> m_EditFieldArr;
70 };
71 class CFDE_TxtEdtFieldFormatParser {
72  public:
73   CFDE_TxtEdtFieldFormatParser();
74   ~CFDE_TxtEdtFieldFormatParser();
75   FX_BOOL Parse(const CFX_WideString& wsFormat);
76   int32_t CountItems() const;
77   void GetItem(int32_t nIndex,
78                CFX_WideString& wsKey,
79                CFX_WideString& wsValue) const;
80 
81  private:
82   typedef struct {
83     int32_t nKeyStart;
84     int32_t nKeyCount;
85     int32_t nValStart;
86     int32_t nValCount;
87   } FDE_TXTEDTFORMATITEM, *FDE_LPTXTEDTFORMATITEM;
88 
89   CFX_WideString m_wsFormat;
90   CFX_ArrayTemplate<FDE_LPTXTEDTFORMATITEM> m_ItemArr;
91 };
92 class CFDE_TxtEdtField {
93  public:
94   static CFDE_TxtEdtField* Create(const CFX_WideString& wsField,
95                                   int32_t nIndex,
96                                   CFDE_TxtEdtBlock* pBlock);
97   virtual void Release();
98   virtual int32_t Insert(int32_t nIndex,
99                          const CFX_WideString& wsIns,
100                          int32_t& nCaret,
101                          FX_BOOL& bBefore);
102   virtual int32_t Delete(int32_t nIndex,
103                          int32_t nCount,
104                          CFX_WideString& wsDel,
105                          int32_t& nCaret,
106                          FX_BOOL& bBefore);
107   virtual int32_t Replace(int32_t nIndex,
108                           int32_t nCount,
109                           const CFX_WideString& wsIns,
110                           CFX_WideString& wsDel,
111                           int32_t& nCaret,
112                           FX_BOOL& bBefore);
113   virtual void GetDisplayText(CFX_WideString& wsDisplay);
114   virtual int32_t GetDisplayLength();
115   virtual void GetFieldText(CFX_WideString& wsField);
116   virtual int32_t GetFieldTextLength() const;
117   virtual int32_t GetRealIndex(int32_t nIndex) const;
118 
119   virtual int32_t NormalizeCaretPos(
120       int32_t nIndex,
121       FDE_FORMAT_CARET_DIRECTION eDirection = FDE_FORMAT_CARET_MIDDLE) const;
122 
123   virtual FX_BOOL GetEditableRange(int32_t& nBgn, int32_t& nEnd) const;
124   virtual void Backup();
125   virtual void Restore();
IsFix()126   virtual FX_BOOL IsFix() const { return FALSE; }
SetIndex(int32_t nIndex)127   void SetIndex(int32_t nIndex) { m_nIndex = nIndex; }
GetIndex()128   int32_t GetIndex() const { return m_nIndex; }
GetBlockIndex()129   int32_t GetBlockIndex() const { return m_pBlock->GetIndex(); }
130 
131  protected:
132   CFDE_TxtEdtField(int32_t nIndex, CFDE_TxtEdtBlock* pBlock);
~CFDE_TxtEdtField()133   virtual ~CFDE_TxtEdtField() {}
134   virtual int32_t Validate(const CFX_WideString& wsText) const;
135   virtual void GetNormalizedFieldText(CFX_WideString& wsField) const;
136   int32_t m_nLength;
137   CFX_WideString m_wsField;
138   CFX_WideString m_wsBackup;
139   FX_WCHAR m_wcFill;
140   FX_BOOL m_bReserveSpace;
141   FX_BOOL m_bLeftAlignment;
142   int32_t m_nIndex;
143   CFDE_TxtEdtBlock* m_pBlock;
144 };
145 class CFDE_TxtEdtField_Integer : public CFDE_TxtEdtField {
146  public:
147   CFDE_TxtEdtField_Integer(const CFX_WideString& wsField,
148                            int32_t nIndex,
149                            CFDE_TxtEdtBlock* pBlock);
150 
151  protected:
~CFDE_TxtEdtField_Integer()152   virtual ~CFDE_TxtEdtField_Integer() {}
153   virtual int32_t Validate(const CFX_WideString& wsText) const;
154 
155  private:
156   FX_BOOL m_bSign;
157 };
158 class CFDE_TxtEdtField_Float : public CFDE_TxtEdtField {
159  public:
160   CFDE_TxtEdtField_Float(const CFX_WideString& wsField,
161                          int32_t nIndex,
162                          CFDE_TxtEdtBlock* pBlock);
163 
164  protected:
~CFDE_TxtEdtField_Float()165   virtual ~CFDE_TxtEdtField_Float() {}
166   virtual int32_t Validate(const CFX_WideString& wsText) const;
167 
168  private:
169   FX_BOOL m_bSigned;
170   int32_t m_nIntPartlength;
171   int32_t m_nDecPartLength;
172 };
173 class CFDE_TxtEdtField_Password : public CFDE_TxtEdtField {
174  public:
175   CFDE_TxtEdtField_Password(const CFX_WideString& wsField,
176                             int32_t nIndex,
177                             CFDE_TxtEdtBlock* pBlock);
178 
179  protected:
~CFDE_TxtEdtField_Password()180   virtual ~CFDE_TxtEdtField_Password() {}
181   virtual void GetNormalizedFieldText(CFX_WideString& wsField) const;
182 
183  private:
184   FX_WCHAR m_wcAlias;
185 };
186 class CFDE_TxtEdtField_String : public CFDE_TxtEdtField {
187  public:
188   CFDE_TxtEdtField_String(const CFX_WideString& wsField,
189                           int32_t nIndex,
190                           CFDE_TxtEdtBlock* pBlock);
191 
192  protected:
~CFDE_TxtEdtField_String()193   virtual ~CFDE_TxtEdtField_String() {}
194 };
195 class CFDE_TxtEdtField_Fixed : public CFDE_TxtEdtField {
196  public:
197   CFDE_TxtEdtField_Fixed(const CFX_WideString& wsField,
198                          int32_t nIndex,
199                          CFDE_TxtEdtBlock* pBlock);
Insert(int32_t nIndex,const CFX_WideString & wsIns,int32_t & nCaret,FX_BOOL & bBefore)200   virtual int32_t Insert(int32_t nIndex,
201                          const CFX_WideString& wsIns,
202                          int32_t& nCaret,
203                          FX_BOOL& bBefore) {
204     return FALSE;
205   }
Delete(int32_t nIndex,int32_t nCount,CFX_WideString & wsDel,int32_t & nCaret,FX_BOOL & bBefore)206   virtual int32_t Delete(int32_t nIndex,
207                          int32_t nCount,
208                          CFX_WideString& wsDel,
209                          int32_t& nCaret,
210                          FX_BOOL& bBefore) {
211     return FALSE;
212   }
Replace(int32_t nIndex,int32_t nCount,const CFX_WideString & wsIns,CFX_WideString & wsDel,int32_t & nCaret,FX_BOOL & bBefore)213   virtual int32_t Replace(int32_t nIndex,
214                           int32_t nCount,
215                           const CFX_WideString& wsIns,
216                           CFX_WideString& wsDel,
217                           int32_t& nCaret,
218                           FX_BOOL& bBefore) {
219     return FALSE;
220   }
221   virtual void GetDisplayText(CFX_WideString& wsDisplay);
222   virtual int32_t NormalizeCaretPos(
223       int32_t nIndex,
224       FDE_FORMAT_CARET_DIRECTION eDirection) const;
GetEditableRange(int32_t & nBgn,int32_t & nEnd)225   virtual FX_BOOL GetEditableRange(int32_t& nBgn, int32_t& nEnd) const {
226     return FALSE;
227   }
Backup()228   virtual void Backup() {}
Restore()229   virtual void Restore() {}
230 
IsFix()231   virtual FX_BOOL IsFix() const { return TRUE; }
232 
233  protected:
~CFDE_TxtEdtField_Fixed()234   virtual ~CFDE_TxtEdtField_Fixed() {}
235 };
236 #endif
237 #endif
238