1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file.
4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fpdfsdk/pwl/cpwl_wnd.h"
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <map>
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <sstream>
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <vector>
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxge/cfx_renderdevice.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fpdfsdk/pwl/cpwl_scroll_bar.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/ptr_util.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/stl_util.h"
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannnamespace {
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconstexpr float kDefaultFontSize = 9.0f;
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}  // namespace
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::CreateParams::CreateParams()
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : rcRectWnd(0, 0, 0, 0),
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pSystemHandler(nullptr),
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pFontMap(nullptr),
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pProvider(nullptr),
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pFocusHandler(nullptr),
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwFlags(0),
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      sBackgroundColor(),
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pAttachedWidget(nullptr),
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nBorderStyle(BorderStyle::SOLID),
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwBorderWidth(1),
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      sBorderColor(),
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      sTextColor(),
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nTransparency(255),
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fFontSize(kDefaultFontSize),
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      sDash(3, 0, 0),
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pAttachedData(nullptr),
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pParentWnd(nullptr),
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pMsgControl(nullptr),
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eCursorType(FXCT_ARROW) {}
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::CreateParams::CreateParams(const CreateParams& other) = default;
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::CreateParams::~CreateParams() = default;
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass CPWL_MsgControl : public Observable<CPWL_MsgControl> {
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann public:
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  explicit CPWL_MsgControl(CPWL_Wnd* pWnd) : m_pCreatedWnd(pWnd) {}
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ~CPWL_MsgControl() {}
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool IsWndCreated(const CPWL_Wnd* pWnd) const {
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return m_pCreatedWnd == pWnd;
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool IsWndCaptureMouse(const CPWL_Wnd* pWnd) const {
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pWnd && pdfium::ContainsValue(m_aMousePath, pWnd);
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool IsMainCaptureKeyboard(const CPWL_Wnd* pWnd) const {
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pWnd == m_pMainKeyboardWnd;
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const {
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pWnd && pdfium::ContainsValue(m_aKeyboardPath, pWnd);
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SetFocus(CPWL_Wnd* pWnd) {
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_aKeyboardPath.clear();
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pWnd)
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pMainKeyboardWnd = pWnd;
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CPWL_Wnd* pParent = pWnd;
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    while (pParent) {
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_aKeyboardPath.push_back(pParent);
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pParent = pParent->GetParentWindow();
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    // Note, pWnd may get destroyed in the OnSetFocus call.
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pWnd->OnSetFocus();
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void KillFocus() {
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ObservedPtr observed_ptr(this);
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!m_aKeyboardPath.empty())
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (CPWL_Wnd* pWnd = m_aKeyboardPath[0])
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pWnd->OnKillFocus();
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!observed_ptr)
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pMainKeyboardWnd = nullptr;
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_aKeyboardPath.clear();
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void SetCapture(CPWL_Wnd* pWnd) {
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_aMousePath.clear();
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pWnd) {
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CPWL_Wnd* pParent = pWnd;
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      while (pParent) {
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        m_aMousePath.push_back(pParent);
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pParent = pParent->GetParentWindow();
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void ReleaseCapture() {
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_aMousePath.clear();
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_Wnd* GetFocusedWindow() const { return m_pMainKeyboardWnd.Get(); }
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann private:
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CPWL_Wnd*> m_aMousePath;
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CPWL_Wnd*> m_aKeyboardPath;
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UnownedPtr<CPWL_Wnd> m_pCreatedWnd;
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  UnownedPtr<CPWL_Wnd> m_pMainKeyboardWnd;
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann};
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::CPWL_Wnd()
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : m_rcWindow(),
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_rcClip(),
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_bCreated(false),
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_bVisible(false),
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_bNotifying(false),
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_bEnabled(true) {}
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::~CPWL_Wnd() {
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(!m_bCreated);
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannByteString CPWL_Wnd::GetClassName() const {
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return "CPWL_Wnd";
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::Create(const CreateParams& cp) {
138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsValid())
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams = cp;
142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnCreate(&m_CreationParams);
143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.rcRectWnd.Normalize();
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcWindow = m_CreationParams.rcRectWnd;
145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcClip = m_rcWindow;
146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_rcClip.IsEmpty()) {
147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_rcClip.Inflate(1.0f, 1.0f);
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_rcClip.Normalize();
149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateMsgControl();
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_CreationParams.pParentWnd)
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_CreationParams.pParentWnd->AddChild(this);
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateParams ccp = m_CreationParams;
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ccp.dwFlags &= 0xFFFF0000L;  // remove sub styles
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateScrollBar(ccp);
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateChildWnd(ccp);
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_bVisible = HasFlag(PWS_VISIBLE);
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnCreated();
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!RePosChildWnd())
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_bCreated = true;
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::OnCreate(CreateParams* pParamsToAdjust) {}
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::OnCreated() {}
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::OnDestroy() {}
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::InvalidateFocusHandler(FocusHandlerIface* handler) {
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_CreationParams.pFocusHandler == handler)
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_CreationParams.pFocusHandler = nullptr;
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::InvalidateProvider(ProviderIface* provider) {
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_CreationParams.pProvider.Get() == provider)
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_CreationParams.pProvider.Reset();
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::Destroy() {
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  KillFocus();
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnDestroy();
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_bCreated) {
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pVScrollBar = nullptr;
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) {
188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CPWL_Wnd* pChild = *it;
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pChild) {
190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        *it = nullptr;
191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pChild->Destroy();
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        delete pChild;
193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (m_CreationParams.pParentWnd)
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_CreationParams.pParentWnd->RemoveChild(this);
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_bCreated = false;
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DestroyMsgControl();
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_Children.clear();
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::Move(const CFX_FloatRect& rcNew, bool bReset, bool bRefresh) {
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!IsValid())
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcOld = GetWindowRect();
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcWindow = rcNew;
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcWindow.Normalize();
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bReset) {
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) {
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!RePosChildWnd())
216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return false;
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bRefresh && !InvalidateRectMove(rcOld, rcNew))
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.rcRectWnd = m_rcWindow;
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::InvalidateRectMove(const CFX_FloatRect& rcOld,
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  const CFX_FloatRect& rcNew) {
228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcUnion = rcOld;
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  rcUnion.Union(rcNew);
230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return InvalidateRect(&rcUnion);
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice,
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              const CFX_Matrix& mtUser2Device) {
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsValid() && IsVisible()) {
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    DrawThisAppearance(pDevice, mtUser2Device);
238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    DrawChildAppearance(pDevice, mtUser2Device);
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice,
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  const CFX_Matrix& mtUser2Device) {
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rectWnd = GetWindowRect();
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (rectWnd.IsEmpty())
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (HasFlag(PWS_BACKGROUND)) {
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float width = static_cast<float>(GetBorderWidth() + GetInnerBorderWidth());
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDevice->DrawFillRect(&mtUser2Device, rectWnd.GetDeflated(width, width),
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                          GetBackgroundColor(), GetTransparency());
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (HasFlag(PWS_BORDER)) {
255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDevice->DrawBorder(&mtUser2Device, rectWnd,
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        static_cast<float>(GetBorderWidth()), GetBorderColor(),
257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        GetBorderLeftTopColor(GetBorderStyle()),
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        GetBorderRightBottomColor(GetBorderStyle()),
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        GetBorderStyle(), GetTransparency());
260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice,
264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   const CFX_Matrix& mtUser2Device) {
265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CPWL_Wnd* pChild : m_Children) {
266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pChild)
267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_Matrix mt = pChild->GetChildMatrix();
270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (mt.IsIdentity()) {
271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChild->DrawAppearance(pDevice, mtUser2Device);
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else {
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      mt.Concat(mtUser2Device);
274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChild->DrawAppearance(pDevice, mt);
275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ObservedPtr thisObserved(this);
281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!IsValid())
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect();
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!HasFlag(PWS_NOREFRESHCLIP)) {
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_FloatRect rcClip = GetClipRect();
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!rcClip.IsEmpty()) {
289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      rcRefresh.Intersect(rcClip);
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcWin = PWLtoWnd(rcRefresh);
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  rcWin.Inflate(1, 1);
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  rcWin.Normalize();
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (CFX_SystemHandler* pSH = GetSystemHandler()) {
298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (CPDFSDK_Widget* widget = static_cast<CPDFSDK_Widget*>(
299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            m_CreationParams.pAttachedWidget.Get())) {
300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pSH->InvalidateRect(widget, rcWin);
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!thisObserved)
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return false;
303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#define PWL_IMPLEMENT_KEY_METHOD(key_method_name)                  \
310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool CPWL_Wnd::key_method_name(uint16_t nChar, uint32_t nFlag) { \
311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!IsValid() || !IsVisible() || !IsEnabled())                \
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;                                                \
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!IsWndCaptureKeyboard(this))                               \
314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;                                                \
315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (auto* pChild : m_Children) {                              \
316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pChild && IsWndCaptureKeyboard(pChild))                  \
317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return pChild->key_method_name(nChar, nFlag);              \
318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }                                                              \
319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;                                                  \
320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_KEY_METHOD(OnChar)
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#undef PWL_IMPLEMENT_KEY_METHOD
325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)                          \
327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool CPWL_Wnd::mouse_method_name(const CFX_PointF& point, uint32_t nFlag) {  \
328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!IsValid() || !IsVisible() || !IsEnabled())                            \
329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;                                                            \
330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (IsWndCaptureMouse(this)) {                                             \
331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (auto* pChild : m_Children) {                                        \
332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pChild && IsWndCaptureMouse(pChild)) {                             \
333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          return pChild->mouse_method_name(pChild->ParentToChild(point),       \
334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           nFlag);                             \
335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }                                                                      \
336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }                                                                        \
337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      SetCursor();                                                             \
338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;                                                            \
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }                                                                          \
340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (auto* pChild : m_Children) {                                          \
341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pChild && pChild->WndHitTest(pChild->ParentToChild(point))) {        \
342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return pChild->mouse_method_name(pChild->ParentToChild(point), nFlag); \
343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }                                                                        \
344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }                                                                          \
345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (WndHitTest(point))                                                     \
346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      SetCursor();                                                             \
347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;                                                              \
348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)
353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannPWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#undef PWL_IMPLEMENT_MOUSE_METHOD
357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CPWL_Wnd::GetSelectedText() {
359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return WideString();
360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::ReplaceSelection(const WideString& text) {}
363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::OnMouseWheel(short zDelta,
365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            const CFX_PointF& point,
366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            uint32_t nFlag) {
367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!IsValid() || !IsVisible() || !IsEnabled())
368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetCursor();
371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!IsWndCaptureKeyboard(this))
372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pChild : m_Children) {
375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pChild && IsWndCaptureKeyboard(pChild))
376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point), nFlag);
377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return false;
379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::AddChild(CPWL_Wnd* pWnd) {
382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_Children.push_back(pWnd);
383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::RemoveChild(CPWL_Wnd* pWnd) {
386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto it = m_Children.rbegin(); it != m_Children.rend(); ++it) {
387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (*it && *it == pWnd) {
388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_Children.erase(std::next(it).base());
389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetScrollInfo(const PWL_SCROLL_INFO& info) {}
395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
396d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetScrollPosition(float pos) {}
397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::ScrollWindowVertically(float pos) {}
399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::NotifyLButtonDown(CPWL_Wnd* child, const CFX_PointF& pos) {}
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::NotifyLButtonUp(CPWL_Wnd* child, const CFX_PointF& pos) {}
403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::NotifyMouseMove(CPWL_Wnd* child, const CFX_PointF& pos) {}
405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd* CPWL_Wnd::GetParentWindow() const {
407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pParentWnd;
408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_FloatRect CPWL_Wnd::GetWindowRect() const {
411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_rcWindow;
412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_FloatRect CPWL_Wnd::GetClientRect() const {
415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcWindow = GetWindowRect();
416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float width = static_cast<float>(GetBorderWidth() + GetInnerBorderWidth());
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcClient = rcWindow.GetDeflated(width, width);
419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (CPWL_ScrollBar* pVSB = GetVScrollBar())
420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    rcClient.right -= pVSB->GetScrollBarWidth();
421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  rcClient.Normalize();
423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return rcWindow.Contains(rcClient) ? rcClient : CFX_FloatRect();
424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_PointF CPWL_Wnd::GetCenterPoint() const {
427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcClient = GetClientRect();
428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return CFX_PointF((rcClient.left + rcClient.right) * 0.5f,
429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    (rcClient.top + rcClient.bottom) * 0.5f);
430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::HasFlag(uint32_t dwFlags) const {
433d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return (m_CreationParams.dwFlags & dwFlags) != 0;
434d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
436d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::RemoveFlag(uint32_t dwFlags) {
437d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.dwFlags &= ~dwFlags;
438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::AddFlag(uint32_t dwFlags) {
441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.dwFlags |= dwFlags;
442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
443d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Color CPWL_Wnd::GetBackgroundColor() const {
445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.sBackgroundColor;
446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
448d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetBackgroundColor(const CFX_Color& color) {
449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.sBackgroundColor = color;
450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Color CPWL_Wnd::GetTextColor() const {
453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.sTextColor;
454d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
455d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannBorderStyle CPWL_Wnd::GetBorderStyle() const {
457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.nBorderStyle;
458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetBorderStyle(BorderStyle nBorderStyle) {
461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (HasFlag(PWS_BORDER))
462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_CreationParams.nBorderStyle = nBorderStyle;
463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CPWL_Wnd::GetBorderWidth() const {
466d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return HasFlag(PWS_BORDER) ? m_CreationParams.dwBorderWidth : 0;
467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CPWL_Wnd::GetInnerBorderWidth() const {
470d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return 0;
471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
472d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Color CPWL_Wnd::GetBorderColor() const {
474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return HasFlag(PWS_BORDER) ? m_CreationParams.sBorderColor : CFX_Color();
475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
476d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
477d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CPWL_Dash& CPWL_Wnd::GetBorderDash() const {
478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.sDash;
479d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
480d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::PrivateData* CPWL_Wnd::GetAttachedData() const {
482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pAttachedData.Get();
483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
485d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const {
486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return HasFlag(PWS_VSCROLL) ? m_pVScrollBar.Get() : nullptr;
487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
489d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::CreateScrollBar(const CreateParams& cp) {
490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateVScrollBar(cp);
491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
493d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::CreateVScrollBar(const CreateParams& cp) {
494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pVScrollBar || !HasFlag(PWS_VSCROLL))
495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CreateParams scp = cp;
498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // flags
500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  scp.dwFlags =
501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      PWS_CHILD | PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
502d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  scp.pParentWnd = this;
504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  scp.eCursorType = FXCT_ARROW;
506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  scp.nTransparency = PWL_SCROLLBAR_TRANSPARENCY;
507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL);
509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pVScrollBar->Create(scp);
510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetCapture() {
513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pMsgCtrl->SetCapture(this);
515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::ReleaseCapture() {
518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pChild : m_Children) {
519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pChild)
520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChild->ReleaseCapture();
521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pMsgCtrl->ReleaseCapture();
524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetFocus() {
527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pMsgCtrl->IsMainCaptureKeyboard(this))
529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pMsgCtrl->KillFocus();
530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pMsgCtrl->SetFocus(this);
531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::KillFocus() {
535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pMsgCtrl->IsWndCaptureKeyboard(this))
537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pMsgCtrl->KillFocus();
538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::OnSetFocus() {}
542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::OnKillFocus() {}
544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::WndHitTest(const CFX_PointF& point) const {
546d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return IsValid() && IsVisible() && GetWindowRect().Contains(point);
547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::ClientHitTest(const CFX_PointF& point) const {
550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return IsValid() && IsVisible() && GetClientRect().Contains(point);
551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CPWL_Wnd* CPWL_Wnd::GetRootWnd() const {
554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pParent = m_CreationParams.pParentWnd;
555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pParent ? pParent->GetRootWnd() : this;
556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
558d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::SetVisible(bool bVisible) {
559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!IsValid())
560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
562d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ObservedPtr thisObserved(this);
563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pChild : m_Children) {
565d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pChild) {
566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChild->SetVisible(bVisible);
567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!thisObserved)
568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return false;
569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
571d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bVisible != m_bVisible) {
573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_bVisible = bVisible;
574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!RePosChildWnd())
575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;
576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!InvalidateRect(nullptr))
578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;
579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
582d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
583d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetClipRect(const CFX_FloatRect& rect) {
584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcClip = rect;
585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcClip.Normalize();
586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
588d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CFX_FloatRect& CPWL_Wnd::GetClipRect() const {
589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_rcClip;
590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::IsReadOnly() const {
593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return HasFlag(PWS_READONLY);
594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::RePosChildWnd() {
597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_ScrollBar* pVSB = GetVScrollBar();
598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pVSB)
599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcContent = GetWindowRect();
602d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!rcContent.IsEmpty()) {
603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float width = static_cast<float>(GetBorderWidth() + GetInnerBorderWidth());
604d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    rcContent.Deflate(width, width);
605d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    rcContent.Normalize();
606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rcVScroll =
608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CFX_FloatRect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom,
609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    rcContent.right - 1.0f, rcContent.top);
610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ObservedPtr thisObserved(this);
612d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pVSB->Move(rcVScroll, true, false);
614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!thisObserved)
615d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
616d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::CreateChildWnd(const CreateParams& cp) {}
621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetCursor() {
623d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsValid()) {
624d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (CFX_SystemHandler* pSH = GetSystemHandler()) {
625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      int32_t nCursorType = GetCreationParams().eCursorType;
626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pSH->SetCursor(nCursorType);
627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
628d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
631d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::CreateMsgControl() {
632d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_CreationParams.pMsgControl)
633d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_CreationParams.pMsgControl = new CPWL_MsgControl(this);
634d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::DestroyMsgControl() {
637d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_MsgControl* pMsgControl = GetMsgControl();
638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pMsgControl && pMsgControl->IsWndCreated(this))
639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    delete pMsgControl;
640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_MsgControl* CPWL_Wnd::GetMsgControl() const {
643d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pMsgControl;
644d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::IsCaptureMouse() const {
647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return IsWndCaptureMouse(this);
648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd* pWnd) const {
651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_MsgControl* pCtrl = GetMsgControl();
652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pCtrl ? pCtrl->IsWndCaptureMouse(pWnd) : false;
653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
654d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const {
656d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_MsgControl* pCtrl = GetMsgControl();
657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pCtrl ? pCtrl->IsWndCaptureKeyboard(pWnd) : false;
658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CPWL_Wnd::IsFocused() const {
661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_MsgControl* pCtrl = GetMsgControl();
662d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pCtrl ? pCtrl->IsMainCaptureKeyboard(this) : false;
663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
664d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_FloatRect CPWL_Wnd::GetFocusRect() const {
666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_FloatRect rect = GetWindowRect();
667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!rect.IsEmpty()) {
668d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    rect.Inflate(1.0f, 1.0f);
669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    rect.Normalize();
670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return rect;
672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
674d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CPWL_Wnd::GetFontSize() const {
675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.fFontSize;
676d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetFontSize(float fFontSize) {
679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.fFontSize = fFontSize;
680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const {
683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pSystemHandler;
684d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::FocusHandlerIface* CPWL_Wnd::GetFocusHandler() const {
687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pFocusHandler.Get();
688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPWL_Wnd::ProviderIface* CPWL_Wnd::GetProvider() const {
691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pProvider.Get();
692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
694d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannIPVT_FontMap* CPWL_Wnd::GetFontMap() const {
695d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.pFontMap;
696d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
698d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Color CPWL_Wnd::GetBorderLeftTopColor(BorderStyle nBorderStyle) const {
699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (nBorderStyle) {
700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case BorderStyle::BEVELED:
701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return CFX_Color(CFX_Color::kGray, 1);
702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case BorderStyle::INSET:
703d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return CFX_Color(CFX_Color::kGray, 0.5f);
704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
705d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return CFX_Color();
706d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
709d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Color CPWL_Wnd::GetBorderRightBottomColor(BorderStyle nBorderStyle) const {
710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (nBorderStyle) {
711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case BorderStyle::BEVELED:
712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return GetBackgroundColor() / 2.0f;
713d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case BorderStyle::INSET:
714d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return CFX_Color(CFX_Color::kGray, 0.75f);
715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return CFX_Color();
717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CPWL_Wnd::GetTransparency() {
721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_CreationParams.nTransparency;
722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetTransparency(int32_t nTransparency) {
725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pChild : m_Children) {
726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pChild)
727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChild->SetTransparency(nTransparency);
728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.nTransparency = nTransparency;
730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
731d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
732d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Matrix CPWL_Wnd::GetWindowMatrix() const {
733d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix mt = GetChildToRoot();
734d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (ProviderIface* pProvider = GetProvider())
735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return mt;
737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
739d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_FloatRect CPWL_Wnd::PWLtoWnd(const CFX_FloatRect& rect) const {
740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix mt = GetWindowMatrix();
741d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return mt.TransformRect(rect);
742d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
744d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_PointF CPWL_Wnd::ParentToChild(const CFX_PointF& point) const {
745d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix mt = GetChildMatrix();
746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (mt.IsIdentity())
747d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return point;
748d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix inverse = mt.GetInverse();
750d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!inverse.IsIdentity())
751d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    mt = inverse;
752d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return mt.Transform(point);
753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_FloatRect CPWL_Wnd::ParentToChild(const CFX_FloatRect& rect) const {
756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix mt = GetChildMatrix();
757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (mt.IsIdentity())
758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return rect;
759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix inverse = mt.GetInverse();
761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!inverse.IsIdentity())
762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    mt = inverse;
763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return mt.TransformRect(rect);
765d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
766d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Matrix CPWL_Wnd::GetChildToRoot() const {
768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_Matrix mt;
769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (HasFlag(PWS_CHILD)) {
770d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const CPWL_Wnd* pParent = this;
771d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    while (pParent) {
772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      mt.Concat(pParent->GetChildMatrix());
773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pParent = pParent->GetParentWindow();
774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
776d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return mt;
777d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_Matrix CPWL_Wnd::GetChildMatrix() const {
780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return HasFlag(PWS_CHILD) ? m_CreationParams.mtChild : CFX_Matrix();
781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::SetChildMatrix(const CFX_Matrix& mt) {
784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_CreationParams.mtChild = mt;
785d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
786d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CPWL_Wnd* CPWL_Wnd::GetFocused() const {
788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CPWL_MsgControl* pMsgCtrl = GetMsgControl();
789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pMsgCtrl ? pMsgCtrl->GetFocusedWindow() : nullptr;
790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPWL_Wnd::EnableWindow(bool bEnable) {
793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_bEnabled == bEnable)
794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pChild : m_Children) {
797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pChild)
798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pChild->EnableWindow(bEnable);
799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_bEnabled = bEnable;
801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
802