OLD | NEW |
| (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/src/fwl/basewidget/fwl_caretimp.h" | |
8 | |
9 #include "xfa/include/fwl/basewidget/fwl_caret.h" | |
10 #include "xfa/include/fwl/core/fwl_theme.h" | |
11 #include "xfa/src/fwl/core/fwl_noteimp.h" | |
12 #include "xfa/src/fwl/core/fwl_targetimp.h" | |
13 #include "xfa/src/fwl/core/fwl_widgetimp.h" | |
14 | |
15 // static | |
16 IFWL_Caret* IFWL_Caret::Create(const CFWL_WidgetImpProperties& properties, | |
17 IFWL_Widget* pOuter) { | |
18 IFWL_Caret* pCaret = new IFWL_Caret; | |
19 CFWL_CaretImp* pCaretImpl = new CFWL_CaretImp(properties, pOuter); | |
20 pCaret->SetImpl(pCaretImpl); | |
21 pCaretImpl->SetInterface(pCaret); | |
22 return pCaret; | |
23 } | |
24 IFWL_Caret::IFWL_Caret() {} | |
25 FWL_ERR IFWL_Caret::ShowCaret(FX_BOOL bFlag) { | |
26 return static_cast<CFWL_CaretImp*>(GetImpl())->ShowCaret(bFlag); | |
27 } | |
28 FWL_ERR IFWL_Caret::GetFrequency(FX_DWORD& elapse) { | |
29 return static_cast<CFWL_CaretImp*>(GetImpl())->GetFrequency(elapse); | |
30 } | |
31 FWL_ERR IFWL_Caret::SetFrequency(FX_DWORD elapse) { | |
32 return static_cast<CFWL_CaretImp*>(GetImpl())->SetFrequency(elapse); | |
33 } | |
34 FWL_ERR IFWL_Caret::SetColor(CFX_Color crFill) { | |
35 return static_cast<CFWL_CaretImp*>(GetImpl())->SetColor(crFill); | |
36 } | |
37 | |
38 CFWL_CaretImp::CFWL_CaretImp(const CFWL_WidgetImpProperties& properties, | |
39 IFWL_Widget* pOuter) | |
40 : CFWL_WidgetImp(properties, pOuter), | |
41 m_hTimer(nullptr), | |
42 m_dwElapse(400), | |
43 m_bSetColor(FALSE) { | |
44 m_pTimer = new CFWL_CaretTimer(this); | |
45 SetStates(FWL_STATE_CAT_HightLight); | |
46 } | |
47 CFWL_CaretImp::~CFWL_CaretImp() { | |
48 if (m_pTimer) { | |
49 delete m_pTimer; | |
50 m_pTimer = NULL; | |
51 } | |
52 } | |
53 FWL_ERR CFWL_CaretImp::GetClassName(CFX_WideString& wsClass) const { | |
54 wsClass = FWL_CLASS_Caret; | |
55 return FWL_ERR_Succeeded; | |
56 } | |
57 FX_DWORD CFWL_CaretImp::GetClassID() const { | |
58 return FWL_CLASSHASH_Caret; | |
59 } | |
60 FWL_ERR CFWL_CaretImp::Initialize() { | |
61 if (CFWL_WidgetImp::Initialize() != FWL_ERR_Succeeded) | |
62 return FWL_ERR_Indefinite; | |
63 m_pDelegate = new CFWL_CaretImpDelegate(this); | |
64 return FWL_ERR_Succeeded; | |
65 } | |
66 FWL_ERR CFWL_CaretImp::Finalize() { | |
67 if (m_hTimer) { | |
68 FWL_StopTimer(m_hTimer); | |
69 m_hTimer = NULL; | |
70 } | |
71 delete m_pDelegate; | |
72 m_pDelegate = nullptr; | |
73 return CFWL_WidgetImp::Finalize(); | |
74 } | |
75 FWL_ERR CFWL_CaretImp::DrawWidget(CFX_Graphics* pGraphics, | |
76 const CFX_Matrix* pMatrix) { | |
77 if (!pGraphics) | |
78 return FWL_ERR_Indefinite; | |
79 if (!m_pProperties->m_pThemeProvider) | |
80 m_pProperties->m_pThemeProvider = GetAvailableTheme(); | |
81 if (!m_pProperties->m_pThemeProvider) | |
82 return FWL_ERR_Indefinite; | |
83 DrawCaretBK(pGraphics, m_pProperties->m_pThemeProvider, pMatrix); | |
84 return FWL_ERR_Succeeded; | |
85 } | |
86 FWL_ERR CFWL_CaretImp::ShowCaret(FX_BOOL bFlag) { | |
87 if (m_hTimer) { | |
88 FWL_StopTimer(m_hTimer); | |
89 m_hTimer = NULL; | |
90 } | |
91 if (bFlag) { | |
92 m_hTimer = FWL_StartTimer(m_pTimer, m_dwElapse); | |
93 } | |
94 return SetStates(FWL_WGTSTATE_Invisible, !bFlag); | |
95 } | |
96 FWL_ERR CFWL_CaretImp::GetFrequency(FX_DWORD& elapse) { | |
97 elapse = m_dwElapse; | |
98 return FWL_ERR_Succeeded; | |
99 } | |
100 FWL_ERR CFWL_CaretImp::SetFrequency(FX_DWORD elapse) { | |
101 m_dwElapse = elapse; | |
102 return FWL_ERR_Succeeded; | |
103 } | |
104 FWL_ERR CFWL_CaretImp::SetColor(CFX_Color crFill) { | |
105 m_bSetColor = TRUE; | |
106 m_crFill = crFill; | |
107 return FWL_ERR_Succeeded; | |
108 } | |
109 FX_BOOL CFWL_CaretImp::DrawCaretBK(CFX_Graphics* pGraphics, | |
110 IFWL_ThemeProvider* pTheme, | |
111 const CFX_Matrix* pMatrix) { | |
112 CFX_RectF rect; | |
113 GetWidgetRect(rect); | |
114 rect.Set(0, 0, rect.width, rect.height); | |
115 CFWL_ThemeBackground param; | |
116 param.m_pWidget = m_pInterface; | |
117 param.m_pGraphics = pGraphics; | |
118 param.m_rtPart = rect; | |
119 if (m_bSetColor) { | |
120 param.m_pData = &m_crFill; | |
121 } | |
122 if (!(m_pProperties->m_dwStates & FWL_STATE_CAT_HightLight)) { | |
123 return FWL_ERR_Succeeded; | |
124 } | |
125 param.m_iPart = FWL_PART_CAT_Background; | |
126 param.m_dwStates = FWL_PARTSTATE_CAT_HightLight; | |
127 if (pMatrix) { | |
128 param.m_matrix.Concat(*pMatrix); | |
129 } | |
130 pTheme->DrawBackground(¶m); | |
131 return FWL_ERR_Succeeded; | |
132 } | |
133 | |
134 CFWL_CaretImp::CFWL_CaretTimer::CFWL_CaretTimer(CFWL_CaretImp* pCaret) | |
135 : m_pCaret(pCaret) {} | |
136 | |
137 int32_t CFWL_CaretImp::CFWL_CaretTimer::Run(FWL_HTIMER hTimer) { | |
138 if (m_pCaret->GetStates() & FWL_STATE_CAT_HightLight) { | |
139 m_pCaret->SetStates(FWL_STATE_CAT_HightLight, FALSE); | |
140 } else { | |
141 m_pCaret->SetStates(FWL_STATE_CAT_HightLight); | |
142 } | |
143 CFX_RectF rt; | |
144 m_pCaret->GetWidgetRect(rt); | |
145 rt.Set(0, 0, rt.width + 1, rt.height); | |
146 m_pCaret->Repaint(&rt); | |
147 return 1; | |
148 } | |
149 CFWL_CaretImpDelegate::CFWL_CaretImpDelegate(CFWL_CaretImp* pOwner) | |
150 : m_pOwner(pOwner) {} | |
151 int32_t CFWL_CaretImpDelegate::OnProcessMessage(CFWL_Message* pMessage) { | |
152 return 1; | |
153 } | |
154 FWL_ERR CFWL_CaretImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics, | |
155 const CFX_Matrix* pMatrix) { | |
156 return m_pOwner->DrawWidget(pGraphics, pMatrix); | |
157 } | |
OLD | NEW |