Clean up CPDF_AnnotList.
[pdfium.git] / fpdfsdk / include / pdfwindow / PWL_Note.h
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_PDFWINDOW_PWL_NOTE_H_
8 #define FPDFSDK_INCLUDE_PDFWINDOW_PWL_NOTE_H_
9
10 #include "PWL_Button.h"
11 #include "PWL_Edit.h"
12 #include "PWL_ListCtrl.h"
13 #include "PWL_ScrollBar.h"
14 #include "PWL_Wnd.h"
15
16 class CPWL_Label;
17 class CPWL_Note;
18 class CPWL_NoteItem;
19 class CPWL_Note_CloseBox;
20 class CPWL_Note_Contents;
21 class CPWL_Note_Edit;
22 class CPWL_Note_Icon;
23 class CPWL_Note_LBBox;
24 class CPWL_Note_Options;
25 class CPWL_Note_RBBox;
26 class IPWL_NoteHandler;
27 class IPWL_NoteItem;
28 class IPWL_NoteNotify;
29 class IPopup_Note;
30
31 class IPWL_NoteNotify {
32  public:
33   virtual ~IPWL_NoteNotify() {}
34   virtual void OnNoteMove(const FX_RECT& rtWin) = 0;
35   virtual void OnNoteShow(FX_BOOL bShow) = 0;
36   virtual void OnNoteActivate(FX_BOOL bActive) = 0;
37   virtual void OnNoteClose() = 0;
38   virtual void OnItemCreate(IPWL_NoteItem* pItem) = 0;
39   virtual void OnItemDelete(IPWL_NoteItem* pItem) = 0;
40   virtual void OnSetAuthorName(IPWL_NoteItem* pItem) = 0;
41   virtual void OnSetBkColor(IPWL_NoteItem* pItem) = 0;
42   virtual void OnSetContents(IPWL_NoteItem* pItem) = 0;
43   virtual void OnSetDateTime(IPWL_NoteItem* pItem) = 0;
44   virtual void OnSetSubjectName(IPWL_NoteItem* pItem) = 0;
45   virtual void OnPopupMenu(int32_t x, int32_t y) = 0;
46   virtual void OnPopupMenu(IPWL_NoteItem* pItem, int32_t x, int32_t y) = 0;
47 };
48
49 class IPWL_NoteHandler {
50  public:
51   virtual ~IPWL_NoteHandler() {}
52   virtual void OnNoteColorChanged(const CPWL_Color& color) = 0;
53 };
54
55 class IPWL_NoteItem {
56  public:
57   virtual ~IPWL_NoteItem() {}
58   virtual void SetPrivateData(void* pData) = 0;
59   virtual void SetBkColor(const CPWL_Color& color) = 0;
60   virtual void SetSubjectName(const CFX_WideString& sName) = 0;
61   virtual void SetAuthorName(const CFX_WideString& sName) = 0;
62   virtual void SetDateTime(FX_SYSTEMTIME time) = 0;
63   virtual void SetContents(const CFX_WideString& sContents) = 0;
64
65   virtual IPWL_NoteItem* CreateSubItem() = 0;
66   virtual int32_t CountSubItems() const = 0;
67   virtual IPWL_NoteItem* GetSubItems(int32_t index) const = 0;
68   virtual void DeleteSubItem(IPWL_NoteItem* pNoteItem) = 0;
69   virtual void SetFocus() = 0;
70
71   virtual IPWL_NoteItem* GetParentItem() const = 0;
72   virtual void* GetPrivateData() const = 0;
73   virtual CFX_WideString GetAuthorName() const = 0;
74   virtual CPWL_Color GetBkColor() const = 0;
75   virtual CFX_WideString GetContents() const = 0;
76   virtual FX_SYSTEMTIME GetDateTime() const = 0;
77   virtual CFX_WideString GetSubjectName() const = 0;
78
79   virtual CPWL_Edit* GetEdit() const = 0;
80 };
81
82 class CPWL_Note_Icon : public CPWL_Wnd {
83  public:
84   CPWL_Note_Icon();
85   ~CPWL_Note_Icon() override;
86
87   void SetIconType(int32_t nType);
88
89  protected:
90   // CPWL_Wnd
91   void DrawThisAppearance(CFX_RenderDevice* pDevice,
92                           CPDF_Matrix* pUser2Device) override;
93
94  private:
95   int32_t m_nType;
96 };
97
98 class CPWL_Note_CloseBox : public CPWL_Button {
99  public:
100   CPWL_Note_CloseBox();
101   ~CPWL_Note_CloseBox() override;
102
103  protected:
104   // CPWL_Button
105   void DrawThisAppearance(CFX_RenderDevice* pDevice,
106                           CPDF_Matrix* pUser2Device) override;
107   FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override;
108   FX_BOOL OnLButtonUp(const CPDF_Point& point, FX_DWORD nFlag) override;
109
110  private:
111   FX_BOOL m_bMouseDown;
112 };
113
114 class CPWL_Note_LBBox : public CPWL_Wnd {
115  public:
116   CPWL_Note_LBBox();
117   ~CPWL_Note_LBBox() override;
118
119  protected:
120   // CPWL_Wnd
121   void DrawThisAppearance(CFX_RenderDevice* pDevice,
122                           CPDF_Matrix* pUser2Device) override;
123 };
124
125 class CPWL_Note_RBBox : public CPWL_Wnd {
126  public:
127   CPWL_Note_RBBox();
128   ~CPWL_Note_RBBox() override;
129
130  protected:
131   // CPWL_Wnd
132   void DrawThisAppearance(CFX_RenderDevice* pDevice,
133                           CPDF_Matrix* pUser2Device) override;
134 };
135
136 class CPWL_Note_Edit : public CPWL_Edit {
137  public:
138   CPWL_Note_Edit();
139   ~CPWL_Note_Edit() override;
140
141   void EnableNotify(FX_BOOL bEnable) { m_bEnableNotify = bEnable; }
142
143   // CPWL_Edit
144   FX_FLOAT GetItemLeftMargin() override;
145   FX_FLOAT GetItemRightMargin() override;
146   FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth) override;
147   void SetText(const FX_WCHAR* csText) override;
148   void OnNotify(CPWL_Wnd* pWnd,
149                 FX_DWORD msg,
150                 intptr_t wParam = 0,
151                 intptr_t lParam = 0) override;
152   void RePosChildWnd() override;
153   void OnSetFocus() override;
154   void OnKillFocus() override;
155
156  private:
157   FX_BOOL m_bEnableNotify;
158   FX_FLOAT m_fOldItemHeight;
159   FX_BOOL m_bSizeChanged;
160   FX_FLOAT m_fOldMin;
161   FX_FLOAT m_fOldMax;
162 };
163
164 class CPWL_Note_Options : public CPWL_Wnd {
165  public:
166   CPWL_Note_Options();
167   ~CPWL_Note_Options() override;
168
169   CPDF_Rect GetContentRect() const;
170   void SetText(const CFX_WideString& sText);
171
172   // CPWL_Wnd
173   void RePosChildWnd() override;
174   void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
175   void DrawThisAppearance(CFX_RenderDevice* pDevice,
176                           CPDF_Matrix* pUser2Device) override;
177   void SetTextColor(const CPWL_Color& color) override;
178
179  private:
180   CPWL_Label* m_pText;
181 };
182
183 class CPWL_Note_Contents : public CPWL_ListCtrl {
184  public:
185   CPWL_Note_Contents();
186   ~CPWL_Note_Contents() override;
187
188   void SetEditFocus(FX_BOOL bLast);
189   CPWL_Edit* GetEdit() const;
190
191   void SetText(const CFX_WideString& sText);
192   CFX_WideString GetText() const;
193
194   CPWL_NoteItem* CreateSubItem();
195   void DeleteSubItem(IPWL_NoteItem* pNoteItem);
196   int32_t CountSubItems() const;
197   IPWL_NoteItem* GetSubItems(int32_t index) const;
198
199   virtual IPWL_NoteItem* GetHitNoteItem(const CPDF_Point& point);
200   void EnableRead(FX_BOOL bEnabled);
201   void EnableModify(FX_BOOL bEnabled);
202
203   // CPWL_ListCtrl
204   CFX_ByteString GetClassName() const override;
205   void OnNotify(CPWL_Wnd* pWnd,
206                 FX_DWORD msg,
207                 intptr_t wParam = 0,
208                 intptr_t lParam = 0) override;
209   FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override;
210   void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
211
212  private:
213   CPWL_Note_Edit* m_pEdit;
214 };
215
216 class CPWL_NoteItem : public CPWL_Wnd, public IPWL_NoteItem {
217  public:
218   CPWL_NoteItem();
219   ~CPWL_NoteItem() override;
220
221   virtual IPWL_NoteItem* GetHitNoteItem(const CPDF_Point& point);
222   virtual IPWL_NoteItem* GetFocusedNoteItem() const;
223
224   virtual FX_BOOL IsTopItem() const { return FALSE; }
225
226   virtual void ResetSubjectName(int32_t nItemIndex);
227   void EnableRead(FX_BOOL bEnabled);
228   void EnableModify(FX_BOOL bEnabled);
229
230   void OnContentsValidate();
231   void OnCreateNoteItem();
232
233   // IPWL_NoteItem
234   void SetPrivateData(void* pData) override;
235   void SetBkColor(const CPWL_Color& color) override;
236   void SetSubjectName(const CFX_WideString& sName) override;
237   void SetAuthorName(const CFX_WideString& sName) override;
238   void SetDateTime(FX_SYSTEMTIME time) override;
239   void SetContents(const CFX_WideString& sContents) override;
240   IPWL_NoteItem* CreateSubItem() override;
241   int32_t CountSubItems() const override;
242   IPWL_NoteItem* GetSubItems(int32_t index) const override;
243   void DeleteSubItem(IPWL_NoteItem* pNoteItem) override;
244   void SetFocus() override { SetNoteFocus(FALSE); }
245   IPWL_NoteItem* GetParentItem() const override;
246   void* GetPrivateData() const override;
247   CFX_WideString GetAuthorName() const override;
248   CPWL_Color GetBkColor() const override;
249   CFX_WideString GetContents() const override;
250   FX_SYSTEMTIME GetDateTime() const override;
251   CFX_WideString GetSubjectName() const override;
252   CPWL_Edit* GetEdit() const override;
253
254  protected:
255   // CPWL_Wnd
256   FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override;
257   FX_BOOL OnRButtonUp(const CPDF_Point& point, FX_DWORD nFlag) override;
258   CFX_ByteString GetClassName() const override;
259   void RePosChildWnd() override;
260   void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
261   void OnNotify(CPWL_Wnd* pWnd,
262                 FX_DWORD msg,
263                 intptr_t wParam = 0,
264                 intptr_t lParam = 0) override;
265   FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth) override;
266   FX_FLOAT GetItemLeftMargin() override;
267   FX_FLOAT GetItemRightMargin() override;
268
269   CPWL_NoteItem* CreateNoteItem();
270   CPWL_NoteItem* GetParentNoteItem() const;
271
272   void SetNoteFocus(FX_BOOL bLast);
273   void PopupNoteItemMenu(const CPDF_Point& point);
274
275   virtual const CPWL_Note* GetNote() const;
276   virtual IPWL_NoteNotify* GetNoteNotify() const;
277
278  protected:
279   CPWL_Label* m_pSubject;
280   CPWL_Label* m_pDateTime;
281   CPWL_Note_Contents* m_pContents;
282
283  private:
284   void* m_pPrivateData;
285   FX_SYSTEMTIME m_dtNote;
286   CFX_WideString m_sAuthor;
287
288   FX_FLOAT m_fOldItemHeight;
289   FX_BOOL m_bSizeChanged;
290   FX_BOOL m_bAllowModify;
291 };
292
293 class CPWL_Note : public CPWL_NoteItem {
294  public:
295   CPWL_Note(IPopup_Note* pPopupNote,
296             IPWL_NoteNotify* pNoteNotify,
297             IPWL_NoteHandler* pNoteHandler);
298   ~CPWL_Note() override;
299
300   IPWL_NoteItem* Reply();
301   void EnableNotify(FX_BOOL bEnabled);
302   void SetIconType(int32_t nType);
303   void SetOptionsText(const CFX_WideString& sText);
304   void EnableRead(FX_BOOL bEnabled);
305   void EnableModify(FX_BOOL bEnabled);
306
307   CFX_WideString GetReplyString() const;
308   void SetReplyString(const CFX_WideString& string);
309
310   // 0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close
311   // / 5-options
312   int32_t NoteHitTest(const CPDF_Point& point) const;
313   CPDF_Rect GetCaptionRect() const { return m_rcCaption; }
314   IPopup_Note* GetPopupNote() const { return m_pPopupNote; }
315
316   // CPWL_NoteItem
317   void SetSubjectName(const CFX_WideString& sName) override;
318   void SetAuthorName(const CFX_WideString& sName) override;
319   CFX_WideString GetAuthorName() const override;
320   void SetBkColor(const CPWL_Color& color) override;
321   void ResetSubjectName(int32_t nItemIndex) override {}
322   FX_BOOL IsTopItem() const override { return TRUE; }
323   const CPWL_Note* GetNote() const override;
324   IPWL_NoteNotify* GetNoteNotify() const override;
325   FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override;
326   FX_BOOL OnRButtonUp(const CPDF_Point& point, FX_DWORD nFlag) override;
327   FX_BOOL OnMouseWheel(short zDelta,
328                        const CPDF_Point& point,
329                        FX_DWORD nFlag) override;
330   void RePosChildWnd() override;
331   void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
332   void OnNotify(CPWL_Wnd* pWnd,
333                 FX_DWORD msg,
334                 intptr_t wParam = 0,
335                 intptr_t lParam = 0) override;
336
337  protected:
338   FX_BOOL ResetScrollBar();
339   void RePosNoteChildren();
340   FX_BOOL ScrollBarShouldVisible();
341
342  private:
343   CPWL_Label* m_pAuthor;
344   CPWL_Note_Icon* m_pIcon;
345   CPWL_Note_CloseBox* m_pCloseBox;
346   CPWL_Note_LBBox* m_pLBBox;
347   CPWL_Note_RBBox* m_pRBBox;
348   CPWL_ScrollBar* m_pContentsBar;
349   CPWL_Note_Options* m_pOptions;
350   IPWL_NoteNotify* m_pNoteNotify;
351   FX_BOOL m_bResizing;
352   PWL_SCROLL_INFO m_OldScrollInfo;
353   CPDF_Rect m_rcCaption;
354   FX_BOOL m_bEnalbleNotify;
355   IPopup_Note* m_pPopupNote;
356   CFX_WideString m_sReplyString;
357 };
358
359 #endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_NOTE_H_