blob: 28bd0e04edd52695da3b57d81110b45d1d333745 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// 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.
Lei Zhang60f507b2015-06-13 00:41:00 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Lei Zhang606346f2015-06-19 18:11:07 -07007#include <map>
8
Lei Zhangbde53d22015-11-12 22:21:30 -08009#include "fpdfsdk/include/pdfwindow/PWL_ScrollBar.h"
10#include "fpdfsdk/include/pdfwindow/PWL_Utils.h"
11#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070012
Nico Weber9d8ec5a2015-08-04 13:00:21 -070013static std::map<int32_t, CPWL_Timer*>& GetPWLTimeMap() {
Bruce Dawson26d96ff2015-01-05 15:31:49 -080014 // Leak the object at shutdown.
Lei Zhang606346f2015-06-19 18:11:07 -070015 static auto timeMap = new std::map<int32_t, CPWL_Timer*>;
Bruce Dawson26d96ff2015-01-05 15:31:49 -080016 return *timeMap;
17}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070018
Nico Weber9d8ec5a2015-08-04 13:00:21 -070019CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached,
20 IFX_SystemHandler* pSystemHandler)
21 : m_nTimerID(0), m_pAttached(pAttached), m_pSystemHandler(pSystemHandler) {
Lei Zhang96660d62015-12-14 18:27:25 -080022 ASSERT(m_pAttached);
23 ASSERT(m_pSystemHandler);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070024}
25
Nico Weber9d8ec5a2015-08-04 13:00:21 -070026CPWL_Timer::~CPWL_Timer() {
27 KillPWLTimer();
28}
29
30int32_t CPWL_Timer::SetPWLTimer(int32_t nElapse) {
31 if (m_nTimerID != 0)
Tom Sepez2f2ffec2015-07-23 14:42:09 -070032 KillPWLTimer();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070033 m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc);
34
35 GetPWLTimeMap()[m_nTimerID] = this;
36 return m_nTimerID;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070037}
38
Nico Weber9d8ec5a2015-08-04 13:00:21 -070039void CPWL_Timer::KillPWLTimer() {
40 if (m_nTimerID == 0)
41 return;
Lei Zhang606346f2015-06-19 18:11:07 -070042
Nico Weber9d8ec5a2015-08-04 13:00:21 -070043 m_pSystemHandler->KillTimer(m_nTimerID);
44 GetPWLTimeMap().erase(m_nTimerID);
45 m_nTimerID = 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070046}
47
Nico Weber9d8ec5a2015-08-04 13:00:21 -070048void CPWL_Timer::TimerProc(int32_t idEvent) {
49 auto it = GetPWLTimeMap().find(idEvent);
50 if (it == GetPWLTimeMap().end())
51 return;
Lei Zhang606346f2015-06-19 18:11:07 -070052
Nico Weber9d8ec5a2015-08-04 13:00:21 -070053 CPWL_Timer* pTimer = it->second;
54 if (pTimer->m_pAttached)
55 pTimer->m_pAttached->TimerProc();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070056}
57
Nico Weber9d8ec5a2015-08-04 13:00:21 -070058CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL) {}
59
60CPWL_TimerHandler::~CPWL_TimerHandler() {
61 delete m_pTimer;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070062}
63
Nico Weber9d8ec5a2015-08-04 13:00:21 -070064void CPWL_TimerHandler::BeginTimer(int32_t nElapse) {
65 if (!m_pTimer)
66 m_pTimer = new CPWL_Timer(this, GetSystemHandler());
67
68 if (m_pTimer)
69 m_pTimer->SetPWLTimer(nElapse);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070070}
71
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072void CPWL_TimerHandler::EndTimer() {
73 if (m_pTimer)
74 m_pTimer->KillPWLTimer();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070075}
76
Nico Weber9d8ec5a2015-08-04 13:00:21 -070077void CPWL_TimerHandler::TimerProc() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070078
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079class CPWL_MsgControl {
80 friend class CPWL_Wnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070081
Nico Weber9d8ec5a2015-08-04 13:00:21 -070082 public:
Lei Zhangc2fb35f2016-01-05 16:46:58 -080083 explicit CPWL_MsgControl(CPWL_Wnd* pWnd) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070084 m_pCreatedWnd = pWnd;
85 Default();
86 }
87
88 ~CPWL_MsgControl() {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070089 Default();
90 }
91
92 void Default() {
93 m_aMousePath.RemoveAll();
94 m_aKeyboardPath.RemoveAll();
95 m_pMainMouseWnd = NULL;
96 m_pMainKeyboardWnd = NULL;
97 }
98
99 FX_BOOL IsWndCreated(const CPWL_Wnd* pWnd) const {
100 return m_pCreatedWnd == pWnd;
101 }
102
103 FX_BOOL IsMainCaptureMouse(const CPWL_Wnd* pWnd) const {
104 return pWnd == m_pMainMouseWnd;
105 }
106
107 FX_BOOL IsWndCaptureMouse(const CPWL_Wnd* pWnd) const {
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800108 if (pWnd) {
109 for (int32_t i = 0, sz = m_aMousePath.GetSize(); i < sz; i++) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700110 if (m_aMousePath.GetAt(i) == pWnd)
111 return TRUE;
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800112 }
113 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700114
115 return FALSE;
116 }
117
118 FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd* pWnd) const {
119 return pWnd == m_pMainKeyboardWnd;
120 }
121
122 FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const {
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800123 if (pWnd) {
124 for (int32_t i = 0, sz = m_aKeyboardPath.GetSize(); i < sz; i++) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125 if (m_aKeyboardPath.GetAt(i) == pWnd)
126 return TRUE;
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800127 }
128 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700129
130 return FALSE;
131 }
132
133 void SetFocus(CPWL_Wnd* pWnd) {
134 m_aKeyboardPath.RemoveAll();
135
136 if (pWnd) {
137 m_pMainKeyboardWnd = pWnd;
138
139 CPWL_Wnd* pParent = pWnd;
140 while (pParent) {
141 m_aKeyboardPath.Add(pParent);
142 pParent = pParent->GetParentWindow();
143 }
144
145 pWnd->OnSetFocus();
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700146 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700147 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700148
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700149 void KillFocus() {
150 if (m_aKeyboardPath.GetSize() > 0)
151 if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))
152 pWnd->OnKillFocus();
153
154 m_pMainKeyboardWnd = NULL;
155 m_aKeyboardPath.RemoveAll();
156 }
157
158 void SetCapture(CPWL_Wnd* pWnd) {
159 m_aMousePath.RemoveAll();
160
161 if (pWnd) {
162 m_pMainMouseWnd = pWnd;
163
164 CPWL_Wnd* pParent = pWnd;
165 while (pParent) {
166 m_aMousePath.Add(pParent);
167 pParent = pParent->GetParentWindow();
168 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700169 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700170 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700171
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700172 void ReleaseCapture() {
173 m_pMainMouseWnd = NULL;
174 m_aMousePath.RemoveAll();
175 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700176
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700177 private:
178 CFX_ArrayTemplate<CPWL_Wnd*> m_aMousePath;
179 CFX_ArrayTemplate<CPWL_Wnd*> m_aKeyboardPath;
180 CPWL_Wnd* m_pCreatedWnd;
181 CPWL_Wnd* m_pMainMouseWnd;
182 CPWL_Wnd* m_pMainKeyboardWnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700183};
184
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700185CPWL_Wnd::CPWL_Wnd()
186 : m_pVScrollBar(NULL),
187 m_rcWindow(),
188 m_rcClip(),
189 m_bCreated(FALSE),
190 m_bVisible(FALSE),
191 m_bNotifying(FALSE),
192 m_bEnabled(TRUE) {}
193
194CPWL_Wnd::~CPWL_Wnd() {
195 ASSERT(m_bCreated == FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700196}
197
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700198CFX_ByteString CPWL_Wnd::GetClassName() const {
199 return "CPWL_Wnd";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700200}
201
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700202void CPWL_Wnd::Create(const PWL_CREATEPARAM& cp) {
203 if (!IsValid()) {
204 m_sPrivateParam = cp;
205
206 OnCreate(m_sPrivateParam);
207
208 m_sPrivateParam.rcRectWnd.Normalize();
209 m_rcWindow = m_sPrivateParam.rcRectWnd;
210 m_rcClip = CPWL_Utils::InflateRect(m_rcWindow, 1.0f);
211
212 CreateMsgControl();
213
214 if (m_sPrivateParam.pParentWnd)
215 m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);
216
217 PWL_CREATEPARAM ccp = m_sPrivateParam;
218
219 ccp.dwFlags &= 0xFFFF0000L; // remove sub styles
Tom Sepez60d909e2015-12-10 15:34:55 -0800220 ccp.mtChild = CFX_Matrix(1, 0, 0, 1, 0, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700221
222 CreateScrollBar(ccp);
223 CreateChildWnd(ccp);
224
225 m_bVisible = HasFlag(PWS_VISIBLE);
226
227 OnCreated();
228
229 RePosChildWnd();
230 m_bCreated = TRUE;
231 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700232}
233
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234void CPWL_Wnd::OnCreate(PWL_CREATEPARAM& cp) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700235
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700236void CPWL_Wnd::OnCreated() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700237
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238void CPWL_Wnd::OnDestroy() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700239
Lei Zhangab5537d2016-01-06 14:58:14 -0800240void CPWL_Wnd::InvalidateFocusHandler(IPWL_FocusHandler* handler) {
241 if (m_sPrivateParam.pFocusHandler == handler)
242 m_sPrivateParam.pFocusHandler = nullptr;
243}
244
245void CPWL_Wnd::InvalidateProvider(IPWL_Provider* provider) {
246 if (m_sPrivateParam.pProvider == provider)
247 m_sPrivateParam.pProvider = nullptr;
248}
249
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700250void CPWL_Wnd::Destroy() {
251 KillFocus();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700252
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700253 OnDestroy();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700254
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700255 if (m_bCreated) {
256 for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) {
257 if (CPWL_Wnd* pChild = m_aChildren[i]) {
258 pChild->Destroy();
259 delete pChild;
260 pChild = NULL;
261 }
262 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700263
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700264 if (m_sPrivateParam.pParentWnd)
265 m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
266 m_bCreated = FALSE;
267 }
Lei Zhang60f507b2015-06-13 00:41:00 -0700268
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700269 DestroyMsgControl();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700270
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700271 FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
272 m_aChildren.RemoveAll();
273 m_pVScrollBar = NULL;
274}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700275
Tom Sepez281a9ea2016-02-26 14:24:28 -0800276void CPWL_Wnd::Move(const CFX_FloatRect& rcNew,
277 FX_BOOL bReset,
278 FX_BOOL bRefresh) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700279 if (IsValid()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800280 CFX_FloatRect rcOld = GetWindowRect();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700281
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700282 m_rcWindow = rcNew;
283 m_rcWindow.Normalize();
284
285 if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
286 rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) {
287 if (bReset) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700288 RePosChildWnd();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700289 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700290 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700291 if (bRefresh) {
292 InvalidateRectMove(rcOld, rcNew);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700293 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700294
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700295 m_sPrivateParam.rcRectWnd = m_rcWindow;
296 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700297}
298
Tom Sepez281a9ea2016-02-26 14:24:28 -0800299void CPWL_Wnd::InvalidateRectMove(const CFX_FloatRect& rcOld,
300 const CFX_FloatRect& rcNew) {
301 CFX_FloatRect rcUnion = rcOld;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700302 rcUnion.Union(rcNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700303
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700304 InvalidateRect(&rcUnion);
305}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700306
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700307void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf& sAppStream) {
308 if (IsValid() && IsVisible()) {
309 GetThisAppearanceStream(sAppStream);
310 GetChildAppearanceStream(sAppStream);
311 }
312}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700313
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700314// if don't set,Get default apperance stream
315void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800316 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700317 if (!rectWnd.IsEmpty()) {
318 CFX_ByteTextBuf sThis;
319
320 if (HasFlag(PWS_BACKGROUND))
321 sThis << CPWL_Utils::GetRectFillAppStream(rectWnd, GetBackgroundColor());
322
323 if (HasFlag(PWS_BORDER)) {
324 sThis << CPWL_Utils::GetBorderAppStream(
325 rectWnd, (FX_FLOAT)GetBorderWidth(), GetBorderColor(),
326 GetBorderLeftTopColor(GetBorderStyle()),
327 GetBorderRightBottomColor(GetBorderStyle()), GetBorderStyle(),
328 GetBorderDash());
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700329 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700330
331 sAppStream << sThis;
332 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700333}
334
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700335void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf& sAppStream) {
336 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
337 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
338 pChild->GetAppearanceStream(sAppStream);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700339 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700340 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700341}
342
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700343void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800344 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700345 if (IsValid() && IsVisible()) {
346 DrawThisAppearance(pDevice, pUser2Device);
347 DrawChildAppearance(pDevice, pUser2Device);
348 }
349}
350
351void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800352 CFX_Matrix* pUser2Device) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800353 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700354 if (!rectWnd.IsEmpty()) {
355 if (HasFlag(PWS_BACKGROUND)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800356 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700357 rectWnd, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth()));
358 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
359 GetBackgroundColor(), GetTransparency());
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700360 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700361
362 if (HasFlag(PWS_BORDER))
Lei Zhang7457e382016-01-06 23:00:34 -0800363 CPWL_Utils::DrawBorder(pDevice, pUser2Device, rectWnd,
364 (FX_FLOAT)GetBorderWidth(), GetBorderColor(),
365 GetBorderLeftTopColor(GetBorderStyle()),
366 GetBorderRightBottomColor(GetBorderStyle()),
367 GetBorderStyle(), GetTransparency());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700368 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700369}
370
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700371void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800372 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700373 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
374 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
Tom Sepez60d909e2015-12-10 15:34:55 -0800375 CFX_Matrix mt = pChild->GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700376 if (mt.IsIdentity()) {
377 pChild->DrawAppearance(pDevice, pUser2Device);
378 } else {
379 mt.Concat(*pUser2Device);
380 pChild->DrawAppearance(pDevice, &mt);
381 }
Lei Zhang60f507b2015-06-13 00:41:00 -0700382 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700383 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700384}
385
Tom Sepez281a9ea2016-02-26 14:24:28 -0800386void CPWL_Wnd::InvalidateRect(CFX_FloatRect* pRect) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700387 if (IsValid()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800388 CFX_FloatRect rcRefresh = pRect ? *pRect : GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700389
390 if (!HasFlag(PWS_NOREFRESHCLIP)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800391 CFX_FloatRect rcClip = GetClipRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392 if (!rcClip.IsEmpty()) {
393 rcRefresh.Intersect(rcClip);
394 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700395 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700396
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700397 FX_RECT rcWin = PWLtoWnd(rcRefresh);
398 rcWin.left -= PWL_INVALIDATE_INFLATE;
399 rcWin.top -= PWL_INVALIDATE_INFLATE;
400 rcWin.right += PWL_INVALIDATE_INFLATE;
401 rcWin.bottom += PWL_INVALIDATE_INFLATE;
402
403 if (IFX_SystemHandler* pSH = GetSystemHandler()) {
404 if (FX_HWND hWnd = GetAttachedHWnd()) {
405 pSH->InvalidateRect(hWnd, rcWin);
406 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700407 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700408 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700409}
410
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700411#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \
412 FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag) { \
413 if (IsValid() && IsVisible() && IsEnabled()) { \
414 if (IsWndCaptureKeyboard(this)) { \
415 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
416 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
417 if (IsWndCaptureKeyboard(pChild)) { \
418 return pChild->key_method_name(nChar, nFlag); \
419 } \
420 } \
421 } \
422 } \
423 } \
424 return FALSE; \
425 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700426
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name) \
Tom Sepez281a9ea2016-02-26 14:24:28 -0800428 FX_BOOL CPWL_Wnd::mouse_method_name(const CFX_FloatPoint& point, \
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700429 FX_DWORD nFlag) { \
430 if (IsValid() && IsVisible() && IsEnabled()) { \
431 if (IsWndCaptureMouse(this)) { \
432 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
433 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
434 if (IsWndCaptureMouse(pChild)) { \
435 return pChild->mouse_method_name(pChild->ParentToChild(point), \
436 nFlag); \
437 } \
438 } \
439 } \
440 SetCursor(); \
441 } else { \
442 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
443 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
444 if (pChild->WndHitTest(pChild->ParentToChild(point))) { \
445 return pChild->mouse_method_name(pChild->ParentToChild(point), \
446 nFlag); \
447 } \
448 } \
449 } \
450 if (WndHitTest(point)) \
451 SetCursor(); \
452 } \
453 } \
454 return FALSE; \
455 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700456
457PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
458PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)
459PWL_IMPLEMENT_KEY_METHOD(OnChar)
460
461PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
462PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
463PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)
464PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk)
465PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown)
466PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700467PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
468PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
469PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
470
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700471FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta,
Tom Sepez281a9ea2016-02-26 14:24:28 -0800472 const CFX_FloatPoint& point,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700473 FX_DWORD nFlag) {
474 if (IsValid() && IsVisible() && IsEnabled()) {
475 SetCursor();
476 if (IsWndCaptureKeyboard(this)) {
477 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
478 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
479 if (IsWndCaptureKeyboard(pChild)) {
480 return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point),
481 nFlag);
482 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700483 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700484 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700485 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700486 }
487 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700488}
489
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490void CPWL_Wnd::AddChild(CPWL_Wnd* pWnd) {
491 m_aChildren.Add(pWnd);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700492}
493
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700494void CPWL_Wnd::RemoveChild(CPWL_Wnd* pWnd) {
495 for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) {
496 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
497 if (pChild == pWnd) {
498 m_aChildren.RemoveAt(i);
499 break;
500 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700501 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700502 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700503}
504
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700505void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd,
506 FX_DWORD msg,
507 intptr_t wParam,
508 intptr_t lParam) {
509 switch (msg) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700510 case PNM_ADDCHILD:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700511 AddChild(pWnd);
512 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700513 case PNM_REMOVECHILD:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700514 RemoveChild(pWnd);
515 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700516 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517 break;
518 }
519}
520
521FX_BOOL CPWL_Wnd::IsValid() const {
522 return m_bCreated;
523}
524
Lei Zhang7457e382016-01-06 23:00:34 -0800525const PWL_CREATEPARAM& CPWL_Wnd::GetCreationParam() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700526 return m_sPrivateParam;
527}
528
529CPWL_Wnd* CPWL_Wnd::GetParentWindow() const {
530 return m_sPrivateParam.pParentWnd;
531}
532
Tom Sepez281a9ea2016-02-26 14:24:28 -0800533CFX_FloatRect CPWL_Wnd::GetWindowRect() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700534 return m_rcWindow;
535}
536
Tom Sepez281a9ea2016-02-26 14:24:28 -0800537CFX_FloatRect CPWL_Wnd::GetClientRect() const {
538 CFX_FloatRect rcWindow = GetWindowRect();
539 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700540 rcWindow, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth()));
541 if (CPWL_ScrollBar* pVSB = GetVScrollBar())
542 rcClient.right -= pVSB->GetScrollBarWidth();
543
544 rcClient.Normalize();
Tom Sepez281a9ea2016-02-26 14:24:28 -0800545 return rcWindow.Contains(rcClient) ? rcClient : CFX_FloatRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700546}
547
Tom Sepez281a9ea2016-02-26 14:24:28 -0800548CFX_FloatPoint CPWL_Wnd::GetCenterPoint() const {
549 CFX_FloatRect rcClient = GetClientRect();
550 return CFX_FloatPoint((rcClient.left + rcClient.right) * 0.5f,
551 (rcClient.top + rcClient.bottom) * 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700552}
553
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700554FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const {
555 return (m_sPrivateParam.dwFlags & dwFlags) != 0;
556}
557
558void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags) {
559 m_sPrivateParam.dwFlags &= ~dwFlags;
560}
561
562void CPWL_Wnd::AddFlag(FX_DWORD dwFlags) {
563 m_sPrivateParam.dwFlags |= dwFlags;
564}
565
566CPWL_Color CPWL_Wnd::GetBackgroundColor() const {
567 return m_sPrivateParam.sBackgroundColor;
568}
569
570void CPWL_Wnd::SetBackgroundColor(const CPWL_Color& color) {
571 m_sPrivateParam.sBackgroundColor = color;
572}
573
574void CPWL_Wnd::SetTextColor(const CPWL_Color& color) {
575 m_sPrivateParam.sTextColor = color;
576}
577
578void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color& color) {
579 m_sPrivateParam.sTextStrokeColor = color;
580}
581
582CPWL_Color CPWL_Wnd::GetTextColor() const {
583 return m_sPrivateParam.sTextColor;
584}
585
586CPWL_Color CPWL_Wnd::GetTextStrokeColor() const {
587 return m_sPrivateParam.sTextStrokeColor;
588}
589
590int32_t CPWL_Wnd::GetBorderStyle() const {
591 return m_sPrivateParam.nBorderStyle;
592}
593
594void CPWL_Wnd::SetBorderStyle(int32_t nBorderStyle) {
595 if (HasFlag(PWS_BORDER))
596 m_sPrivateParam.nBorderStyle = nBorderStyle;
597}
598
599int32_t CPWL_Wnd::GetBorderWidth() const {
600 if (HasFlag(PWS_BORDER))
601 return m_sPrivateParam.dwBorderWidth;
602
603 return 0;
604}
605
606int32_t CPWL_Wnd::GetInnerBorderWidth() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700607 return 0;
608}
609
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700610CPWL_Color CPWL_Wnd::GetBorderColor() const {
611 if (HasFlag(PWS_BORDER))
612 return m_sPrivateParam.sBorderColor;
613
614 return CPWL_Color();
615}
616
Lei Zhang7457e382016-01-06 23:00:34 -0800617const CPWL_Dash& CPWL_Wnd::GetBorderDash() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700618 return m_sPrivateParam.sDash;
619}
620
621void* CPWL_Wnd::GetAttachedData() const {
622 return m_sPrivateParam.pAttachedData;
623}
624
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700625CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const {
626 if (HasFlag(PWS_VSCROLL))
627 return m_pVScrollBar;
628
629 return NULL;
630}
631
632void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM& cp) {
633 CreateVScrollBar(cp);
634}
635
636void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM& cp) {
637 if (!m_pVScrollBar && HasFlag(PWS_VSCROLL)) {
638 PWL_CREATEPARAM scp = cp;
639
640 // flags
641 scp.dwFlags =
642 PWS_CHILD | PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
643
644 scp.pParentWnd = this;
645 scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
646 scp.eCursorType = FXCT_ARROW;
647 scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
648
Lei Zhange00660b2015-08-13 15:40:18 -0700649 m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL);
650 m_pVScrollBar->Create(scp);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700651 }
652}
653
654void CPWL_Wnd::SetCapture() {
655 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
656 pMsgCtrl->SetCapture(this);
657}
658
659void CPWL_Wnd::ReleaseCapture() {
660 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++)
661 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
662 pChild->ReleaseCapture();
663
664 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
665 pMsgCtrl->ReleaseCapture();
666}
667
668void CPWL_Wnd::SetFocus() {
669 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
670 if (!pMsgCtrl->IsMainCaptureKeyboard(this))
671 pMsgCtrl->KillFocus();
672 pMsgCtrl->SetFocus(this);
673 }
674}
675
676void CPWL_Wnd::KillFocus() {
677 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
678 if (pMsgCtrl->IsWndCaptureKeyboard(this))
679 pMsgCtrl->KillFocus();
680 }
681}
682
683void CPWL_Wnd::OnSetFocus() {}
684
685void CPWL_Wnd::OnKillFocus() {}
686
Tom Sepez281a9ea2016-02-26 14:24:28 -0800687FX_BOOL CPWL_Wnd::WndHitTest(const CFX_FloatPoint& point) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700688 return IsValid() && IsVisible() && GetWindowRect().Contains(point.x, point.y);
689}
690
Tom Sepez281a9ea2016-02-26 14:24:28 -0800691FX_BOOL CPWL_Wnd::ClientHitTest(const CFX_FloatPoint& point) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700692 return IsValid() && IsVisible() && GetClientRect().Contains(point.x, point.y);
693}
694
695const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const {
696 if (m_sPrivateParam.pParentWnd)
697 return m_sPrivateParam.pParentWnd->GetRootWnd();
698
699 return this;
700}
701
702void CPWL_Wnd::SetVisible(FX_BOOL bVisible) {
703 if (IsValid()) {
704 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
705 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
706 pChild->SetVisible(bVisible);
707 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700708 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700709
710 if (bVisible != m_bVisible) {
711 m_bVisible = bVisible;
712 RePosChildWnd();
713 InvalidateRect();
714 }
715 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700716}
717
Tom Sepez281a9ea2016-02-26 14:24:28 -0800718void CPWL_Wnd::SetClipRect(const CFX_FloatRect& rect) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700719 m_rcClip = rect;
720 m_rcClip.Normalize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700721}
722
Tom Sepez281a9ea2016-02-26 14:24:28 -0800723const CFX_FloatRect& CPWL_Wnd::GetClipRect() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700724 return m_rcClip;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700725}
726
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700727FX_BOOL CPWL_Wnd::IsReadOnly() const {
728 return HasFlag(PWS_READONLY);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700729}
730
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700731void CPWL_Wnd::RePosChildWnd() {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800732 CFX_FloatRect rcContent = CPWL_Utils::DeflateRect(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700733 GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth()));
734
735 CPWL_ScrollBar* pVSB = GetVScrollBar();
736
Tom Sepez281a9ea2016-02-26 14:24:28 -0800737 CFX_FloatRect rcVScroll =
738 CFX_FloatRect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom,
739 rcContent.right - 1.0f, rcContent.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700740
741 if (pVSB)
742 pVSB->Move(rcVScroll, TRUE, FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700743}
744
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700745void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM& cp) {}
746
747void CPWL_Wnd::SetCursor() {
748 if (IsValid()) {
749 if (IFX_SystemHandler* pSH = GetSystemHandler()) {
750 int32_t nCursorType = GetCreationParam().eCursorType;
751 pSH->SetCursor(nCursorType);
752 }
753 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700754}
755
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700756void CPWL_Wnd::CreateMsgControl() {
757 if (!m_sPrivateParam.pMsgControl)
758 m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700759}
760
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700761void CPWL_Wnd::DestroyMsgControl() {
762 if (CPWL_MsgControl* pMsgControl = GetMsgControl())
763 if (pMsgControl->IsWndCreated(this))
764 delete pMsgControl;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700765}
766
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700767CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const {
768 return m_sPrivateParam.pMsgControl;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700769}
770
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700771FX_BOOL CPWL_Wnd::IsCaptureMouse() const {
772 return IsWndCaptureMouse(this);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700773}
774
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700775FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd* pWnd) const {
776 if (CPWL_MsgControl* pCtrl = GetMsgControl())
777 return pCtrl->IsWndCaptureMouse(pWnd);
778
779 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700780}
781
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700782FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const {
783 if (CPWL_MsgControl* pCtrl = GetMsgControl())
784 return pCtrl->IsWndCaptureKeyboard(pWnd);
785
786 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700787}
788
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700789FX_BOOL CPWL_Wnd::IsFocused() const {
790 if (CPWL_MsgControl* pCtrl = GetMsgControl())
791 return pCtrl->IsMainCaptureKeyboard(this);
792
793 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700794}
795
Tom Sepez281a9ea2016-02-26 14:24:28 -0800796CFX_FloatRect CPWL_Wnd::GetFocusRect() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700797 return CPWL_Utils::InflateRect(GetWindowRect(), 1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700798}
799
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700800FX_FLOAT CPWL_Wnd::GetFontSize() const {
801 return m_sPrivateParam.fFontSize;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700802}
803
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700804void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize) {
805 m_sPrivateParam.fFontSize = fFontSize;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700806}
807
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700808IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const {
809 return m_sPrivateParam.pSystemHandler;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700810}
811
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700812IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const {
813 return m_sPrivateParam.pFocusHandler;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700814}
815
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700816IPWL_Provider* CPWL_Wnd::GetProvider() const {
817 return m_sPrivateParam.pProvider;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700818}
819
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700820IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const {
821 return m_sPrivateParam.pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700822}
823
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700824CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(int32_t nBorderStyle) const {
825 CPWL_Color color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700826
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700827 switch (nBorderStyle) {
828 case PBS_SOLID:
829 break;
830 case PBS_DASH:
831 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700832 case PBS_BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700833 color = CPWL_Color(COLORTYPE_GRAY, 1);
834 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700835 case PBS_INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700836 color = CPWL_Color(COLORTYPE_GRAY, 0.5f);
837 break;
838 case PBS_UNDERLINED:
839 break;
840 }
841
842 return color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700843}
844
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700845CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(int32_t nBorderStyle) const {
846 CPWL_Color color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700847
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700848 switch (nBorderStyle) {
849 case PBS_SOLID:
850 break;
851 case PBS_DASH:
852 break;
853 case PBS_BEVELED:
854 color = CPWL_Utils::DevideColor(GetBackgroundColor(), 2);
855 break;
856 case PBS_INSET:
857 color = CPWL_Color(COLORTYPE_GRAY, 0.75f);
858 break;
859 case PBS_UNDERLINED:
860 break;
861 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700862
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700863 return color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700864}
865
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700866int32_t CPWL_Wnd::GetTransparency() {
867 return m_sPrivateParam.nTransparency;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700868}
869
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870void CPWL_Wnd::SetTransparency(int32_t nTransparency) {
871 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
872 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
873 pChild->SetTransparency(nTransparency);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700874 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700875 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700876
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700877 m_sPrivateParam.nTransparency = nTransparency;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700878}
879
Tom Sepez60d909e2015-12-10 15:34:55 -0800880CFX_Matrix CPWL_Wnd::GetWindowMatrix() const {
881 CFX_Matrix mt = GetChildToRoot();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700882
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700883 if (IPWL_Provider* pProvider = GetProvider()) {
884 mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700885 return mt;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700886 }
887
888 return mt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700889}
890
Tom Sepez281a9ea2016-02-26 14:24:28 -0800891void CPWL_Wnd::PWLtoWnd(const CFX_FloatPoint& point,
892 int32_t& x,
893 int32_t& y) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800894 CFX_Matrix mt = GetWindowMatrix();
Tom Sepez281a9ea2016-02-26 14:24:28 -0800895 CFX_FloatPoint pt = point;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700896 mt.Transform(pt.x, pt.y);
897 x = (int32_t)(pt.x + 0.5);
898 y = (int32_t)(pt.y + 0.5);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700899}
900
Tom Sepez281a9ea2016-02-26 14:24:28 -0800901FX_RECT CPWL_Wnd::PWLtoWnd(const CFX_FloatRect& rect) const {
902 CFX_FloatRect rcTemp = rect;
Tom Sepez60d909e2015-12-10 15:34:55 -0800903 CFX_Matrix mt = GetWindowMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700904 mt.TransformRect(rcTemp);
905 return FX_RECT((int32_t)(rcTemp.left + 0.5), (int32_t)(rcTemp.bottom + 0.5),
906 (int32_t)(rcTemp.right + 0.5), (int32_t)(rcTemp.top + 0.5));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700907}
908
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700909FX_HWND CPWL_Wnd::GetAttachedHWnd() const {
910 return m_sPrivateParam.hAttachedWnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700911}
912
Tom Sepez281a9ea2016-02-26 14:24:28 -0800913CFX_FloatPoint CPWL_Wnd::ChildToParent(const CFX_FloatPoint& point) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800914 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700915 if (mt.IsIdentity())
916 return point;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700917
Tom Sepez281a9ea2016-02-26 14:24:28 -0800918 CFX_FloatPoint pt = point;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700919 mt.Transform(pt.x, pt.y);
920 return pt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700921}
922
Tom Sepez281a9ea2016-02-26 14:24:28 -0800923CFX_FloatRect CPWL_Wnd::ChildToParent(const CFX_FloatRect& rect) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800924 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700925 if (mt.IsIdentity())
926 return rect;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700927
Tom Sepez281a9ea2016-02-26 14:24:28 -0800928 CFX_FloatRect rc = rect;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700929 mt.TransformRect(rc);
930 return rc;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700931}
932
Tom Sepez281a9ea2016-02-26 14:24:28 -0800933CFX_FloatPoint CPWL_Wnd::ParentToChild(const CFX_FloatPoint& point) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800934 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700935 if (mt.IsIdentity())
936 return point;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700937
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700938 mt.SetReverse(mt);
Tom Sepez281a9ea2016-02-26 14:24:28 -0800939 CFX_FloatPoint pt = point;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700940 mt.Transform(pt.x, pt.y);
941 return pt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700942}
943
Tom Sepez281a9ea2016-02-26 14:24:28 -0800944CFX_FloatRect CPWL_Wnd::ParentToChild(const CFX_FloatRect& rect) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800945 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700946 if (mt.IsIdentity())
947 return rect;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700948
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700949 mt.SetReverse(mt);
Tom Sepez281a9ea2016-02-26 14:24:28 -0800950 CFX_FloatRect rc = rect;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700951 mt.TransformRect(rc);
952 return rc;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700953}
954
Tom Sepez60d909e2015-12-10 15:34:55 -0800955CFX_Matrix CPWL_Wnd::GetChildToRoot() const {
956 CFX_Matrix mt(1, 0, 0, 1, 0, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700957 if (HasFlag(PWS_CHILD)) {
958 const CPWL_Wnd* pParent = this;
959 while (pParent) {
960 mt.Concat(pParent->GetChildMatrix());
961 pParent = pParent->GetParentWindow();
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700962 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700963 }
964 return mt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700965}
966
Tom Sepez60d909e2015-12-10 15:34:55 -0800967CFX_Matrix CPWL_Wnd::GetChildMatrix() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700968 if (HasFlag(PWS_CHILD))
969 return m_sPrivateParam.mtChild;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700970
Tom Sepez60d909e2015-12-10 15:34:55 -0800971 return CFX_Matrix(1, 0, 0, 1, 0, 0);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700972}
973
Tom Sepez60d909e2015-12-10 15:34:55 -0800974void CPWL_Wnd::SetChildMatrix(const CFX_Matrix& mt) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700975 m_sPrivateParam.mtChild = mt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700976}
977
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700978const CPWL_Wnd* CPWL_Wnd::GetFocused() const {
979 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
980 return pMsgCtrl->m_pMainKeyboardWnd;
981 }
982
983 return NULL;
984}
985
986void CPWL_Wnd::EnableWindow(FX_BOOL bEnable) {
987 if (m_bEnabled != bEnable) {
988 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
989 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
990 pChild->EnableWindow(bEnable);
991 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700992 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700993
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700994 m_bEnabled = bEnable;
995
996 if (bEnable)
997 OnEnabled();
998 else
999 OnDisabled();
1000 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001001}
1002
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001003FX_BOOL CPWL_Wnd::IsEnabled() {
1004 return m_bEnabled;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001005}
1006
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001007void CPWL_Wnd::OnEnabled() {}
1008
1009void CPWL_Wnd::OnDisabled() {}
1010
1011FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const {
1012 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1013 return pSystemHandler->IsCTRLKeyDown(nFlag);
1014 }
1015
1016 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001017}
1018
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001019FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const {
1020 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1021 return pSystemHandler->IsSHIFTKeyDown(nFlag);
1022 }
1023
1024 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001025}
1026
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001027FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const {
1028 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1029 return pSystemHandler->IsALTKeyDown(nFlag);
1030 }
1031
1032 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001033}
1034
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001035FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const {
1036 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1037 return pSystemHandler->IsINSERTKeyDown(nFlag);
1038 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001039
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001040 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001041}