summaryrefslogtreecommitdiff
path: root/fpdfsdk/include/pdfwindow/PWL_Wnd.h
blob: e74dc88c5c108c0ca32dc3eaf40756c132364c5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
 
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FPDFSDK_INCLUDE_PDFWINDOW_PWL_WND_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_WND_H_

#include "../../../core/include/fxcrt/fx_basic.h"
#include "../../../core/include/fpdfdoc/fpdf_doc.h"
#include "../fx_systemhandler.h"

class CPWL_MsgControl;
class CPWL_ScrollBar;
class CPWL_Timer;
class CPWL_TimerHandler;
class CPWL_Wnd;
class IFX_Edit_FontMap;
class IFX_SystemHandler;
class IPWL_Provider;
class IPWL_SpellCheck;

#ifdef FX_READER_DLL
	#ifdef PWL_EXPORT
			#define PWL_CLASS		__declspec(dllexport)
			#define PWL_FUNCTION	PWL_CLASS	
		#else
			#define PWL_CLASS
			#define PWL_FUNCTION
	#endif
#else
	#define PWL_CLASS
	#define PWL_FUNCTION
#endif

//window styles
#define PWS_CHILD							0x80000000L
#define PWS_BORDER							0x40000000L
#define PWS_BACKGROUND						0x20000000L
#define PWS_HSCROLL							0x10000000L
#define PWS_VSCROLL							0x08000000L
#define PWS_VISIBLE							0x04000000L
#define PWS_DISABLE							0x02000000L
#define PWS_READONLY						0x01000000L
#define PWS_AUTOFONTSIZE					0x00800000L
#define PWS_AUTOTRANSPARENT					0x00400000L
#define PWS_NOREFRESHCLIP					0x00200000L

//edit and label styles
#define PES_MULTILINE						0x0001L
#define PES_PASSWORD						0x0002L
#define PES_LEFT							0x0004L
#define PES_RIGHT							0x0008L
#define PES_MIDDLE							0x0010L
#define PES_TOP								0x0020L
#define PES_BOTTOM							0x0040L
#define PES_CENTER							0x0080L
#define PES_CHARARRAY						0x0100L
#define PES_AUTOSCROLL						0x0200L
#define PES_AUTORETURN						0x0400L
#define PES_UNDO							0x0800L
#define PES_RICH							0x1000L
#define PES_SPELLCHECK						0x2000L
#define PES_TEXTOVERFLOW					0x4000L
#define PES_NOREAD							0x8000L

//listbox styles
#define PLBS_MULTIPLESEL					0x0001L
#define PLBS_HOVERSEL						0x0008L

//combobox styles
#define PCBS_ALLOWCUSTOMTEXT				0x0001L

//richedit styles
#define PRES_MULTILINE						0x0001L
#define PRES_AUTORETURN						0x0002L
#define PRES_AUTOSCROLL						0x0004L
#define PRES_SPELLCHECK						0x0008L
#define PRES_UNDO							0x0100L
#define PRES_MULTIPAGES						0x0200L
#define PRES_TEXTOVERFLOW					0x0400L

//border style
#define PBS_SOLID							0
#define PBS_DASH							1
#define PBS_BEVELED							2
#define PBS_INSET							3
#define PBS_UNDERLINED						4
#define PBS_SHADOW							5

//notification messages
#define PNM_ADDCHILD						0x00000000L
#define PNM_REMOVECHILD						0x00000001L
#define PNM_SETSCROLLINFO					0x00000002L
#define PNM_SETSCROLLPOS					0x00000003L
#define PNM_SCROLLWINDOW					0x00000004L
#define PNM_LBUTTONDOWN						0x00000005L
#define PNM_LBUTTONUP						0x00000006L
#define PNM_MOUSEMOVE						0x00000007L
#define	PNM_NOTERESET						0x00000008L
#define PNM_SETCARETINFO					0x00000009L
#define PNM_SELCHANGED						0x0000000AL
#define	PNM_NOTEEDITCHANGED					0x0000000BL

