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
25 #include "wine/debug.h"
35 #include "msctf_internal.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(msctf
);
39 typedef struct tagRange
{
40 ITfRange ITfRange_iface
;
41 /* const ITfRangeACPVtb *RangeACPVtbl; */
44 ITextStoreACP
*pITextStoreACP
;
45 ITfContext
*pITfContext
;
48 TfGravity gravityStart
, gravityEnd
;
49 DWORD anchorStart
, anchorEnd
;
53 static inline Range
*impl_from_ITfRange(ITfRange
*iface
)
55 return CONTAINING_RECORD(iface
, Range
, ITfRange_iface
);
58 static void Range_Destructor(Range
*This
)
60 TRACE("destroying %p\n", This
);
61 HeapFree(GetProcessHeap(),0,This
);
64 static HRESULT WINAPI
Range_QueryInterface(ITfRange
*iface
, REFIID iid
, LPVOID
*ppvOut
)
66 Range
*This
= impl_from_ITfRange(iface
);
69 if (IsEqualIID(iid
, &IID_IUnknown
) || IsEqualIID(iid
, &IID_ITfRange
))
71 *ppvOut
= &This
->ITfRange_iface
;
76 ITfRange_AddRef(iface
);
80 WARN("unsupported interface: %s\n", debugstr_guid(iid
));
84 static ULONG WINAPI
Range_AddRef(ITfRange
*iface
)
86 Range
*This
= impl_from_ITfRange(iface
);
87 return InterlockedIncrement(&This
->refCount
);
90 static ULONG WINAPI
Range_Release(ITfRange
*iface
)
92 Range
*This
= impl_from_ITfRange(iface
);
95 ret
= InterlockedDecrement(&This
->refCount
);
97 Range_Destructor(This
);
101 /*****************************************************
103 *****************************************************/
105 static HRESULT WINAPI
Range_GetText(ITfRange
*iface
, TfEditCookie ec
,
106 DWORD dwFlags
, WCHAR
*pchText
, ULONG cchMax
, ULONG
*pcch
)
108 Range
*This
= impl_from_ITfRange(iface
);
109 FIXME("STUB:(%p)\n",This
);
113 static HRESULT WINAPI
Range_SetText(ITfRange
*iface
, TfEditCookie ec
,
114 DWORD dwFlags
, const WCHAR
*pchText
, LONG cch
)
116 Range
*This
= impl_from_ITfRange(iface
);
117 FIXME("STUB:(%p)\n",This
);
121 static HRESULT WINAPI
Range_GetFormattedText(ITfRange
*iface
, TfEditCookie ec
,
122 IDataObject
**ppDataObject
)
124 Range
*This
= impl_from_ITfRange(iface
);
125 FIXME("STUB:(%p)\n",This
);
129 static HRESULT WINAPI
Range_GetEmbedded(ITfRange
*iface
, TfEditCookie ec
,
130 REFGUID rguidService
, REFIID riid
, IUnknown
**ppunk
)
132 Range
*This
= impl_from_ITfRange(iface
);
133 FIXME("STUB:(%p)\n",This
);
137 static HRESULT WINAPI
Range_InsertEmbedded(ITfRange
*iface
, TfEditCookie ec
,
138 DWORD dwFlags
, IDataObject
*pDataObject
)
140 Range
*This
= impl_from_ITfRange(iface
);
141 FIXME("STUB:(%p)\n",This
);
145 static HRESULT WINAPI
Range_ShiftStart(ITfRange
*iface
, TfEditCookie ec
,
146 LONG cchReq
, LONG
*pcch
, const TF_HALTCOND
*pHalt
)
148 Range
*This
= impl_from_ITfRange(iface
);
149 FIXME("STUB:(%p)\n",This
);
153 static HRESULT WINAPI
Range_ShiftEnd(ITfRange
*iface
, TfEditCookie ec
,
154 LONG cchReq
, LONG
*pcch
, const TF_HALTCOND
*pHalt
)
156 Range
*This
= impl_from_ITfRange(iface
);
157 FIXME("STUB:(%p)\n",This
);
161 static HRESULT WINAPI
Range_ShiftStartToRange(ITfRange
*iface
, TfEditCookie ec
,
162 ITfRange
*pRange
, TfAnchor aPos
)
164 Range
*This
= impl_from_ITfRange(iface
);
165 FIXME("STUB:(%p)\n",This
);
169 static HRESULT WINAPI
Range_ShiftEndToRange(ITfRange
*iface
, TfEditCookie ec
,
170 ITfRange
*pRange
, TfAnchor aPos
)
172 Range
*This
= impl_from_ITfRange(iface
);
173 FIXME("STUB:(%p)\n",This
);
177 static HRESULT WINAPI
Range_ShiftStartRegion(ITfRange
*iface
, TfEditCookie ec
,
178 TfShiftDir dir
, BOOL
*pfNoRegion
)
180 Range
*This
= impl_from_ITfRange(iface
);
181 FIXME("STUB:(%p)\n",This
);
185 static HRESULT WINAPI
Range_ShiftEndRegion(ITfRange
*iface
, TfEditCookie ec
,
186 TfShiftDir dir
, BOOL
*pfNoRegion
)
188 Range
*This
= impl_from_ITfRange(iface
);
189 FIXME("STUB:(%p)\n",This
);
193 static HRESULT WINAPI
Range_IsEmpty(ITfRange
*iface
, TfEditCookie ec
,
196 Range
*This
= impl_from_ITfRange(iface
);
197 FIXME("STUB:(%p)\n",This
);
201 static HRESULT WINAPI
Range_Collapse(ITfRange
*iface
, TfEditCookie ec
,
204 Range
*This
= impl_from_ITfRange(iface
);
205 TRACE("(%p) %i %i\n",This
,ec
,aPos
);
209 case TF_ANCHOR_START
:
210 This
->anchorEnd
= This
->anchorStart
;
213 This
->anchorStart
= This
->anchorEnd
;
222 static HRESULT WINAPI
Range_IsEqualStart(ITfRange
*iface
, TfEditCookie ec
,
223 ITfRange
*pWith
, TfAnchor aPos
, BOOL
*pfEqual
)
225 Range
*This
= impl_from_ITfRange(iface
);
226 FIXME("STUB:(%p)\n",This
);
230 static HRESULT WINAPI
Range_IsEqualEnd(ITfRange
*iface
, TfEditCookie ec
,
231 ITfRange
*pWith
, TfAnchor aPos
, BOOL
*pfEqual
)
233 Range
*This
= impl_from_ITfRange(iface
);
234 FIXME("STUB:(%p)\n",This
);
238 static HRESULT WINAPI
Range_CompareStart(ITfRange
*iface
, TfEditCookie ec
,
239 ITfRange
*pWith
, TfAnchor aPos
, LONG
*plResult
)
241 Range
*This
= impl_from_ITfRange(iface
);
242 FIXME("STUB:(%p)\n",This
);
246 static HRESULT WINAPI
Range_CompareEnd(ITfRange
*iface
, TfEditCookie ec
,
247 ITfRange
*pWith
, TfAnchor aPos
, LONG
*plResult
)
249 Range
*This
= impl_from_ITfRange(iface
);
250 FIXME("STUB:(%p)\n",This
);
254 static HRESULT WINAPI
Range_AdjustForInsert(ITfRange
*iface
, TfEditCookie ec
,
255 ULONG cchInsert
, BOOL
*pfInsertOk
)
257 Range
*This
= impl_from_ITfRange(iface
);
258 FIXME("STUB:(%p)\n",This
);
262 static HRESULT WINAPI
Range_GetGravity(ITfRange
*iface
,
263 TfGravity
*pgStart
, TfGravity
*pgEnd
)
265 Range
*This
= impl_from_ITfRange(iface
);
266 FIXME("STUB:(%p)\n",This
);
270 static HRESULT WINAPI
Range_SetGravity(ITfRange
*iface
, TfEditCookie ec
,
271 TfGravity gStart
, TfGravity gEnd
)
273 Range
*This
= impl_from_ITfRange(iface
);
274 FIXME("STUB:(%p)\n",This
);
278 static HRESULT WINAPI
Range_Clone(ITfRange
*iface
, ITfRange
**ppClone
)
280 Range
*This
= impl_from_ITfRange(iface
);
281 FIXME("STUB:(%p)\n",This
);
285 static HRESULT WINAPI
Range_GetContext(ITfRange
*iface
, ITfContext
**ppContext
)
287 Range
*This
= impl_from_ITfRange(iface
);
288 TRACE("(%p)\n",This
);
291 *ppContext
= This
->pITfContext
;
295 static const ITfRangeVtbl Range_RangeVtbl
=
297 Range_QueryInterface
,
303 Range_GetFormattedText
,
305 Range_InsertEmbedded
,
308 Range_ShiftStartToRange
,
309 Range_ShiftEndToRange
,
310 Range_ShiftStartRegion
,
311 Range_ShiftEndRegion
,
318 Range_AdjustForInsert
,
325 HRESULT
Range_Constructor(ITfContext
*context
, ITextStoreACP
*textstore
, DWORD lockType
, DWORD anchorStart
, DWORD anchorEnd
, ITfRange
**ppOut
)
329 This
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(Range
));
331 return E_OUTOFMEMORY
;
333 TRACE("(%p) %p %p\n",This
, context
, textstore
);
335 This
->ITfRange_iface
.lpVtbl
= &Range_RangeVtbl
;
337 This
->pITfContext
= context
;
338 This
->pITextStoreACP
= textstore
;
339 This
->lockType
= lockType
;
340 This
->anchorStart
= anchorStart
;
341 This
->anchorEnd
= anchorEnd
;
343 *ppOut
= &This
->ITfRange_iface
;
344 TRACE("returning %p\n", *ppOut
);
349 /* Internal conversion functions */
351 HRESULT
TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION
*tf
, TS_SELECTION_ACP
*tsAcp
)
355 if (!tf
|| !tsAcp
|| !tf
->range
)
358 This
= impl_from_ITfRange(tf
->range
);
360 tsAcp
->acpStart
= This
->anchorStart
;
361 tsAcp
->acpEnd
= This
->anchorEnd
;
362 tsAcp
->style
.ase
= tf
->style
.ase
;
363 tsAcp
->style
.fInterimChar
= tf
->style
.fInterimChar
;