xref: /reactos/sdk/lib/cicero/ciccaret.cpp (revision fc3eeb61)
1 /*
2  * PROJECT:     ReactOS Cicero
3  * LICENSE:     LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4  * PURPOSE:     Displaying Cicero caret
5  * COPYRIGHT:   Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6  */
7 
8 #include "precomp.h"
9 #include "ciccaret.h"
10 
11 /**
12  * @implemented
13  */
CicCaret()14 CicCaret::CicCaret()
15 {
16     m_bCaretBlinking = FALSE;
17     m_bCaretVisible = FALSE;
18     m_uCaretBlinkTimerID = 0;
19     m_pt.x = m_pt.y = 0;
20     m_size.cx = m_size.cy = 0;
21 }
22 
23 /**
24  * @implemented
25  */
~CicCaret()26 CicCaret::~CicCaret()
27 {
28     HideCaret();
29     ::KillTimer(m_hWnd, m_uCaretBlinkTimerID);
30     m_uCaretBlinkTimerID = 0;
31 }
32 
33 /**
34  * @implemented
35  */
CreateCaret(HWND hWnd,SIZE size)36 void CicCaret::CreateCaret(HWND hWnd, SIZE size)
37 {
38     m_hWnd = hWnd;
39     m_size = size;
40     if (::IsWindow(hWnd))
41         m_uCaretBlinkTimerID = ::SetTimer(m_hWnd, TIMER_ID, ::GetCaretBlinkTime(), NULL);
42 }
43 
44 /**
45  * @implemented
46  */
DestroyCaret()47 void CicCaret::DestroyCaret()
48 {
49     HideCaret();
50     ::KillTimer(m_hWnd, m_uCaretBlinkTimerID);
51     m_uCaretBlinkTimerID = 0;
52 }
53 
54 /**
55  * @implemented
56  */
HideCaret()57 void CicCaret::HideCaret()
58 {
59     if (m_bCaretVisible)
60     {
61         m_bCaretVisible = FALSE;
62         InvertCaret();
63     }
64     m_bCaretBlinking = FALSE;
65 }
66 
67 /**
68  * @implemented
69  */
InvertCaret()70 void CicCaret::InvertCaret()
71 {
72     HDC hDC = ::GetDC(m_hWnd);
73     ::PatBlt(hDC, m_pt.x, m_pt.y, m_size.cx, m_size.cy, DSTINVERT);
74     ::ReleaseDC(m_hWnd, hDC);
75 }
76 
77 /**
78  * @implemented
79  */
OnTimer()80 void CicCaret::OnTimer()
81 {
82     if (m_bCaretBlinking)
83     {
84         m_bCaretVisible = !m_bCaretVisible;
85         InvertCaret();
86     }
87 }
88 
89 /**
90  * @implemented
91  */
SetCaretPos(POINT pt)92 void CicCaret::SetCaretPos(POINT pt)
93 {
94     BOOL bCaretVisible = m_bCaretVisible;
95     if (bCaretVisible)
96         InvertCaret();
97 
98     m_pt = pt;
99 
100     if (bCaretVisible)
101         InvertCaret();
102 }
103 
104 /**
105  * @implemented
106  */
SetBlinking(BOOL bBlinking)107 void CicCaret::SetBlinking(BOOL bBlinking)
108 {
109     m_bCaretBlinking = bBlinking;
110 }
111