Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: xfa/fwl/core/fwl_formimp.cpp

Issue 2432423002: Merge the CFWL_*Imp classes into the IFWL_* classes. (Closed)
Patch Set: Review feedback Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fwl/core/fwl_formimp.h ('k') | xfa/fwl/core/fwl_noteimp.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "xfa/fwl/core/fwl_formimp.h"
8
9 #include "xfa/fde/tto/fde_textout.h"
10 #include "xfa/fwl/basewidget/fwl_formproxyimp.h"
11 #include "xfa/fwl/core/cfwl_message.h"
12 #include "xfa/fwl/core/cfwl_themebackground.h"
13 #include "xfa/fwl/core/cfwl_themepart.h"
14 #include "xfa/fwl/core/cfwl_themetext.h"
15 #include "xfa/fwl/core/cfwl_widgetmgr.h"
16 #include "xfa/fwl/core/fwl_noteimp.h"
17 #include "xfa/fwl/core/fwl_widgetimp.h"
18 #include "xfa/fwl/core/ifwl_app.h"
19 #include "xfa/fwl/core/ifwl_themeprovider.h"
20 #include "xfa/fwl/theme/cfwl_widgettp.h"
21
22 namespace {
23
24 const int kSystemButtonSize = 21;
25 const int kSystemButtonMargin = 5;
26 const int kSystemButtonSpan = 2;
27
28 } // namespace
29
30 namespace {
31
32 const uint8_t kCornerEnlarge = 10;
33
34 } // namespace
35
36 // static
37 IFWL_Form* IFWL_Form::CreateFormProxy(CFWL_WidgetImpProperties& properties,
38 CFX_WideString* classname,
39 IFWL_Widget* pOuter) {
40 IFWL_Form* pForm = new IFWL_Form;
41 CFWL_FormProxyImp* pFormProxyImpl = new CFWL_FormProxyImp(properties, pOuter);
42 pForm->SetImpl(pFormProxyImpl);
43 pFormProxyImpl->SetInterface(pForm);
44 return pForm;
45 }
46 IFWL_Form::IFWL_Form() {}
47 FWL_FORMSIZE IFWL_Form::GetFormSize() {
48 return static_cast<CFWL_FormImp*>(GetImpl())->GetFormSize();
49 }
50 FWL_Error IFWL_Form::SetFormSize(FWL_FORMSIZE eFormSize) {
51 return static_cast<CFWL_FormImp*>(GetImpl())->SetFormSize(eFormSize);
52 }
53 IFWL_Widget* IFWL_Form::DoModal() {
54 return static_cast<CFWL_FormImp*>(GetImpl())->DoModal();
55 }
56 IFWL_Widget* IFWL_Form::DoModal(uint32_t& dwCommandID) {
57 return static_cast<CFWL_FormImp*>(GetImpl())->DoModal(dwCommandID);
58 }
59 FWL_Error IFWL_Form::EndDoModal() {
60 return static_cast<CFWL_FormImp*>(GetImpl())->EndDoModal();
61 }
62 FWL_Error IFWL_Form::SetBorderRegion(CFX_Path* pPath) {
63 return static_cast<CFWL_FormImp*>(GetImpl())->SetBorderRegion(pPath);
64 }
65
66 RestoreResizeInfo::RestoreResizeInfo() {}
67
68 RestoreResizeInfo::~RestoreResizeInfo() {}
69
70 CFWL_FormImp::CFWL_FormImp(const CFWL_WidgetImpProperties& properties,
71 IFWL_Widget* pOuter)
72 : CFWL_WidgetImp(properties, pOuter),
73 m_pCloseBox(nullptr),
74 m_pMinBox(nullptr),
75 m_pMaxBox(nullptr),
76 m_pCaptionBox(nullptr),
77 m_pSubFocus(nullptr),
78 m_fCXBorder(0),
79 m_fCYBorder(0),
80 m_iCaptureBtn(-1),
81 m_iSysBox(0),
82 m_eResizeType(FORM_RESIZETYPE_None),
83 m_bLButtonDown(FALSE),
84 m_bMaximized(false),
85 m_bSetMaximize(FALSE),
86 m_bCustomizeLayout(FALSE),
87 m_eFormSize(FWL_FORMSIZE_Manual),
88 m_bDoModalFlag(FALSE),
89 m_pBigIcon(nullptr),
90 m_pSmallIcon(nullptr),
91 m_bMouseIn(FALSE) {
92 m_rtRelative.Reset();
93 m_rtCaption.Reset();
94 m_rtRestore.Reset();
95 m_rtCaptionText.Reset();
96 m_rtIcon.Reset();
97 }
98
99 CFWL_FormImp::~CFWL_FormImp() {
100 RemoveSysButtons();
101 }
102
103 FWL_Error CFWL_FormImp::GetClassName(CFX_WideString& wsClass) const {
104 wsClass = FWL_CLASS_Form;
105 return FWL_Error::Succeeded;
106 }
107
108 FWL_Type CFWL_FormImp::GetClassID() const {
109 return FWL_Type::Form;
110 }
111
112 FX_BOOL CFWL_FormImp::IsInstance(const CFX_WideStringC& wsClass) const {
113 if (wsClass == CFX_WideStringC(FWL_CLASS_Form))
114 return TRUE;
115 return CFWL_WidgetImp::IsInstance(wsClass);
116 }
117
118 FWL_Error CFWL_FormImp::Initialize() {
119 if (CFWL_WidgetImp::Initialize() != FWL_Error::Succeeded)
120 return FWL_Error::Indefinite;
121 RegisterForm();
122 RegisterEventTarget();
123 m_pDelegate = new CFWL_FormImpDelegate(this);
124 return FWL_Error::Succeeded;
125 }
126 FWL_Error CFWL_FormImp::Finalize() {
127 delete m_pDelegate;
128 m_pDelegate = nullptr;
129 UnregisterEventTarget();
130 UnRegisterForm();
131 return CFWL_WidgetImp::Finalize();
132 }
133 FWL_Error CFWL_FormImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) {
134 if (bAutoSize) {
135 rect.Reset();
136 FX_FLOAT fCapHeight = GetCaptionHeight();
137 FX_FLOAT fCXBorder = GetBorderSize(TRUE);
138 FX_FLOAT fCYBorder = GetBorderSize(FALSE);
139 FX_FLOAT fEdge = GetEdgeWidth();
140 rect.height += fCapHeight + fCYBorder + fEdge + fEdge;
141 rect.width += fCXBorder + fCXBorder + fEdge + fEdge;
142 } else {
143 rect = m_pProperties->m_rtWidget;
144 }
145 return FWL_Error::Succeeded;
146 }
147 FWL_Error CFWL_FormImp::GetClientRect(CFX_RectF& rect) {
148 if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) == 0) {
149 rect = m_pProperties->m_rtWidget;
150 rect.Offset(-rect.left, -rect.top);
151 return FWL_Error::Succeeded;
152 }
153 #ifdef FWL_UseMacSystemBorder
154 rect = m_rtRelative;
155 CFWL_WidgetMgr* pWidgetMgr = CFWL_WidgetMgr::GetInstance();
156 if (!pWidgetMgr)
157 return FWL_Error::Indefinite;
158
159 rect.left = 0;
160 rect.top = 0;
161 return FWL_Error::Succeeded;
162 #else
163 FX_FLOAT x = 0;
164 FX_FLOAT y = 0;
165 FX_FLOAT t = 0;
166 IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
167 if (pTheme) {
168 CFWL_ThemePart part;
169 part.m_pWidget = m_pInterface;
170 x = *static_cast<FX_FLOAT*>(
171 pTheme->GetCapacity(&part, CFWL_WidgetCapacity::CXBorder));
172 y = *static_cast<FX_FLOAT*>(
173 pTheme->GetCapacity(&part, CFWL_WidgetCapacity::CYBorder));
174 t = *static_cast<FX_FLOAT*>(
175 pTheme->GetCapacity(&part, CFWL_WidgetCapacity::CYCaption));
176 }
177 rect = m_pProperties->m_rtWidget;
178 rect.Offset(-rect.left, -rect.top);
179 rect.Deflate(x, t, x, y);
180 return FWL_Error::Succeeded;
181 #endif
182 }
183 FWL_Error CFWL_FormImp::Update() {
184 if (m_iLock > 0) {
185 return FWL_Error::Succeeded;
186 }
187 if (!m_pProperties->m_pThemeProvider) {
188 m_pProperties->m_pThemeProvider = GetAvailableTheme();
189 }
190 #ifdef FWL_UseMacSystemBorder
191 #else
192 SetThemeData();
193 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
194 UpdateIcon();
195 }
196 #endif
197 UpdateCaption();
198 Layout();
199 return FWL_Error::Succeeded;
200 }
201 FWL_WidgetHit CFWL_FormImp::HitTest(FX_FLOAT fx, FX_FLOAT fy) {
202 GetAvailableTheme();
203 if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy))
204 return FWL_WidgetHit::CloseBox;
205 if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy))
206 return FWL_WidgetHit::MaxBox;
207 if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy))
208 return FWL_WidgetHit::MinBox;
209 CFX_RectF rtCap;
210 rtCap.Set(m_rtCaption.left + m_fCYBorder, m_rtCaption.top + m_fCXBorder,
211 m_rtCaption.width - kSystemButtonSize * m_iSysBox - 2 * m_fCYBorder,
212 m_rtCaption.height - m_fCXBorder);
213 if (rtCap.Contains(fx, fy))
214 return FWL_WidgetHit::Titlebar;
215 if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
216 (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize)) {
217 FX_FLOAT fWidth = m_rtRelative.width - 2 * (m_fCYBorder + kCornerEnlarge);
218 FX_FLOAT fHeight = m_rtRelative.height - 2 * (m_fCXBorder + kCornerEnlarge);
219 CFX_RectF rt;
220 rt.Set(0, m_fCXBorder + kCornerEnlarge, m_fCYBorder, fHeight);
221 if (rt.Contains(fx, fy))
222 return FWL_WidgetHit::Left;
223 rt.Set(m_rtRelative.width - m_fCYBorder, m_fCXBorder + kCornerEnlarge,
224 m_fCYBorder, fHeight);
225 if (rt.Contains(fx, fy))
226 return FWL_WidgetHit::Right;
227 rt.Set(m_fCYBorder + kCornerEnlarge, 0, fWidth, m_fCXBorder);
228 if (rt.Contains(fx, fy))
229 return FWL_WidgetHit::Top;
230 rt.Set(m_fCYBorder + kCornerEnlarge, m_rtRelative.height - m_fCXBorder,
231 fWidth, m_fCXBorder);
232 if (rt.Contains(fx, fy))
233 return FWL_WidgetHit::Bottom;
234 rt.Set(0, 0, m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
235 if (rt.Contains(fx, fy))
236 return FWL_WidgetHit::LeftTop;
237 rt.Set(0, m_rtRelative.height - m_fCXBorder - kCornerEnlarge,
238 m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
239 if (rt.Contains(fx, fy))
240 return FWL_WidgetHit::LeftBottom;
241 rt.Set(m_rtRelative.width - m_fCYBorder - kCornerEnlarge, 0,
242 m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
243 if (rt.Contains(fx, fy))
244 return FWL_WidgetHit::RightTop;
245 rt.Set(m_rtRelative.width - m_fCYBorder - kCornerEnlarge,
246 m_rtRelative.height - m_fCXBorder - kCornerEnlarge,
247 m_fCYBorder + kCornerEnlarge, m_fCXBorder + kCornerEnlarge);
248 if (rt.Contains(fx, fy))
249 return FWL_WidgetHit::RightBottom;
250 }
251 return FWL_WidgetHit::Client;
252 }
253 FWL_Error CFWL_FormImp::DrawWidget(CFX_Graphics* pGraphics,
254 const CFX_Matrix* pMatrix) {
255 if (!pGraphics)
256 return FWL_Error::Indefinite;
257 if (!m_pProperties->m_pThemeProvider)
258 return FWL_Error::Indefinite;
259 IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
260 FX_BOOL bInactive = !IsActive();
261 int32_t iState = bInactive ? CFWL_PartState_Inactive : CFWL_PartState_Normal;
262 if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_NoDrawClient) == 0) {
263 DrawBackground(pGraphics, pTheme);
264 }
265 #ifdef FWL_UseMacSystemBorder
266 return FWL_Error::Succeeded;
267 #endif
268 CFWL_ThemeBackground param;
269 param.m_pWidget = m_pInterface;
270 param.m_dwStates = iState;
271 param.m_pGraphics = pGraphics;
272 param.m_rtPart = m_rtRelative;
273 if (pMatrix) {
274 param.m_matrix.Concat(*pMatrix);
275 }
276 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
277 param.m_iPart = CFWL_Part::Border;
278 pTheme->DrawBackground(&param);
279 }
280 if ((m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_EdgeMask) !=
281 FWL_WGTSTYLE_EdgeNone) {
282 CFX_RectF rtEdge;
283 GetEdgeRect(rtEdge);
284 param.m_iPart = CFWL_Part::Edge;
285 param.m_rtPart = rtEdge;
286 param.m_dwStates = iState;
287 pTheme->DrawBackground(&param);
288 }
289 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
290 param.m_iPart = CFWL_Part::Caption;
291 param.m_dwStates = iState;
292 param.m_rtPart = m_rtCaption;
293 pTheme->DrawBackground(&param);
294 DrawCaptionText(pGraphics, pTheme, pMatrix);
295 } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
296 param.m_iPart = CFWL_Part::NarrowCaption;
297 param.m_dwStates = iState;
298 param.m_rtPart = m_rtCaption;
299 pTheme->DrawBackground(&param);
300 DrawCaptionText(pGraphics, pTheme, pMatrix);
301 }
302 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon) {
303 param.m_iPart = CFWL_Part::Icon;
304 if (HasIcon()) {
305 DrawIconImage(pGraphics, pTheme, pMatrix);
306 }
307 }
308 #if (_FX_OS_ == _FX_MACOSX_)
309 {
310 if (m_pCloseBox) {
311 param.m_iPart = CFWL_Part::CloseBox;
312 param.m_dwStates = m_pCloseBox->GetPartState();
313 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
314 param.m_dwStates = CFWL_PartState_Disabled;
315 } else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) {
316 param.m_dwStates = CFWL_PartState_Hovered;
317 }
318 param.m_rtPart = m_pCloseBox->m_rtBtn;
319 pTheme->DrawBackground(&param);
320 }
321 if (m_pMaxBox) {
322 param.m_iPart = CFWL_Part::MaximizeBox;
323 param.m_dwStates = m_pMaxBox->GetPartState();
324 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
325 param.m_dwStates = CFWL_PartState_Disabled;
326 } else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) {
327 param.m_dwStates = CFWL_PartState_Hovered;
328 }
329 param.m_rtPart = m_pMaxBox->m_rtBtn;
330 param.m_bMaximize = m_bMaximized;
331 pTheme->DrawBackground(&param);
332 }
333 if (m_pMinBox) {
334 param.m_iPart = CFWL_Part::MinimizeBox;
335 param.m_dwStates = m_pMinBox->GetPartState();
336 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) {
337 param.m_dwStates = CFWL_PartState_Disabled;
338 } else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) {
339 param.m_dwStates = CFWL_PartState_Hovered;
340 }
341 param.m_rtPart = m_pMinBox->m_rtBtn;
342 pTheme->DrawBackground(&param);
343 }
344 m_bMouseIn = FALSE;
345 }
346 #else
347 {
348 if (m_pCloseBox) {
349 param.m_iPart = CFWL_Part::CloseBox;
350 param.m_dwStates = m_pCloseBox->GetPartState();
351 param.m_rtPart = m_pCloseBox->m_rtBtn;
352 pTheme->DrawBackground(&param);
353 }
354 if (m_pMaxBox) {
355 param.m_iPart = CFWL_Part::MaximizeBox;
356 param.m_dwStates = m_pMaxBox->GetPartState();
357 param.m_rtPart = m_pMaxBox->m_rtBtn;
358 param.m_bMaximize = m_bMaximized;
359 pTheme->DrawBackground(&param);
360 }
361 if (m_pMinBox) {
362 param.m_iPart = CFWL_Part::MinimizeBox;
363 param.m_dwStates = m_pMinBox->GetPartState();
364 param.m_rtPart = m_pMinBox->m_rtBtn;
365 pTheme->DrawBackground(&param);
366 }
367 }
368 #endif
369 return FWL_Error::Succeeded;
370 }
371
372 FWL_FORMSIZE CFWL_FormImp::GetFormSize() {
373 return m_eFormSize;
374 }
375
376 FWL_Error CFWL_FormImp::SetFormSize(FWL_FORMSIZE eFormSize) {
377 m_eFormSize = eFormSize;
378 return FWL_Error::Succeeded;
379 }
380
381 IFWL_Widget* CFWL_FormImp::DoModal() {
382 IFWL_App* pApp = GetOwnerApp();
383 if (!pApp)
384 return nullptr;
385
386 CFWL_NoteDriver* pDriver = pApp->GetNoteDriver();
387 if (!pDriver)
388 return nullptr;
389
390 m_pNoteLoop.reset(new CFWL_NoteLoop(this));
391 pDriver->PushNoteLoop(m_pNoteLoop.get());
392 m_bDoModalFlag = TRUE;
393 SetStates(FWL_WGTSTATE_Invisible, FALSE);
394 pDriver->Run();
395 #if (_FX_OS_ == _FX_MACOSX_)
396 #else
397 pDriver->PopNoteLoop();
398 #endif
399 m_pNoteLoop.reset();
400 return nullptr;
401 }
402
403 IFWL_Widget* CFWL_FormImp::DoModal(uint32_t& dwCommandID) {
404 return DoModal();
405 }
406
407 FWL_Error CFWL_FormImp::EndDoModal() {
408 if (!m_pNoteLoop)
409 return FWL_Error::Indefinite;
410 m_bDoModalFlag = FALSE;
411 #if (_FX_OS_ == _FX_MACOSX_)
412 m_pNoteLoop->EndModalLoop();
413 IFWL_App* pApp = GetOwnerApp();
414 if (!pApp)
415 return FWL_Error::Indefinite;
416
417 CFWL_NoteDriver* pDriver =
418 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
419 if (!pDriver)
420 return FWL_Error::Indefinite;
421
422 pDriver->PopNoteLoop();
423 SetStates(FWL_WGTSTATE_Invisible, TRUE);
424 return FWL_Error::Succeeded;
425 #else
426 SetStates(FWL_WGTSTATE_Invisible, TRUE);
427 return m_pNoteLoop->EndModalLoop();
428 #endif
429 }
430
431 FWL_Error CFWL_FormImp::SetBorderRegion(CFX_Path* pPath) {
432 return FWL_Error::Succeeded;
433 }
434 void CFWL_FormImp::DrawBackground(CFX_Graphics* pGraphics,
435 IFWL_ThemeProvider* pTheme) {
436 CFWL_ThemeBackground param;
437 param.m_pWidget = m_pInterface;
438 param.m_iPart = CFWL_Part::Background;
439 param.m_pGraphics = pGraphics;
440 param.m_rtPart = m_rtRelative;
441 param.m_rtPart.Deflate(m_fCYBorder, m_rtCaption.height, m_fCYBorder,
442 m_fCXBorder);
443 pTheme->DrawBackground(&param);
444 }
445 CFWL_WidgetImp* CFWL_FormImp::GetSubFocus() {
446 return m_pSubFocus;
447 }
448 void CFWL_FormImp::SetSubFocus(CFWL_WidgetImp* pWidget) {
449 m_pSubFocus = pWidget;
450 }
451
452 void CFWL_FormImp::ShowChildWidget(IFWL_Widget* pParent) {
453 IFWL_App* pApp = FWL_GetApp();
454 if (!pApp)
455 return;
456
457 CFWL_WidgetMgr* pWidgetMgr = pApp->GetWidgetMgr();
458 if (!pWidgetMgr)
459 return;
460
461 IFWL_Widget* pChild = pWidgetMgr->GetFirstChildWidget(pParent);
462 while (pChild) {
463 ShowChildWidget(pChild);
464 pChild = pWidgetMgr->GetNextSiblingWidget(pChild);
465 }
466 }
467
468 void CFWL_FormImp::RemoveSysButtons() {
469 m_rtCaption.Reset();
470 delete m_pCloseBox;
471 m_pCloseBox = nullptr;
472 delete m_pMinBox;
473 m_pMinBox = nullptr;
474 delete m_pMaxBox;
475 m_pMaxBox = nullptr;
476 delete m_pCaptionBox;
477 m_pCaptionBox = nullptr;
478 }
479
480 void CFWL_FormImp::CalcContentRect(CFX_RectF& rtContent) {
481 #ifdef FWL_UseMacSystemBorder
482 rtContent = m_rtRelative;
483 #else
484 GetEdgeRect(rtContent);
485 if (HasEdge()) {
486 FX_FLOAT fEdge = GetEdgeWidth();
487 rtContent.Deflate(fEdge, fEdge);
488 }
489 #endif
490 }
491 CFWL_SysBtn* CFWL_FormImp::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
492 if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
493 return m_pCloseBox;
494 }
495 if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) {
496 return m_pMaxBox;
497 }
498 if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) {
499 return m_pMinBox;
500 }
501 if (m_pCaptionBox && m_pCaptionBox->m_rtBtn.Contains(fx, fy)) {
502 return m_pCaptionBox;
503 }
504 return nullptr;
505 }
506 CFWL_SysBtn* CFWL_FormImp::GetSysBtnByState(uint32_t dwState) {
507 if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState)) {
508 return m_pCloseBox;
509 }
510 if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState)) {
511 return m_pMaxBox;
512 }
513 if (m_pMinBox && (m_pMinBox->m_dwState & dwState)) {
514 return m_pMinBox;
515 }
516 if (m_pCaptionBox && (m_pCaptionBox->m_dwState & dwState)) {
517 return m_pCaptionBox;
518 }
519 return nullptr;
520 }
521 CFWL_SysBtn* CFWL_FormImp::GetSysBtnByIndex(int32_t nIndex) {
522 if (nIndex < 0)
523 return nullptr;
524
525 CFX_ArrayTemplate<CFWL_SysBtn*> arrBtn;
526 if (m_pMinBox)
527 arrBtn.Add(m_pMinBox);
528
529 if (m_pMaxBox)
530 arrBtn.Add(m_pMaxBox);
531
532 if (m_pCloseBox)
533 arrBtn.Add(m_pCloseBox);
534
535 return arrBtn[nIndex];
536 }
537 int32_t CFWL_FormImp::GetSysBtnIndex(CFWL_SysBtn* pBtn) {
538 CFX_ArrayTemplate<CFWL_SysBtn*> arrBtn;
539 if (m_pMinBox)
540 arrBtn.Add(m_pMinBox);
541
542 if (m_pMaxBox)
543 arrBtn.Add(m_pMaxBox);
544
545 if (m_pCloseBox)
546 arrBtn.Add(m_pCloseBox);
547
548 return arrBtn.Find(pBtn);
549 }
550 FX_FLOAT CFWL_FormImp::GetCaptionHeight() {
551 CFWL_WidgetCapacity dwCapacity = CFWL_WidgetCapacity::None;
552
553 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Caption) {
554 dwCapacity = CFWL_WidgetCapacity::CYCaption;
555 } else if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_NarrowCaption) {
556 dwCapacity = CFWL_WidgetCapacity::CYNarrowCaption;
557 }
558 if (dwCapacity != CFWL_WidgetCapacity::None) {
559 FX_FLOAT* pfCapHeight =
560 static_cast<FX_FLOAT*>(GetThemeCapacity(dwCapacity));
561 return pfCapHeight ? *pfCapHeight : 0;
562 }
563 return 0;
564 }
565 void CFWL_FormImp::DrawCaptionText(CFX_Graphics* pGs,
566 IFWL_ThemeProvider* pTheme,
567 const CFX_Matrix* pMatrix) {
568 CFX_WideString wsText;
569 IFWL_DataProvider* pData = m_pProperties->m_pDataProvider;
570 pData->GetCaption(m_pInterface, wsText);
571 if (wsText.IsEmpty()) {
572 return;
573 }
574 CFWL_ThemeText textParam;
575 textParam.m_pWidget = m_pInterface;
576 textParam.m_iPart = CFWL_Part::Caption;
577 textParam.m_dwStates = CFWL_PartState_Normal;
578 textParam.m_pGraphics = pGs;
579 if (pMatrix) {
580 textParam.m_matrix.Concat(*pMatrix);
581 }
582 CFX_RectF rtText;
583 if (m_bCustomizeLayout) {
584 rtText = m_rtCaptionText;
585 rtText.top -= 5;
586 } else {
587 rtText = m_rtCaption;
588 FX_FLOAT fpos;
589 fpos = HasIcon() ? 29.0f : 13.0f;
590 rtText.left += fpos;
591 }
592 textParam.m_rtPart = rtText;
593 textParam.m_wsText = wsText;
594 textParam.m_dwTTOStyles = FDE_TTOSTYLE_SingleLine | FDE_TTOSTYLE_Ellipsis;
595 textParam.m_iTTOAlign = m_bCustomizeLayout ? FDE_TTOALIGNMENT_Center
596 : FDE_TTOALIGNMENT_CenterLeft;
597 pTheme->DrawText(&textParam);
598 }
599 void CFWL_FormImp::DrawIconImage(CFX_Graphics* pGs,
600 IFWL_ThemeProvider* pTheme,
601 const CFX_Matrix* pMatrix) {
602 IFWL_FormDP* pData =
603 static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
604 CFWL_ThemeBackground param;
605 param.m_pWidget = m_pInterface;
606 param.m_iPart = CFWL_Part::Icon;
607 param.m_pGraphics = pGs;
608 param.m_pImage = pData->GetIcon(m_pInterface, FALSE);
609 param.m_rtPart = m_rtIcon;
610 if (pMatrix) {
611 param.m_matrix.Concat(*pMatrix);
612 }
613 pTheme->DrawBackground(&param);
614 }
615 void CFWL_FormImp::GetEdgeRect(CFX_RectF& rtEdge) {
616 rtEdge = m_rtRelative;
617 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) {
618 FX_FLOAT fCX = GetBorderSize();
619 FX_FLOAT fCY = GetBorderSize(FALSE);
620 rtEdge.Deflate(fCX, m_rtCaption.Height(), fCX, fCY);
621 }
622 }
623 void CFWL_FormImp::SetWorkAreaRect() {
624 m_rtRestore = m_pProperties->m_rtWidget;
625 CFWL_WidgetMgr* pWidgetMgr = CFWL_WidgetMgr::GetInstance();
626 if (!pWidgetMgr)
627 return;
628 m_bSetMaximize = TRUE;
629 Repaint(&m_rtRelative);
630 }
631 void CFWL_FormImp::SetCursor(FX_FLOAT fx, FX_FLOAT fy) {}
632 void CFWL_FormImp::Layout() {
633 GetRelativeRect(m_rtRelative);
634 #ifndef FWL_UseMacSystemBorder
635 ReSetSysBtn();
636 #endif
637 }
638 void CFWL_FormImp::ReSetSysBtn() {
639 m_fCXBorder =
640 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CXBorder));
641 m_fCYBorder =
642 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CYBorder));
643 RemoveSysButtons();
644 IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
645 m_bCustomizeLayout = pTheme->IsCustomizedLayout(m_pInterface);
646 FX_FLOAT fCapHeight = GetCaptionHeight();
647 if (fCapHeight > 0) {
648 m_rtCaption = m_rtRelative;
649 m_rtCaption.height = fCapHeight;
650 }
651 m_iSysBox = 0;
652 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_CloseBox) {
653 m_pCloseBox = new CFWL_SysBtn;
654 if (!m_bCustomizeLayout) {
655 m_pCloseBox->m_rtBtn.Set(
656 m_rtRelative.right() - kSystemButtonMargin - kSystemButtonSize,
657 kSystemButtonMargin, kSystemButtonSize, kSystemButtonSize);
658 }
659 m_iSysBox++;
660 }
661 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MaximizeBox) {
662 m_pMaxBox = new CFWL_SysBtn;
663 if (!m_bCustomizeLayout) {
664 if (m_pCloseBox) {
665 m_pMaxBox->m_rtBtn.Set(
666 m_pCloseBox->m_rtBtn.left - kSystemButtonSpan - kSystemButtonSize,
667 m_pCloseBox->m_rtBtn.top, kSystemButtonSize, kSystemButtonSize);
668 } else {
669 m_pMaxBox->m_rtBtn.Set(
670 m_rtRelative.right() - kSystemButtonMargin - kSystemButtonSize,
671 kSystemButtonMargin, kSystemButtonSize, kSystemButtonSize);
672 }
673 }
674 m_iSysBox++;
675 }
676 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MinimizeBox) {
677 m_pMinBox = new CFWL_SysBtn;
678 if (!m_bCustomizeLayout) {
679 if (m_pMaxBox) {
680 m_pMinBox->m_rtBtn.Set(
681 m_pMaxBox->m_rtBtn.left - kSystemButtonSpan - kSystemButtonSize,
682 m_pMaxBox->m_rtBtn.top, kSystemButtonSize, kSystemButtonSize);
683 } else if (m_pCloseBox) {
684 m_pMinBox->m_rtBtn.Set(
685 m_pCloseBox->m_rtBtn.left - kSystemButtonSpan - kSystemButtonSize,
686 m_pCloseBox->m_rtBtn.top, kSystemButtonSize, kSystemButtonSize);
687 } else {
688 m_pMinBox->m_rtBtn.Set(
689 m_rtRelative.right() - kSystemButtonMargin - kSystemButtonSize,
690 kSystemButtonMargin, kSystemButtonSize, kSystemButtonSize);
691 }
692 }
693 m_iSysBox++;
694 }
695 IFWL_FormDP* pData =
696 static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
697 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Icon &&
698 pData->GetIcon(m_pInterface, FALSE)) {
699 if (!m_bCustomizeLayout) {
700 m_rtIcon.Set(5, (m_rtCaption.height - m_fSmallIconSz) / 2, m_fSmallIconSz,
701 m_fSmallIconSz);
702 }
703 }
704 }
705 void CFWL_FormImp::RegisterForm() {
706 IFWL_App* pApp = GetOwnerApp();
707 if (!pApp)
708 return;
709
710 CFWL_NoteDriver* pDriver =
711 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
712 if (!pDriver)
713 return;
714
715 pDriver->RegisterForm(this);
716 }
717 void CFWL_FormImp::UnRegisterForm() {
718 IFWL_App* pApp = GetOwnerApp();
719 if (!pApp)
720 return;
721
722 CFWL_NoteDriver* pDriver =
723 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
724 if (!pDriver)
725 return;
726
727 pDriver->UnRegisterForm(this);
728 }
729 FX_BOOL CFWL_FormImp::IsDoModal() {
730 return m_bDoModalFlag;
731 }
732 void CFWL_FormImp::SetThemeData() {
733 m_fSmallIconSz =
734 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::SmallIcon));
735 m_fBigIconSz =
736 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::BigIcon));
737 }
738 FX_BOOL CFWL_FormImp::HasIcon() {
739 IFWL_FormDP* pData =
740 static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
741 return !!pData->GetIcon(m_pInterface, FALSE);
742 }
743 void CFWL_FormImp::UpdateIcon() {
744 CFWL_WidgetMgr* pWidgetMgr = CFWL_WidgetMgr::GetInstance();
745 if (!pWidgetMgr)
746 return;
747 IFWL_FormDP* pData =
748 static_cast<IFWL_FormDP*>(m_pProperties->m_pDataProvider);
749 CFX_DIBitmap* pBigIcon = pData->GetIcon(m_pInterface, TRUE);
750 CFX_DIBitmap* pSmallIcon = pData->GetIcon(m_pInterface, FALSE);
751 if (pBigIcon)
752 m_pBigIcon = pBigIcon;
753 if (pSmallIcon)
754 m_pSmallIcon = pSmallIcon;
755 }
756 void CFWL_FormImp::UpdateCaption() {
757 CFWL_WidgetMgr* pWidgetMgr = CFWL_WidgetMgr::GetInstance();
758 if (!pWidgetMgr)
759 return;
760 IFWL_DataProvider* pData = m_pProperties->m_pDataProvider;
761 if (!pData)
762 return;
763 CFX_WideString text;
764 pData->GetCaption(m_pInterface, text);
765 }
766 void CFWL_FormImp::DoWidthLimit(FX_FLOAT& fLeft,
767 FX_FLOAT& fWidth,
768 FX_FLOAT fCurX,
769 FX_FLOAT fSpace,
770 FX_FLOAT fLimitMin,
771 FX_FLOAT fLimitMax,
772 FX_BOOL bLeft) {
773 FX_FLOAT fx = fCurX;
774 FX_FLOAT fy = 0;
775 TransformTo(nullptr, fx, fy);
776 FX_FLOAT fTemp =
777 bLeft ? (fWidth - fx + fLeft + fSpace) : (fx - fLeft + fSpace);
778 if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
779 fWidth = fTemp;
780 fLeft += bLeft ? (fx - fLeft - fSpace) : 0;
781 } else {
782 if (fTemp < fLimitMin && fWidth > fLimitMin) {
783 fLeft += bLeft ? (fWidth - fLimitMin) : 0;
784 fWidth = fLimitMin;
785 } else if (fTemp > fLimitMax && fWidth < fLimitMax) {
786 fLeft -= bLeft ? (fLimitMax - fWidth) : 0;
787 fWidth = fLimitMax;
788 }
789 }
790 }
791 void CFWL_FormImp::DoHeightLimit(FX_FLOAT& fTop,
792 FX_FLOAT& fHeight,
793 FX_FLOAT fCurY,
794 FX_FLOAT fSpace,
795 FX_FLOAT fLimitMin,
796 FX_FLOAT fLimitMax,
797 FX_BOOL bTop) {
798 FX_FLOAT fx = 0;
799 FX_FLOAT fy = fCurY;
800 TransformTo(nullptr, fx, fy);
801 FX_FLOAT fTemp = bTop ? (fHeight - fy + fTop + fSpace) : (fy - fTop + fSpace);
802 if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
803 fHeight = fTemp;
804 fTop += bTop ? (fy - fTop - fSpace) : 0;
805 } else {
806 if (fTemp < fLimitMin && fHeight > fLimitMin) {
807 fTop += bTop ? (fHeight - fLimitMin) : 0;
808 fHeight = fLimitMin;
809 } else if (fTemp > fLimitMax && fHeight < fLimitMax) {
810 fTop -= bTop ? (fLimitMax - fHeight) : 0;
811 fHeight = fLimitMax;
812 }
813 }
814 }
815
816 CFWL_FormImpDelegate::CFWL_FormImpDelegate(CFWL_FormImp* pOwner)
817 : m_pOwner(pOwner) {}
818
819 #ifdef FWL_UseMacSystemBorder
820 void CFWL_FormImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
821 if (!pMessage)
822 return;
823
824 switch (pMessage->GetClassID()) {
825 case CFWL_MessageType::Activate: {
826 m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
827 m_pOwner->Repaint(&m_pOwner->m_rtRelative);
828 break;
829 }
830 case CFWL_MessageType::Deactivate: {
831 m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
832 m_pOwner->Repaint(&m_pOwner->m_rtRelative);
833 break;
834 }
835 default:
836 break;
837 }
838 }
839 #else
840 void CFWL_FormImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
841 if (!pMessage)
842 return;
843
844 switch (pMessage->GetClassID()) {
845 case CFWL_MessageType::Activate: {
846 m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
847 IFWL_App* pApp = m_pOwner->GetOwnerApp();
848 CFWL_NoteDriver* pDriver =
849 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
850 CFWL_WidgetImp* pSubFocusImp = m_pOwner->GetSubFocus();
851 IFWL_Widget* pSubFocus =
852 pSubFocusImp ? pSubFocusImp->GetInterface() : nullptr;
853 if (pSubFocus && pSubFocus != pDriver->GetFocus())
854 pDriver->SetFocus(pSubFocus);
855
856 m_pOwner->Repaint(&m_pOwner->m_rtRelative);
857 break;
858 }
859 case CFWL_MessageType::Deactivate: {
860 m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
861 IFWL_App* pApp = m_pOwner->GetOwnerApp();
862 CFWL_NoteDriver* pDriver =
863 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
864 CFWL_WidgetImp* pSubFocusImp = m_pOwner->GetSubFocus();
865 IFWL_Widget* pSubFocus =
866 pSubFocusImp ? pSubFocusImp->GetInterface() : nullptr;
867 if (pSubFocus) {
868 if (pSubFocus == pDriver->GetFocus()) {
869 pDriver->SetFocus(nullptr);
870 } else if (pSubFocus->GetStates() & FWL_WGTSTATE_Focused) {
871 CFWL_MsgKillFocus ms;
872 IFWL_WidgetDelegate* pDelegate = pSubFocus->SetDelegate(nullptr);
873 if (pDelegate)
874 pDelegate->OnProcessMessage(&ms);
875 }
876 }
877 m_pOwner->Repaint(&m_pOwner->m_rtRelative);
878 break;
879 }
880 case CFWL_MessageType::Mouse: {
881 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
882 switch (pMsg->m_dwCmd) {
883 case FWL_MouseCommand::LeftButtonDown: {
884 OnLButtonDown(pMsg);
885 break;
886 }
887 case FWL_MouseCommand::LeftButtonUp: {
888 OnLButtonUp(pMsg);
889 break;
890 }
891 case FWL_MouseCommand::Move: {
892 OnMouseMove(pMsg);
893 break;
894 }
895 case FWL_MouseCommand::Hover: {
896 OnMouseHover(pMsg);
897 break;
898 }
899 case FWL_MouseCommand::Leave: {
900 OnMouseLeave(pMsg);
901 break;
902 }
903 case FWL_MouseCommand::LeftButtonDblClk: {
904 OnLButtonDblClk(pMsg);
905 break;
906 }
907 default:
908 break;
909 }
910 break;
911 }
912 case CFWL_MessageType::Size: {
913 CFWL_WidgetMgr* pWidgetMgr = CFWL_WidgetMgr::GetInstance();
914 if (!pWidgetMgr)
915 return;
916
917 pWidgetMgr->AddRedrawCounts(m_pOwner->m_pInterface);
918 if (!m_pOwner->m_bSetMaximize)
919 break;
920
921 m_pOwner->m_bSetMaximize = FALSE;
922 CFWL_MsgSize* pMsg = static_cast<CFWL_MsgSize*>(pMessage);
923 m_pOwner->m_pProperties->m_rtWidget.left = 0;
924 m_pOwner->m_pProperties->m_rtWidget.top = 0;
925 m_pOwner->m_pProperties->m_rtWidget.width = (FX_FLOAT)pMsg->m_iWidth;
926 m_pOwner->m_pProperties->m_rtWidget.height = (FX_FLOAT)pMsg->m_iHeight;
927 m_pOwner->Update();
928 break;
929 }
930 case CFWL_MessageType::WindowMove: {
931 OnWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage));
932 break;
933 }
934 case CFWL_MessageType::Close: {
935 OnClose(static_cast<CFWL_MsgClose*>(pMessage));
936 break;
937 }
938 default: {
939 break;
940 }
941 }
942 }
943 #endif // FWL_UseMacSystemBorder
944
945 void CFWL_FormImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
946
947 void CFWL_FormImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
948 const CFX_Matrix* pMatrix) {
949 m_pOwner->DrawWidget(pGraphics, pMatrix);
950 }
951
952 void CFWL_FormImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
953 m_pOwner->SetGrab(TRUE);
954 m_pOwner->m_bLButtonDown = TRUE;
955 m_pOwner->m_eResizeType = FORM_RESIZETYPE_None;
956 CFWL_SysBtn* pPressBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
957 m_pOwner->m_iCaptureBtn = m_pOwner->GetSysBtnIndex(pPressBtn);
958 CFX_RectF rtCap;
959 rtCap.Set(m_pOwner->m_rtCaption.left + m_pOwner->m_fCYBorder,
960 m_pOwner->m_rtCaption.top + m_pOwner->m_fCXBorder,
961 m_pOwner->m_rtCaption.width -
962 kSystemButtonSize * m_pOwner->m_iSysBox -
963 2 * m_pOwner->m_fCYBorder,
964 m_pOwner->m_rtCaption.height - m_pOwner->m_fCXBorder);
965 if (pPressBtn) {
966 pPressBtn->SetPressed();
967 m_pOwner->Repaint(&pPressBtn->m_rtBtn);
968 } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) {
969 m_pOwner->m_eResizeType = FORM_RESIZETYPE_Cap;
970 } else if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
971 (m_pOwner->m_pProperties->m_dwStyleExes &
972 FWL_STYLEEXT_FRM_Resize) &&
973 !m_pOwner->m_bMaximized) {
974 m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
975 }
976 m_pOwner->m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
977 m_pOwner->m_InfoStart.m_szStart =
978 CFX_SizeF(m_pOwner->m_pProperties->m_rtWidget.width,
979 m_pOwner->m_pProperties->m_rtWidget.height);
980 }
981 void CFWL_FormImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
982 m_pOwner->SetGrab(FALSE);
983 m_pOwner->m_bLButtonDown = FALSE;
984 CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
985 CFWL_SysBtn* pPressedBtn =
986 m_pOwner->GetSysBtnByIndex(m_pOwner->m_iCaptureBtn);
987 if (!pPressedBtn || pPointBtn != pPressedBtn) {
988 return;
989 }
990 if (pPressedBtn == m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed)) {
991 pPressedBtn->SetNormal();
992 }
993 if (pPressedBtn == m_pOwner->m_pMaxBox) {
994 if (m_pOwner->m_bMaximized) {
995 m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
996 m_pOwner->Update();
997 m_pOwner->Repaint();
998 } else {
999 m_pOwner->SetWorkAreaRect();
1000 m_pOwner->Update();
1001 }
1002 m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
1003 } else if (pPressedBtn != m_pOwner->m_pMinBox) {
1004 CFWL_EvtClose eClose;
1005 eClose.m_pSrcTarget = m_pOwner->m_pInterface;
1006 m_pOwner->DispatchEvent(&eClose);
1007 }
1008 }
1009 void CFWL_FormImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
1010 if (m_pOwner->m_bLButtonDown) {
1011 return;
1012 }
1013 if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
1014 (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
1015 !m_pOwner->m_bMaximized) {
1016 m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
1017 }
1018 CFX_RectF rtInvalidate;
1019 rtInvalidate.Reset();
1020 CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
1021 CFWL_SysBtn* pOldHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
1022 #if (_FX_OS_ == _FX_MACOSX_)
1023 {
1024 if (pOldHover && pPointBtn != pOldHover) {
1025 pOldHover->SetNormal();
1026 }
1027 if (pPointBtn && pPointBtn != pOldHover) {
1028 pPointBtn->SetHover();
1029 }
1030 if (m_pOwner->m_pCloseBox) {
1031 rtInvalidate = m_pOwner->m_pCloseBox->m_rtBtn;
1032 }
1033 if (m_pOwner->m_pMaxBox) {
1034 if (rtInvalidate.IsEmpty()) {
1035 rtInvalidate = m_pOwner->m_pMaxBox->m_rtBtn;
1036 } else {
1037 rtInvalidate.Union(m_pOwner->m_pMaxBox->m_rtBtn);
1038 }
1039 }
1040 if (m_pOwner->m_pMinBox) {
1041 if (rtInvalidate.IsEmpty()) {
1042 rtInvalidate = m_pOwner->m_pMinBox->m_rtBtn;
1043 } else {
1044 rtInvalidate.Union(m_pOwner->m_pMinBox->m_rtBtn);
1045 }
1046 }
1047 if (!rtInvalidate.IsEmpty() &&
1048 rtInvalidate.Contains(pMsg->m_fx, pMsg->m_fy)) {
1049 m_pOwner->m_bMouseIn = TRUE;
1050 }
1051 }
1052 #else
1053 {
1054 if (pOldHover && pPointBtn != pOldHover) {
1055 pOldHover->SetNormal();
1056 rtInvalidate = pOldHover->m_rtBtn;
1057 }
1058 if (pPointBtn && pPointBtn != pOldHover) {
1059 pPointBtn->SetHover();
1060 if (rtInvalidate.IsEmpty()) {
1061 rtInvalidate = pPointBtn->m_rtBtn;
1062 } else {
1063 rtInvalidate.Union(pPointBtn->m_rtBtn);
1064 }
1065 }
1066 }
1067 #endif
1068 if (!rtInvalidate.IsEmpty()) {
1069 m_pOwner->Repaint(&rtInvalidate);
1070 }
1071 }
1072 void CFWL_FormImpDelegate::OnMouseHover(CFWL_MsgMouse* pMsg) {
1073 m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
1074 }
1075 void CFWL_FormImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
1076 CFWL_SysBtn* pHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
1077 if (pHover) {
1078 pHover->SetNormal();
1079 m_pOwner->Repaint(&pHover->m_rtBtn);
1080 }
1081 if (pMsg->m_dwCmd == FWL_MouseCommand::Leave && !m_pOwner->m_bLButtonDown) {
1082 m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
1083 }
1084 }
1085 void CFWL_FormImpDelegate::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
1086 if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
1087 m_pOwner->HitTest(pMsg->m_fx, pMsg->m_fy) == FWL_WidgetHit::Titlebar) {
1088 if (m_pOwner->m_bMaximized) {
1089 m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
1090 } else {
1091 m_pOwner->SetWorkAreaRect();
1092 }
1093 m_pOwner->Update();
1094 m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
1095 }
1096 }
1097 void CFWL_FormImpDelegate::OnWindowMove(CFWL_MsgWindowMove* pMsg) {
1098 m_pOwner->m_pProperties->m_rtWidget.left = pMsg->m_fx;
1099 m_pOwner->m_pProperties->m_rtWidget.top = pMsg->m_fy;
1100 }
1101 void CFWL_FormImpDelegate::OnClose(CFWL_MsgClose* pMsg) {
1102 CFWL_EvtClose eClose;
1103 eClose.m_pSrcTarget = m_pOwner->m_pInterface;
1104 m_pOwner->DispatchEvent(&eClose);
1105 }
1106
1107 CFWL_SysBtn::CFWL_SysBtn() {
1108 m_rtBtn.Set(0, 0, 0, 0);
1109 m_dwState = 0;
1110 }
1111
1112 bool CFWL_SysBtn::IsDisabled() const {
1113 return !!(m_dwState & FWL_SYSBUTTONSTATE_Disabled);
1114 }
1115
1116 void CFWL_SysBtn::SetNormal() {
1117 m_dwState &= 0xFFF0;
1118 }
1119
1120 void CFWL_SysBtn::SetPressed() {
1121 SetNormal();
1122 m_dwState |= FWL_SYSBUTTONSTATE_Pressed;
1123 }
1124
1125 void CFWL_SysBtn::SetHover() {
1126 SetNormal();
1127 m_dwState |= FWL_SYSBUTTONSTATE_Hover;
1128 }
1129
1130 void CFWL_SysBtn::SetDisabled(FX_BOOL bDisabled) {
1131 bDisabled ? m_dwState |= FWL_SYSBUTTONSTATE_Disabled
1132 : m_dwState &= ~FWL_SYSBUTTONSTATE_Disabled;
1133 }
1134
1135 uint32_t CFWL_SysBtn::GetPartState() const {
1136 if (IsDisabled())
1137 return CFWL_PartState_Disabled;
1138 if (m_dwState & FWL_SYSBUTTONSTATE_Pressed)
1139 return CFWL_PartState_Pressed;
1140 if (m_dwState & FWL_SYSBUTTONSTATE_Hover)
1141 return CFWL_PartState_Hovered;
1142 return CFWL_PartState_Normal;
1143 }
OLDNEW
« no previous file with comments | « xfa/fwl/core/fwl_formimp.h ('k') | xfa/fwl/core/fwl_noteimp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698