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 #define WIN32_NO_STATUS
23 #define COM_NO_WINDOWS_H
31 #include <wine/debug.h>
35 //#include "winuser.h"
36 //#include "shlwapi.h"
37 //#include "winerror.h"
40 //#include "wine/unicode.h"
43 //#include "msctf_internal.h"
45 WINE_DEFAULT_DEBUG_CHANNEL(msctf
);
47 typedef struct tagRange
{
48 ITfRange ITfRange_iface
;
49 /* const ITfRangeACPVtb *RangeACPVtbl; */
52 ITextStoreACP
*pITextStoreACP
;
53 ITfContext
*pITfContext
;
56 TfGravity gravityStart
, gravityEnd
;
57 DWORD anchorStart
, anchorEnd
;
61 static inline Range
*impl_from_ITfRange(ITfRange
*iface
)
63 return CONTAINING_RECORD(iface
, Range
, ITfRange_iface
);
66 static void Range_Destructor(Range
*This
)
68 TRACE("destroying %p\n", This
);
69 HeapFree(GetProcessHeap(),0,This
);
72 static HRESULT WINAPI
Range_QueryInterface(ITfRange
*iface
, REFIID iid
, LPVOID
*ppvOut
)
74 Range
*This
= impl_from_ITfRange(iface
);
77 if (IsEqualIID(iid
, &IID_IUnknown
) || IsEqualIID(iid
, &IID_ITfRange
))
84 IUnknown_AddRef(iface
);
88 WARN("unsupported interface: %s\n", debugstr_guid(iid
));
92 static ULONG WINAPI
Range_AddRef(ITfRange
*iface
)
94 Range
*This
= impl_from_ITfRange(iface
);
95 return InterlockedIncrement(&This
->refCount
);
98 static ULONG WINAPI
Range_Release(ITfRange
*iface
)
100 Range
*This
= impl_from_ITfRange(iface
);
103 ret
= InterlockedDecrement(&This
->refCount
);
105 Range_Destructor(This
);
109 /*****************************************************
111 *****************************************************/
113 static HRESULT WINAPI
Range_GetText(ITfRange
*iface
, TfEditCookie ec
,
114 DWORD dwFlags
, WCHAR
*pchText
, ULONG cchMax
, ULONG
*pcch
)
116 Range
*This
= impl_from_ITfRange(iface
);
117 FIXME("STUB:(%p)\n",This
);
121 static HRESULT WINAPI
Range_SetText(ITfRange
*iface
, TfEditCookie ec
,
122 DWORD dwFlags
, const WCHAR
*pchText
, LONG cch
)
124 Range
*This
= impl_from_ITfRange(iface
);
125 FIXME("STUB:(%p)\n",This
);
129 static HRESULT WINAPI
Range_GetFormattedText(ITfRange
*iface
, TfEditCookie ec
,
130 IDataObject
**ppDataObject
)
132 Range
*This
= impl_from_ITfRange(iface
);
133 FIXME("STUB:(%p)\n",This
);
137 static HRESULT WINAPI
Range_GetEmbedded(ITfRange
*iface
, TfEditCookie ec
,
138 REFGUID rguidService
, REFIID riid
, IUnknown
**ppunk
)
140 Range
*This
= impl_from_ITfRange(iface
);
141 FIXME("STUB:(%p)\n",This
);
145 static HRESULT WINAPI
Range_InsertEmbedded(ITfRange
*iface
, TfEditCookie ec
,
146 DWORD dwFlags
, IDataObject
*pDataObject
)
148 Range
*This
= impl_from_ITfRange(iface
);
149 FIXME("STUB:(%p)\n",This
);
153 static HRESULT WINAPI
Range_ShiftStart(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_ShiftEnd(ITfRange
*iface
, TfEditCookie ec
,
162 LONG cchReq
, LONG
*pcch
, const TF_HALTCOND
*pHalt
)
164 Range
*This
= impl_from_ITfRange(iface
);
165 FIXME("STUB:(%p)\n",This
);
169 static HRESULT WINAPI
Range_ShiftStartToRange(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_ShiftEndToRange(ITfRange
*iface
, TfEditCookie ec
,
178 ITfRange
*pRange
, TfAnchor aPos
)
180 Range
*This
= impl_from_ITfRange(iface
);
181 FIXME("STUB:(%p)\n",This
);
185 static HRESULT WINAPI
Range_ShiftStartRegion(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_ShiftEndRegion(ITfRange
*iface
, TfEditCookie ec
,
194 TfShiftDir dir
, BOOL
*pfNoRegion
)
196 Range
*This
= impl_from_ITfRange(iface
);
197 FIXME("STUB:(%p)\n",This
);
201 static HRESULT WINAPI
Range_IsEmpty(ITfRange
*iface
, TfEditCookie ec
,
204 Range
*This
= impl_from_ITfRange(iface
);
205 FIXME("STUB:(%p)\n",This
);
209 static HRESULT WINAPI
Range_Collapse(ITfRange
*iface
, TfEditCookie ec
,
212 Range
*This
= impl_from_ITfRange(iface
);
213 TRACE("(%p) %i %i\n",This
,ec
,aPos
);
217 case TF_ANCHOR_START
:
218 This
->anchorEnd
= This
->anchorStart
;
221 This
->anchorStart
= This
->anchorEnd
;
230 static HRESULT WINAPI
Range_IsEqualStart(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_IsEqualEnd(ITfRange
*iface
, TfEditCookie ec
,
239 ITfRange
*pWith
, TfAnchor aPos
, BOOL
*pfEqual
)
241 Range
*This
= impl_from_ITfRange(iface
);
242 FIXME("STUB:(%p)\n",This
);
246 static HRESULT WINAPI
Range_CompareStart(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_CompareEnd(ITfRange
*iface
, TfEditCookie ec
,
255 ITfRange
*pWith
, TfAnchor aPos
, LONG
*plResult
)
257 Range
*This
= impl_from_ITfRange(iface
);
258 FIXME("STUB:(%p)\n",This
);
262 static HRESULT WINAPI
Range_AdjustForInsert(ITfRange
*iface
, TfEditCookie ec
,
263 ULONG cchInsert
, BOOL
*pfInsertOk
)
265 Range
*This
= impl_from_ITfRange(iface
);
266 FIXME("STUB:(%p)\n",This
);
270 static HRESULT WINAPI
Range_GetGravity(ITfRange
*iface
,
271 TfGravity
*pgStart
, TfGravity
*pgEnd
)
273 Range
*This
= impl_from_ITfRange(iface
);
274 FIXME("STUB:(%p)\n",This
);
278 static HRESULT WINAPI
Range_SetGravity(ITfRange
*iface
, TfEditCookie ec
,
279 TfGravity gStart
, TfGravity gEnd
)
281 Range
*This
= impl_from_ITfRange(iface
);
282 FIXME("STUB:(%p)\n",This
);
286 static HRESULT WINAPI
Range_Clone(ITfRange
*iface
, ITfRange
**ppClone
)
288 Range
*This
= impl_from_ITfRange(iface
);
289 FIXME("STUB:(%p)\n",This
);
293 static HRESULT WINAPI
Range_GetContext(ITfRange
*iface
, ITfContext
**ppContext
)
295 Range
*This
= impl_from_ITfRange(iface
);
296 TRACE("(%p)\n",This
);
299 *ppContext
= This
->pITfContext
;
303 static const ITfRangeVtbl Range_RangeVtbl
=
305 Range_QueryInterface
,
311 Range_GetFormattedText
,
313 Range_InsertEmbedded
,
316 Range_ShiftStartToRange
,
317 Range_ShiftEndToRange
,
318 Range_ShiftStartRegion
,
319 Range_ShiftEndRegion
,
326 Range_AdjustForInsert
,
333 HRESULT
Range_Constructor(ITfContext
*context
, ITextStoreACP
*textstore
, DWORD lockType
, DWORD anchorStart
, DWORD anchorEnd
, ITfRange
**ppOut
)
337 This
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(Range
));
339 return E_OUTOFMEMORY
;
341 TRACE("(%p) %p %p\n",This
, context
, textstore
);
343 This
->ITfRange_iface
.lpVtbl
= &Range_RangeVtbl
;
345 This
->pITfContext
= context
;
346 This
->pITextStoreACP
= textstore
;
347 This
->lockType
= lockType
;
348 This
->anchorStart
= anchorStart
;
349 This
->anchorEnd
= anchorEnd
;
351 *ppOut
= &This
->ITfRange_iface
;
352 TRACE("returning %p\n", This
);
357 /* Internal conversion functions */
359 HRESULT
TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION
*tf
, TS_SELECTION_ACP
*tsAcp
)
363 if (!tf
|| !tsAcp
|| !tf
->range
)
366 This
= (Range
*)tf
->range
;
368 tsAcp
->acpStart
= This
->anchorStart
;
369 tsAcp
->acpEnd
= This
->anchorEnd
;
370 tsAcp
->style
.ase
= tf
->style
.ase
;
371 tsAcp
->style
.fInterimChar
= tf
->style
.fInterimChar
;