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 14static CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*> g_TimeMap; 15 16CPWL_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 25CPWL_Timer::~CPWL_Timer() 26{ 27 KillPWLTimer(); 28} 29 30FX_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 38void 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 48void 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 63CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL) 64{ 65} 66 67CPWL_TimerHandler::~CPWL_TimerHandler() 68{ 69 if (m_pTimer) delete m_pTimer; 70} 71 72void 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 81void CPWL_TimerHandler::EndTimer() 82{ 83 if (m_pTimer) 84 m_pTimer->KillPWLTimer(); 85} 86 87void CPWL_TimerHandler::TimerProc() 88{ 89} 90 91/* --------------------------- CPWL_MsgControl ---------------------------- */ 92 93class CPWL_MsgControl 94{ 95 friend class CPWL_Wnd; 96 97public: 98 CPWL_MsgControl(CPWL_Wnd * pWnd) 99 { 100// PWL_TRACE("new CPWL_MsgControl\n"); 101 m_pCreatedWnd = pWnd; 102 Default(); 103 } 104 105 ~CPWL_MsgControl() 106 { 107// PWL_TRACE("~CPWL_MsgControl\n"); 108 Default(); 109 } 110 111 void Default() 112 { 113 m_aMousePath.RemoveAll(); 114 m_aKeyboardPath.RemoveAll(); 115 m_pMainMouseWnd = NULL; 116 m_pMainKeyboardWnd = NULL; 117 } 118 119 FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const 120 { 121 return m_pCreatedWnd == pWnd; 122 } 123 124 FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const 125 { 126 return pWnd == m_pMainMouseWnd; 127 } 128 129 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 139 FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const 140 { 141 return pWnd == m_pMainKeyboardWnd; 142 } 143 144 145 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 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 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 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 201 void ReleaseCapture() 202 { 203 m_pMainMouseWnd = NULL; 204 m_aMousePath.RemoveAll(); 205 } 206 207private: 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 217CPWL_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 228CPWL_Wnd::~CPWL_Wnd() 229{ 230 ASSERT(m_bCreated == FALSE); 231} 232 233CFX_ByteString CPWL_Wnd::GetClassName() const 234{ 235 return "CPWL_Wnd"; 236} 237 238void 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 272void CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp) 273{ 274} 275 276void CPWL_Wnd::OnCreated() 277{ 278} 279 280void CPWL_Wnd::OnDestroy() 281{ 282} 283 284void 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 314void 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 342void 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 376void 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 386void 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 396void 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 419void 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 430void 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 439void 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 464void 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 484void 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)\ 516FX_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)\ 538FX_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 575PWL_IMPLEMENT_KEY_METHOD(OnKeyDown) 576PWL_IMPLEMENT_KEY_METHOD(OnKeyUp) 577PWL_IMPLEMENT_KEY_METHOD(OnChar) 578 579PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk) 580PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown) 581PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp) 582PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk) 583PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown) 584PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp) 585PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDblClk) 586PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown) 587PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp) 588PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove) 589 590FX_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 612void CPWL_Wnd::AddChild(CPWL_Wnd * pWnd) 613{ 614 m_aChildren.Add(pWnd); 615} 616 617void 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 632void 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 647FX_BOOL CPWL_Wnd::IsValid() const 648{ 649 return m_bCreated; 650} 651 652PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const 653{ 654 return m_sPrivateParam; 655} 656 657CPWL_Wnd* CPWL_Wnd::GetParentWindow() const 658{ 659 return m_sPrivateParam.pParentWnd; 660} 661 662CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const 663{ 664 return m_sPrivateParam.rcRectWnd; 665} 666 667CPDF_Rect CPWL_Wnd::GetWindowRect() const 668{ 669 return m_rcWindow; 670} 671 672CPDF_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 688CPDF_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 696CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const 697{ 698 return CPWL_Utils::GetCenterSquare(GetClientRect()); 699} 700 701CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const 702{ 703 return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f)); 704} 705 706FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const 707{ 708 return (m_sPrivateParam.dwFlags & dwFlags) != 0; 709} 710 711void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags) 712{ 713 m_sPrivateParam.dwFlags &= ~dwFlags; 714} 715 716void CPWL_Wnd::AddFlag(FX_DWORD dwFlags) 717{ 718 m_sPrivateParam.dwFlags |= dwFlags; 719} 720 721CPWL_Color CPWL_Wnd::GetBackgroundColor() const 722{ 723 return m_sPrivateParam.sBackgroundColor; 724} 725 726void CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color) 727{ 728 m_sPrivateParam.sBackgroundColor = color; 729} 730 731void CPWL_Wnd::SetTextColor(const CPWL_Color & color) 732{ 733 m_sPrivateParam.sTextColor = color; 734} 735 736void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color) 737{ 738 m_sPrivateParam.sTextStrokeColor = color; 739} 740 741CPWL_Color CPWL_Wnd::GetTextColor() const 742{ 743 return m_sPrivateParam.sTextColor; 744} 745 746CPWL_Color CPWL_Wnd::GetTextStrokeColor() const 747{ 748 return m_sPrivateParam.sTextStrokeColor; 749} 750 751FX_INT32 CPWL_Wnd::GetBorderStyle() const 752{ 753 return m_sPrivateParam.nBorderStyle; 754} 755 756void CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle) 757{ 758 if (HasFlag(PWS_BORDER)) 759 m_sPrivateParam.nBorderStyle = nBorderStyle; 760} 761 762FX_INT32 CPWL_Wnd::GetBorderWidth() const 763{ 764 if (HasFlag(PWS_BORDER)) 765 return m_sPrivateParam.dwBorderWidth; 766 767 return 0; 768} 769 770FX_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 783void CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth) 784{ 785 if (HasFlag(PWS_BORDER)) 786 m_sPrivateParam.dwBorderWidth = nBorderWidth; 787} 788 789CPWL_Color CPWL_Wnd::GetBorderColor() const 790{ 791 if (HasFlag(PWS_BORDER)) 792 return m_sPrivateParam.sBorderColor; 793 794 return CPWL_Color(); 795} 796 797void CPWL_Wnd::SetBorderColor(const CPWL_Color & color) 798{ 799 if (HasFlag(PWS_BORDER)) 800 m_sPrivateParam.sBorderColor = color; 801} 802 803CPWL_Dash CPWL_Wnd::GetBorderDash() const 804{ 805 return m_sPrivateParam.sDash; 806} 807 808void* CPWL_Wnd::GetAttachedData() const 809{ 810 return m_sPrivateParam.pAttachedData; 811} 812 813void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash) 814{ 815 if (HasFlag(PWS_BORDER)) 816 m_sPrivateParam.sDash = sDash; 817} 818 819CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const 820{ 821 if (HasFlag(PWS_VSCROLL)) 822 return m_pVScrollBar; 823 824 return NULL; 825} 826 827void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp) 828{ 829 CreateVScrollBar(cp); 830} 831 832void 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 851void CPWL_Wnd::SetCapture() 852{ 853 if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) 854 pMsgCtrl->SetCapture(this); 855} 856 857void 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 867void 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 877void CPWL_Wnd::KillFocus() 878{ 879 if (CPWL_MsgControl * pMsgCtrl = GetMsgControl()) 880 { 881 if (pMsgCtrl->IsWndCaptureKeyboard(this)) 882 pMsgCtrl->KillFocus(); 883 } 884} 885 886void CPWL_Wnd::OnSetFocus() 887{ 888} 889 890void CPWL_Wnd::OnKillFocus() 891{ 892} 893 894FX_BOOL CPWL_Wnd::WndHitTest(const CPDF_Point & point) const 895{ 896 return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y); 897} 898 899FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const 900{ 901 return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y); 902} 903 904const 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 912void 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 933void CPWL_Wnd::SetClipRect(const CPDF_Rect & rect) 934{ 935 m_rcClip = rect; 936 m_rcClip.Normalize(); 937} 938 939CPDF_Rect CPWL_Wnd::GetClipRect() const 940{ 941 return m_rcClip; 942} 943 944FX_BOOL CPWL_Wnd::IsReadOnly() const 945{ 946 return HasFlag(PWS_READONLY); 947} 948 949void 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 963void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp) 964{ 965} 966 967void 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 979void CPWL_Wnd::CreateMsgControl() 980{ 981 if (!m_sPrivateParam.pMsgControl) 982 m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this); 983} 984 985void CPWL_Wnd::DestroyMsgControl() 986{ 987 if (CPWL_MsgControl* pMsgControl = GetMsgControl()) 988 if (pMsgControl->IsWndCreated(this)) 989 delete pMsgControl; 990} 991 992CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const 993{ 994 return m_sPrivateParam.pMsgControl; 995} 996 997FX_BOOL CPWL_Wnd::IsCaptureMouse() const 998{ 999 return IsWndCaptureMouse(this); 1000} 1001 1002FX_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 1010FX_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 1018FX_BOOL CPWL_Wnd::IsFocused() const 1019{ 1020 if (CPWL_MsgControl * pCtrl = GetMsgControl()) 1021 return pCtrl->IsMainCaptureKeyboard(this); 1022 1023 return FALSE; 1024} 1025 1026CPDF_Rect CPWL_Wnd::GetFocusRect() const 1027{ 1028 return CPWL_Utils::InflateRect(this->GetWindowRect(),1); 1029} 1030 1031FX_FLOAT CPWL_Wnd::GetFontSize() const 1032{ 1033 return this->m_sPrivateParam.fFontSize; 1034} 1035 1036void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize) 1037{ 1038 this->m_sPrivateParam.fFontSize = fFontSize; 1039} 1040 1041IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const 1042{ 1043 return m_sPrivateParam.pSystemHandler; 1044} 1045 1046IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const 1047{ 1048 return m_sPrivateParam.pFocusHandler; 1049} 1050 1051IPWL_Provider* CPWL_Wnd::GetProvider() const 1052{ 1053 return m_sPrivateParam.pProvider; 1054} 1055 1056IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const 1057{ 1058 return m_sPrivateParam.pFontMap; 1059} 1060 1061CPWL_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 1084CPWL_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 1109FX_INT32 CPWL_Wnd::GetTransparency() 1110{ 1111 return m_sPrivateParam.nTransparency; 1112} 1113 1114void 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 1127CPDF_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 1153void 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 1162FX_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 1170FX_HWND CPWL_Wnd::GetAttachedHWnd() const 1171{ 1172 return m_sPrivateParam.hAttachedWnd; 1173} 1174 1175CPDF_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 1188CPDF_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 1201CPDF_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 1215CPDF_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 1229CPDF_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 1246CPDF_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 1254void CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt) 1255{ 1256 m_sPrivateParam.mtChild = mt; 1257} 1258 1259const 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 1269void 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 1290FX_BOOL CPWL_Wnd::IsEnabled() 1291{ 1292 return m_bEnabled; 1293} 1294 1295void CPWL_Wnd::OnEnabled() 1296{ 1297} 1298 1299void CPWL_Wnd::OnDisabled() 1300{ 1301} 1302 1303FX_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 1313FX_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 1323FX_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 1333FX_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