blob: 5bedad127a3375cace5fc837d79eba96dd9d777d [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
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700276void CPWL_Wnd::Move(const CPDF_Rect& rcNew, FX_BOOL bReset, FX_BOOL bRefresh) {
277 if (IsValid()) {
278 CPDF_Rect rcOld = GetWindowRect();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700279
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700280 m_rcWindow = rcNew;
281 m_rcWindow.Normalize();
282
283 if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
284 rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom) {
285 if (bReset) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700286 RePosChildWnd();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700287 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700288 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700289 if (bRefresh) {
290 InvalidateRectMove(rcOld, rcNew);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700291 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700292
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700293 m_sPrivateParam.rcRectWnd = m_rcWindow;
294 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700295}
296
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700297void CPWL_Wnd::InvalidateRectMove(const CPDF_Rect& rcOld,
298 const CPDF_Rect& rcNew) {
299 CPDF_Rect rcUnion = rcOld;
300 rcUnion.Union(rcNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700301
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700302 InvalidateRect(&rcUnion);
303}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700304
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700305void CPWL_Wnd::GetAppearanceStream(CFX_ByteString& sAppStream) {
306 if (IsValid()) {
307 CFX_ByteTextBuf sTextBuf;
308 GetAppearanceStream(sTextBuf);
309 sAppStream += sTextBuf.GetByteString();
310 }
311}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700312
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700313void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf& sAppStream) {
314 if (IsValid() && IsVisible()) {
315 GetThisAppearanceStream(sAppStream);
316 GetChildAppearanceStream(sAppStream);
317 }
318}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700319
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700320// if don't set,Get default apperance stream
321void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
322 CPDF_Rect rectWnd = GetWindowRect();
323 if (!rectWnd.IsEmpty()) {
324 CFX_ByteTextBuf sThis;
325
326 if (HasFlag(PWS_BACKGROUND))
327 sThis << CPWL_Utils::GetRectFillAppStream(rectWnd, GetBackgroundColor());
328
329 if (HasFlag(PWS_BORDER)) {
330 sThis << CPWL_Utils::GetBorderAppStream(
331 rectWnd, (FX_FLOAT)GetBorderWidth(), GetBorderColor(),
332 GetBorderLeftTopColor(GetBorderStyle()),
333 GetBorderRightBottomColor(GetBorderStyle()), GetBorderStyle(),
334 GetBorderDash());
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700335 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336
337 sAppStream << sThis;
338 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700339}
340
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700341void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf& sAppStream) {
342 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
343 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
344 pChild->GetAppearanceStream(sAppStream);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700345 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700346 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700347}
348
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700349void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800350 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700351 if (IsValid() && IsVisible()) {
352 DrawThisAppearance(pDevice, pUser2Device);
353 DrawChildAppearance(pDevice, pUser2Device);
354 }
355}
356
357void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800358 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700359 CPDF_Rect rectWnd = GetWindowRect();
360 if (!rectWnd.IsEmpty()) {
361 if (HasFlag(PWS_BACKGROUND)) {
362 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(
363 rectWnd, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth()));
364 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
365 GetBackgroundColor(), GetTransparency());
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700366 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700367
368 if (HasFlag(PWS_BORDER))
369 CPWL_Utils::DrawBorder(
370 pDevice, pUser2Device, rectWnd, (FX_FLOAT)GetBorderWidth(),
371 GetBorderColor(), GetBorderLeftTopColor(GetBorderStyle()),
372 GetBorderRightBottomColor(GetBorderStyle()), GetBorderStyle(),
373 GetBorderDash(), GetTransparency());
374 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700375}
376
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700377void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800378 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700379 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
380 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
Tom Sepez60d909e2015-12-10 15:34:55 -0800381 CFX_Matrix mt = pChild->GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700382 if (mt.IsIdentity()) {
383 pChild->DrawAppearance(pDevice, pUser2Device);
384 } else {
385 mt.Concat(*pUser2Device);
386 pChild->DrawAppearance(pDevice, &mt);
387 }
Lei Zhang60f507b2015-06-13 00:41:00 -0700388 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700389 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700390}
391
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect) {
393 if (IsValid()) {
394 CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
395
396 if (!HasFlag(PWS_NOREFRESHCLIP)) {
397 CPDF_Rect rcClip = GetClipRect();
398 if (!rcClip.IsEmpty()) {
399 rcRefresh.Intersect(rcClip);
400 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700401 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700402
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700403 FX_RECT rcWin = PWLtoWnd(rcRefresh);
404 rcWin.left -= PWL_INVALIDATE_INFLATE;
405 rcWin.top -= PWL_INVALIDATE_INFLATE;
406 rcWin.right += PWL_INVALIDATE_INFLATE;
407 rcWin.bottom += PWL_INVALIDATE_INFLATE;
408
409 if (IFX_SystemHandler* pSH = GetSystemHandler()) {
410 if (FX_HWND hWnd = GetAttachedHWnd()) {
411 pSH->InvalidateRect(hWnd, rcWin);
412 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700413 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700414 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700415}
416
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700417#define PWL_IMPLEMENT_KEY_METHOD(key_method_name) \
418 FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag) { \
419 if (IsValid() && IsVisible() && IsEnabled()) { \
420 if (IsWndCaptureKeyboard(this)) { \
421 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
422 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
423 if (IsWndCaptureKeyboard(pChild)) { \
424 return pChild->key_method_name(nChar, nFlag); \
425 } \
426 } \
427 } \
428 } \
429 } \
430 return FALSE; \
431 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700432
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700433#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name) \
434 FX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point& point, \
435 FX_DWORD nFlag) { \
436 if (IsValid() && IsVisible() && IsEnabled()) { \
437 if (IsWndCaptureMouse(this)) { \
438 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
439 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
440 if (IsWndCaptureMouse(pChild)) { \
441 return pChild->mouse_method_name(pChild->ParentToChild(point), \
442 nFlag); \
443 } \
444 } \
445 } \
446 SetCursor(); \
447 } else { \
448 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { \
449 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { \
450 if (pChild->WndHitTest(pChild->ParentToChild(point))) { \
451 return pChild->mouse_method_name(pChild->ParentToChild(point), \
452 nFlag); \
453 } \
454 } \
455 } \
456 if (WndHitTest(point)) \
457 SetCursor(); \
458 } \
459 } \
460 return FALSE; \
461 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700462
463PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
464PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)
465PWL_IMPLEMENT_KEY_METHOD(OnChar)
466
467PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
468PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
469PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)
470PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk)
471PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown)
472PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700473PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
474PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
475PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
476
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700477FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta,
478 const CPDF_Point& point,
479 FX_DWORD nFlag) {
480 if (IsValid() && IsVisible() && IsEnabled()) {
481 SetCursor();
482 if (IsWndCaptureKeyboard(this)) {
483 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
484 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
485 if (IsWndCaptureKeyboard(pChild)) {
486 return pChild->OnMouseWheel(zDelta, pChild->ParentToChild(point),
487 nFlag);
488 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700489 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700491 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700492 }
493 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700494}
495
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700496void CPWL_Wnd::AddChild(CPWL_Wnd* pWnd) {
497 m_aChildren.Add(pWnd);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700498}
499
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700500void CPWL_Wnd::RemoveChild(CPWL_Wnd* pWnd) {
501 for (int32_t i = m_aChildren.GetSize() - 1; i >= 0; i--) {
502 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
503 if (pChild == pWnd) {
504 m_aChildren.RemoveAt(i);
505 break;
506 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700507 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700508 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700509}
510
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700511void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd,
512 FX_DWORD msg,
513 intptr_t wParam,
514 intptr_t lParam) {
515 switch (msg) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700516 case PNM_ADDCHILD:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517 AddChild(pWnd);
518 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700519 case PNM_REMOVECHILD:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700520 RemoveChild(pWnd);
521 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700522 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700523 break;
524 }
525}
526
527FX_BOOL CPWL_Wnd::IsValid() const {
528 return m_bCreated;
529}
530
531PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const {
532 return m_sPrivateParam;
533}
534
535CPWL_Wnd* CPWL_Wnd::GetParentWindow() const {
536 return m_sPrivateParam.pParentWnd;
537}
538
539CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const {
540 return m_sPrivateParam.rcRectWnd;
541}
542
543CPDF_Rect CPWL_Wnd::GetWindowRect() const {
544 return m_rcWindow;
545}
546
547CPDF_Rect CPWL_Wnd::GetClientRect() const {
548 CPDF_Rect rcWindow = GetWindowRect();
549 CPDF_Rect rcClient = CPWL_Utils::DeflateRect(
550 rcWindow, (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth()));
551 if (CPWL_ScrollBar* pVSB = GetVScrollBar())
552 rcClient.right -= pVSB->GetScrollBarWidth();
553
554 rcClient.Normalize();
555 return rcWindow.Contains(rcClient) ? rcClient : CPDF_Rect();
556}
557
558CPDF_Point CPWL_Wnd::GetCenterPoint() const {
559 CPDF_Rect rcClient = GetClientRect();
560 return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
561 (rcClient.top + rcClient.bottom) * 0.5f);
562}
563
564CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const {
565 return CPWL_Utils::GetCenterSquare(GetClientRect());
566}
567
568CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const {
569 return CPWL_Utils::GetCenterSquare(
570 CPWL_Utils::DeflateRect(GetWindowRect(), 0.1f));
571}
572
573FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const {
574 return (m_sPrivateParam.dwFlags & dwFlags) != 0;
575}
576
577void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags) {
578 m_sPrivateParam.dwFlags &= ~dwFlags;
579}
580
581void CPWL_Wnd::AddFlag(FX_DWORD dwFlags) {
582 m_sPrivateParam.dwFlags |= dwFlags;
583}
584
585CPWL_Color CPWL_Wnd::GetBackgroundColor() const {
586 return m_sPrivateParam.sBackgroundColor;
587}
588
589void CPWL_Wnd::SetBackgroundColor(const CPWL_Color& color) {
590 m_sPrivateParam.sBackgroundColor = color;
591}
592
593void CPWL_Wnd::SetTextColor(const CPWL_Color& color) {
594 m_sPrivateParam.sTextColor = color;
595}
596
597void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color& color) {
598 m_sPrivateParam.sTextStrokeColor = color;
599}
600
601CPWL_Color CPWL_Wnd::GetTextColor() const {
602 return m_sPrivateParam.sTextColor;
603}
604
605CPWL_Color CPWL_Wnd::GetTextStrokeColor() const {
606 return m_sPrivateParam.sTextStrokeColor;
607}
608
609int32_t CPWL_Wnd::GetBorderStyle() const {
610 return m_sPrivateParam.nBorderStyle;
611}
612
613void CPWL_Wnd::SetBorderStyle(int32_t nBorderStyle) {
614 if (HasFlag(PWS_BORDER))
615 m_sPrivateParam.nBorderStyle = nBorderStyle;
616}
617
618int32_t CPWL_Wnd::GetBorderWidth() const {
619 if (HasFlag(PWS_BORDER))
620 return m_sPrivateParam.dwBorderWidth;
621
622 return 0;
623}
624
625int32_t CPWL_Wnd::GetInnerBorderWidth() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 return 0;
627}
628
629void CPWL_Wnd::SetBorderWidth(int32_t nBorderWidth) {
630 if (HasFlag(PWS_BORDER))
631 m_sPrivateParam.dwBorderWidth = nBorderWidth;
632}
633
634CPWL_Color CPWL_Wnd::GetBorderColor() const {
635 if (HasFlag(PWS_BORDER))
636 return m_sPrivateParam.sBorderColor;
637
638 return CPWL_Color();
639}
640
641void CPWL_Wnd::SetBorderColor(const CPWL_Color& color) {
642 if (HasFlag(PWS_BORDER))
643 m_sPrivateParam.sBorderColor = color;
644}
645
646CPWL_Dash CPWL_Wnd::GetBorderDash() const {
647 return m_sPrivateParam.sDash;
648}
649
650void* CPWL_Wnd::GetAttachedData() const {
651 return m_sPrivateParam.pAttachedData;
652}
653
654void CPWL_Wnd::SetBorderDash(const CPWL_Dash& sDash) {
655 if (HasFlag(PWS_BORDER))
656 m_sPrivateParam.sDash = sDash;
657}
658
659CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const {
660 if (HasFlag(PWS_VSCROLL))
661 return m_pVScrollBar;
662
663 return NULL;
664}
665
666void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM& cp) {
667 CreateVScrollBar(cp);
668}
669
670void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM& cp) {
671 if (!m_pVScrollBar && HasFlag(PWS_VSCROLL)) {
672 PWL_CREATEPARAM scp = cp;
673
674 // flags
675 scp.dwFlags =
676 PWS_CHILD | PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
677
678 scp.pParentWnd = this;
679 scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
680 scp.eCursorType = FXCT_ARROW;
681 scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
682
Lei Zhange00660b2015-08-13 15:40:18 -0700683 m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL);
684 m_pVScrollBar->Create(scp);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700685 }
686}
687
688void CPWL_Wnd::SetCapture() {
689 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
690 pMsgCtrl->SetCapture(this);
691}
692
693void CPWL_Wnd::ReleaseCapture() {
694 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++)
695 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
696 pChild->ReleaseCapture();
697
698 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl())
699 pMsgCtrl->ReleaseCapture();
700}
701
702void CPWL_Wnd::SetFocus() {
703 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
704 if (!pMsgCtrl->IsMainCaptureKeyboard(this))
705 pMsgCtrl->KillFocus();
706 pMsgCtrl->SetFocus(this);
707 }
708}
709
710void CPWL_Wnd::KillFocus() {
711 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
712 if (pMsgCtrl->IsWndCaptureKeyboard(this))
713 pMsgCtrl->KillFocus();
714 }
715}
716
717void CPWL_Wnd::OnSetFocus() {}
718
719void CPWL_Wnd::OnKillFocus() {}
720
721FX_BOOL CPWL_Wnd::WndHitTest(const CPDF_Point& point) const {
722 return IsValid() && IsVisible() && GetWindowRect().Contains(point.x, point.y);
723}
724
725FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point& point) const {
726 return IsValid() && IsVisible() && GetClientRect().Contains(point.x, point.y);
727}
728
729const CPWL_Wnd* CPWL_Wnd::GetRootWnd() const {
730 if (m_sPrivateParam.pParentWnd)
731 return m_sPrivateParam.pParentWnd->GetRootWnd();
732
733 return this;
734}
735
736void CPWL_Wnd::SetVisible(FX_BOOL bVisible) {
737 if (IsValid()) {
738 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
739 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
740 pChild->SetVisible(bVisible);
741 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700742 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700743
744 if (bVisible != m_bVisible) {
745 m_bVisible = bVisible;
746 RePosChildWnd();
747 InvalidateRect();
748 }
749 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700750}
751
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700752void CPWL_Wnd::SetClipRect(const CPDF_Rect& rect) {
753 m_rcClip = rect;
754 m_rcClip.Normalize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700755}
756
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700757CPDF_Rect CPWL_Wnd::GetClipRect() const {
758 return m_rcClip;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700759}
760
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700761FX_BOOL CPWL_Wnd::IsReadOnly() const {
762 return HasFlag(PWS_READONLY);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700763}
764
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700765void CPWL_Wnd::RePosChildWnd() {
766 CPDF_Rect rcContent = CPWL_Utils::DeflateRect(
767 GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth()));
768
769 CPWL_ScrollBar* pVSB = GetVScrollBar();
770
771 CPDF_Rect rcVScroll =
772 CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH, rcContent.bottom,
773 rcContent.right - 1.0f, rcContent.top);
774
775 if (pVSB)
776 pVSB->Move(rcVScroll, TRUE, FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700777}
778
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700779void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM& cp) {}
780
781void CPWL_Wnd::SetCursor() {
782 if (IsValid()) {
783 if (IFX_SystemHandler* pSH = GetSystemHandler()) {
784 int32_t nCursorType = GetCreationParam().eCursorType;
785 pSH->SetCursor(nCursorType);
786 }
787 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700788}
789
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700790void CPWL_Wnd::CreateMsgControl() {
791 if (!m_sPrivateParam.pMsgControl)
792 m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700793}
794
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700795void CPWL_Wnd::DestroyMsgControl() {
796 if (CPWL_MsgControl* pMsgControl = GetMsgControl())
797 if (pMsgControl->IsWndCreated(this))
798 delete pMsgControl;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700799}
800
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700801CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const {
802 return m_sPrivateParam.pMsgControl;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700803}
804
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700805FX_BOOL CPWL_Wnd::IsCaptureMouse() const {
806 return IsWndCaptureMouse(this);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700807}
808
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700809FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd* pWnd) const {
810 if (CPWL_MsgControl* pCtrl = GetMsgControl())
811 return pCtrl->IsWndCaptureMouse(pWnd);
812
813 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700814}
815
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700816FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd* pWnd) const {
817 if (CPWL_MsgControl* pCtrl = GetMsgControl())
818 return pCtrl->IsWndCaptureKeyboard(pWnd);
819
820 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700821}
822
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700823FX_BOOL CPWL_Wnd::IsFocused() const {
824 if (CPWL_MsgControl* pCtrl = GetMsgControl())
825 return pCtrl->IsMainCaptureKeyboard(this);
826
827 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700828}
829
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700830CPDF_Rect CPWL_Wnd::GetFocusRect() const {
831 return CPWL_Utils::InflateRect(GetWindowRect(), 1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700832}
833
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700834FX_FLOAT CPWL_Wnd::GetFontSize() const {
835 return m_sPrivateParam.fFontSize;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700836}
837
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700838void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize) {
839 m_sPrivateParam.fFontSize = fFontSize;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700840}
841
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700842IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const {
843 return m_sPrivateParam.pSystemHandler;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700844}
845
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700846IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const {
847 return m_sPrivateParam.pFocusHandler;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700848}
849
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700850IPWL_Provider* CPWL_Wnd::GetProvider() const {
851 return m_sPrivateParam.pProvider;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700852}
853
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700854IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const {
855 return m_sPrivateParam.pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700856}
857
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700858CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(int32_t nBorderStyle) const {
859 CPWL_Color color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700860
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700861 switch (nBorderStyle) {
862 case PBS_SOLID:
863 break;
864 case PBS_DASH:
865 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700866 case PBS_BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700867 color = CPWL_Color(COLORTYPE_GRAY, 1);
868 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700869 case PBS_INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870 color = CPWL_Color(COLORTYPE_GRAY, 0.5f);
871 break;
872 case PBS_UNDERLINED:
873 break;
874 }
875
876 return color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700877}
878
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700879CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(int32_t nBorderStyle) const {
880 CPWL_Color color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700881
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700882 switch (nBorderStyle) {
883 case PBS_SOLID:
884 break;
885 case PBS_DASH:
886 break;
887 case PBS_BEVELED:
888 color = CPWL_Utils::DevideColor(GetBackgroundColor(), 2);
889 break;
890 case PBS_INSET:
891 color = CPWL_Color(COLORTYPE_GRAY, 0.75f);
892 break;
893 case PBS_UNDERLINED:
894 break;
895 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700896
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700897 return color;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700898}
899
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700900int32_t CPWL_Wnd::GetTransparency() {
901 return m_sPrivateParam.nTransparency;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700902}
903
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700904void CPWL_Wnd::SetTransparency(int32_t nTransparency) {
905 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
906 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
907 pChild->SetTransparency(nTransparency);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700908 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700909 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700910
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700911 m_sPrivateParam.nTransparency = nTransparency;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700912}
913
Tom Sepez60d909e2015-12-10 15:34:55 -0800914CFX_Matrix CPWL_Wnd::GetWindowMatrix() const {
915 CFX_Matrix mt = GetChildToRoot();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700916
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700917 if (IPWL_Provider* pProvider = GetProvider()) {
918 mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700919 return mt;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700920 }
921
922 return mt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700923}
924
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700925void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, int32_t& x, int32_t& y) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800926 CFX_Matrix mt = GetWindowMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700927 CPDF_Point pt = point;
928 mt.Transform(pt.x, pt.y);
929 x = (int32_t)(pt.x + 0.5);
930 y = (int32_t)(pt.y + 0.5);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700931}
932
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700933FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect& rect) const {
934 CPDF_Rect rcTemp = rect;
Tom Sepez60d909e2015-12-10 15:34:55 -0800935 CFX_Matrix mt = GetWindowMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700936 mt.TransformRect(rcTemp);
937 return FX_RECT((int32_t)(rcTemp.left + 0.5), (int32_t)(rcTemp.bottom + 0.5),
938 (int32_t)(rcTemp.right + 0.5), (int32_t)(rcTemp.top + 0.5));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700939}
940
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700941FX_HWND CPWL_Wnd::GetAttachedHWnd() const {
942 return m_sPrivateParam.hAttachedWnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700943}
944
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700945CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800946 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700947 if (mt.IsIdentity())
948 return point;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700949
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700950 CPDF_Point pt = point;
951 mt.Transform(pt.x, pt.y);
952 return pt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700953}
954
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700955CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800956 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700957 if (mt.IsIdentity())
958 return rect;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700959
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700960 CPDF_Rect rc = rect;
961 mt.TransformRect(rc);
962 return rc;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700963}
964
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700965CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800966 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700967 if (mt.IsIdentity())
968 return point;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700969
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700970 mt.SetReverse(mt);
971 CPDF_Point pt = point;
972 mt.Transform(pt.x, pt.y);
973 return pt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700974}
975
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700976CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const {
Tom Sepez60d909e2015-12-10 15:34:55 -0800977 CFX_Matrix mt = GetChildMatrix();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700978 if (mt.IsIdentity())
979 return rect;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700980
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700981 mt.SetReverse(mt);
982 CPDF_Rect rc = rect;
983 mt.TransformRect(rc);
984 return rc;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700985}
986
Tom Sepez60d909e2015-12-10 15:34:55 -0800987CFX_Matrix CPWL_Wnd::GetChildToRoot() const {
988 CFX_Matrix mt(1, 0, 0, 1, 0, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700989 if (HasFlag(PWS_CHILD)) {
990 const CPWL_Wnd* pParent = this;
991 while (pParent) {
992 mt.Concat(pParent->GetChildMatrix());
993 pParent = pParent->GetParentWindow();
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700994 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700995 }
996 return mt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700997}
998
Tom Sepez60d909e2015-12-10 15:34:55 -0800999CFX_Matrix CPWL_Wnd::GetChildMatrix() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001000 if (HasFlag(PWS_CHILD))
1001 return m_sPrivateParam.mtChild;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001002
Tom Sepez60d909e2015-12-10 15:34:55 -08001003 return CFX_Matrix(1, 0, 0, 1, 0, 0);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001004}
1005
Tom Sepez60d909e2015-12-10 15:34:55 -08001006void CPWL_Wnd::SetChildMatrix(const CFX_Matrix& mt) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001007 m_sPrivateParam.mtChild = mt;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001008}
1009
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001010const CPWL_Wnd* CPWL_Wnd::GetFocused() const {
1011 if (CPWL_MsgControl* pMsgCtrl = GetMsgControl()) {
1012 return pMsgCtrl->m_pMainKeyboardWnd;
1013 }
1014
1015 return NULL;
1016}
1017
1018void CPWL_Wnd::EnableWindow(FX_BOOL bEnable) {
1019 if (m_bEnabled != bEnable) {
1020 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
1021 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
1022 pChild->EnableWindow(bEnable);
1023 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001024 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001025
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001026 m_bEnabled = bEnable;
1027
1028 if (bEnable)
1029 OnEnabled();
1030 else
1031 OnDisabled();
1032 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001033}
1034
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001035FX_BOOL CPWL_Wnd::IsEnabled() {
1036 return m_bEnabled;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001037}
1038
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001039void CPWL_Wnd::OnEnabled() {}
1040
1041void CPWL_Wnd::OnDisabled() {}
1042
1043FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const {
1044 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1045 return pSystemHandler->IsCTRLKeyDown(nFlag);
1046 }
1047
1048 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001049}
1050
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001051FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const {
1052 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1053 return pSystemHandler->IsSHIFTKeyDown(nFlag);
1054 }
1055
1056 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001057}
1058
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001059FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const {
1060 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1061 return pSystemHandler->IsALTKeyDown(nFlag);
1062 }
1063
1064 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001065}
1066
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001067FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const {
1068 if (IFX_SystemHandler* pSystemHandler = GetSystemHandler()) {
1069 return pSystemHandler->IsINSERTKeyDown(nFlag);
1070 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001071
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001072 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001073}