2 * ITfRange implementation
4 * Copyright 2009 Aric Stewart, CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "msctf_internal.h"
23 typedef struct tagRange
{
24 ITfRange ITfRange_iface
;
25 /* const ITfRangeACPVtb *RangeACPVtbl; */
28 ITextStoreACP
*pITextStoreACP
;
29 ITfContext
*pITfContext
;
32 TfGravity gravityStart
, gravityEnd
;
33 DWORD anchorStart
, anchorEnd
;
37 static inline Range
*impl_from_ITfRange(ITfRange
*iface
)
39 return CONTAINING_RECORD(iface
, Range
, ITfRange_iface
);
42 static void Range_Destructor(Range
*This
)
44 TRACE("destroying %p\n", This
);
45 HeapFree(GetProcessHeap(),0,This
);
48 static HRESULT WINAPI
Range_QueryInterface(ITfRange
*iface
, REFIID iid
, LPVOID
*ppvOut
)
50 Range
*This
= impl_from_ITfRange(iface
);
53 if (IsEqualIID(iid
, &IID_IUnknown
) || IsEqualIID(iid
, &IID_ITfRange
))
55 *ppvOut
= &This
->ITfRange_iface
;
60 ITfRange_AddRef(iface
);
64 WARN("unsupported interface: %s\n", debugstr_guid(iid
));
68 static ULONG WINAPI
Range_AddRef(ITfRange
*iface
)
70 Range
*This
= impl_from_ITfRange(iface
);
71 return InterlockedIncrement(&This
->refCount
);
74 static ULONG WINAPI
Range_Release(ITfRange
*iface
)
76 Range
*This
= impl_from_ITfRange(iface
);
79 ret
= InterlockedDecrement(&This
->refCount
);
81 Range_Destructor(This
);
85 /*****************************************************
87 *****************************************************/
89 static HRESULT WINAPI
Range_GetText(ITfRange
*iface
, TfEditCookie ec
,
90 DWORD dwFlags
, WCHAR
*pchText
, ULONG cchMax
, ULONG
*pcch
)
92 Range
*This
= impl_from_ITfRange(iface
);
93 FIXME("STUB:(%p)\n",This
);
97 static HRESULT WINAPI
Range_SetText(ITfRange
*iface
, TfEditCookie ec
,
98 DWORD dwFlags
, const WCHAR
*pchText
, LONG cch
)
100 Range
*This
= impl_from_ITfRange(iface
);
101 FIXME("STUB:(%p)\n",This
);
105 static HRESULT WINAPI
Range_GetFormattedText(ITfRange
*iface
, TfEditCookie ec
,
106 IDataObject
**ppDataObject
)
108 Range
*This
= impl_from_ITfRange(iface
);
109 FIXME("STUB:(%p)\n",This
);
113 static HRESULT WINAPI
Range_GetEmbedded(ITfRange
*iface
, TfEditCookie ec
,
114 REFGUID rguidService
, REFIID riid
, IUnknown
**ppunk
)
116 Range
*This
= impl_from_ITfRange(iface
);
117 FIXME("STUB:(%p)\n",This
);
121 static HRESULT WINAPI
Range_InsertEmbedded(ITfRange
*iface
, TfEditCookie ec
,
122 DWORD dwFlags
, IDataObject
*pDataObject
)
124 Range
*This
= impl_from_ITfRange(iface
);
125 FIXME("STUB:(%p)\n",This
);
129 static HRESULT WINAPI
Range_ShiftStart(ITfRange
*iface
, TfEditCookie ec
,
130 LONG cchReq
, LONG
*pcch
, const TF_HALTCOND
*pHalt
)
132 Range
*This
= impl_from_ITfRange(iface
);
133 FIXME("STUB:(%p)\n",This
);
137 static HRESULT WINAPI
Range_ShiftEnd(ITfRange
*iface
, TfEditCookie ec
,
138 LONG cchReq
, LONG
*pcch
, const TF_HALTCOND
*pHalt
)
140 Range
*This
= impl_from_ITfRange(iface
);
141 FIXME("STUB:(%p)\n",This
);
145 static HRESULT WINAPI
Range_ShiftStartToRange(ITfRange
*iface
, TfEditCookie ec
,
146 ITfRange
*pRange
, TfAnchor aPos
)
148 Range
*This
= impl_from_ITfRange(iface
);
149 FIXME("STUB:(%p)\n",This
);
153 static HRESULT WINAPI
Range_ShiftEndToRange(ITfRange
*iface
, TfEditCookie ec
,
154 ITfRange
*pRange
, TfAnchor aPos
)
156 Range
*This
= impl_from_ITfRange(iface
);
157 FIXME("STUB:(%p)\n",This
);
161 static HRESULT WINAPI
Range_ShiftStartRegion(ITfRange
*iface
, TfEditCookie ec
,
162 TfShiftDir dir
, BOOL
*pfNoRegion
)
164 Range
*This
= impl_from_ITfRange(iface
);
165 FIXME("STUB:(%p)\n",This
);
169 static HRESULT WINAPI
Range_ShiftEndRegion(ITfRange
*iface
, TfEditCookie ec
,
170 TfShiftDir dir
, BOOL
*pfNoRegion
)
172 Range
*This
= impl_from_ITfRange(iface
);
173 FIXME("STUB:(%p)\n",This
);
177 static HRESULT WINAPI
Range_IsEmpty(ITfRange
*iface
, TfEditCookie ec
,
180 Range
*This
= impl_from_ITfRange(iface
);
181 FIXME("STUB:(%p)\n",This
);
185 static HRESULT WINAPI
Range_Collapse(ITfRange
*iface
, TfEditCookie ec
,
188 Range
*This
= impl_from_ITfRange(iface
);
189 TRACE("(%p) %i %i\n",This
,ec
,aPos
);
193 case TF_ANCHOR_START
:
194 This
->anchorEnd
= This
->anchorStart
;
197 This
->anchorStart
= This
->anchorEnd
;
206 static HRESULT WINAPI
Range_IsEqualStart(ITfRange
*iface
, TfEditCookie ec
,
207 ITfRange
*pWith
, TfAnchor aPos
, BOOL
*pfEqual
)
209 Range
*This
= impl_from_ITfRange(iface
);
210 FIXME("STUB:(%p)\n",This
);
214 static HRESULT WINAPI
Range_IsEqualEnd(ITfRange
*iface
, TfEditCookie ec
,
215 ITfRange
*pWith
, TfAnchor aPos
, BOOL
*pfEqual
)
217 Range
*This
= impl_from_ITfRange(iface
);
218 FIXME("STUB:(%p)\n",This
);
222 static HRESULT WINAPI
Range_CompareStart(ITfRange
*iface
, TfEditCookie ec
,
223 ITfRange
*pWith
, TfAnchor aPos
, LONG
*plResult
)
225 Range
*This
= impl_from_ITfRange(iface
);
226 FIXME("STUB:(%p)\n",This
);
230 static HRESULT WINAPI
Range_CompareEnd(ITfRange
*iface
, TfEditCookie ec
,
231 ITfRange
*pWith
, TfAnchor aPos
, LONG
*plResult
)
233 Range
*This
= impl_from_ITfRange(iface
);
234 FIXME("STUB:(%p)\n",This
);
238 static HRESULT WINAPI
Range_AdjustForInsert(ITfRange
*iface
, TfEditCookie ec
,
239 ULONG cchInsert
, BOOL
*pfInsertOk
)
241 Range
*This
= impl_from_ITfRange(iface
);
242 FIXME("STUB:(%p)\n",This
);
246 static HRESULT WINAPI
Range_GetGravity(ITfRange
*iface
,
247 TfGravity
*pgStart
, TfGravity
*pgEnd
)
249 Range
*This
= impl_from_ITfRange(iface
);
250 FIXME("STUB:(%p)\n",This
);
254 static HRESULT WINAPI
Range_SetGravity(ITfRange
*iface
, TfEditCookie ec
,
255 TfGravity gStart
, TfGravity gEnd
)
257 Range
*This
= impl_from_ITfRange(iface
);
258 FIXME("STUB:(%p)\n",This
);
262 static HRESULT WINAPI
Range_Clone(ITfRange
*iface
, ITfRange
**ppClone
)
264 Range
*This
= impl_from_ITfRange(iface
);
265 FIXME("STUB:(%p)\n",This
);
269 static HRESULT WINAPI
Range_GetContext(ITfRange
*iface
, ITfContext
**ppContext
)
271 Range
*This
= impl_from_ITfRange(iface
);
272 TRACE("(%p)\n",This
);
275 *ppContext
= This
->pITfContext
;
279 static const ITfRangeVtbl Range_RangeVtbl
=
281 Range_QueryInterface
,
287 Range_GetFormattedText
,
289 Range_InsertEmbedded
,
292 Range_ShiftStartToRange
,
293 Range_ShiftEndToRange
,
294 Range_ShiftStartRegion
,
295 Range_ShiftEndRegion
,
302 Range_AdjustForInsert
,
309 HRESULT
Range_Constructor(ITfContext
*context
, ITextStoreACP
*textstore
, DWORD lockType
, DWORD anchorStart
, DWORD anchorEnd
, ITfRange
**ppOut
)
313 This
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(Range
));
315 return E_OUTOFMEMORY
;
317 TRACE("(%p) %p %p\n",This
, context
, textstore
);
319 This
->ITfRange_iface
.lpVtbl
= &Range_RangeVtbl
;
321 This
->pITfContext
= context
;
322 This
->pITextStoreACP
= textstore
;
323 This
->lockType
= lockType
;
324 This
->anchorStart
= anchorStart
;
325 This
->anchorEnd
= anchorEnd
;
327 *ppOut
= &This
->ITfRange_iface
;
328 TRACE("returning %p\n", *ppOut
);
333 /* Internal conversion functions */
335 HRESULT
TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION
*tf
, TS_SELECTION_ACP
*tsAcp
)
339 if (!tf
|| !tsAcp
|| !tf
->range
)
342 This
= impl_from_ITfRange(tf
->range
);
344 tsAcp
->acpStart
= This
->anchorStart
;
345 tsAcp
->acpEnd
= This
->anchorEnd
;
346 tsAcp
->style
.ase
= tf
->style
.ase
;
347 tsAcp
->style
.fInterimChar
= tf
->style
.fInterimChar
;