2 * Copyright 2006 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
32 #include "wine/debug.h"
33 #include "wine/unicode.h"
35 #include "mshtml_private.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
40 const IHTMLTxtRangeVtbl
*lpHTMLTxtRangeVtbl
;
50 #define HTMLTXTRANGE(x) ((IHTMLTxtRange*) &(x)->lpHTMLTxtRangeVtbl)
52 #define HTMLTXTRANGE_THIS(iface) DEFINE_THIS(HTMLTxtRange, HTMLTxtRange, iface)
54 static HRESULT WINAPI
HTMLTxtRange_QueryInterface(IHTMLTxtRange
*iface
, REFIID riid
, void **ppv
)
56 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
60 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
61 TRACE("(%p)->(IID_IUnknown %p)\n", This
, ppv
);
62 *ppv
= HTMLTXTRANGE(This
);
63 }else if(IsEqualGUID(&IID_IDispatch
, riid
)) {
64 TRACE("(%p)->(IID_IDispatch %p)\n", This
, ppv
);
65 *ppv
= HTMLTXTRANGE(This
);
66 }else if(IsEqualGUID(&IID_IHTMLTxtRange
, riid
)) {
67 TRACE("(%p)->(IID_IHTMLTxtRange %p)\n", This
, ppv
);
68 *ppv
= HTMLTXTRANGE(This
);
72 IUnknown_AddRef((IUnknown
*)*ppv
);
76 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
80 static ULONG WINAPI
HTMLTxtRange_AddRef(IHTMLTxtRange
*iface
)
82 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
83 LONG ref
= InterlockedIncrement(&This
->ref
);
85 TRACE("(%p) ref=%d\n", This
, ref
);
90 static ULONG WINAPI
HTMLTxtRange_Release(IHTMLTxtRange
*iface
)
92 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
93 LONG ref
= InterlockedDecrement(&This
->ref
);
95 TRACE("(%p) ref=%d\n", This
, ref
);
99 nsISelection_Release(This
->nsrange
);
101 list_remove(&This
->entry
);
108 static HRESULT WINAPI
HTMLTxtRange_GetTypeInfoCount(IHTMLTxtRange
*iface
, UINT
*pctinfo
)
110 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
111 FIXME("(%p)->(%p)\n", This
, pctinfo
);
115 static HRESULT WINAPI
HTMLTxtRange_GetTypeInfo(IHTMLTxtRange
*iface
, UINT iTInfo
,
116 LCID lcid
, ITypeInfo
**ppTInfo
)
118 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
119 FIXME("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
123 static HRESULT WINAPI
HTMLTxtRange_GetIDsOfNames(IHTMLTxtRange
*iface
, REFIID riid
,
124 LPOLESTR
*rgszNames
, UINT cNames
,
125 LCID lcid
, DISPID
*rgDispId
)
127 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
128 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
,
133 static HRESULT WINAPI
HTMLTxtRange_Invoke(IHTMLTxtRange
*iface
, DISPID dispIdMember
,
134 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
135 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
137 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
138 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
139 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
143 static HRESULT WINAPI
HTMLTxtRange_get_htmlText(IHTMLTxtRange
*iface
, BSTR
*p
)
145 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
147 TRACE("(%p)->(%p)\n", This
, p
);
152 nsIDOMDocumentFragment
*fragment
;
155 nsres
= nsIDOMRange_CloneContents(This
->nsrange
, &fragment
);
156 if(NS_SUCCEEDED(nsres
)) {
157 const PRUnichar
*nstext
;
160 nsAString_Init(&nsstr
, NULL
);
161 nsnode_to_nsstring((nsIDOMNode
*)fragment
, &nsstr
);
162 nsIDOMDocumentFragment_Release(fragment
);
164 nsAString_GetData(&nsstr
, &nstext
, NULL
);
165 *p
= SysAllocString(nstext
);
167 nsAString_Finish(&nsstr
);
172 const WCHAR emptyW
[] = {0};
173 *p
= SysAllocString(emptyW
);
176 TRACE("return %s\n", debugstr_w(*p
));
180 static HRESULT WINAPI
HTMLTxtRange_put_text(IHTMLTxtRange
*iface
, BSTR v
)
182 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
183 nsIDOMDocument
*nsdoc
;
184 nsIDOMText
*text_node
;
188 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
191 return MSHTML_E_NODOC
;
193 nsres
= nsIWebNavigation_GetDocument(This
->doc
->nscontainer
->navigation
, &nsdoc
);
194 if(NS_FAILED(nsres
)) {
195 ERR("GetDocument failed: %08x\n", nsres
);
199 nsAString_Init(&text_str
, v
);
200 nsres
= nsIDOMDocument_CreateTextNode(nsdoc
, &text_str
, &text_node
);
201 nsAString_Finish(&text_str
);
202 if(NS_FAILED(nsres
)) {
203 ERR("CreateTextNode failed: %08x\n", nsres
);
206 nsres
= nsIDOMRange_DeleteContents(This
->nsrange
);
208 ERR("DeleteContents failed: %08x\n", nsres
);
210 nsres
= nsIDOMRange_InsertNode(This
->nsrange
, (nsIDOMNode
*)text_node
);
212 ERR("InsertNode failed: %08x\n", nsres
);
217 static HRESULT WINAPI
HTMLTxtRange_get_text(IHTMLTxtRange
*iface
, BSTR
*p
)
219 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
221 TRACE("(%p)->(%p)\n", This
, p
);
229 nsAString_Init(&text_str
, NULL
);
231 nsres
= nsIDOMRange_ToString(This
->nsrange
, &text_str
);
232 if(NS_SUCCEEDED(nsres
)) {
233 const PRUnichar
*nstext
;
235 nsAString_GetData(&text_str
, &nstext
, NULL
);
236 *p
= SysAllocString(nstext
);
238 ERR("ToString failed: %08x\n", nsres
);
241 nsAString_Finish(&text_str
);
245 static const WCHAR empty
[] = {0};
246 *p
= SysAllocString(empty
);
252 static HRESULT WINAPI
HTMLTxtRange_parentElement(IHTMLTxtRange
*iface
, IHTMLElement
**parent
)
254 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
255 FIXME("(%p)->(%p)\n", This
, parent
);
259 static HRESULT WINAPI
HTMLTxtRange_duplicate(IHTMLTxtRange
*iface
, IHTMLTxtRange
**Duplicate
)
261 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
262 nsIDOMRange
*nsrange
= NULL
;
264 TRACE("(%p)->(%p)\n", This
, Duplicate
);
266 nsIDOMRange_CloneRange(This
->nsrange
, &nsrange
);
267 *Duplicate
= HTMLTxtRange_Create(This
->doc
, nsrange
);
268 nsIDOMRange_Release(nsrange
);
273 static HRESULT WINAPI
HTMLTxtRange_inRange(IHTMLTxtRange
*iface
, IHTMLTxtRange
*Range
,
274 VARIANT_BOOL
*InRange
)
276 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
277 FIXME("(%p)->(%p %p)\n", This
, Range
, InRange
);
281 static HRESULT WINAPI
HTMLTxtRange_isEqual(IHTMLTxtRange
*iface
, IHTMLTxtRange
*Range
,
282 VARIANT_BOOL
*IsEqual
)
284 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
285 FIXME("(%p)->(%p %p)\n", This
, Range
, IsEqual
);
289 static HRESULT WINAPI
HTMLTxtRange_scrollIntoView(IHTMLTxtRange
*iface
, VARIANT_BOOL fStart
)
291 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
292 FIXME("(%p)->(%x)\n", This
, fStart
);
296 static HRESULT WINAPI
HTMLTxtRange_collapse(IHTMLTxtRange
*iface
, VARIANT_BOOL Start
)
298 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
300 TRACE("(%p)->(%x)\n", This
, Start
);
302 nsIDOMRange_Collapse(This
->nsrange
, Start
!= VARIANT_FALSE
);
306 static HRESULT WINAPI
HTMLTxtRange_expand(IHTMLTxtRange
*iface
, BSTR Unit
, VARIANT_BOOL
*Success
)
308 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
309 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(Unit
), Success
);
313 static HRESULT WINAPI
HTMLTxtRange_move(IHTMLTxtRange
*iface
, BSTR Unit
,
314 long Count
, long *ActualCount
)
316 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
317 FIXME("(%p)->(%s %ld %p)\n", This
, debugstr_w(Unit
), Count
, ActualCount
);
321 static HRESULT WINAPI
HTMLTxtRange_moveStart(IHTMLTxtRange
*iface
, BSTR Unit
,
322 long Count
, long *ActualCount
)
324 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
325 FIXME("(%p)->(%s %ld %p)\n", This
, debugstr_w(Unit
), Count
, ActualCount
);
329 static HRESULT WINAPI
HTMLTxtRange_moveEnd(IHTMLTxtRange
*iface
, BSTR Unit
,
330 long Count
, long *ActualCount
)
332 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
333 FIXME("(%p)->(%s %ld %p)\n", This
, debugstr_w(Unit
), Count
, ActualCount
);
337 static HRESULT WINAPI
HTMLTxtRange_select(IHTMLTxtRange
*iface
)
339 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
340 FIXME("(%p)->()\n", This
);
344 static HRESULT WINAPI
HTMLTxtRange_pasteHTML(IHTMLTxtRange
*iface
, BSTR html
)
346 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
347 FIXME("(%p)->(%s)\n", This
, debugstr_w(html
));
351 static HRESULT WINAPI
HTMLTxtRange_moveToElementText(IHTMLTxtRange
*iface
, IHTMLElement
*element
)
353 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
354 FIXME("(%p)->(%p)\n", This
, element
);
358 static HRESULT WINAPI
HTMLTxtRange_setEndPoint(IHTMLTxtRange
*iface
, BSTR how
,
359 IHTMLTxtRange
*SourceRange
)
361 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
362 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(how
), SourceRange
);
366 static HRESULT WINAPI
HTMLTxtRange_compareEndPoints(IHTMLTxtRange
*iface
, BSTR how
,
367 IHTMLTxtRange
*SourceRange
, long *ret
)
369 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
370 FIXME("(%p)->(%s %p %p)\n", This
, debugstr_w(how
), SourceRange
, ret
);
374 static HRESULT WINAPI
HTMLTxtRange_findText(IHTMLTxtRange
*iface
, BSTR String
,
375 long count
, long Flags
, VARIANT_BOOL
*Success
)
377 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
378 FIXME("(%p)->(%s %ld %08lx %p)\n", This
, debugstr_w(String
), count
, Flags
, Success
);
382 static HRESULT WINAPI
HTMLTxtRange_moveToPoint(IHTMLTxtRange
*iface
, long x
, long y
)
384 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
385 FIXME("(%p)->(%ld %ld)\n", This
, x
, y
);
389 static HRESULT WINAPI
HTMLTxtRange_getBookmark(IHTMLTxtRange
*iface
, BSTR
*Bookmark
)
391 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
392 FIXME("(%p)->(%p)\n", This
, Bookmark
);
396 static HRESULT WINAPI
HTMLTxtRange_moveToBookmark(IHTMLTxtRange
*iface
, BSTR Bookmark
,
397 VARIANT_BOOL
*Success
)
399 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
400 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(Bookmark
), Success
);
404 static HRESULT WINAPI
HTMLTxtRange_queryCommandSupported(IHTMLTxtRange
*iface
, BSTR cmdID
,
407 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
408 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
412 static HRESULT WINAPI
HTMLTxtRange_queryCommandEnabled(IHTMLTxtRange
*iface
, BSTR cmdID
,
415 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
416 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
420 static HRESULT WINAPI
HTMLTxtRange_queryCommandState(IHTMLTxtRange
*iface
, BSTR cmdID
,
423 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
424 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
428 static HRESULT WINAPI
HTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange
*iface
, BSTR cmdID
,
431 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
432 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
436 static HRESULT WINAPI
HTMLTxtRange_queryCommandText(IHTMLTxtRange
*iface
, BSTR cmdID
,
439 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
440 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pcmdText
);
444 static HRESULT WINAPI
HTMLTxtRange_queryCommandValue(IHTMLTxtRange
*iface
, BSTR cmdID
,
447 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
448 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pcmdValue
);
452 static HRESULT WINAPI
HTMLTxtRange_execCommand(IHTMLTxtRange
*iface
, BSTR cmdID
,
453 VARIANT_BOOL showUI
, VARIANT value
, VARIANT_BOOL
*pfRet
)
455 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
456 FIXME("(%p)->(%s %x v %p)\n", This
, debugstr_w(cmdID
), showUI
, pfRet
);
460 static HRESULT WINAPI
HTMLTxtRange_execCommandShowHelp(IHTMLTxtRange
*iface
, BSTR cmdID
,
463 HTMLTxtRange
*This
= HTMLTXTRANGE_THIS(iface
);
464 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
468 #undef HTMLTXTRANGE_THIS
470 static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl
= {
471 HTMLTxtRange_QueryInterface
,
473 HTMLTxtRange_Release
,
474 HTMLTxtRange_GetTypeInfoCount
,
475 HTMLTxtRange_GetTypeInfo
,
476 HTMLTxtRange_GetIDsOfNames
,
478 HTMLTxtRange_get_htmlText
,
479 HTMLTxtRange_put_text
,
480 HTMLTxtRange_get_text
,
481 HTMLTxtRange_parentElement
,
482 HTMLTxtRange_duplicate
,
483 HTMLTxtRange_inRange
,
484 HTMLTxtRange_isEqual
,
485 HTMLTxtRange_scrollIntoView
,
486 HTMLTxtRange_collapse
,
489 HTMLTxtRange_moveStart
,
490 HTMLTxtRange_moveEnd
,
492 HTMLTxtRange_pasteHTML
,
493 HTMLTxtRange_moveToElementText
,
494 HTMLTxtRange_setEndPoint
,
495 HTMLTxtRange_compareEndPoints
,
496 HTMLTxtRange_findText
,
497 HTMLTxtRange_moveToPoint
,
498 HTMLTxtRange_getBookmark
,
499 HTMLTxtRange_moveToBookmark
,
500 HTMLTxtRange_queryCommandSupported
,
501 HTMLTxtRange_queryCommandEnabled
,
502 HTMLTxtRange_queryCommandState
,
503 HTMLTxtRange_queryCommandIndeterm
,
504 HTMLTxtRange_queryCommandText
,
505 HTMLTxtRange_queryCommandValue
,
506 HTMLTxtRange_execCommand
,
507 HTMLTxtRange_execCommandShowHelp
510 IHTMLTxtRange
*HTMLTxtRange_Create(HTMLDocument
*doc
, nsIDOMRange
*nsrange
)
512 HTMLTxtRange
*ret
= mshtml_alloc(sizeof(HTMLTxtRange
));
514 ret
->lpHTMLTxtRangeVtbl
= &HTMLTxtRangeVtbl
;
518 nsIDOMRange_AddRef(nsrange
);
519 ret
->nsrange
= nsrange
;
522 list_add_head(&doc
->range_list
, &ret
->entry
);
524 return HTMLTXTRANGE(ret
);
527 void detach_ranges(HTMLDocument
*This
)
531 LIST_FOR_EACH_ENTRY(iter
, &This
->range_list
, HTMLTxtRange
, entry
) {