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 FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_
8#define FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_
9
10#if _FX_OS_ == _FX_ANDROID_
11#include "time.h"
12#else
13#include <ctime>
14#endif
15
16#include "core/include/fpdfdoc/fpdf_doc.h"
17#include "core/include/fxcrt/fx_basic.h"
18#include "fpdfsdk/include/fsdk_define.h"
19#include "fpdfsdk/include/fx_systemhandler.h"
20
21class CPDFSDK_PageView;
22class CPDF_Annot;
23class CPDF_Page;
24class CFX_Matrix;
25class CPDF_RenderOptions;
26class CFX_RenderDevice;
27
28#define CFX_IntArray CFX_ArrayTemplate<int>
29
30class CPDFSDK_DateTime {
31 public:
32  CPDFSDK_DateTime();
33  CPDFSDK_DateTime(const CFX_ByteString& dtStr);
34  CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime);
35  CPDFSDK_DateTime(const FX_SYSTEMTIME& st);
36
37  CPDFSDK_DateTime& operator=(const CPDFSDK_DateTime& datetime);
38  CPDFSDK_DateTime& operator=(const FX_SYSTEMTIME& st);
39  FX_BOOL operator==(CPDFSDK_DateTime& datetime);
40  FX_BOOL operator!=(CPDFSDK_DateTime& datetime);
41  FX_BOOL operator>(CPDFSDK_DateTime& datetime);
42  FX_BOOL operator>=(CPDFSDK_DateTime& datetime);
43  FX_BOOL operator<(CPDFSDK_DateTime& datetime);
44  FX_BOOL operator<=(CPDFSDK_DateTime& datetime);
45  operator time_t();
46
47  CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr);
48  CFX_ByteString ToCommonDateTimeString();
49  CFX_ByteString ToPDFDateTimeString();
50  void ToSystemTime(FX_SYSTEMTIME& st);
51  CPDFSDK_DateTime ToGMT();
52  CPDFSDK_DateTime& AddDays(short days);
53  CPDFSDK_DateTime& AddSeconds(int seconds);
54
55  void ResetDateTime();
56
57  struct FX_DATETIME {
58    int16_t year;
59    uint8_t month;
60    uint8_t day;
61    uint8_t hour;
62    uint8_t minute;
63    uint8_t second;
64    int8_t tzHour;
65    uint8_t tzMinute;
66  } dt;
67};
68
69class CPDFSDK_Annot {
70 public:
71  explicit CPDFSDK_Annot(CPDFSDK_PageView* pPageView);
72  virtual ~CPDFSDK_Annot() {}
73
74#ifdef PDF_ENABLE_XFA
75  virtual FX_BOOL IsXFAField() { return FALSE; }
76#endif  // PDF_ENABLE_XFA
77
78  virtual FX_FLOAT GetMinWidth() const;
79  virtual FX_FLOAT GetMinHeight() const;
80  // define layout order to 5.
81  virtual int GetLayoutOrder() const { return 5; }
82
83  virtual CPDF_Annot* GetPDFAnnot() const { return nullptr; }
84
85#ifdef PDF_ENABLE_XFA
86  virtual IXFA_Widget* GetXFAWidget() const { return nullptr; }
87#endif  // PDF_ENABLE_XFA
88
89  virtual CFX_ByteString GetType() const { return ""; }
90  virtual CFX_ByteString GetSubType() const { return ""; }
91
92  virtual void SetRect(const CPDF_Rect& rect) {}
93  virtual CPDF_Rect GetRect() const { return CPDF_Rect(); }
94
95  virtual void Annot_OnDraw(CFX_RenderDevice* pDevice,
96                            CFX_Matrix* pUser2Device,
97                            CPDF_RenderOptions* pOptions) {}
98
99  UnderlyingPageType* GetUnderlyingPage();
100  CPDF_Page* GetPDFPage();
101#ifdef PDF_ENABLE_XFA
102  CPDFXFA_Page* GetPDFXFAPage();
103#endif  // PDF_ENABLE_XFA
104
105  void SetPage(CPDFSDK_PageView* pPageView) { m_pPageView = pPageView; }
106  CPDFSDK_PageView* GetPageView() const { return m_pPageView; }
107
108  // Tab Order
109  int GetTabOrder();
110  void SetTabOrder(int iTabOrder);
111
112  // Selection
113  FX_BOOL IsSelected();
114  void SetSelected(FX_BOOL bSelected);
115
116 protected:
117  CPDFSDK_PageView* m_pPageView;
118  FX_BOOL m_bSelected;
119  int m_nTabOrder;
120};
121
122class CPDFSDK_BAAnnot : public CPDFSDK_Annot {
123 public:
124  CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView);
125  ~CPDFSDK_BAAnnot() override {}
126
127#ifdef PDF_ENABLE_XFA
128  FX_BOOL IsXFAField() override;
129#endif  // PDF_ENABLE_XFA
130
131  CFX_ByteString GetType() const override;
132  CFX_ByteString GetSubType() const override;
133  void SetRect(const CPDF_Rect& rect) override;
134  CPDF_Rect GetRect() const override;
135  CPDF_Annot* GetPDFAnnot() const override;
136  void Annot_OnDraw(CFX_RenderDevice* pDevice,
137                    CFX_Matrix* pUser2Device,
138                    CPDF_RenderOptions* pOptions) override;
139
140  CPDF_Dictionary* GetAnnotDict() const;
141
142  void SetContents(const CFX_WideString& sContents);
143  CFX_WideString GetContents() const;
144
145  void SetAnnotName(const CFX_WideString& sName);
146  CFX_WideString GetAnnotName() const;
147
148  void SetModifiedDate(const FX_SYSTEMTIME& st);
149  FX_SYSTEMTIME GetModifiedDate() const;
150
151  void SetFlags(int nFlags);
152  int GetFlags() const;
153
154  void SetAppState(const CFX_ByteString& str);
155  CFX_ByteString GetAppState() const;
156
157  void SetStructParent(int key);
158  int GetStructParent() const;
159
160  // border
161  void SetBorderWidth(int nWidth);
162  int GetBorderWidth() const;
163
164  // BBS_SOLID
165  // BBS_DASH
166  // BBS_BEVELED
167  // BBS_INSET
168  // BBS_UNDERLINE
169
170  void SetBorderStyle(int nStyle);
171  int GetBorderStyle() const;
172
173  void SetBorderDash(const CFX_IntArray& array);
174  void GetBorderDash(CFX_IntArray& array) const;
175
176  // The background of the annotation's icon when closed
177  // The title bar of the annotation's pop-up window
178  // The border of a link annotation
179
180  void SetColor(FX_COLORREF color);
181  void RemoveColor();
182  FX_BOOL GetColor(FX_COLORREF& color) const;
183
184  FX_BOOL IsVisible() const;
185  // action
186
187  CPDF_Action GetAction() const;
188  void SetAction(const CPDF_Action& a);
189  void RemoveAction();
190
191  CPDF_AAction GetAAction() const;
192  void SetAAction(const CPDF_AAction& aa);
193  void RemoveAAction();
194
195  virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT);
196
197  virtual FX_BOOL IsAppearanceValid();
198  virtual FX_BOOL IsAppearanceValid(CPDF_Annot::AppearanceMode mode);
199  virtual void DrawAppearance(CFX_RenderDevice* pDevice,
200                              const CFX_Matrix* pUser2Device,
201                              CPDF_Annot::AppearanceMode mode,
202                              const CPDF_RenderOptions* pOptions);
203  void DrawBorder(CFX_RenderDevice* pDevice,
204                  const CFX_Matrix* pUser2Device,
205                  const CPDF_RenderOptions* pOptions);
206
207  void ClearCachedAP();
208
209  void WriteAppearance(const CFX_ByteString& sAPType,
210                       const CPDF_Rect& rcBBox,
211                       const CFX_Matrix& matrix,
212                       const CFX_ByteString& sContents,
213                       const CFX_ByteString& sAPState = "");
214
215 protected:
216  CPDF_Annot* m_pAnnot;
217
218 private:
219  FX_BOOL CreateFormFiller();
220};
221
222#endif  // FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_
223