| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fwl/cfwl_form.h" | 7 #include "xfa/fwl/cfwl_form.h" |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "third_party/base/ptr_util.h" | 11 #include "third_party/base/ptr_util.h" |
| 12 #include "xfa/fde/tto/fde_textout.h" | 12 #include "xfa/fde/tto/fde_textout.h" |
| 13 #include "xfa/fwl/cfwl_app.h" | 13 #include "xfa/fwl/cfwl_app.h" |
| 14 #include "xfa/fwl/cfwl_event.h" | 14 #include "xfa/fwl/cfwl_event.h" |
| 15 #include "xfa/fwl/cfwl_formproxy.h" | 15 #include "xfa/fwl/cfwl_formproxy.h" |
| 16 #include "xfa/fwl/cfwl_messagemouse.h" | 16 #include "xfa/fwl/cfwl_messagemouse.h" |
| 17 #include "xfa/fwl/cfwl_notedriver.h" | 17 #include "xfa/fwl/cfwl_notedriver.h" |
| 18 #include "xfa/fwl/cfwl_noteloop.h" | 18 #include "xfa/fwl/cfwl_noteloop.h" |
| 19 #include "xfa/fwl/cfwl_sysbtn.h" | |
| 20 #include "xfa/fwl/cfwl_themebackground.h" | 19 #include "xfa/fwl/cfwl_themebackground.h" |
| 21 #include "xfa/fwl/cfwl_themepart.h" | 20 #include "xfa/fwl/cfwl_themepart.h" |
| 22 #include "xfa/fwl/cfwl_themetext.h" | 21 #include "xfa/fwl/cfwl_themetext.h" |
| 23 #include "xfa/fwl/cfwl_widgetmgr.h" | 22 #include "xfa/fwl/cfwl_widgetmgr.h" |
| 24 #include "xfa/fwl/ifwl_themeprovider.h" | 23 #include "xfa/fwl/ifwl_themeprovider.h" |
| 25 #include "xfa/fwl/theme/cfwl_widgettp.h" | 24 #include "xfa/fwl/theme/cfwl_widgettp.h" |
| 26 | 25 |
| 27 namespace { | |
| 28 | |
| 29 const int kSystemButtonSize = 21; | |
| 30 const int kSystemButtonMargin = 5; | |
| 31 const int kSystemButtonSpan = 2; | |
| 32 | |
| 33 } // namespace | |
| 34 | |
| 35 CFWL_Form::CFWL_Form(const CFWL_App* app, | 26 CFWL_Form::CFWL_Form(const CFWL_App* app, |
| 36 std::unique_ptr<CFWL_WidgetProperties> properties, | 27 std::unique_ptr<CFWL_WidgetProperties> properties, |
| 37 CFWL_Widget* pOuter) | 28 CFWL_Widget* pOuter) |
| 38 : CFWL_Widget(app, std::move(properties), pOuter), | 29 : CFWL_Widget(app, std::move(properties), pOuter), |
| 39 #if (_FX_OS_ == _FX_MACOSX_) | |
| 40 m_bMouseIn(false), | |
| 41 #endif | |
| 42 m_pCloseBox(nullptr), | |
| 43 m_pMinBox(nullptr), | |
| 44 m_pMaxBox(nullptr), | |
| 45 m_pSubFocus(nullptr), | 30 m_pSubFocus(nullptr), |
| 46 m_fCXBorder(0), | 31 m_fCXBorder(0), |
| 47 m_fCYBorder(0), | 32 m_fCYBorder(0) { |
| 48 m_iCaptureBtn(-1), | |
| 49 m_iSysBox(0), | |
| 50 m_bLButtonDown(false), | |
| 51 m_bMaximized(false), | |
| 52 m_bSetMaximize(false), | |
| 53 m_bDoModalFlag(false) { | |
| 54 m_rtRelative.Reset(); | 33 m_rtRelative.Reset(); |
| 55 m_rtRestore.Reset(); | 34 m_rtRestore.Reset(); |
| 56 | 35 |
| 57 RegisterForm(); | 36 RegisterForm(); |
| 58 RegisterEventTarget(nullptr); | 37 RegisterEventTarget(nullptr); |
| 59 } | 38 } |
| 60 | 39 |
| 61 CFWL_Form::~CFWL_Form() { | 40 CFWL_Form::~CFWL_Form() { |
| 62 UnregisterEventTarget(); | 41 UnregisterEventTarget(); |
| 63 UnRegisterForm(); | 42 UnRegisterForm(); |
| 64 RemoveSysButtons(); | |
| 65 } | 43 } |
| 66 | 44 |
| 67 FWL_Type CFWL_Form::GetClassID() const { | 45 FWL_Type CFWL_Form::GetClassID() const { |
| 68 return FWL_Type::Form; | 46 return FWL_Type::Form; |
| 69 } | 47 } |
| 70 | 48 |
| 71 bool CFWL_Form::IsInstance(const CFX_WideStringC& wsClass) const { | 49 bool CFWL_Form::IsInstance(const CFX_WideStringC& wsClass) const { |
| 72 if (wsClass == CFX_WideStringC(FWL_CLASS_Form)) | 50 if (wsClass == CFX_WideStringC(FWL_CLASS_Form)) |
| 73 return true; | 51 return true; |
| 74 return CFWL_Widget::IsInstance(wsClass); | 52 return CFWL_Widget::IsInstance(wsClass); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 85 return; | 63 return; |
| 86 if (!m_pProperties->m_pThemeProvider) | 64 if (!m_pProperties->m_pThemeProvider) |
| 87 m_pProperties->m_pThemeProvider = GetAvailableTheme(); | 65 m_pProperties->m_pThemeProvider = GetAvailableTheme(); |
| 88 | 66 |
| 89 Layout(); | 67 Layout(); |
| 90 } | 68 } |
| 91 | 69 |
| 92 FWL_WidgetHit CFWL_Form::HitTest(FX_FLOAT fx, FX_FLOAT fy) { | 70 FWL_WidgetHit CFWL_Form::HitTest(FX_FLOAT fx, FX_FLOAT fy) { |
| 93 GetAvailableTheme(); | 71 GetAvailableTheme(); |
| 94 | 72 |
| 95 if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) | |
| 96 return FWL_WidgetHit::CloseBox; | |
| 97 if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) | |
| 98 return FWL_WidgetHit::MaxBox; | |
| 99 if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) | |
| 100 return FWL_WidgetHit::MinBox; | |
| 101 | |
| 102 CFX_RectF rtCap; | 73 CFX_RectF rtCap; |
| 103 rtCap.Set(m_fCYBorder, m_fCXBorder, | 74 rtCap.Set(m_fCYBorder, m_fCXBorder, -2 * m_fCYBorder, 0 - m_fCXBorder); |
| 104 0 - kSystemButtonSize * m_iSysBox - 2 * m_fCYBorder, | |
| 105 0 - m_fCXBorder); | |
| 106 return rtCap.Contains(fx, fy) ? FWL_WidgetHit::Titlebar | 75 return rtCap.Contains(fx, fy) ? FWL_WidgetHit::Titlebar |
| 107 : FWL_WidgetHit::Client; | 76 : FWL_WidgetHit::Client; |
| 108 } | 77 } |
| 109 | 78 |
| 110 void CFWL_Form::DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) { | 79 void CFWL_Form::DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) { |
| 111 if (!pGraphics) | 80 if (!pGraphics) |
| 112 return; | 81 return; |
| 113 if (!m_pProperties->m_pThemeProvider) | 82 if (!m_pProperties->m_pThemeProvider) |
| 114 return; | 83 return; |
| 115 | 84 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 132 param.m_iPart = CFWL_Part::Border; | 101 param.m_iPart = CFWL_Part::Border; |
| 133 pTheme->DrawBackground(¶m); | 102 pTheme->DrawBackground(¶m); |
| 134 } | 103 } |
| 135 if ((m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_EdgeMask) != | 104 if ((m_pProperties->m_dwStyleExes & FWL_WGTSTYLE_EdgeMask) != |
| 136 FWL_WGTSTYLE_EdgeNone) { | 105 FWL_WGTSTYLE_EdgeNone) { |
| 137 param.m_iPart = CFWL_Part::Edge; | 106 param.m_iPart = CFWL_Part::Edge; |
| 138 param.m_rtPart = GetEdgeRect(); | 107 param.m_rtPart = GetEdgeRect(); |
| 139 param.m_dwStates = iState; | 108 param.m_dwStates = iState; |
| 140 pTheme->DrawBackground(¶m); | 109 pTheme->DrawBackground(¶m); |
| 141 } | 110 } |
| 142 | |
| 143 #if (_FX_OS_ == _FX_MACOSX_) | |
| 144 { | |
| 145 if (m_pCloseBox) { | |
| 146 param.m_iPart = CFWL_Part::CloseBox; | |
| 147 param.m_dwStates = m_pCloseBox->GetPartState(); | |
| 148 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) | |
| 149 param.m_dwStates = CFWL_PartState_Disabled; | |
| 150 else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) | |
| 151 param.m_dwStates = CFWL_PartState_Hovered; | |
| 152 param.m_rtPart = m_pCloseBox->m_rtBtn; | |
| 153 pTheme->DrawBackground(¶m); | |
| 154 } | |
| 155 if (m_pMaxBox) { | |
| 156 param.m_iPart = CFWL_Part::MaximizeBox; | |
| 157 param.m_dwStates = m_pMaxBox->GetPartState(); | |
| 158 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) | |
| 159 param.m_dwStates = CFWL_PartState_Disabled; | |
| 160 else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) | |
| 161 param.m_dwStates = CFWL_PartState_Hovered; | |
| 162 param.m_rtPart = m_pMaxBox->m_rtBtn; | |
| 163 param.m_bMaximize = m_bMaximized; | |
| 164 pTheme->DrawBackground(¶m); | |
| 165 } | |
| 166 if (m_pMinBox) { | |
| 167 param.m_iPart = CFWL_Part::MinimizeBox; | |
| 168 param.m_dwStates = m_pMinBox->GetPartState(); | |
| 169 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Deactivated) | |
| 170 param.m_dwStates = CFWL_PartState_Disabled; | |
| 171 else if (CFWL_PartState_Normal == param.m_dwStates && m_bMouseIn) | |
| 172 param.m_dwStates = CFWL_PartState_Hovered; | |
| 173 param.m_rtPart = m_pMinBox->m_rtBtn; | |
| 174 pTheme->DrawBackground(¶m); | |
| 175 } | |
| 176 m_bMouseIn = false; | |
| 177 } | |
| 178 #else | |
| 179 { | |
| 180 if (m_pCloseBox) { | |
| 181 param.m_iPart = CFWL_Part::CloseBox; | |
| 182 param.m_dwStates = m_pCloseBox->GetPartState(); | |
| 183 param.m_rtPart = m_pCloseBox->m_rtBtn; | |
| 184 pTheme->DrawBackground(¶m); | |
| 185 } | |
| 186 if (m_pMaxBox) { | |
| 187 param.m_iPart = CFWL_Part::MaximizeBox; | |
| 188 param.m_dwStates = m_pMaxBox->GetPartState(); | |
| 189 param.m_rtPart = m_pMaxBox->m_rtBtn; | |
| 190 param.m_bMaximize = m_bMaximized; | |
| 191 pTheme->DrawBackground(¶m); | |
| 192 } | |
| 193 if (m_pMinBox) { | |
| 194 param.m_iPart = CFWL_Part::MinimizeBox; | |
| 195 param.m_dwStates = m_pMinBox->GetPartState(); | |
| 196 param.m_rtPart = m_pMinBox->m_rtBtn; | |
| 197 pTheme->DrawBackground(¶m); | |
| 198 } | |
| 199 } | |
| 200 #endif | |
| 201 } | 111 } |
| 202 | 112 |
| 203 CFWL_Widget* CFWL_Form::DoModal() { | 113 CFWL_Widget* CFWL_Form::DoModal() { |
| 204 const CFWL_App* pApp = GetOwnerApp(); | 114 const CFWL_App* pApp = GetOwnerApp(); |
| 205 if (!pApp) | 115 if (!pApp) |
| 206 return nullptr; | 116 return nullptr; |
| 207 | 117 |
| 208 CFWL_NoteDriver* pDriver = pApp->GetNoteDriver(); | 118 CFWL_NoteDriver* pDriver = pApp->GetNoteDriver(); |
| 209 if (!pDriver) | 119 if (!pDriver) |
| 210 return nullptr; | 120 return nullptr; |
| 211 | 121 |
| 212 m_pNoteLoop = pdfium::MakeUnique<CFWL_NoteLoop>(); | 122 m_pNoteLoop = pdfium::MakeUnique<CFWL_NoteLoop>(); |
| 213 m_pNoteLoop->SetMainForm(this); | 123 m_pNoteLoop->SetMainForm(this); |
| 214 | 124 |
| 215 pDriver->PushNoteLoop(m_pNoteLoop.get()); | 125 pDriver->PushNoteLoop(m_pNoteLoop.get()); |
| 216 m_bDoModalFlag = true; | |
| 217 RemoveStates(FWL_WGTSTATE_Invisible); | 126 RemoveStates(FWL_WGTSTATE_Invisible); |
| 218 pDriver->Run(); | 127 pDriver->Run(); |
| 219 | 128 |
| 220 #if _FX_OS_ != _FX_MACOSX_ | 129 #if _FX_OS_ != _FX_MACOSX_ |
| 221 pDriver->PopNoteLoop(); | 130 pDriver->PopNoteLoop(); |
| 222 #endif | 131 #endif |
| 223 | 132 |
| 224 m_pNoteLoop.reset(); | 133 m_pNoteLoop.reset(); |
| 225 return nullptr; | 134 return nullptr; |
| 226 } | 135 } |
| 227 | 136 |
| 228 void CFWL_Form::EndDoModal() { | 137 void CFWL_Form::EndDoModal() { |
| 229 if (!m_pNoteLoop) | 138 if (!m_pNoteLoop) |
| 230 return; | 139 return; |
| 231 | 140 |
| 232 m_bDoModalFlag = false; | |
| 233 | |
| 234 #if (_FX_OS_ == _FX_MACOSX_) | 141 #if (_FX_OS_ == _FX_MACOSX_) |
| 235 m_pNoteLoop->EndModalLoop(); | 142 m_pNoteLoop->EndModalLoop(); |
| 236 const CFWL_App* pApp = GetOwnerApp(); | 143 const CFWL_App* pApp = GetOwnerApp(); |
| 237 if (!pApp) | 144 if (!pApp) |
| 238 return; | 145 return; |
| 239 | 146 |
| 240 CFWL_NoteDriver* pDriver = | 147 CFWL_NoteDriver* pDriver = |
| 241 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); | 148 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); |
| 242 if (!pDriver) | 149 if (!pDriver) |
| 243 return; | 150 return; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 254 IFWL_ThemeProvider* pTheme) { | 161 IFWL_ThemeProvider* pTheme) { |
| 255 CFWL_ThemeBackground param; | 162 CFWL_ThemeBackground param; |
| 256 param.m_pWidget = this; | 163 param.m_pWidget = this; |
| 257 param.m_iPart = CFWL_Part::Background; | 164 param.m_iPart = CFWL_Part::Background; |
| 258 param.m_pGraphics = pGraphics; | 165 param.m_pGraphics = pGraphics; |
| 259 param.m_rtPart = m_rtRelative; | 166 param.m_rtPart = m_rtRelative; |
| 260 param.m_rtPart.Deflate(m_fCYBorder, m_fCXBorder, m_fCYBorder, m_fCXBorder); | 167 param.m_rtPart.Deflate(m_fCYBorder, m_fCXBorder, m_fCYBorder, m_fCXBorder); |
| 261 pTheme->DrawBackground(¶m); | 168 pTheme->DrawBackground(¶m); |
| 262 } | 169 } |
| 263 | 170 |
| 264 void CFWL_Form::RemoveSysButtons() { | |
| 265 delete m_pCloseBox; | |
| 266 m_pCloseBox = nullptr; | |
| 267 delete m_pMinBox; | |
| 268 m_pMinBox = nullptr; | |
| 269 delete m_pMaxBox; | |
| 270 m_pMaxBox = nullptr; | |
| 271 } | |
| 272 | |
| 273 CFWL_SysBtn* CFWL_Form::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) { | |
| 274 if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) | |
| 275 return m_pCloseBox; | |
| 276 if (m_pMaxBox && m_pMaxBox->m_rtBtn.Contains(fx, fy)) | |
| 277 return m_pMaxBox; | |
| 278 if (m_pMinBox && m_pMinBox->m_rtBtn.Contains(fx, fy)) | |
| 279 return m_pMinBox; | |
| 280 return nullptr; | |
| 281 } | |
| 282 | |
| 283 CFWL_SysBtn* CFWL_Form::GetSysBtnByState(uint32_t dwState) { | |
| 284 if (m_pCloseBox && (m_pCloseBox->m_dwState & dwState)) | |
| 285 return m_pCloseBox; | |
| 286 if (m_pMaxBox && (m_pMaxBox->m_dwState & dwState)) | |
| 287 return m_pMaxBox; | |
| 288 if (m_pMinBox && (m_pMinBox->m_dwState & dwState)) | |
| 289 return m_pMinBox; | |
| 290 return nullptr; | |
| 291 } | |
| 292 | |
| 293 CFWL_SysBtn* CFWL_Form::GetSysBtnByIndex(int32_t nIndex) { | |
| 294 if (nIndex < 0) | |
| 295 return nullptr; | |
| 296 | |
| 297 CFX_ArrayTemplate<CFWL_SysBtn*> arrBtn; | |
| 298 if (m_pMinBox) | |
| 299 arrBtn.Add(m_pMinBox); | |
| 300 if (m_pMaxBox) | |
| 301 arrBtn.Add(m_pMaxBox); | |
| 302 if (m_pCloseBox) | |
| 303 arrBtn.Add(m_pCloseBox); | |
| 304 return arrBtn[nIndex]; | |
| 305 } | |
| 306 | |
| 307 int32_t CFWL_Form::GetSysBtnIndex(CFWL_SysBtn* pBtn) { | |
| 308 CFX_ArrayTemplate<CFWL_SysBtn*> arrBtn; | |
| 309 if (m_pMinBox) | |
| 310 arrBtn.Add(m_pMinBox); | |
| 311 if (m_pMaxBox) | |
| 312 arrBtn.Add(m_pMaxBox); | |
| 313 if (m_pCloseBox) | |
| 314 arrBtn.Add(m_pCloseBox); | |
| 315 return arrBtn.Find(pBtn); | |
| 316 } | |
| 317 | |
| 318 CFX_RectF CFWL_Form::GetEdgeRect() { | 171 CFX_RectF CFWL_Form::GetEdgeRect() { |
| 319 CFX_RectF rtEdge = m_rtRelative; | 172 CFX_RectF rtEdge = m_rtRelative; |
| 320 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) { | 173 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) { |
| 321 FX_FLOAT fCX = GetBorderSize(true); | 174 FX_FLOAT fCX = GetBorderSize(true); |
| 322 FX_FLOAT fCY = GetBorderSize(false); | 175 FX_FLOAT fCY = GetBorderSize(false); |
| 323 rtEdge.Deflate(fCX, fCY, fCX, fCY); | 176 rtEdge.Deflate(fCX, fCY, fCX, fCY); |
| 324 } | 177 } |
| 325 return rtEdge; | 178 return rtEdge; |
| 326 } | 179 } |
| 327 | 180 |
| 328 void CFWL_Form::SetWorkAreaRect() { | 181 void CFWL_Form::SetWorkAreaRect() { |
| 329 m_rtRestore = m_pProperties->m_rtWidget; | 182 m_rtRestore = m_pProperties->m_rtWidget; |
| 330 CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr(); | 183 CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr(); |
| 331 if (!pWidgetMgr) | 184 if (!pWidgetMgr) |
| 332 return; | 185 return; |
| 333 | |
| 334 m_bSetMaximize = true; | |
| 335 RepaintRect(m_rtRelative); | 186 RepaintRect(m_rtRelative); |
| 336 } | 187 } |
| 337 | 188 |
| 338 void CFWL_Form::Layout() { | 189 void CFWL_Form::Layout() { |
| 339 m_rtRelative = GetRelativeRect(); | 190 m_rtRelative = GetRelativeRect(); |
| 340 | 191 |
| 341 #ifndef FWL_UseMacSystemBorder | 192 #ifndef FWL_UseMacSystemBorder |
| 342 ResetSysBtn(); | |
| 343 #endif | |
| 344 } | |
| 345 | |
| 346 void CFWL_Form::ResetSysBtn() { | |
| 347 m_fCXBorder = | 193 m_fCXBorder = |
| 348 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CXBorder)); | 194 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CXBorder)); |
| 349 m_fCYBorder = | 195 m_fCYBorder = |
| 350 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CYBorder)); | 196 *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CYBorder)); |
| 351 RemoveSysButtons(); | 197 #endif |
| 352 | |
| 353 m_iSysBox = 0; | |
| 354 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_CloseBox) { | |
| 355 m_pCloseBox = new CFWL_SysBtn; | |
| 356 m_pCloseBox->m_rtBtn.Set( | |
| 357 m_rtRelative.right() - kSystemButtonMargin - kSystemButtonSize, | |
| 358 kSystemButtonMargin, kSystemButtonSize, kSystemButtonSize); | |
| 359 m_iSysBox++; | |
| 360 } | |
| 361 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MaximizeBox) { | |
| 362 m_pMaxBox = new CFWL_SysBtn; | |
| 363 if (m_pCloseBox) { | |
| 364 m_pMaxBox->m_rtBtn.Set( | |
| 365 m_pCloseBox->m_rtBtn.left - kSystemButtonSpan - kSystemButtonSize, | |
| 366 m_pCloseBox->m_rtBtn.top, kSystemButtonSize, kSystemButtonSize); | |
| 367 } else { | |
| 368 m_pMaxBox->m_rtBtn.Set( | |
| 369 m_rtRelative.right() - kSystemButtonMargin - kSystemButtonSize, | |
| 370 kSystemButtonMargin, kSystemButtonSize, kSystemButtonSize); | |
| 371 } | |
| 372 m_iSysBox++; | |
| 373 } | |
| 374 if (m_pProperties->m_dwStyles & FWL_WGTSTYLE_MinimizeBox) { | |
| 375 m_pMinBox = new CFWL_SysBtn; | |
| 376 if (m_pMaxBox) { | |
| 377 m_pMinBox->m_rtBtn.Set( | |
| 378 m_pMaxBox->m_rtBtn.left - kSystemButtonSpan - kSystemButtonSize, | |
| 379 m_pMaxBox->m_rtBtn.top, kSystemButtonSize, kSystemButtonSize); | |
| 380 } else if (m_pCloseBox) { | |
| 381 m_pMinBox->m_rtBtn.Set( | |
| 382 m_pCloseBox->m_rtBtn.left - kSystemButtonSpan - kSystemButtonSize, | |
| 383 m_pCloseBox->m_rtBtn.top, kSystemButtonSize, kSystemButtonSize); | |
| 384 } else { | |
| 385 m_pMinBox->m_rtBtn.Set( | |
| 386 m_rtRelative.right() - kSystemButtonMargin - kSystemButtonSize, | |
| 387 kSystemButtonMargin, kSystemButtonSize, kSystemButtonSize); | |
| 388 } | |
| 389 m_iSysBox++; | |
| 390 } | |
| 391 } | 198 } |
| 392 | 199 |
| 393 void CFWL_Form::RegisterForm() { | 200 void CFWL_Form::RegisterForm() { |
| 394 const CFWL_App* pApp = GetOwnerApp(); | 201 const CFWL_App* pApp = GetOwnerApp(); |
| 395 if (!pApp) | 202 if (!pApp) |
| 396 return; | 203 return; |
| 397 | 204 |
| 398 CFWL_NoteDriver* pDriver = | 205 CFWL_NoteDriver* pDriver = |
| 399 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); | 206 static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); |
| 400 if (!pDriver) | 207 if (!pDriver) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 424 switch (pMessage->GetType()) { | 231 switch (pMessage->GetType()) { |
| 425 case CFWL_Message::Type::Mouse: { | 232 case CFWL_Message::Type::Mouse: { |
| 426 CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage); | 233 CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage); |
| 427 switch (pMsg->m_dwCmd) { | 234 switch (pMsg->m_dwCmd) { |
| 428 case FWL_MouseCommand::LeftButtonDown: | 235 case FWL_MouseCommand::LeftButtonDown: |
| 429 OnLButtonDown(pMsg); | 236 OnLButtonDown(pMsg); |
| 430 break; | 237 break; |
| 431 case FWL_MouseCommand::LeftButtonUp: | 238 case FWL_MouseCommand::LeftButtonUp: |
| 432 OnLButtonUp(pMsg); | 239 OnLButtonUp(pMsg); |
| 433 break; | 240 break; |
| 434 case FWL_MouseCommand::Move: | |
| 435 OnMouseMove(pMsg); | |
| 436 break; | |
| 437 case FWL_MouseCommand::Leave: | |
| 438 OnMouseLeave(pMsg); | |
| 439 break; | |
| 440 default: | 241 default: |
| 441 break; | 242 break; |
| 442 } | 243 } |
| 443 break; | 244 break; |
| 444 } | 245 } |
| 445 default: | 246 default: |
| 446 break; | 247 break; |
| 447 } | 248 } |
| 448 #endif // FWL_UseMacSystemBorder | 249 #endif // FWL_UseMacSystemBorder |
| 449 } | 250 } |
| 450 | 251 |
| 451 void CFWL_Form::OnDrawWidget(CFX_Graphics* pGraphics, | 252 void CFWL_Form::OnDrawWidget(CFX_Graphics* pGraphics, |
| 452 const CFX_Matrix* pMatrix) { | 253 const CFX_Matrix* pMatrix) { |
| 453 DrawWidget(pGraphics, pMatrix); | 254 DrawWidget(pGraphics, pMatrix); |
| 454 } | 255 } |
| 455 | 256 |
| 456 void CFWL_Form::OnLButtonDown(CFWL_MessageMouse* pMsg) { | 257 void CFWL_Form::OnLButtonDown(CFWL_MessageMouse* pMsg) { |
| 457 SetGrab(true); | 258 SetGrab(true); |
| 458 m_bLButtonDown = true; | |
| 459 | |
| 460 CFWL_SysBtn* pPressBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy); | |
| 461 m_iCaptureBtn = GetSysBtnIndex(pPressBtn); | |
| 462 | |
| 463 if (!pPressBtn) | |
| 464 return; | |
| 465 | |
| 466 pPressBtn->SetPressed(); | |
| 467 RepaintRect(pPressBtn->m_rtBtn); | |
| 468 } | 259 } |
| 469 | 260 |
| 470 void CFWL_Form::OnLButtonUp(CFWL_MessageMouse* pMsg) { | 261 void CFWL_Form::OnLButtonUp(CFWL_MessageMouse* pMsg) { |
| 471 SetGrab(false); | 262 SetGrab(false); |
| 472 m_bLButtonDown = false; | |
| 473 CFWL_SysBtn* pPointBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy); | |
| 474 CFWL_SysBtn* pPressedBtn = GetSysBtnByIndex(m_iCaptureBtn); | |
| 475 if (!pPressedBtn || pPointBtn != pPressedBtn) | |
| 476 return; | |
| 477 if (pPressedBtn == GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed)) | |
| 478 pPressedBtn->SetNormal(); | |
| 479 if (pPressedBtn == m_pMaxBox) { | |
| 480 if (m_bMaximized) { | |
| 481 SetWidgetRect(m_rtRestore); | |
| 482 Update(); | |
| 483 Repaint(); | |
| 484 } else { | |
| 485 SetWorkAreaRect(); | |
| 486 Update(); | |
| 487 } | |
| 488 m_bMaximized = !m_bMaximized; | |
| 489 } else if (pPressedBtn != m_pMinBox) { | |
| 490 CFWL_Event eClose(CFWL_Event::Type::Close, this); | |
| 491 DispatchEvent(&eClose); | |
| 492 } | |
| 493 } | 263 } |
| 494 | |
| 495 void CFWL_Form::OnMouseMove(CFWL_MessageMouse* pMsg) { | |
| 496 if (m_bLButtonDown) | |
| 497 return; | |
| 498 | |
| 499 CFX_RectF rtInvalidate; | |
| 500 rtInvalidate.Reset(); | |
| 501 CFWL_SysBtn* pPointBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy); | |
| 502 CFWL_SysBtn* pOldHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover); | |
| 503 | |
| 504 #if _FX_OS_ == _FX_MACOSX_ | |
| 505 { | |
| 506 if (pOldHover && pPointBtn != pOldHover) | |
| 507 pOldHover->SetNormal(); | |
| 508 if (pPointBtn && pPointBtn != pOldHover) | |
| 509 pPointBtn->SetHover(); | |
| 510 if (m_pCloseBox) | |
| 511 rtInvalidate = m_pCloseBox->m_rtBtn; | |
| 512 if (m_pMaxBox) { | |
| 513 if (rtInvalidate.IsEmpty()) | |
| 514 rtInvalidate = m_pMaxBox->m_rtBtn; | |
| 515 else | |
| 516 rtInvalidate.Union(m_pMaxBox->m_rtBtn); | |
| 517 } | |
| 518 if (m_pMinBox) { | |
| 519 if (rtInvalidate.IsEmpty()) | |
| 520 rtInvalidate = m_pMinBox->m_rtBtn; | |
| 521 else | |
| 522 rtInvalidate.Union(m_pMinBox->m_rtBtn); | |
| 523 } | |
| 524 if (!rtInvalidate.IsEmpty() && | |
| 525 rtInvalidate.Contains(pMsg->m_fx, pMsg->m_fy)) { | |
| 526 m_bMouseIn = true; | |
| 527 } | |
| 528 } | |
| 529 #else | |
| 530 { | |
| 531 if (pOldHover && pPointBtn != pOldHover) { | |
| 532 pOldHover->SetNormal(); | |
| 533 rtInvalidate = pOldHover->m_rtBtn; | |
| 534 } | |
| 535 if (pPointBtn && pPointBtn != pOldHover) { | |
| 536 pPointBtn->SetHover(); | |
| 537 if (rtInvalidate.IsEmpty()) | |
| 538 rtInvalidate = pPointBtn->m_rtBtn; | |
| 539 else | |
| 540 rtInvalidate.Union(pPointBtn->m_rtBtn); | |
| 541 } | |
| 542 } | |
| 543 #endif | |
| 544 | |
| 545 if (!rtInvalidate.IsEmpty()) | |
| 546 RepaintRect(rtInvalidate); | |
| 547 } | |
| 548 | |
| 549 void CFWL_Form::OnMouseLeave(CFWL_MessageMouse* pMsg) { | |
| 550 CFWL_SysBtn* pHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover); | |
| 551 if (!pHover) | |
| 552 return; | |
| 553 | |
| 554 pHover->SetNormal(); | |
| 555 RepaintRect(pHover->m_rtBtn); | |
| 556 } | |
| OLD | NEW |