#define PWL_CLASSNAME_EDIT					"CPWL_Edit"

struct CPWL_Dash
{
	CPWL_Dash(int32_t dash, int32_t gap, int32_t phase) : nDash(dash), nGap(gap), nPhase(phase)
	{}

	int32_t			nDash;
	int32_t			nGap;
	int32_t			nPhase;
};

struct PWL_CLASS CPWL_Color
{
	CPWL_Color(int32_t type = COLORTYPE_TRANSPARENT, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)
		: nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)
	{}

	CPWL_Color(int32_t r, int32_t g, int32_t b) :
		nColorType(COLORTYPE_RGB), fColor1(r/255.0f), fColor2(g/255.0f), fColor3(b/255.0f), fColor4(0)
	{}
	
	void ConvertColorType(int32_t other_nColorType);

	/*
	COLORTYPE_TRANSPARENT
	COLORTYPE_RGB
	COLORTYPE_CMYK
	COLORTYPE_GRAY
	*/
	int32_t					nColorType; 
	FX_FLOAT					fColor1,fColor2,fColor3,fColor4;
};

inline FX_BOOL operator == (const CPWL_Color &c1, const CPWL_Color &c2)
{
	return c1.nColorType == c2.nColorType && 
		c1.fColor1 - c2.fColor1 < 0.0001 && c1.fColor1 - c2.fColor1 > -0.0001 &&
		c1.fColor2 - c2.fColor2 < 0.0001 && c1.fColor2 - c2.fColor2 > -0.0001 &&
		c1.fColor3 - c2.fColor3 < 0.0001 && c1.fColor3 - c2.fColor3 > -0.0001 &&
		c1.fColor4 - c2.fColor4 < 0.0001 && c1.fColor4 - c2.fColor4 > -0.0001;
}

inline FX_BOOL operator != (const CPWL_Color &c1, const CPWL_Color &c2)
{
	return !operator == (c1, c2);
}

#define PWL_SCROLLBAR_WIDTH					12.0f
#define PWL_SCROLLBAR_BUTTON_WIDTH			9.0f
#define PWL_SCROLLBAR_POSBUTTON_MINWIDTH	2.0f
#define PWL_SCROLLBAR_TRANSPARANCY			150
#define PWL_SCROLLBAR_BKCOLOR				CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f)
#define PWL_DEFAULT_SELTEXTCOLOR			CPWL_Color(COLORTYPE_RGB,1,1,1)
#define PWL_DEFAULT_SELBACKCOLOR			CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f)
#define PWL_DEFAULT_BACKCOLOR				PWL_DEFAULT_SELTEXTCOLOR
#define PWL_DEFAULT_TEXTCOLOR				CPWL_Color(COLORTYPE_RGB,0,0,0)
#define PWL_DEFAULT_FONTSIZE				9.0f
#define PWL_DEFAULT_BLACKCOLOR				CPWL_Color(COLORTYPE_GRAY,0)
#define PWL_DEFAULT_WHITECOLOR				CPWL_Color(COLORTYPE_GRAY,1)
#define PWL_DEFAULT_HEAVYGRAYCOLOR			CPWL_Color(COLORTYPE_GRAY,0.50)
#define PWL_DEFAULT_LIGHTGRAYCOLOR			CPWL_Color(COLORTYPE_GRAY,0.75)
#define PWL_TRIANGLE_HALFLEN				2.0f
#define	PWL_CBBUTTON_TRIANGLE_HALFLEN		3.0f
#define PWL_INVALIDATE_INFLATE				2

class IPWL_SpellCheck
{
public:
        virtual ~IPWL_SpellCheck() { }
	virtual FX_BOOL							CheckWord(const FX_CHAR* sWord) = 0;
	virtual void							SuggestWords(const FX_CHAR* sWord, CFX_ByteStringArray & sSuggest) = 0;	
};

class IPWL_Provider
{
public:
        virtual ~IPWL_Provider() { }

