ReactOS 0.4.16-dev-1311-g81a4d83
range.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CTF
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: ITfRangeACP implementation
5 * COPYRIGHT: Copyright 2009 Aric Stewart, CodeWeavers
6 * Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include <initguid.h>
10#include <windef.h>
11#include <winbase.h>
12#include <winreg.h>
13#include <msctf.h>
14#include <msctf_undoc.h>
15
16// Cicero
17#include <cicbase.h>
18#include <cicreg.h>
19#include <cicutb.h>
20
21class CInputContext;
22#include "range.h"
23#include "msctf_internal.h"
24
25#include <wine/debug.h>
27
29// CRange
30
33 _In_ ITextStoreACP *textstore,
34 _In_ DWORD lockType,
35 _In_ TfAnchor anchorStart,
36 _In_ TfAnchor anchorEnd
37)
38 : m_pContext(context)
39 , m_pTextStore(textstore)
40 , m_dwLockType(lockType)
41 , m_anchorStart(anchorStart)
42 , m_anchorEnd(anchorEnd)
43 , m_dwCookie(MAXDWORD)
44 , m_cRefs(1)
45{
46}
47
49{
50}
51
53{
56 if (!pRange)
57 return NULL;
58 pRange->m_dwCookie = m_dwCookie;
59 return pRange;
60}
61
63{
64 return E_NOTIMPL;
65}
66
68 TfEditCookie ec,
69 BOOL bEnd,
70 ITfRange *pWidth,
71 TfAnchor aPos,
72 LONG *plResult)
73{
74 return E_NOTIMPL;
75}
76
78{
79 if (!tf || !tsAcp || !tf->range)
80 {
81 ERR("E_INVALIDARG: %p, %p, %p\n", tf, tsAcp, tf->range);
82 return E_INVALIDARG;
83 }
84
85 CRange *This = static_cast<CRange *>(static_cast<ITfRangeACP *>(tf->range));
86 tsAcp->acpStart = This->m_anchorStart;
87 tsAcp->acpEnd = This->m_anchorEnd;
88 tsAcp->style.ase = static_cast<TsActiveSelEnd>(tf->style.ase);
89 tsAcp->style.fInterimChar = tf->style.fInterimChar;
90 return S_OK;
91}
92
94// ** IUnknown methods **
95
97{
98 if (IsEqualGUID(riid, IID_PRIV_CRANGE))
99 {
100 *ppvObj = this;
101 return S_OK; // No AddRef
102 }
103
104 if (IsEqualGUID(riid, IID_ITfRange) || IsEqualGUID(riid, IID_IUnknown))
105 *ppvObj = this;
106 else if (IsEqualGUID(riid, IID_ITfRangeACP))
107 *ppvObj = static_cast<ITfRangeACP *>(this);
108 else if (IsEqualGUID(riid, IID_ITfRangeAnchor))
109 *ppvObj = static_cast<ITfRangeAnchor *>(this);
110 else if (IsEqualGUID(riid, IID_ITfSource))
111 *ppvObj = static_cast<ITfSource *>(this);
112 else
113 *ppvObj = NULL;
114
115 if (*ppvObj)
116 {
117 AddRef();
118 return S_OK;
119 }
120
121 ERR("E_NOINTERFACE: %s\n", wine_dbgstr_guid(&riid));
122 return E_NOINTERFACE;
123}
124
126{
127 TRACE("%p -> ()\n", this);
129}
130
132{
133 TRACE("%p -> ()\n", this);
134 if (InterlockedDecrement(&m_cRefs) == 0)
135 {
136 delete this;
137 return 0;
138 }
139 return m_cRefs;
140}
141
143// ** ITfRange methods **
144
148 _Out_ WCHAR *pchText,
150 _Out_ ULONG *pcch)
151{
152 FIXME("\n");
153 return E_NOTIMPL;
154}
155
159 _In_ const WCHAR *pchText,
160 _In_ LONG cch)
161{
162 FIXME("\n");
163 return E_NOTIMPL;
164}
165
168 _Out_ IDataObject **ppDataObject)
169{
170 FIXME("\n");
171 return E_NOTIMPL;
172}
173
176 _In_ REFGUID rguidService,
178 _Out_ IUnknown **ppunk)
179{
180 FIXME("\n");
181 return E_NOTIMPL;
182}
183
187 _In_ IDataObject *pDataObject)
188{
189 FIXME("\n");
190 return E_NOTIMPL;
191}
192
195 _In_ LONG cchReq,
196 _Out_ LONG *pcch,
197 _In_ const TF_HALTCOND *pHalt)
198{
199 FIXME("\n");
200 return E_NOTIMPL;
201}
202
205 _In_ LONG cchReq,
206 _Out_ LONG *pcch,
207 _In_ const TF_HALTCOND *pHalt)
208{
209 FIXME("\n");
210 return E_NOTIMPL;
211}
212
215 _In_ ITfRange *pRange,
216 _In_ TfAnchor aPos)
217{
218 FIXME("\n");
219 return E_NOTIMPL;
220}
221
224 _In_ ITfRange *pRange,
225 _In_ TfAnchor aPos)
226{
227 FIXME("\n");
228 return E_NOTIMPL;
229}
230
234 _Out_ BOOL *pfNoRegion)
235{
236 FIXME("\n");
237 return E_NOTIMPL;
238}
239
243 _Out_ BOOL *pfNoRegion)
244{
245 FIXME("\n");
246 return E_NOTIMPL;
247}
248
251 _Out_ BOOL *pfEmpty)
252{
253 TRACE("(%d, %p)\n", ec, pfEmpty);
254 return IsEqualStart(ec, static_cast<ITfRangeACP *>(this), TF_ANCHOR_END, pfEmpty);
255}
256
259 _In_ TfAnchor aPos)
260{
261 FIXME("\n");
262 return E_NOTIMPL;
263}
264
267 _In_ ITfRange *pWith,
268 _In_ TfAnchor aPos,
269 _Out_ BOOL *pfEqual)
270{
271 FIXME("\n");
272 return _IsEqualX(ec, FALSE, pWith, aPos, pfEqual);
273}
274
277 _In_ ITfRange *pWith,
278 _In_ TfAnchor aPos,
279 _Out_ BOOL *pfEqual)
280{
281 FIXME("\n");
282 return _IsEqualX(ec, TRUE, pWith, aPos, pfEqual);
283}
284
287 _In_ ITfRange *pWith,
288 _In_ TfAnchor aPos,
289 _Out_ LONG *plResult)
290{
291 FIXME("\n");
292 return E_NOTIMPL;
293}
294
297 _In_ ITfRange *pWith,
298 _In_ TfAnchor aPos,
299 _Out_ LONG *plResult)
300{
301 FIXME("\n");
302 return E_NOTIMPL;
303}
304
307 _In_ ULONG cchInsert,
308 _Out_ BOOL *pfInsertOk)
309{
310 FIXME("\n");
311 return E_NOTIMPL;
312}
313
315 _Out_ TfGravity *pgStart,
316 _Out_ TfGravity *pgEnd)
317{
318 FIXME("\n");
319 return E_NOTIMPL;
320}
321
324 _In_ TfGravity gStart,
325 _In_ TfGravity gEnd)
326{
327 FIXME("\n");
328 return E_NOTIMPL;
329}
330
332 _Out_ ITfRange **ppClone)
333{
334 TRACE("%p\n", ppClone);
335
336 if (!ppClone)
337 return E_INVALIDARG;
338
339 CRange *pCloned = _Clone();
340 if (!pCloned)
341 return E_OUTOFMEMORY;
342
343 *ppClone = static_cast<ITfRangeACP *>(pCloned);
344 return S_OK;
345}
346
348 _Out_ ITfContext **ppContext)
349{
350 FIXME("%p\n", ppContext);
351 return E_NOTIMPL;
352}
353
355// ** ITfRangeACP methods **
356
358{
359 FIXME("\n");
360 return E_NOTIMPL;
361}
362
364{
365 FIXME("\n");
366 return E_NOTIMPL;
367}
368
370// ** ITfRangeAnchor methods **
371
373{
374 FIXME("\n");
375 return E_NOTIMPL;
376}
377
379{
380 FIXME("\n");
381 return E_NOTIMPL;
382}
383
385// ** ITfSource methods **
386
389 _In_ IUnknown *punk,
390 _Out_ DWORD *pdwCookie)
391{
392 FIXME("\n");
393 return E_NOTIMPL;
394}
395
397 _In_ DWORD dwCookie)
398{
399 FIXME("\n");
400 return E_NOTIMPL;
401}
402
404
408 DWORD lockType, DWORD anchorStart, DWORD anchorEnd, ITfRange **ppOut)
409{
410 CRange *This = new(cicNoThrow) CRange(context, textstore, lockType,
411 (TfAnchor)anchorStart, (TfAnchor)anchorEnd);
412 if (!This)
413 return E_OUTOFMEMORY;
414
415 *ppOut = static_cast<ITfRangeACP *>(This);
416 return S_OK;
417}
418
419/* Internal conversion functions */
420
423{
425}
UINT cchMax
unsigned int dir
Definition: maze.c:112
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHODIMP_(t)
Definition: basetyps.h:44
const GUID IID_IUnknown
#define cicNoThrow
Definition: cicbase.h:34
Definition: range.h:9
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj) override
Definition: range.cpp:96
CRange * _Clone()
Definition: range.cpp:52
STDMETHODIMP Clone(_Out_ ITfRange **ppClone) override
Definition: range.cpp:331
STDMETHODIMP ShiftStart(_In_ TfEditCookie ec, _In_ LONG cchReq, _Out_ LONG *pcch, _In_ const TF_HALTCOND *pHalt) override
Definition: range.cpp:193
LONG m_cRefs
Definition: range.h:17
STDMETHODIMP Collapse(_In_ TfEditCookie ec, _In_ TfAnchor aPos) override
Definition: range.cpp:257
STDMETHODIMP SetGravity(_In_ TfEditCookie ec, _In_ TfGravity gStart, _In_ TfGravity gEnd) override
Definition: range.cpp:322
STDMETHODIMP GetContext(_Out_ ITfContext **ppContext) override
Definition: range.cpp:347
STDMETHODIMP CompareEnd(_In_ TfEditCookie ec, _In_ ITfRange *pWith, _In_ TfAnchor aPos, _Out_ LONG *plResult) override
Definition: range.cpp:295
STDMETHODIMP ShiftEnd(_In_ TfEditCookie ec, _In_ LONG cchReq, _Out_ LONG *pcch, _In_ const TF_HALTCOND *pHalt) override
Definition: range.cpp:203
STDMETHODIMP ShiftEndToRange(_In_ TfEditCookie ec, _In_ ITfRange *pRange, _In_ TfAnchor aPos) override
Definition: range.cpp:222
STDMETHODIMP AdviseSink(_In_ REFIID riid, _In_ IUnknown *punk, _Out_ DWORD *pdwCookie) override
Definition: range.cpp:387
ITextStoreACP * m_pTextStore
Definition: range.h:12
STDMETHODIMP IsEmpty(_In_ TfEditCookie ec, _Out_ BOOL *pfEmpty) override
Definition: range.cpp:249
STDMETHODIMP UnadviseSink(_In_ DWORD dwCookie) override
Definition: range.cpp:396
STDMETHODIMP ShiftEndRegion(_In_ TfEditCookie ec, _In_ TfShiftDir dir, _Out_ BOOL *pfNoRegion) override
Definition: range.cpp:240
STDMETHODIMP SetExtent(_In_ LONG acpAnchor, _In_ LONG cch) override
Definition: range.cpp:363
STDMETHODIMP CompareStart(_In_ TfEditCookie ec, _In_ ITfRange *pWith, _In_ TfAnchor aPos, _Out_ LONG *plResult) override
Definition: range.cpp:285
CRange(_In_ ITfContext *context, _In_ ITextStoreACP *textstore, _In_ DWORD lockType, _In_ TfAnchor anchorStart, _In_ TfAnchor anchorEnd)
Definition: range.cpp:31
DWORD m_dwLockType
Definition: range.h:13
static HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp)
Definition: range.cpp:77
STDMETHODIMP ShiftStartRegion(_In_ TfEditCookie ec, _In_ TfShiftDir dir, _Out_ BOOL *pfNoRegion) override
Definition: range.cpp:231
STDMETHODIMP GetFormattedText(_In_ TfEditCookie ec, _Out_ IDataObject **ppDataObject) override
Definition: range.cpp:166
STDMETHODIMP ShiftStartToRange(_In_ TfEditCookie ec, _In_ ITfRange *pRange, _In_ TfAnchor aPos) override
Definition: range.cpp:213
STDMETHODIMP GetEmbedded(_In_ TfEditCookie ec, _In_ REFGUID rguidService, _In_ REFIID riid, _Out_ IUnknown **ppunk) override
Definition: range.cpp:174
HRESULT _CompareX(TfEditCookie ec, BOOL bEnd, ITfRange *pWidth, TfAnchor aPos, LONG *plResult)
Definition: range.cpp:67
TfAnchor m_anchorStart
Definition: range.h:14
STDMETHODIMP GetGravity(_Out_ TfGravity *pgStart, _Out_ TfGravity *pgEnd) override
Definition: range.cpp:314
STDMETHODIMP IsEqualEnd(_In_ TfEditCookie ec, _In_ ITfRange *pWith, _In_ TfAnchor aPos, _Out_ BOOL *pfEqual) override
Definition: range.cpp:275
ITfContext * m_pContext
Definition: range.h:11
STDMETHODIMP InsertEmbedded(_In_ TfEditCookie ec, _In_ DWORD dwFlags, _In_ IDataObject *pDataObject) override
Definition: range.cpp:184
HRESULT _IsEqualX(TfEditCookie ec, BOOL bEnd, ITfRange *pWith, TfAnchor aPos, BOOL *pfEqual)
Definition: range.cpp:62
STDMETHODIMP IsEqualStart(_In_ TfEditCookie ec, _In_ ITfRange *pWith, _In_ TfAnchor aPos, _Out_ BOOL *pfEqual) override
Definition: range.cpp:265
STDMETHODIMP GetText(_In_ TfEditCookie ec, _In_ DWORD dwFlags, _Out_ WCHAR *pchText, _In_ ULONG cchMax, _Out_ ULONG *pcch) override
Definition: range.cpp:145
DWORD m_dwCookie
Definition: range.h:16
STDMETHODIMP SetText(_In_ TfEditCookie ec, _In_ DWORD dwFlags, _In_ const WCHAR *pchText, _In_ LONG cch) override
Definition: range.cpp:156
virtual ~CRange()
Definition: range.cpp:48
STDMETHODIMP GetExtent(_Out_ LONG *pacpAnchor, _Out_ LONG *pcch) override
Definition: range.cpp:357
STDMETHODIMP AdjustForInsert(_In_ TfEditCookie ec, _In_ ULONG cchInsert, _Out_ BOOL *pfInsertOk) override
Definition: range.cpp:305
TfAnchor m_anchorEnd
Definition: range.h:15
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
HFONT tf
Definition: icontest.c:17
REFIID riid
Definition: atlbase.h:39
ULONG AddRef()
ULONG Release()
#define S_OK
Definition: intsafe.h:52
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
TfAnchor
Definition: msctf.idl:153
@ TF_ANCHOR_END
Definition: msctf.idl:153
DWORD TfEditCookie
Definition: msctf.idl:86
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define MAXDWORD
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
EXTERN_C HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp)
Definition: range.cpp:422
EXTERN_C HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD lockType, DWORD anchorStart, DWORD anchorEnd, ITfRange **ppOut)
Definition: range.cpp:407
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define TRACE(s)
Definition: solgame.cpp:4
TsActiveSelEnd ase
Definition: textstor.idl:86
TS_SELECTIONSTYLE style
Definition: textstor.idl:94
Definition: scsiwmi.h:51
Definition: http.c:7252
TsActiveSelEnd
Definition: textstor.idl:67
uint32_t ULONG
Definition: typedefs.h:59
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define E_NOINTERFACE
Definition: winerror.h:2364
__wchar_t WCHAR
Definition: xmlstorage.h:180