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/cfwl_caret.h" 8 9 #include <utility> 10 11 #include "third_party/base/ptr_util.h" 12 #include "xfa/fwl/cfwl_notedriver.h" 13 #include "xfa/fwl/cfwl_themebackground.h" 14 #include "xfa/fwl/cfwl_timerinfo.h" 15 #include "xfa/fwl/cfwl_widgetproperties.h" 16 #include "xfa/fwl/ifwl_themeprovider.h" 17 18 namespace { 19 20 const uint32_t kFrequency = 400; 21 22 constexpr int kStateHighlight = (1 << 0); 23 24 } // namespace 25 26 CFWL_Caret::CFWL_Caret(const CFWL_App* app, 27 std::unique_ptr<CFWL_WidgetProperties> properties, 28 CFWL_Widget* pOuter) 29 : CFWL_Widget(app, std::move(properties), pOuter), 30 m_pTimer(pdfium::MakeUnique<CFWL_Caret::Timer>(this)), 31 m_pTimerInfo(nullptr) { 32 SetStates(kStateHighlight); 33 } 34 35 CFWL_Caret::~CFWL_Caret() { 36 if (m_pTimerInfo) { 37 m_pTimerInfo->StopTimer(); 38 m_pTimerInfo = nullptr; 39 } 40 } 41 42 FWL_Type CFWL_Caret::GetClassID() const { 43 return FWL_Type::Caret; 44 } 45 46 void CFWL_Caret::Update() {} 47 48 void CFWL_Caret::DrawWidget(CXFA_Graphics* pGraphics, 49 const CFX_Matrix& matrix) { 50 if (!pGraphics) 51 return; 52 if (!m_pProperties->m_pThemeProvider) 53 m_pProperties->m_pThemeProvider = GetAvailableTheme(); 54 if (!m_pProperties->m_pThemeProvider) 55 return; 56 57 DrawCaretBK(pGraphics, m_pProperties->m_pThemeProvider, &matrix); 58 } 59 60 void CFWL_Caret::ShowCaret() { 61 if (m_pTimerInfo) 62 m_pTimerInfo->StopTimer(); 63 m_pTimerInfo = m_pTimer->StartTimer(kFrequency, true); 64 RemoveStates(FWL_WGTSTATE_Invisible); 65 } 66 67 void CFWL_Caret::HideCaret() { 68 if (m_pTimerInfo) { 69 m_pTimerInfo->StopTimer(); 70 m_pTimerInfo = nullptr; 71 } 72 SetStates(FWL_WGTSTATE_Invisible); 73 } 74 75 void CFWL_Caret::DrawCaretBK(CXFA_Graphics* pGraphics, 76 IFWL_ThemeProvider* pTheme, 77 const CFX_Matrix* pMatrix) { 78 if (!(m_pProperties->m_dwStates & kStateHighlight)) 79 return; 80 81 CFWL_ThemeBackground param; 82 param.m_pWidget = this; 83 param.m_pGraphics = pGraphics; 84 param.m_rtPart = CFX_RectF(0, 0, GetWidgetRect().Size()); 85 param.m_iPart = CFWL_Part::Background; 86 param.m_dwStates = CFWL_PartState_HightLight; 87 if (pMatrix) 88 param.m_matrix.Concat(*pMatrix); 89 pTheme->DrawBackground(¶m); 90 } 91 92 void CFWL_Caret::OnProcessMessage(CFWL_Message* pMessage) {} 93 94 void CFWL_Caret::OnDrawWidget(CXFA_Graphics* pGraphics, 95 const CFX_Matrix& matrix) { 96 DrawWidget(pGraphics, matrix); 97 } 98 99 CFWL_Caret::Timer::Timer(CFWL_Caret* pCaret) : CFWL_Timer(pCaret) {} 100 101 void CFWL_Caret::Timer::Run(CFWL_TimerInfo* pTimerInfo) { 102 CFWL_Caret* pCaret = static_cast<CFWL_Caret*>(m_pWidget.Get()); 103 if (!(pCaret->GetStates() & kStateHighlight)) 104 pCaret->SetStates(kStateHighlight); 105 else 106 pCaret->RemoveStates(kStateHighlight); 107 108 CFX_RectF rt = pCaret->GetWidgetRect(); 109 pCaret->RepaintRect(CFX_RectF(0, 0, rt.width + 1, rt.height)); 110 } 111