	//get a matrix which map user space to CWnd client space
	virtual CPDF_Matrix						GetWindowMatrix(void* pAttachedData) = 0;

	/*
	0 L"&Undo\tCtrl+Z"
	1 L"&Redo\tCtrl+Shift+Z"
	2 L"Cu&t\tCtrl+X"
	3 L"&Copy\tCtrl+C"
	4 L"&Paste\tCtrl+V"
	5 L"&Delete"
	6  L"&Select All\tCtrl+A"
	*/
	virtual CFX_WideString					LoadPopupMenuString(int32_t nIndex) = 0;
};

class IPWL_FocusHandler
{
public:
        virtual ~IPWL_FocusHandler() { }
	virtual void							OnSetFocus(CPWL_Wnd* pWnd) = 0;
	virtual void							OnKillFocus(CPWL_Wnd* pWnd) = 0;
};

struct PWL_CREATEPARAM
{
public:
	PWL_CREATEPARAM() : rcRectWnd(0,0,0,0),
		pSystemHandler(NULL),
		pFontMap(NULL),
		pProvider(NULL),
		pFocusHandler(NULL),
		dwFlags(0),
		sBackgroundColor(),
		hAttachedWnd(NULL),
		pSpellCheck(NULL),
		nBorderStyle(PBS_SOLID),
		dwBorderWidth(1),
		sBorderColor(),
		sTextColor(),
		sTextStrokeColor(),
		nTransparency(255),
		fFontSize(PWL_DEFAULT_FONTSIZE),
		sDash(3,0,0),	
		pAttachedData(NULL),
		pParentWnd(NULL),
		pMsgControl(NULL),
		eCursorType(FXCT_ARROW),
		mtChild(1,0,0,1,0,0)
	{
	}

	CPDF_Rect				rcRectWnd;				//required	
	IFX_SystemHandler*		pSystemHandler;			//required
	IFX_Edit_FontMap*		pFontMap;				//required for text window
	IPWL_Provider*			pProvider;				//required for self coordinate
	IPWL_FocusHandler*		pFocusHandler;			//optional
	FX_DWORD				dwFlags;				//optional
	CPWL_Color				sBackgroundColor;		//optional
	FX_HWND					hAttachedWnd;			//required for no-reader framework
	IPWL_SpellCheck*		pSpellCheck;			//required for spellchecking
	int32_t				nBorderStyle;			//optional
	int32_t				dwBorderWidth;			//optional
	CPWL_Color				sBorderColor;			//optional
	CPWL_Color				sTextColor;				//optional
	CPWL_Color				sTextStrokeColor;		//optional
	int32_t				nTransparency;			//optional
	FX_FLOAT				fFontSize;				//optional
	CPWL_Dash				sDash;					//optional
	void*					pAttachedData;			//optional
	CPWL_Wnd*				pParentWnd;				//ignore
	CPWL_MsgControl*		pMsgControl;			//ignore
	int32_t				eCursorType;			//ignore
	CPDF_Matrix				mtChild;				//ignore
};

class CPWL_Timer
{
public:
	CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler);
	virtual ~CPWL_Timer();

	int32_t							SetPWLTimer(int32_t nElapse);
	void								KillPWLTimer();
	static void 						TimerProc(int32_t idEvent);

private:
	int32_t							m_nTimerID;	
	CPWL_TimerHandler*					m_pAttached;
	IFX_SystemHandler*					m_pSystemHandler;
};

class PWL_CLASS CPWL_TimerHandler
{
public:
	CPWL_TimerHandler();
	virtual ~CPWL_TimerHandler();

	void								BeginTimer(int32_t nElapse);
	void								EndTimer();
	virtual void						TimerProc();
	virtual IFX_SystemHandler*			GetSystemHandler() const = 0;

private:
	CPWL_Timer*							m_pTimer;
};

class PWL_CLASS CPWL_Wnd : public CPWL_TimerHandler
{
	friend class CPWL_MsgControl;
public:
	CPWL_Wnd();
	virtual ~CPWL_Wnd();

