• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "../../include/pdfwindow/PDFWindow.h"
8 #include "../../include/pdfwindow/PWL_Wnd.h"
9 #include "../../include/pdfwindow/PWL_Utils.h"
10 #include "../../include/pdfwindow/PWL_ScrollBar.h"
11 
12 /* -------------------------- CPWL_Timer -------------------------- */
13 
14 static CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*>	g_TimeMap;
15 
CPWL_Timer(CPWL_TimerHandler * pAttached,IFX_SystemHandler * pSystemHandler)16 CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) :
17 	m_pAttached(pAttached),
18 	m_nTimerID(0),
19 	m_pSystemHandler(pSystemHandler)
20 {
21 	ASSERT(m_pAttached != NULL);
22 	ASSERT(m_pSystemHandler != NULL);
23 }
24 
~CPWL_Timer()25 CPWL_Timer::~CPWL_Timer()
26 {
27 	KillPWLTimer();
28 }
29 
SetPWLTimer(FX_INT32 nElapse)30 FX_INT32 CPWL_Timer::SetPWLTimer(FX_INT32 nElapse)
31 {
32 	if (m_nTimerID != 0) KillPWLTimer();
33 	m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc);
34 	g_TimeMap.SetAt(m_nTimerID, this);
35 	return m_nTimerID;
36 }
37 
KillPWLTimer()38 void CPWL_Timer::KillPWLTimer()
39 {
40 	if (m_nTimerID != 0)
41 	{
42 		m_pSystemHandler->KillTimer(m_nTimerID);
43 		g_TimeMap.RemoveKey(m_nTimerID);
44 		m_nTimerID = 0;
45 	}
46 }
47 
TimerProc(FX_INT32 idEvent)48 void CPWL_Timer::TimerProc(FX_INT32 idEvent)
49 {
50 	CPWL_Timer* pTimer = NULL;
51 	if (g_TimeMap.Lookup(idEvent, pTimer))
52 	{
53 		if (pTimer)
54 		{
55 			if (pTimer->m_pAttached)
56 				pTimer->m_pAttached->TimerProc();
57 		}
58 	}
59 }
60 
61 /* -------------------------- CPWL_TimerHandler -------------------------- */
62 
CPWL_TimerHandler()63 CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL)
64 {
65 }
66 
~CPWL_TimerHandler()67 CPWL_TimerHandler::~CPWL_TimerHandler()
68 {
69 	if (m_pTimer) delete m_pTimer;
70 }
71 
BeginTimer(FX_INT32 nElapse)72 void CPWL_TimerHandler::BeginTimer(FX_INT32 nElapse)
73 {
74 	if (!m_pTimer)
75 		m_pTimer = new CPWL_Timer(this, GetSystemHandler());
76 
77 	if (m_pTimer)
78 		m_pTimer->SetPWLTimer(nElapse);
79 }
80 
EndTimer()81 void CPWL_TimerHandler::EndTimer()
82 {
83 	if (m_pTimer)
84 		m_pTimer->KillPWLTimer();
85 }
86 
TimerProc()87 void CPWL_TimerHandler::TimerProc()
88 {
89 }
90 
91 /* --------------------------- CPWL_MsgControl ---------------------------- */
92 
93 class CPWL_MsgControl
94 {
95 	friend class CPWL_Wnd;
96 
97 public:
CPWL_MsgControl(CPWL_Wnd * pWnd)98 	CPWL_MsgControl(CPWL_Wnd * pWnd)
99 	{
100 //		PWL_TRACE("new CPWL_MsgControl\n");
101 		m_pCreatedWnd = pWnd;
102 		Default();
103 	}
104 
~CPWL_MsgControl()105 	~CPWL_MsgControl()
106 	{
107 //		PWL_TRACE("~CPWL_MsgControl\n");
108 		Default();
109 	}
110 
Default()111 	void Default()
112 	{
113 		m_aMousePath.RemoveAll();
114 		m_aKeyboardPath.RemoveAll();
115 		m_pMainMouseWnd = NULL;
116 		m_pMainKeyboardWnd = NULL;
117 	}
118 
IsWndCreated(const CPWL_Wnd * pWnd) const119 	FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const
120 	{
121 		return m_pCreatedWnd == pWnd;
122 	}
123 
IsMainCaptureMouse(const CPWL_Wnd * pWnd) const124 	FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const
125 	{
126 		return pWnd == m_pMainMouseWnd;
127 	}
128 
IsWndCaptureMouse(const CPWL_Wnd * pWnd) const129 	FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
130 	{
131 		if (pWnd)
132 			for( FX_INT32 i=0,sz=m_aMousePath.GetSize(); i<sz; i++)
133 				if (m_aMousePath.GetAt(i) == pWnd)
134 					return TRUE;
135 
136 		return FALSE;
137 	}
138 
IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const139 	FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const
140 	{
141 		return pWnd == m_pMainKeyboardWnd;
142 	}
143 
144 
IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const145 	FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
146 	{
147 		if (pWnd)
148 			for( FX_INT32 i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++)
149 				if (m_aKeyboardPath.GetAt(i) == pWnd)
150 					return TRUE;
151 
152 		return FALSE;
153 	}
154 
SetFocus(CPWL_Wnd * pWnd)155 	void SetFocus(CPWL_Wnd * pWnd)
156 	{
157 		m_aKeyboardPath.RemoveAll();
158 
159 		if (pWnd)
160 		{
161 			m_pMainKeyboardWnd = pWnd;
162 
163 			CPWL_Wnd * pParent = pWnd;
164 			while (pParent)
165 			{
166 				m_aKeyboardPath.Add(pParent);
167 				pParent = pParent->GetParentWindow();
168 			}
169 
170 			pWnd->OnSetFocus();
171 		}
172 	}
173 
KillFocus()174 	void KillFocus()
175 	{
176 		if (m_aKeyboardPath.GetSize() > 0)
177 			if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))
178 				pWnd->OnKillFocus();
179 
180 		m_pMainKeyboardWnd = NULL;
181 		m_aKeyboardPath.RemoveAll();
182 	}
183 
SetCapture(CPWL_Wnd * pWnd)184 	void SetCapture(CPWL_Wnd * pWnd)
185 	{
186 		m_aMousePath.RemoveAll();
187 
188 		if (pWnd)
189 		{
190 			m_pMainMouseWnd = pWnd;
191 
192 			CPWL_Wnd * pParent = pWnd;
193 			while (pParent)
194 			{
195 				m_aMousePath.Add(pParent);
196 				pParent = pParent->GetParentWindow();
197 			}
198 		}
199 	}
200 
ReleaseCapture()201 	void ReleaseCapture()
202 	{
203 		m_pMainMouseWnd = NULL;
204 		m_aMousePath.RemoveAll();
205 	}
206 
207 private:
208 	CFX_ArrayTemplate<CPWL_Wnd*>	m_aMousePath;
209 	CFX_ArrayTemplate<CPWL_Wnd*>	m_aKeyboardPath;
210 	CPWL_Wnd*						m_pCreatedWnd;
211 	CPWL_Wnd*						m_pMainMouseWnd;
212 	CPWL_Wnd*						m_pMainKeyboardWnd;
213 };
214 
215 /* --------------------------- CPWL_Wnd ---------------------------- */
216 
CPWL_Wnd()217 CPWL_Wnd::CPWL_Wnd() :
218 	m_pVScrollBar(NULL),
219 	m_rcWindow(),
220 	m_rcClip(),
221 	m_bCreated(FALSE),
222 	m_bVisible(FALSE),
223 	m_bNotifying(FALSE),
224 	m_bEnabled(TRUE)
225 {
226 }
227 
~CPWL_Wnd()228 CPWL_Wnd::~CPWL_Wnd()
229 {
230 	ASSERT(m_bCreated == FALSE);
231 }
232 
GetClassName() const233 CFX_ByteString CPWL_Wnd::GetClassName() const
234 {
235 	return "CPWL_Wnd";
236 }
237 
Create(const PWL_CREATEPARAM & cp)238 void CPWL_Wnd::Create(const PWL_CREATEPARAM & cp)
239 {
240 	if (!IsValid())
241 	{
242 		m_sPrivateParam = cp;
243 
244 		OnCreate(m_sPrivateParam);
245 
246 		m_sPrivateParam.rcRectWnd.Normalize();
247 		m_rcWindow = m_sPrivateParam.rcRectWnd;
248 		m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f);
249 
250 		CreateMsgControl();
251 
252 		if (m_sPrivateParam.pParentWnd)
253 			m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);
254 
255 		PWL_CREATEPARAM ccp = m_sPrivateParam;
256 
257 		ccp.dwFlags &= 0xFFFF0000L; //remove sub styles
258 		ccp.mtChild = CPDF_Matrix(1,0,0,1,0,0);
259 
260 		CreateScrollBar(ccp);
261 		CreateChildWnd(ccp);
262 
263 		m_bVisible = HasFlag(PWS_VISIBLE);
264 
265 		OnCreated();
266 
267 		RePosChildWnd();
268 		m_bCreated = TRUE;
269 	}
270 }
271 
OnCreate(PWL_CREATEPARAM & cp)272 void CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp)
273 {
274 }
275 
OnCreated()276 void CPWL_Wnd::OnCreated()
277 {
278 }
279 
OnDestroy()280 void CPWL_Wnd::OnDestroy()
281 {
282 }
283 
Destroy()284 void CPWL_Wnd::Destroy()
285 {
286 	KillFocus();
287 
288 	OnDestroy();
289 
290 	if (m_bCreated)
291 	{
292 		for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)
293 		{
294 			if (CPWL_Wnd * pChild = m_aChildren[i])
295 			{
296 				pChild->Destroy();
297 				delete pChild;
298 				pChild = NULL;
299 			}
300 		}
301 
302 		if (m_sPrivateParam.pParentWnd)
303 			m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
304 		m_bCreated = FALSE;
305 	}
306 
307 	DestroyMsgControl();
308 
309 	FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
310 	m_aChildren.RemoveAll();
311 	m_pVScrollBar = NULL;
312 }
313 
Move(const CPDF_Rect & rcNew,FX_BOOL bReset,FX_BOOL bRefresh)314 void CPWL_Wnd::Move(const CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh)
315 {
316 	if (IsValid())
317 	{
318 		CPDF_Rect rcOld = this->GetWindowRect();
319 
320 		m_rcWindow = rcNew;
321 		m_rcWindow.Normalize();
322 		//m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); //for special caret
323 
324 		if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
325 			rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom)
326 		{
327 			if (bReset)
328 			{
329 				RePosChildWnd();
330 			}
331 
332 		}
333 		if (bRefresh)
334 		{
335 			InvalidateRectMove(rcOld,rcNew);
336 		}
337 
338 		m_sPrivateParam.rcRectWnd = m_rcWindow;
339 	}
340 }
341 
InvalidateRectMove(const CPDF_Rect & rcOld,const CPDF_Rect & rcNew)342 void  CPWL_Wnd::InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew)
343 {
344 	CPDF_Rect rcUnion = rcOld;
345 	rcUnion.Union(rcNew);
346 
347 	InvalidateRect(&rcUnion);
348 
349 	/*
350 	CPDF_Rect SubArray[4];
351 
352 	rcOld.Substract4(rcNew,SubArray);
353 	for (FX_INT32 i=0;i<4;i++)
354 	{
355 		if (SubArray[i].left == 0 &&
356 			SubArray[i].right == 0 &&
357 			SubArray[i].top == 0 &&
358 			SubArray[i].bottom == 0)continue;
359 
360 		InvalidateRect(&CPWL_Utils::InflateRect(SubArray[i],2));
361 	}
362 
363 	rcNew.Substract4(rcOld,SubArray);
364 	for (FX_INT32 j=0;j<4;j++)
365 	{
366 		if (SubArray[j].left == 0 &&
367 			SubArray[j].right == 0 &&
368 			SubArray[j].top == 0 &&
369 			SubArray[j].bottom == 0)continue;
370 
371 		InvalidateRect(&CPWL_Utils::InflateRect(SubArray[j],2));
372 	}
373 	*/
374 }
375 
GetAppearanceStream(CFX_ByteString & sAppStream)376 void CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream)
377 {
378 	if (IsValid())
379 	{
380 		CFX_ByteTextBuf sTextBuf;
381 		GetAppearanceStream(sTextBuf);
382 		sAppStream += sTextBuf.GetByteString();
383 	}
384 }
385 
GetAppearanceStream(CFX_ByteTextBuf & sAppStream)386 void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf & sAppStream)
387 {
388 	if (IsValid() && IsVisible())
389 	{
390 		GetThisAppearanceStream(sAppStream);
391 		GetChildAppearanceStream(sAppStream);
392 	}
393 }
394 
395 //if don't set,Get default apperance stream
GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)396 void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
397 {
398 	CPDF_Rect rectWnd = GetWindowRect();
399 	if (!rectWnd.IsEmpty())
400 	{
401 		CFX_ByteTextBuf sThis;
402 
403 		if (HasFlag(PWS_BACKGROUND))
404 			sThis << CPWL_Utils::GetRectFillAppStream(rectWnd,this->GetBackgroundColor());
405 
406 		if (HasFlag(PWS_BORDER))
407 			sThis << CPWL_Utils::GetBorderAppStream(rectWnd,
408 									(FX_FLOAT)GetBorderWidth(),
409 									GetBorderColor(),
410 									this->GetBorderLeftTopColor(this->GetBorderStyle()),
411 									this->GetBorderRightBottomColor(this->GetBorderStyle()),
412 									this->GetBorderStyle(),
413 									this->GetBorderDash());
414 
415 		sAppStream << sThis;
416 	}
417 }
418 
GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)419 void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)
420 {
421 	for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
422 	{
423 		if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
424 		{
425 			pChild->GetAppearanceStream(sAppStream);
426 		}
427 	}
428 }
429 
DrawAppearance(CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device)430 void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
431 {
432 	if (IsValid() && IsVisible())
433 	{
434 		DrawThisAppearance(pDevice,pUser2Device);
435 		DrawChildAppearance(pDevice,pUser2Device);
436 	}
437 }
438 
DrawThisAppearance(CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device)439 void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
440 {
441 	CPDF_Rect rectWnd = GetWindowRect();
442 	if (!rectWnd.IsEmpty())
443 	{
444 		if (HasFlag(PWS_BACKGROUND))
445 		{
446 			CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
447 			CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient,this->GetBackgroundColor(),GetTransparency());
448 		}
449 
450 		if (HasFlag(PWS_BORDER))
451 			CPWL_Utils::DrawBorder(pDevice,
452 								pUser2Device,
453 								rectWnd,
454 								(FX_FLOAT)GetBorderWidth(),
455 								GetBorderColor(),
456 								this->GetBorderLeftTopColor(this->GetBorderStyle()),
457 								this->GetBorderRightBottomColor(this->GetBorderStyle()),
458 								this->GetBorderStyle(),
459 								this->GetBorderDash(),
460 								GetTransparency());
461 	}
462 }
463 
DrawChildAppearance(CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device)464 void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
465 {
466 	for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
467 	{
468 		if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
469 		{
470 			CPDF_Matrix mt = pChild->GetChildMatrix();
471 			if (mt.IsIdentity())
472 			{
473 				pChild->DrawAppearance(pDevice,pUser2Device);
474 			}
475 			else
476 			{
477 				mt.Concat(*pUser2Device);
478 				pChild->DrawAppearance(pDevice,&mt);
479 			}
480 		}
481 	}
482 }
483 
InvalidateRect(CPDF_Rect * pRect)484 void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect)
485 {
486 	if (IsValid())
487 	{
488 		CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
489 
490 		if (!HasFlag(PWS_NOREFRESHCLIP))
491 		{
492 			CPDF_Rect rcClip = GetClipRect();
493 			if (!rcClip.IsEmpty())
494 			{
495 				rcRefresh.Intersect(rcClip);
496 			}
497 		}
498 
499 		FX_RECT rcWin = PWLtoWnd(rcRefresh);
500 		rcWin.left -= PWL_INVALIDATE_INFLATE;
501 		rcWin.top -= PWL_INVALIDATE_INFLATE;
502 		rcWin.right += PWL_INVALIDATE_INFLATE;
503 		rcWin.bottom += PWL_INVALIDATE_INFLATE;
504 
505 		if (IFX_SystemHandler* pSH = GetSystemHandler())
506 		{
507 			if (FX_HWND hWnd = GetAttachedHWnd())
508 			{
509 				pSH->InvalidateRect(hWnd, rcWin);
510 			}
511 		}
512 	}
513 }
514 
515 #define PWL_IMPLEMENT_KEY_METHOD(key_method_name)\
516 FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag)\
517 {\
518 	if (IsValid() && IsVisible() && IsEnabled())\
519 	{\
520 		if (IsWndCaptureKeyboard(this))\
521 		{\
522 			for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
523 			{\
524 				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
525 				{\
526 					if (IsWndCaptureKeyboard(pChild))\
527 					{\
528 						return pChild->key_method_name(nChar,nFlag);\
529 					}\
530 				}\
531 			}\
532 		}\
533 	}\
534 	return FALSE;\
535 }
536 
537 #define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)\
538 FX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point & point, FX_DWORD nFlag)\
539 {\
540 	if (IsValid() && IsVisible() && IsEnabled())\
541 	{\
542 		if (IsWndCaptureMouse(this))\
543 		{\
544 			for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
545 			{\
546 				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
547 				{\
548 					if (IsWndCaptureMouse(pChild))\
549 					{\
550 						return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
551 					}\
552 				}\
553 			}\
554 			SetCursor();\
555 		}\
556 		else\
557 		{\
558 			for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
559 			{\
560 				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
561 				{\
562 					if (pChild->WndHitTest(pChild->ParentToChild(point)))\
563 					{\
564 						return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
565 					}\
566 				}\
567 			}\
568 			if (this->WndHitTest(point))\
569 				SetCursor();\
570 		}\
571 	}\
572 	return FALSE;\
573 }
574 
575 PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)576 PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)
577 PWL_IMPLEMENT_KEY_METHOD(OnChar)
578 
579 PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
580 PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
581 PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)
582 PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk)
583 PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown)
584 PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)
585 PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDblClk)
586 PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
587 PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
588 PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
589 
590 FX_BOOL	CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
591 {
592 	if (IsValid() && IsVisible() && IsEnabled())
593 	{
594 		SetCursor();
595 		if (IsWndCaptureKeyboard(this))
596 		{
597 			for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
598 			{
599 				if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
600 				{
601 					if (IsWndCaptureKeyboard(pChild))
602 					{
603 						return pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag);
604 					}
605 				}
606 			}
607 		}
608 	}
609 	return FALSE;
610 }
611 
AddChild(CPWL_Wnd * pWnd)612 void CPWL_Wnd::AddChild(CPWL_Wnd * pWnd)
613 {
614 	m_aChildren.Add(pWnd);
615 }
616 
RemoveChild(CPWL_Wnd * pWnd)617 void CPWL_Wnd::RemoveChild(CPWL_Wnd * pWnd)
618 {
619 	for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)
620 	{
621 		if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
622 		{
623 			if (pChild == pWnd)
624 			{
625 				m_aChildren.RemoveAt(i);
626 				break;
627 			}
628 		}
629 	}
630 }
631 
OnNotify(CPWL_Wnd * pWnd,FX_DWORD msg,FX_INTPTR wParam,FX_INTPTR lParam)632 void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
633 {
634 	switch (msg)
635 	{
636 	case PNM_ADDCHILD:
637 		this->AddChild(pWnd);
638 		break;
639 	case PNM_REMOVECHILD:
640 		this->RemoveChild(pWnd);
641 		break;
642 	default:
643 		break;
644 	}
645 }
646 
IsValid() const647 FX_BOOL CPWL_Wnd::IsValid() const
648 {
649 	return m_bCreated;
650 }
651 
GetCreationParam() const652 PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const
653 {
654 	return m_sPrivateParam;
655 }
656 
GetParentWindow() const657 CPWL_Wnd* CPWL_Wnd::GetParentWindow() const
658 {
659 	return m_sPrivateParam.pParentWnd;
660 }
661 
GetOriginWindowRect() const662 CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const
663 {
664 	return m_sPrivateParam.rcRectWnd;
665 }
666 
GetWindowRect() const667 CPDF_Rect CPWL_Wnd::GetWindowRect() const
668 {
669 	return m_rcWindow;
670 }
671 
GetClientRect() const672 CPDF_Rect CPWL_Wnd::GetClientRect() const
673 {
674 	CPDF_Rect rcWindow = GetWindowRect();
675 	CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
676 
677 	if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
678 		rcClient.right -= pVSB->GetScrollBarWidth();
679 
680 	rcClient.Normalize();
681 
682 	if (rcWindow.Contains(rcClient))
683 		return rcClient;
684 	else
685 		return CPDF_Rect();
686 }
687 
GetCenterPoint() const688 CPDF_Point CPWL_Wnd::GetCenterPoint() const
689 {
690 	CPDF_Rect rcClient = GetClientRect();
691 
692 	return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
693 		(rcClient.top + rcClient.bottom) * 0.5f);
694 }
695 
GetClientCenterSquare() const696 CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const
697 {
698 	return CPWL_Utils::GetCenterSquare(GetClientRect());
699 }
700 
GetWindowCenterSquare() const701 CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const
702 {
703 	return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));
704 }
705 
HasFlag(FX_DWORD dwFlags) const706 FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const
707 {
708 	return (m_sPrivateParam.dwFlags & dwFlags) != 0;
709 }
710 
RemoveFlag(FX_DWORD dwFlags)711 void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags)
712 {
713 	m_sPrivateParam.dwFlags &= ~dwFlags;
714 }
715 
AddFlag(FX_DWORD dwFlags)716 void CPWL_Wnd::AddFlag(FX_DWORD dwFlags)
717 {
718 	m_sPrivateParam.dwFlags |= dwFlags;
719 }
720 
GetBackgroundColor() const721 CPWL_Color CPWL_Wnd::GetBackgroundColor() const
722 {
723 	return m_sPrivateParam.sBackgroundColor;
724 }
725 
SetBackgroundColor(const CPWL_Color & color)726 void CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color)
727 {
728 	m_sPrivateParam.sBackgroundColor = color;
729 }
730 
SetTextColor(const CPWL_Color & color)731 void CPWL_Wnd::SetTextColor(const CPWL_Color & color)
732 {
733 	m_sPrivateParam.sTextColor = color;
734 }
735 
SetTextStrokeColor(const CPWL_Color & color)736 void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color)
737 {
738 	m_sPrivateParam.sTextStrokeColor = color;
739 }
740 
GetTextColor() const741 CPWL_Color CPWL_Wnd::GetTextColor() const
742 {
743 	return m_sPrivateParam.sTextColor;
744 }
745 
GetTextStrokeColor() const746 CPWL_Color CPWL_Wnd::GetTextStrokeColor() const
747 {
748 	return m_sPrivateParam.sTextStrokeColor;
749 }
750 
GetBorderStyle() const751 FX_INT32 CPWL_Wnd::GetBorderStyle() const
752 {
753 	return m_sPrivateParam.nBorderStyle;
754 }
755 
SetBorderStyle(FX_INT32 nBorderStyle)756 void CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle)
757 {
758 	if (HasFlag(PWS_BORDER))
759 		m_sPrivateParam.nBorderStyle = nBorderStyle;
760 }
761 
GetBorderWidth() const762 FX_INT32 CPWL_Wnd::GetBorderWidth() const
763 {
764 	if (HasFlag(PWS_BORDER))
765 		return m_sPrivateParam.dwBorderWidth;
766 
767 	return 0;
768 }
769 
GetInnerBorderWidth() const770 FX_INT32 CPWL_Wnd::GetInnerBorderWidth() const
771 {
772 	/*
773 	switch (GetBorderStyle())
774 	{
775 	case PBS_BEVELED:
776 	case PBS_INSET:
777 		return GetBorderWidth() / 2;
778 	}
779 	*/
780 	return 0;
781 }
782 
SetBorderWidth(FX_INT32 nBorderWidth)783 void CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth)
784 {
785 	if (HasFlag(PWS_BORDER))
786 		m_sPrivateParam.dwBorderWidth = nBorderWidth;
787 }
788 
GetBorderColor() const789 CPWL_Color CPWL_Wnd::GetBorderColor() const
790 {
791 	if (HasFlag(PWS_BORDER))
792 		return m_sPrivateParam.sBorderColor;
793 
794 	return CPWL_Color();
795 }
796 
SetBorderColor(const CPWL_Color & color)797 void CPWL_Wnd::SetBorderColor(const CPWL_Color & color)
798 {
799 	if (HasFlag(PWS_BORDER))
800 		m_sPrivateParam.sBorderColor = color;
801 }
802 
GetBorderDash() const803 CPWL_Dash CPWL_Wnd::GetBorderDash() const
804 {
805 	return m_sPrivateParam.sDash;
806 }
807 
GetAttachedData() const808 void* CPWL_Wnd::GetAttachedData() const
809 {
810 	return m_sPrivateParam.pAttachedData;
811 }
812 
SetBorderDash(const CPWL_Dash & sDash)813 void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash)
814 {
815 	if (HasFlag(PWS_BORDER))
816 		m_sPrivateParam.sDash = sDash;
817 }
818 
GetVScrollBar() const819 CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const
820 {
821 	if (HasFlag(PWS_VSCROLL))
822 		return m_pVScrollBar;
823 
824 	return NULL;
825 }
826 
CreateScrollBar(const PWL_CREATEPARAM & cp)827 void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp)
828 {
829 	CreateVScrollBar(cp);
830 }
831 
CreateVScrollBar(const PWL_CREATEPARAM & cp)832 void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM & cp)
833 {
834 	if (!m_pVScrollBar && HasFlag(PWS_VSCROLL))
835 	{
836 		PWL_CREATEPARAM scp = cp;
837 
838 		//flags
839 		scp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
840 
841 		scp.pParentWnd = this;
842 		scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
843 		scp.eCursorType = FXCT_ARROW;
844 		scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
845 
846 		if ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL)))
847 			m_pVScrollBar->Create(scp);
848 	}
849 }
850 
SetCapture()851 void CPWL_Wnd::SetCapture()
852 {
853 	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
854 		pMsgCtrl->SetCapture(this);
855 }
856 
ReleaseCapture()857 void CPWL_Wnd::ReleaseCapture()
858 {
859 	for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
860 		if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
861 			pChild->ReleaseCapture();
862 
863 	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
864 		pMsgCtrl->ReleaseCapture();
865 }
866 
SetFocus()867 void CPWL_Wnd::SetFocus()
868 {
869 	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
870 	{
871 		if (!pMsgCtrl->IsMainCaptureKeyboard(this))
872 			pMsgCtrl->KillFocus();
873 		pMsgCtrl->SetFocus(this);
874 	}
875 }
876 
KillFocus()877 void CPWL_Wnd::KillFocus()
878 {
879 	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
880 	{
881 		if (pMsgCtrl->IsWndCaptureKeyboard(this))
882 			pMsgCtrl->KillFocus();
883 	}
884 }
885 
OnSetFocus()886 void CPWL_Wnd::OnSetFocus()
887 {
888 }
889 
OnKillFocus()890 void CPWL_Wnd::OnKillFocus()
891 {
892 }
893 
WndHitTest(const CPDF_Point & point) const894 FX_BOOL	CPWL_Wnd::WndHitTest(const CPDF_Point & point) const
895 {
896 	return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);
897 }
898 
ClientHitTest(const CPDF_Point & point) const899 FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const
900 {
901 	return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y);
902 }
903 
GetRootWnd() const904 const CPWL_Wnd * CPWL_Wnd::GetRootWnd() const
905 {
906 	if (m_sPrivateParam.pParentWnd)
907 		return m_sPrivateParam.pParentWnd->GetRootWnd();
908 	else
909 		return this;
910 }
911 
SetVisible(FX_BOOL bVisible)912 void CPWL_Wnd::SetVisible(FX_BOOL bVisible)
913 {
914 	if (IsValid())
915 	{
916 		for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
917 		{
918 			if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
919 			{
920 				pChild->SetVisible(bVisible);
921 			}
922 		}
923 
924 		if (bVisible != m_bVisible)
925 		{
926 			m_bVisible = bVisible;
927 			RePosChildWnd();
928 			InvalidateRect();
929 		}
930 	}
931 }
932 
SetClipRect(const CPDF_Rect & rect)933 void CPWL_Wnd::SetClipRect(const CPDF_Rect & rect)
934 {
935 	m_rcClip = rect;
936 	m_rcClip.Normalize();
937 }
938 
GetClipRect() const939 CPDF_Rect CPWL_Wnd::GetClipRect() const
940 {
941 	return m_rcClip;
942 }
943 
IsReadOnly() const944 FX_BOOL	CPWL_Wnd::IsReadOnly() const
945 {
946 	return HasFlag(PWS_READONLY);
947 }
948 
RePosChildWnd()949 void CPWL_Wnd::RePosChildWnd()
950 {
951 	CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
952 
953 	CPWL_ScrollBar * pVSB = this->GetVScrollBar();
954 
955 	CPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH,
956 							rcContent.bottom,
957 							rcContent.right-1.0f,
958 							rcContent.top);
959 
960 	if (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE);
961 }
962 
CreateChildWnd(const PWL_CREATEPARAM & cp)963 void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp)
964 {
965 }
966 
SetCursor()967 void CPWL_Wnd::SetCursor()
968 {
969 	if (IsValid())
970 	{
971 		if (IFX_SystemHandler* pSH = GetSystemHandler())
972 		{
973 			FX_INT32 nCursorType = this->GetCreationParam().eCursorType;
974 			pSH->SetCursor(nCursorType);
975 		}
976 	}
977 }
978 
CreateMsgControl()979 void CPWL_Wnd::CreateMsgControl()
980 {
981 	if (!m_sPrivateParam.pMsgControl)
982 		m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
983 }
984 
DestroyMsgControl()985 void CPWL_Wnd::DestroyMsgControl()
986 {
987 	if (CPWL_MsgControl* pMsgControl = GetMsgControl())
988 		if (pMsgControl->IsWndCreated(this))
989 			delete pMsgControl;
990 }
991 
GetMsgControl() const992 CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const
993 {
994 	return m_sPrivateParam.pMsgControl;
995 }
996 
IsCaptureMouse() const997 FX_BOOL CPWL_Wnd::IsCaptureMouse() const
998 {
999 	return IsWndCaptureMouse(this);
1000 }
1001 
IsWndCaptureMouse(const CPWL_Wnd * pWnd) const1002 FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
1003 {
1004 	if (CPWL_MsgControl * pCtrl = GetMsgControl())
1005 		return pCtrl->IsWndCaptureMouse(pWnd);
1006 
1007 	return FALSE;
1008 }
1009 
IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const1010 FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
1011 {
1012 	if (CPWL_MsgControl * pCtrl = GetMsgControl())
1013 		return pCtrl->IsWndCaptureKeyboard(pWnd);
1014 
1015 	return FALSE;
1016 }
1017 
IsFocused() const1018 FX_BOOL CPWL_Wnd::IsFocused() const
1019 {
1020 	if (CPWL_MsgControl * pCtrl = GetMsgControl())
1021 		return pCtrl->IsMainCaptureKeyboard(this);
1022 
1023 	return FALSE;
1024 }
1025 
GetFocusRect() const1026 CPDF_Rect CPWL_Wnd::GetFocusRect() const
1027 {
1028 	return CPWL_Utils::InflateRect(this->GetWindowRect(),1);
1029 }
1030 
GetFontSize() const1031 FX_FLOAT CPWL_Wnd::GetFontSize() const
1032 {
1033 	return this->m_sPrivateParam.fFontSize;
1034 }
1035 
SetFontSize(FX_FLOAT fFontSize)1036 void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize)
1037 {
1038 	this->m_sPrivateParam.fFontSize = fFontSize;
1039 }
1040 
GetSystemHandler() const1041 IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const
1042 {
1043 	return m_sPrivateParam.pSystemHandler;
1044 }
1045 
GetFocusHandler() const1046 IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const
1047 {
1048 	return m_sPrivateParam.pFocusHandler;
1049 }
1050 
GetProvider() const1051 IPWL_Provider* CPWL_Wnd::GetProvider() const
1052 {
1053 	return m_sPrivateParam.pProvider;
1054 }
1055 
GetFontMap() const1056 IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const
1057 {
1058 	return m_sPrivateParam.pFontMap;
1059 }
1060 
GetBorderLeftTopColor(FX_INT32 nBorderStyle) const1061 CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(FX_INT32 nBorderStyle) const
1062 {
1063 	CPWL_Color color;
1064 
1065 	switch (nBorderStyle)
1066 	{
1067 		case PBS_SOLID:
1068 			break;
1069 		case PBS_DASH:
1070 			break;
1071 		case PBS_BEVELED:
1072 			color = CPWL_Color(COLORTYPE_GRAY,1);
1073 			break;
1074 		case PBS_INSET:
1075 			color = CPWL_Color(COLORTYPE_GRAY,0.5f);
1076 			break;
1077 		case PBS_UNDERLINED:
1078 			break;
1079 	}
1080 
1081 	return color;
1082 }
1083 
GetBorderRightBottomColor(FX_INT32 nBorderStyle) const1084 CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(FX_INT32 nBorderStyle) const
1085 {
1086 	CPWL_Color color;
1087 
1088 	switch (nBorderStyle)
1089 	{
1090 		case PBS_SOLID:
1091 			break;
1092 		case PBS_DASH:
1093 			break;
1094 		case PBS_BEVELED:
1095 			color = CPWL_Utils::DevideColor(GetBackgroundColor(),2);
1096 			break;
1097 		case PBS_INSET:
1098 			color = CPWL_Color(COLORTYPE_GRAY,0.75f);
1099 			break;
1100 		case PBS_UNDERLINED:
1101 			break;
1102 	}
1103 
1104 	return color;
1105 }
1106 
1107 /* ----------------------------------------------------------------- */
1108 
GetTransparency()1109 FX_INT32 CPWL_Wnd::GetTransparency()
1110 {
1111 	return m_sPrivateParam.nTransparency;
1112 }
1113 
SetTransparency(FX_INT32 nTransparency)1114 void CPWL_Wnd::SetTransparency(FX_INT32 nTransparency)
1115 {
1116 	for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
1117 	{
1118 		if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
1119 		{
1120 			pChild->SetTransparency(nTransparency);
1121 		}
1122 	}
1123 
1124 	m_sPrivateParam.nTransparency = nTransparency;
1125 }
1126 
GetWindowMatrix() const1127 CPDF_Matrix	CPWL_Wnd::GetWindowMatrix() const
1128 {
1129 	CPDF_Matrix mt = this->GetChildToRoot();
1130 
1131 	if (IPWL_Provider* pProvider = GetProvider())
1132 	{
1133 		mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
1134 		return mt;
1135 	}
1136 
1137 /*
1138 	if (CReader_App* pApp = CPWL_Module::GetReaderApp())
1139 		if (CReader_Document* pDocument = pApp->GetCurrentDocument())
1140 			if (CReader_DocView* pDocView = pDocument->GetCurrentDocView())
1141 			{
1142 				CPDF_Matrix mtPageView;
1143 				pDocView->GetCurrentMatrix(mtPageView);
1144 				mt.Concat(mtPageView);
1145 				return mt;
1146 			}
1147 
1148 */
1149 
1150 	return mt;
1151 }
1152 
PWLtoWnd(const CPDF_Point & point,FX_INT32 & x,FX_INT32 & y) const1153 void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, FX_INT32& x, FX_INT32& y) const
1154 {
1155 	CPDF_Matrix mt = GetWindowMatrix();
1156 	CPDF_Point pt = point;
1157 	mt.Transform(pt.x,pt.y);
1158 	x = (FX_INT32)(pt.x+0.5);
1159 	y = (FX_INT32)(pt.y+0.5);
1160 }
1161 
PWLtoWnd(const CPDF_Rect & rect) const1162 FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const
1163 {
1164 	CPDF_Rect rcTemp = rect;
1165 	CPDF_Matrix mt = GetWindowMatrix();
1166 	mt.TransformRect(rcTemp);
1167 	return FX_RECT((FX_INT32)(rcTemp.left+0.5), (FX_INT32)(rcTemp.bottom+0.5), (FX_INT32)(rcTemp.right+0.5), (FX_INT32)(rcTemp.top+0.5));
1168 }
1169 
GetAttachedHWnd() const1170 FX_HWND CPWL_Wnd::GetAttachedHWnd() const
1171 {
1172 	return m_sPrivateParam.hAttachedWnd;
1173 }
1174 
ChildToParent(const CPDF_Point & point) const1175 CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const
1176 {
1177 	CPDF_Matrix mt = GetChildMatrix();
1178 	if (mt.IsIdentity())
1179 		return point;
1180 	else
1181 	{
1182 		CPDF_Point pt = point;
1183 		mt.Transform(pt.x,pt.y);
1184 		return pt;
1185 	}
1186 }
1187 
ChildToParent(const CPDF_Rect & rect) const1188 CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const
1189 {
1190 	CPDF_Matrix mt = GetChildMatrix();
1191 	if (mt.IsIdentity())
1192 		return rect;
1193 	else
1194 	{
1195 		CPDF_Rect rc = rect;
1196 		mt.TransformRect(rc);
1197 		return rc;
1198 	}
1199 }
1200 
ParentToChild(const CPDF_Point & point) const1201 CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const
1202 {
1203 	CPDF_Matrix mt = GetChildMatrix();
1204 	if (mt.IsIdentity())
1205 		return point;
1206 	else
1207 	{
1208 		mt.SetReverse(mt);
1209 		CPDF_Point pt = point;
1210 		mt.Transform(pt.x,pt.y);
1211 		return pt;
1212 	}
1213 }
1214 
ParentToChild(const CPDF_Rect & rect) const1215 CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const
1216 {
1217 	CPDF_Matrix mt = GetChildMatrix();
1218 	if (mt.IsIdentity())
1219 		return rect;
1220 	else
1221 	{
1222 		mt.SetReverse(mt);
1223 		CPDF_Rect rc = rect;
1224 		mt.TransformRect(rc);
1225 		return rc;
1226 	}
1227 }
1228 
GetChildToRoot() const1229 CPDF_Matrix CPWL_Wnd::GetChildToRoot() const
1230 {
1231 	CPDF_Matrix mt(1,0,0,1,0,0);
1232 
1233 	if (HasFlag(PWS_CHILD))
1234 	{
1235 		const CPWL_Wnd* pParent = this;
1236 		while (pParent)
1237 		{
1238 			mt.Concat(pParent->GetChildMatrix());
1239 			pParent = pParent->GetParentWindow();
1240 		}
1241 	}
1242 
1243 	return mt;
1244 }
1245 
GetChildMatrix() const1246 CPDF_Matrix CPWL_Wnd::GetChildMatrix() const
1247 {
1248 	if (HasFlag(PWS_CHILD))
1249 		return m_sPrivateParam.mtChild;
1250 
1251 	return CPDF_Matrix(1,0,0,1,0,0);
1252 }
1253 
SetChildMatrix(const CPDF_Matrix & mt)1254 void CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt)
1255 {
1256 	m_sPrivateParam.mtChild = mt;
1257 }
1258 
GetFocused() const1259 const CPWL_Wnd*	CPWL_Wnd::GetFocused() const
1260 {
1261 	if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
1262 	{
1263 		return pMsgCtrl->m_pMainKeyboardWnd;
1264 	}
1265 
1266 	return NULL;
1267 }
1268 
EnableWindow(FX_BOOL bEnable)1269 void CPWL_Wnd::EnableWindow(FX_BOOL bEnable)
1270 {
1271 	if (m_bEnabled != bEnable)
1272 	{
1273 		for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
1274 		{
1275 			if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
1276 			{
1277 				pChild->EnableWindow(bEnable);
1278 			}
1279 		}
1280 
1281 		this->m_bEnabled = bEnable;
1282 
1283 		if (bEnable)
1284 			this->OnEnabled();
1285 		else
1286 			this->OnDisabled();
1287 	}
1288 }
1289 
IsEnabled()1290 FX_BOOL CPWL_Wnd::IsEnabled()
1291 {
1292 	return m_bEnabled;
1293 }
1294 
OnEnabled()1295 void CPWL_Wnd::OnEnabled()
1296 {
1297 }
1298 
OnDisabled()1299 void CPWL_Wnd::OnDisabled()
1300 {
1301 }
1302 
IsCTRLpressed(FX_DWORD nFlag) const1303 FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const
1304 {
1305 	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
1306 	{
1307 		return pSystemHandler->IsCTRLKeyDown(nFlag);
1308 	}
1309 
1310 	return FALSE;
1311 }
1312 
IsSHIFTpressed(FX_DWORD nFlag) const1313 FX_BOOL	CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const
1314 {
1315 	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
1316 	{
1317 		return pSystemHandler->IsSHIFTKeyDown(nFlag);
1318 	}
1319 
1320 	return FALSE;
1321 }
1322 
IsALTpressed(FX_DWORD nFlag) const1323 FX_BOOL	CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const
1324 {
1325 	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
1326 	{
1327 		return pSystemHandler->IsALTKeyDown(nFlag);
1328 	}
1329 
1330 	return FALSE;
1331 }
1332 
IsINSERTpressed(FX_DWORD nFlag) const1333 FX_BOOL	CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const
1334 {
1335 	if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
1336 	{
1337 		return pSystemHandler->IsINSERTKeyDown(nFlag);
1338 	}
1339 
1340 	return FALSE;
1341 }
1342 
1343