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