	void							Create(const PWL_CREATEPARAM & cp);
	virtual CFX_ByteString			GetClassName() const;	
	void							Destroy();
	void							Move(const CPDF_Rect & rcNew,FX_BOOL bReset,FX_BOOL bRefresh);
	virtual void					InvalidateRect(CPDF_Rect* pRect = NULL);

	void							GetAppearanceStream(CFX_ByteString & sAppStream);
	void							DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);

	virtual FX_BOOL					OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
	virtual FX_BOOL					OnKeyUp(FX_WORD nChar, FX_DWORD nFlag);
	virtual FX_BOOL					OnChar(FX_WORD nChar, FX_DWORD nFlag);
	virtual FX_BOOL					OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnMButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnMButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnMButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnRButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnRButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
	virtual FX_BOOL					OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);

	virtual void					SetFocus();
	virtual void					KillFocus();
	void							SetCapture();
	void							ReleaseCapture();

	virtual void					OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, intptr_t wParam = 0, intptr_t lParam = 0);
	virtual void					SetTextColor(const CPWL_Color & color);
	virtual void					SetTextStrokeColor(const CPWL_Color & color);
	virtual void					SetVisible(FX_BOOL bVisible);

	virtual CPDF_Rect				GetFocusRect() const;
	virtual CPWL_Color				GetBackgroundColor() const;
	virtual CPWL_Color				GetBorderColor() const;
	virtual CPWL_Color				GetTextColor() const;
	virtual CPWL_Color				GetTextStrokeColor() const;
	virtual FX_FLOAT				GetFontSize() const;
	virtual int32_t				GetInnerBorderWidth() const;
	virtual CPWL_Color				GetBorderLeftTopColor(int32_t nBorderStyle) const;
	virtual CPWL_Color				GetBorderRightBottomColor(int32_t nBorderStyle) const;

	virtual FX_BOOL					IsModified() const {return FALSE;}

	virtual void					SetFontSize(FX_FLOAT fFontSize);	

	void							SetBackgroundColor(const CPWL_Color & color);		
	void							SetBorderColor(const CPWL_Color & color);
	void							SetBorderWidth(int32_t nBorderWidth);
	void							SetClipRect(const CPDF_Rect & rect);
	void							SetBorderStyle(int32_t eBorderStyle);	
	void							SetBorderDash(const CPWL_Dash & sDash);

	CPDF_Rect						GetOriginWindowRect() const;
	virtual CPDF_Rect				GetWindowRect() const;
	virtual CPDF_Rect				GetClientRect() const;
	CPDF_Point						GetCenterPoint() const;
	CPDF_Rect						GetClientCenterSquare() const;
	CPDF_Rect						GetWindowCenterSquare() const;		
	int32_t						GetBorderWidth() const;		
	FX_BOOL							IsVisible() const {return m_bVisible;}	
	FX_BOOL							HasFlag(FX_DWORD dwFlags) const;
	void							AddFlag(FX_DWORD dwFlags);
	void							RemoveFlag(FX_DWORD dwFlags);
	CPDF_Rect						GetClipRect() const;		
	CPWL_Wnd*						GetParentWindow() const;		
	int32_t						GetBorderStyle() const;	
	CPWL_Dash						GetBorderDash() const;
	void*							GetAttachedData() const;
	
	FX_BOOL							WndHitTest(const CPDF_Point & point) const;
	FX_BOOL							ClientHitTest(const CPDF_Point & point) const;
	FX_BOOL							IsCaptureMouse() const;

	const CPWL_Wnd*					GetFocused() const;
	FX_BOOL							IsFocused() const;
	FX_BOOL							IsReadOnly() const;
	CPWL_ScrollBar*					GetVScrollBar() const;

	IFX_Edit_FontMap*				GetFontMap() const;
	IPWL_Provider*					GetProvider() const;
	virtual IFX_SystemHandler*		GetSystemHandler() const;
	IPWL_FocusHandler*				GetFocusHandler() const;
	
	int32_t						GetTransparency();
	void							SetTransparency(int32_t nTransparency);

	CPDF_Matrix						GetChildToRoot() const;
	CPDF_Matrix						GetChildMatrix() const;
	void							SetChildMatrix(const CPDF_Matrix& mt);
	CPDF_Matrix						GetWindowMatrix() const;

	virtual CPDF_Point				ChildToParent(const CPDF_Point& point) const;
	virtual CPDF_Rect				ChildToParent(const CPDF_Rect& rect) const;
	virtual CPDF_Point				ParentToChild(const CPDF_Point& point) const;
	virtual CPDF_Rect				ParentToChild(const CPDF_Rect& rect) const;

	//those methods only implemented by listctrl item
	virtual FX_FLOAT				GetItemHeight(FX_FLOAT fLimitWidth) {return 0;} 
	virtual FX_FLOAT				GetItemLeftMargin() {return 0;} 
	virtual FX_FLOAT				GetItemRightMargin() {return 0;} 

	void							EnableWindow(FX_BOOL bEnable);
	FX_BOOL							IsEnabled();
	virtual void					SetCursor();

