diff options
Diffstat (limited to 'xfa/fwl/core/cfwl_caret.cpp')
-rw-r--r-- | xfa/fwl/core/cfwl_caret.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/xfa/fwl/core/cfwl_caret.cpp b/xfa/fwl/core/cfwl_caret.cpp new file mode 100644 index 0000000000..97cf1e9682 --- /dev/null +++ b/xfa/fwl/core/cfwl_caret.cpp @@ -0,0 +1,108 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "xfa/fwl/core/cfwl_caret.h" + +#include <utility> + +#include "third_party/base/ptr_util.h" +#include "xfa/fwl/core/cfwl_notedriver.h" +#include "xfa/fwl/core/cfwl_themebackground.h" +#include "xfa/fwl/core/cfwl_timerinfo.h" +#include "xfa/fwl/core/cfwl_widgetproperties.h" +#include "xfa/fwl/core/ifwl_themeprovider.h" + +namespace { + +const uint32_t kFrequency = 400; + +} // namespace + +CFWL_Caret::CFWL_Caret(const CFWL_App* app, + std::unique_ptr<CFWL_WidgetProperties> properties, + IFWL_Widget* pOuter) + : IFWL_Widget(app, std::move(properties), pOuter), + m_pTimer(new CFWL_Caret::Timer(this)), + m_pTimerInfo(nullptr) { + SetStates(FWL_STATE_CAT_HightLight); +} + +CFWL_Caret::~CFWL_Caret() { + if (m_pTimerInfo) { + m_pTimerInfo->StopTimer(); + m_pTimerInfo = nullptr; + } +} + +FWL_Type CFWL_Caret::GetClassID() const { + return FWL_Type::Caret; +} + +void CFWL_Caret::Update() {} + +void CFWL_Caret::DrawWidget(CFX_Graphics* pGraphics, + const CFX_Matrix* pMatrix) { + if (!pGraphics) + return; + if (!m_pProperties->m_pThemeProvider) + m_pProperties->m_pThemeProvider = GetAvailableTheme(); + if (!m_pProperties->m_pThemeProvider) + return; + + DrawCaretBK(pGraphics, m_pProperties->m_pThemeProvider, pMatrix); +} + +void CFWL_Caret::ShowCaret(bool bFlag) { + if (m_pTimerInfo) { + m_pTimerInfo->StopTimer(); + m_pTimerInfo = nullptr; + } + if (bFlag) + m_pTimerInfo = m_pTimer->StartTimer(kFrequency, true); + + SetStates(FWL_WGTSTATE_Invisible, !bFlag); +} + +void CFWL_Caret::DrawCaretBK(CFX_Graphics* pGraphics, + IFWL_ThemeProvider* pTheme, + const CFX_Matrix* pMatrix) { + if (!(m_pProperties->m_dwStates & FWL_STATE_CAT_HightLight)) + return; + + CFX_RectF rect; + GetWidgetRect(rect); + rect.Set(0, 0, rect.width, rect.height); + + CFWL_ThemeBackground param; + param.m_pWidget = this; + param.m_pGraphics = pGraphics; + param.m_rtPart = rect; + param.m_iPart = CFWL_Part::Background; + param.m_dwStates = CFWL_PartState_HightLight; + if (pMatrix) + param.m_matrix.Concat(*pMatrix); + pTheme->DrawBackground(¶m); +} + +void CFWL_Caret::OnProcessMessage(CFWL_Message* pMessage) {} + +void CFWL_Caret::OnDrawWidget(CFX_Graphics* pGraphics, + const CFX_Matrix* pMatrix) { + DrawWidget(pGraphics, pMatrix); +} + +CFWL_Caret::Timer::Timer(CFWL_Caret* pCaret) : CFWL_Timer(pCaret) {} + +void CFWL_Caret::Timer::Run(CFWL_TimerInfo* pTimerInfo) { + CFWL_Caret* pCaret = static_cast<CFWL_Caret*>(m_pWidget); + pCaret->SetStates(FWL_STATE_CAT_HightLight, + !(pCaret->GetStates() & FWL_STATE_CAT_HightLight)); + + CFX_RectF rt; + pCaret->GetWidgetRect(rt); + rt.Set(0, 0, rt.width + 1, rt.height); + pCaret->Repaint(&rt); +} |