Home | History | Annotate | Download | only in fwl
      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(&param);
     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