protected:	
	virtual void					CreateChildWnd(const PWL_CREATEPARAM & cp);
	virtual void					RePosChildWnd();
	void							GetAppearanceStream(CFX_ByteTextBuf & sAppStream);
	virtual void					GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
	virtual void					GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream);

	virtual void					DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
	virtual void					DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);

	virtual void					OnCreate(PWL_CREATEPARAM & cp);
	virtual void					OnCreated();
	virtual void					OnDestroy();

	virtual void					OnSetFocus();
	virtual void					OnKillFocus();

	virtual void					OnEnabled();
	virtual void					OnDisabled();

	void							SetNotifyFlag(FX_BOOL bNotifying = TRUE){m_bNotifying = bNotifying;};
 
	FX_BOOL							IsValid() const;
	PWL_CREATEPARAM					GetCreationParam() const;		
	FX_BOOL							IsNotifying() const {return m_bNotifying;}	
	
	void							InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew);

	void							PWLtoWnd(const CPDF_Point & point, int32_t& x, int32_t& y) const;
	FX_RECT							PWLtoWnd(const CPDF_Rect & rect) const;	
	FX_HWND							GetAttachedHWnd() const;
	
	FX_BOOL							IsWndCaptureMouse(const CPWL_Wnd * pWnd) const;
	FX_BOOL							IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const;	
	const CPWL_Wnd*					GetRootWnd() const;	

	FX_BOOL							IsCTRLpressed(FX_DWORD nFlag) const;
	FX_BOOL							IsSHIFTpressed(FX_DWORD nFlag) const;
	FX_BOOL							IsALTpressed(FX_DWORD nFlag) const;
	FX_BOOL							IsINSERTpressed(FX_DWORD nFlag) const;

private:
	void							AddChild(CPWL_Wnd * pWnd);
	void							RemoveChild(CPWL_Wnd * pWnd);

	void							CreateScrollBar(const PWL_CREATEPARAM & cp);
	void							CreateVScrollBar(const PWL_CREATEPARAM & cp);	

	void							AjustStyle();	
	void							CreateMsgControl();
	void							DestroyMsgControl();
	
	CPWL_MsgControl*				GetMsgControl() const;	
	
protected:
	CFX_ArrayTemplate<CPWL_Wnd*>	m_aChildren;

private:
	PWL_CREATEPARAM					m_sPrivateParam;
	
	CPWL_ScrollBar*					m_pVScrollBar;

	CPDF_Rect						m_rcWindow;
	CPDF_Rect						m_rcClip;

	FX_BOOL							m_bCreated;			
	FX_BOOL							m_bVisible;
	FX_BOOL							m_bNotifying;	
	FX_BOOL							m_bEnabled;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_WND_H_