2 * Copyright 2006-2007 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
29 #include "wine/debug.h"
31 #include "mshtml_private.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml
);
37 IHTMLTxtRange IHTMLTxtRange_iface
;
38 IOleCommandTarget IOleCommandTarget_iface
;
41 HTMLDocumentNode
*doc
;
48 IHTMLDOMRange IHTMLDOMRange_iface
;
73 static HTMLTxtRange
*get_range_object(HTMLDocumentNode
*doc
, IHTMLTxtRange
*iface
)
77 LIST_FOR_EACH_ENTRY(iter
, &doc
->range_list
, HTMLTxtRange
, entry
) {
78 if(&iter
->IHTMLTxtRange_iface
== iface
)
82 ERR("Could not find range in document\n");
86 static range_unit_t
string_to_unit(LPCWSTR str
)
88 if(!wcsicmp(str
, L
"character")) return RU_CHAR
;
89 if(!wcsicmp(str
, L
"word")) return RU_WORD
;
90 if(!wcsicmp(str
, L
"sentence")) return RU_SENTENCE
;
91 if(!wcsicmp(str
, L
"textedit")) return RU_TEXTEDIT
;
96 static int string_to_nscmptype(LPCWSTR str
)
98 if(!wcsicmp(str
, L
"StartToEnd")) return NS_START_TO_END
;
99 if(!wcsicmp(str
, L
"StartToStart")) return NS_START_TO_START
;
100 if(!wcsicmp(str
, L
"EndToStart")) return NS_END_TO_START
;
101 if(!wcsicmp(str
, L
"EndToEnd")) return NS_END_TO_END
;
106 static UINT16
get_node_type(nsIDOMNode
*node
)
111 nsIDOMNode_GetNodeType(node
, &type
);
116 static void get_text_node_data(nsIDOMNode
*node
, nsAString
*nsstr
, const PRUnichar
**str
)
121 nsres
= nsIDOMNode_QueryInterface(node
, &IID_nsIDOMText
, (void**)&nstext
);
122 assert(nsres
== NS_OK
);
124 nsAString_Init(nsstr
, NULL
);
125 nsres
= nsIDOMText_GetData(nstext
, nsstr
);
126 nsIDOMText_Release(nstext
);
128 ERR("GetData failed: %08lx\n", nsres
);
130 nsAString_GetData(nsstr
, str
);
133 static nsIDOMNode
*get_child_node(nsIDOMNode
*node
, UINT32 off
)
135 nsIDOMNodeList
*node_list
;
136 nsIDOMNode
*ret
= NULL
;
138 nsIDOMNode_GetChildNodes(node
, &node_list
);
139 nsIDOMNodeList_Item(node_list
, off
, &ret
);
140 nsIDOMNodeList_Release(node_list
);
145 /* This is very inefficient, but there is no faster way to compute index in
146 * child node list using public API. Gecko has internal nsINode::IndexOf
147 * function that we could consider exporting and use instead. */
148 static int get_child_index(nsIDOMNode
*parent
, nsIDOMNode
*child
)
150 nsIDOMNodeList
*node_list
;
155 nsres
= nsIDOMNode_GetChildNodes(parent
, &node_list
);
156 assert(nsres
== NS_OK
);
159 nsres
= nsIDOMNodeList_Item(node_list
, ret
, &node
);
160 assert(nsres
== NS_OK
&& node
);
162 nsIDOMNode_Release(node
);
165 nsIDOMNode_Release(node
);
169 nsIDOMNodeList_Release(node_list
);
173 static void init_rangepoint_no_addref(rangepoint_t
*rangepoint
, nsIDOMNode
*node
, UINT32 off
)
175 rangepoint
->type
= get_node_type(node
);
176 rangepoint
->node
= node
;
177 rangepoint
->off
= off
;
180 static void init_rangepoint(rangepoint_t
*rangepoint
, nsIDOMNode
*node
, UINT32 off
)
182 nsIDOMNode_AddRef(node
);
183 init_rangepoint_no_addref(rangepoint
, node
, off
);
186 static inline void free_rangepoint(rangepoint_t
*rangepoint
)
188 nsIDOMNode_Release(rangepoint
->node
);
191 static inline BOOL
rangepoint_cmp(const rangepoint_t
*point1
, const rangepoint_t
*point2
)
193 return point1
->node
== point2
->node
&& point1
->off
== point2
->off
;
196 static BOOL
rangepoint_next_node(rangepoint_t
*iter
)
202 /* Try to move to the child node. */
203 node
= get_child_node(iter
->node
, iter
->off
);
205 free_rangepoint(iter
);
206 init_rangepoint_no_addref(iter
, node
, 0);
210 /* There are no more children in the node. Move to parent. */
211 nsres
= nsIDOMNode_GetParentNode(iter
->node
, &node
);
212 assert(nsres
== NS_OK
);
216 off
= get_child_index(node
, iter
->node
)+1;
217 free_rangepoint(iter
);
218 init_rangepoint_no_addref(iter
, node
, off
);
222 static UINT32
get_child_count(nsIDOMNode
*node
)
224 nsIDOMNodeList
*node_list
;
228 nsres
= nsIDOMNode_GetChildNodes(node
, &node_list
);
229 assert(nsres
== NS_OK
);
231 nsres
= nsIDOMNodeList_GetLength(node_list
, &ret
);
232 nsIDOMNodeList_Release(node_list
);
233 assert(nsres
== NS_OK
);
238 static UINT32
get_text_length(nsIDOMNode
*node
)
244 nsres
= nsIDOMNode_QueryInterface(node
, &IID_nsIDOMText
, (void**)&nstext
);
245 assert(nsres
== NS_OK
);
247 nsres
= nsIDOMText_GetLength(nstext
, &ret
);
248 nsIDOMText_Release(nstext
);
249 assert(nsres
== NS_OK
);
254 static BOOL
rangepoint_prev_node(rangepoint_t
*iter
)
260 /* Try to move to the child node. */
262 node
= get_child_node(iter
->node
, iter
->off
-1);
263 assert(node
!= NULL
);
265 off
= get_node_type(node
) == TEXT_NODE
? get_text_length(node
) : get_child_count(node
);
266 free_rangepoint(iter
);
267 init_rangepoint_no_addref(iter
, node
, off
);
271 /* There are no more children in the node. Move to parent. */
272 nsres
= nsIDOMNode_GetParentNode(iter
->node
, &node
);
273 assert(nsres
== NS_OK
);
277 off
= get_child_index(node
, iter
->node
);
278 free_rangepoint(iter
);
279 init_rangepoint_no_addref(iter
, node
, off
);
283 static void get_start_point(HTMLTxtRange
*This
, rangepoint_t
*ret
)
288 nsIDOMRange_GetStartContainer(This
->nsrange
, &node
);
289 nsIDOMRange_GetStartOffset(This
->nsrange
, &off
);
291 init_rangepoint_no_addref(ret
, node
, off
);
294 static void get_end_point(HTMLTxtRange
*This
, rangepoint_t
*ret
)
299 nsIDOMRange_GetEndContainer(This
->nsrange
, &node
);
300 nsIDOMRange_GetEndOffset(This
->nsrange
, &off
);
302 init_rangepoint_no_addref(ret
, node
, off
);
305 static void set_start_point(HTMLTxtRange
*This
, const rangepoint_t
*start
)
307 nsresult nsres
= nsIDOMRange_SetStart(This
->nsrange
, start
->node
, start
->off
);
309 ERR("failed: %08lx\n", nsres
);
312 static void set_end_point(HTMLTxtRange
*This
, const rangepoint_t
*end
)
314 nsresult nsres
= nsIDOMRange_SetEnd(This
->nsrange
, end
->node
, end
->off
);
316 ERR("failed: %08lx\n", nsres
);
319 static BOOL
is_elem_tag(nsIDOMNode
*node
, LPCWSTR istag
)
323 const PRUnichar
*tag
;
327 nsres
= nsIDOMNode_QueryInterface(node
, &IID_nsIDOMElement
, (void**)&elem
);
331 nsAString_Init(&tag_str
, NULL
);
332 nsIDOMElement_GetTagName(elem
, &tag_str
);
333 nsIDOMElement_Release(elem
);
334 nsAString_GetData(&tag_str
, &tag
);
336 ret
= !wcsicmp(tag
, istag
);
338 nsAString_Finish(&tag_str
);
343 static inline BOOL
wstrbuf_init(wstrbuf_t
*buf
)
347 buf
->buf
= malloc(buf
->size
* sizeof(WCHAR
));
348 if (!buf
->buf
) return FALSE
;
353 static inline void wstrbuf_finish(wstrbuf_t
*buf
)
358 static void wstrbuf_append_len(wstrbuf_t
*buf
, LPCWSTR str
, int len
)
360 if(buf
->len
+len
>= buf
->size
) {
361 buf
->size
= 2*buf
->size
+len
;
362 buf
->buf
= realloc(buf
->buf
, buf
->size
* sizeof(WCHAR
));
365 memcpy(buf
->buf
+buf
->len
, str
, len
*sizeof(WCHAR
));
367 buf
->buf
[buf
->len
] = 0;
370 static void wstrbuf_append_nodetxt(wstrbuf_t
*buf
, LPCWSTR str
, int len
)
372 const WCHAR
*s
= str
;
375 TRACE("%s\n", debugstr_wn(str
, len
));
377 if(buf
->len
+len
>= buf
->size
) {
378 buf
->size
= 2*buf
->size
+len
;
379 buf
->buf
= realloc(buf
->buf
, buf
->size
* sizeof(WCHAR
));
382 if(buf
->len
&& iswspace(buf
->buf
[buf
->len
-1])) {
383 while(s
< str
+len
&& iswspace(*s
))
387 d
= buf
->buf
+buf
->len
;
392 while(s
< str
+len
&& iswspace(*s
))
399 buf
->len
= d
- buf
->buf
;
403 static void wstrbuf_append_node(wstrbuf_t
*buf
, nsIDOMNode
*node
, BOOL ignore_text
)
406 switch(get_node_type(node
)) {
410 const PRUnichar
*data
;
415 nsIDOMNode_QueryInterface(node
, &IID_nsIDOMText
, (void**)&nstext
);
417 nsAString_Init(&data_str
, NULL
);
418 nsIDOMText_GetData(nstext
, &data_str
);
419 nsAString_GetData(&data_str
, &data
);
420 wstrbuf_append_nodetxt(buf
, data
, lstrlenW(data
));
421 nsAString_Finish(&data_str
);
423 nsIDOMText_Release(nstext
);
428 if(is_elem_tag(node
, L
"br")) {
429 static const WCHAR endlW
[] = {'\r','\n'};
430 wstrbuf_append_len(buf
, endlW
, 2);
431 }else if(is_elem_tag(node
, L
"hr")) {
432 static const WCHAR endl2W
[] = {'\r','\n','\r','\n'};
433 wstrbuf_append_len(buf
, endl2W
, 4);
438 static void wstrbuf_append_node_rec(wstrbuf_t
*buf
, nsIDOMNode
*node
)
440 nsIDOMNode
*iter
, *tmp
;
442 wstrbuf_append_node(buf
, node
, FALSE
);
444 nsIDOMNode_GetFirstChild(node
, &iter
);
446 wstrbuf_append_node_rec(buf
, iter
);
447 nsIDOMNode_GetNextSibling(iter
, &tmp
);
448 nsIDOMNode_Release(iter
);
453 static void range_to_string(HTMLTxtRange
*This
, wstrbuf_t
*buf
)
455 rangepoint_t end_pos
, iter
;
458 nsIDOMRange_GetCollapsed(This
->nsrange
, &collapsed
);
466 get_end_point(This
, &end_pos
);
467 get_start_point(This
, &iter
);
470 if(iter
.type
== TEXT_NODE
) {
471 const PRUnichar
*str
;
474 get_text_node_data(iter
.node
, &nsstr
, &str
);
476 if(iter
.node
== end_pos
.node
) {
477 wstrbuf_append_nodetxt(buf
, str
+iter
.off
, end_pos
.off
-iter
.off
);
478 nsAString_Finish(&nsstr
);
482 wstrbuf_append_nodetxt(buf
, str
+iter
.off
, lstrlenW(str
+iter
.off
));
483 nsAString_Finish(&nsstr
);
487 node
= get_child_node(iter
.node
, iter
.off
);
489 wstrbuf_append_node(buf
, node
, TRUE
);
490 nsIDOMNode_Release(node
);
494 if(!rangepoint_next_node(&iter
)) {
495 ERR("End of document?\n");
498 }while(!rangepoint_cmp(&iter
, &end_pos
));
500 free_rangepoint(&iter
);
501 free_rangepoint(&end_pos
);
506 for(p
= buf
->buf
+buf
->len
-1; p
>= buf
->buf
&& iswspace(*p
); p
--);
514 HRESULT
get_node_text(HTMLDOMNode
*node
, BSTR
*ret
)
519 if (!wstrbuf_init(&buf
))
520 return E_OUTOFMEMORY
;
521 wstrbuf_append_node_rec(&buf
, node
->nsnode
);
522 if(buf
.buf
&& *buf
.buf
) {
523 *ret
= SysAllocString(buf
.buf
);
525 hres
= E_OUTOFMEMORY
;
529 wstrbuf_finish(&buf
);
532 TRACE("ret %s\n", debugstr_w(*ret
));
536 static WCHAR
move_next_char(rangepoint_t
*iter
)
538 rangepoint_t last_space
;
546 const PRUnichar
*str
;
550 get_text_node_data(iter
->node
, &nsstr
, &str
);
553 nsAString_Finish(&nsstr
);
563 free_rangepoint(&last_space
);
569 nsAString_Finish(&nsstr
);
570 if(!c
) { /* continue to skip spaces */
571 init_rangepoint(&last_space
, iter
->node
, iter
->off
);
577 nsAString_Finish(&nsstr
);
580 /* If we have a non-space char and we're skipping spaces, stop and return the last found space. */
582 free_rangepoint(iter
);
591 node
= get_child_node(iter
->node
, iter
->off
);
595 if(is_elem_tag(node
, L
"br")) {
597 nsIDOMNode_Release(node
);
598 free_rangepoint(iter
);
604 init_rangepoint(&last_space
, iter
->node
, iter
->off
+1);
605 }else if(is_elem_tag(node
, L
"hr")) {
606 nsIDOMNode_Release(node
);
608 free_rangepoint(iter
);
617 nsIDOMNode_Release(node
);
619 }while(rangepoint_next_node(iter
));
622 free_rangepoint(&last_space
);
627 static WCHAR
move_prev_char(rangepoint_t
*iter
)
629 rangepoint_t last_space
;
637 const PRUnichar
*str
;
644 get_text_node_data(iter
->node
, &nsstr
, &str
);
650 while(p
> str
&& iswspace(*(p
-1)))
654 free_rangepoint(&last_space
);
659 nsAString_Finish(&nsstr
);
660 if(p
== str
) { /* continue to skip spaces */
661 init_rangepoint(&last_space
, iter
->node
, iter
->off
);
667 nsAString_Finish(&nsstr
);
670 /* If we have a non-space char and we're skipping spaces, stop and return the last found space. */
672 free_rangepoint(iter
);
684 node
= get_child_node(iter
->node
, iter
->off
-1);
688 if(is_elem_tag(node
, L
"br")) {
690 free_rangepoint(&last_space
);
692 init_rangepoint(&last_space
, iter
->node
, iter
->off
-1);
693 }else if(is_elem_tag(node
, L
"hr")) {
694 nsIDOMNode_Release(node
);
696 free_rangepoint(iter
);
705 nsIDOMNode_Release(node
);
707 }while(rangepoint_prev_node(iter
));
710 free_rangepoint(iter
);
718 static LONG
move_by_chars(rangepoint_t
*iter
, LONG cnt
)
723 while(ret
< cnt
&& move_next_char(iter
))
726 while(ret
> cnt
&& move_prev_char(iter
))
733 static LONG
find_prev_space(rangepoint_t
*iter
, BOOL first_space
)
738 init_rangepoint(&prev
, iter
->node
, iter
->off
);
739 c
= move_prev_char(&prev
);
740 if(!c
|| (first_space
&& iswspace(c
))) {
741 free_rangepoint(&prev
);
746 free_rangepoint(iter
);
747 init_rangepoint(iter
, prev
.node
, prev
.off
);
748 c
= move_prev_char(&prev
);
749 }while(c
&& !iswspace(c
));
751 free_rangepoint(&prev
);
755 static BOOL
find_word_end(rangepoint_t
*iter
, BOOL is_collapsed
)
757 rangepoint_t prev_iter
;
762 init_rangepoint(&prev_iter
, iter
->node
, iter
->off
);
763 c
= move_prev_char(&prev_iter
);
764 free_rangepoint(&prev_iter
);
770 init_rangepoint(&prev_iter
, iter
->node
, iter
->off
);
771 c
= move_next_char(iter
);
773 free_rangepoint(iter
);
779 ret
= !rangepoint_cmp(iter
, &prev_iter
);
783 free_rangepoint(&prev_iter
);
784 }while(c
&& !iswspace(c
));
789 static LONG
move_by_words(rangepoint_t
*iter
, LONG cnt
)
796 while(ret
< cnt
&& (c
= move_next_char(iter
))) {
801 while(ret
> cnt
&& find_prev_space(iter
, FALSE
))
808 static inline HTMLTxtRange
*impl_from_IHTMLTxtRange(IHTMLTxtRange
*iface
)
810 return CONTAINING_RECORD(iface
, HTMLTxtRange
, IHTMLTxtRange_iface
);
813 static HRESULT WINAPI
HTMLTxtRange_QueryInterface(IHTMLTxtRange
*iface
, REFIID riid
, void **ppv
)
815 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
816 return IDispatchEx_QueryInterface(&This
->dispex
.IDispatchEx_iface
, riid
, ppv
);
819 static ULONG WINAPI
HTMLTxtRange_AddRef(IHTMLTxtRange
*iface
)
821 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
822 return IDispatchEx_AddRef(&This
->dispex
.IDispatchEx_iface
);
825 static ULONG WINAPI
HTMLTxtRange_Release(IHTMLTxtRange
*iface
)
827 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
828 return IDispatchEx_Release(&This
->dispex
.IDispatchEx_iface
);
831 static HRESULT WINAPI
HTMLTxtRange_GetTypeInfoCount(IHTMLTxtRange
*iface
, UINT
*pctinfo
)
833 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
835 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
838 static HRESULT WINAPI
HTMLTxtRange_GetTypeInfo(IHTMLTxtRange
*iface
, UINT iTInfo
,
839 LCID lcid
, ITypeInfo
**ppTInfo
)
841 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
843 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
846 static HRESULT WINAPI
HTMLTxtRange_GetIDsOfNames(IHTMLTxtRange
*iface
, REFIID riid
,
847 LPOLESTR
*rgszNames
, UINT cNames
,
848 LCID lcid
, DISPID
*rgDispId
)
850 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
852 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
,
853 cNames
, lcid
, rgDispId
);
856 static HRESULT WINAPI
HTMLTxtRange_Invoke(IHTMLTxtRange
*iface
, DISPID dispIdMember
,
857 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
858 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
860 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
862 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
863 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
866 static HRESULT WINAPI
HTMLTxtRange_get_htmlText(IHTMLTxtRange
*iface
, BSTR
*p
)
868 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
870 TRACE("(%p)->(%p)\n", This
, p
);
875 nsIDOMDocumentFragment
*fragment
;
878 nsres
= nsIDOMRange_CloneContents(This
->nsrange
, &fragment
);
879 if(NS_SUCCEEDED(nsres
)) {
880 const PRUnichar
*nstext
;
883 nsAString_Init(&nsstr
, NULL
);
884 nsnode_to_nsstring((nsIDOMNode
*)fragment
, &nsstr
);
885 nsIDOMDocumentFragment_Release(fragment
);
887 nsAString_GetData(&nsstr
, &nstext
);
888 *p
= SysAllocString(nstext
);
890 nsAString_Finish(&nsstr
);
895 *p
= SysAllocString(L
"");
898 TRACE("return %s\n", debugstr_w(*p
));
902 static HRESULT WINAPI
HTMLTxtRange_put_text(IHTMLTxtRange
*iface
, BSTR v
)
904 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
905 nsIDOMText
*text_node
;
909 TRACE("(%p)->(%s)\n", This
, debugstr_w(v
));
912 return MSHTML_E_NODOC
;
914 nsAString_InitDepend(&text_str
, v
);
915 nsres
= nsIDOMDocument_CreateTextNode(This
->doc
->dom_document
, &text_str
, &text_node
);
916 nsAString_Finish(&text_str
);
917 if(NS_FAILED(nsres
)) {
918 ERR("CreateTextNode failed: %08lx\n", nsres
);
921 nsres
= nsIDOMRange_DeleteContents(This
->nsrange
);
923 ERR("DeleteContents failed: %08lx\n", nsres
);
925 nsres
= nsIDOMRange_InsertNode(This
->nsrange
, (nsIDOMNode
*)text_node
);
927 ERR("InsertNode failed: %08lx\n", nsres
);
929 nsres
= nsIDOMRange_SetEndAfter(This
->nsrange
, (nsIDOMNode
*)text_node
);
931 ERR("SetEndAfter failed: %08lx\n", nsres
);
933 nsIDOMText_Release(text_node
);
934 return IHTMLTxtRange_collapse(&This
->IHTMLTxtRange_iface
, VARIANT_FALSE
);
937 static HRESULT WINAPI
HTMLTxtRange_get_text(IHTMLTxtRange
*iface
, BSTR
*p
)
939 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
942 TRACE("(%p)->(%p)\n", This
, p
);
948 if (!wstrbuf_init(&buf
))
949 return E_OUTOFMEMORY
;
950 range_to_string(This
, &buf
);
952 *p
= SysAllocString(buf
.buf
);
953 wstrbuf_finish(&buf
);
955 TRACE("ret %s\n", debugstr_w(*p
));
959 static HRESULT WINAPI
HTMLTxtRange_parentElement(IHTMLTxtRange
*iface
, IHTMLElement
**parent
)
961 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
962 nsIDOMNode
*nsnode
, *tmp
;
966 TRACE("(%p)->(%p)\n", This
, parent
);
968 nsIDOMRange_GetCommonAncestorContainer(This
->nsrange
, &nsnode
);
969 while(nsnode
&& get_node_type(nsnode
) != ELEMENT_NODE
) {
970 nsIDOMNode_GetParentNode(nsnode
, &tmp
);
971 nsIDOMNode_Release(nsnode
);
980 hres
= get_node(nsnode
, TRUE
, &node
);
981 nsIDOMNode_Release(nsnode
);
985 hres
= IHTMLDOMNode_QueryInterface(&node
->IHTMLDOMNode_iface
, &IID_IHTMLElement
, (void**)parent
);
990 static HRESULT WINAPI
HTMLTxtRange_duplicate(IHTMLTxtRange
*iface
, IHTMLTxtRange
**Duplicate
)
992 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
993 nsIDOMRange
*nsrange
= NULL
;
996 TRACE("(%p)->(%p)\n", This
, Duplicate
);
998 nsIDOMRange_CloneRange(This
->nsrange
, &nsrange
);
999 hres
= HTMLTxtRange_Create(This
->doc
, nsrange
, Duplicate
);
1000 nsIDOMRange_Release(nsrange
);
1005 static HRESULT WINAPI
HTMLTxtRange_inRange(IHTMLTxtRange
*iface
, IHTMLTxtRange
*Range
,
1006 VARIANT_BOOL
*InRange
)
1008 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1009 HTMLTxtRange
*src_range
;
1013 TRACE("(%p)->(%p %p)\n", This
, Range
, InRange
);
1015 *InRange
= VARIANT_FALSE
;
1017 src_range
= get_range_object(This
->doc
, Range
);
1021 nsres
= nsIDOMRange_CompareBoundaryPoints(This
->nsrange
, NS_START_TO_START
,
1022 src_range
->nsrange
, &nsret
);
1023 if(NS_SUCCEEDED(nsres
) && nsret
<= 0) {
1024 nsres
= nsIDOMRange_CompareBoundaryPoints(This
->nsrange
, NS_END_TO_END
,
1025 src_range
->nsrange
, &nsret
);
1026 if(NS_SUCCEEDED(nsres
) && nsret
>= 0)
1027 *InRange
= VARIANT_TRUE
;
1030 if(NS_FAILED(nsres
))
1031 ERR("CompareBoundaryPoints failed: %08lx\n", nsres
);
1036 static HRESULT WINAPI
HTMLTxtRange_isEqual(IHTMLTxtRange
*iface
, IHTMLTxtRange
*Range
,
1037 VARIANT_BOOL
*IsEqual
)
1039 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1040 HTMLTxtRange
*src_range
;
1044 TRACE("(%p)->(%p %p)\n", This
, Range
, IsEqual
);
1046 *IsEqual
= VARIANT_FALSE
;
1048 src_range
= get_range_object(This
->doc
, Range
);
1052 nsres
= nsIDOMRange_CompareBoundaryPoints(This
->nsrange
, NS_START_TO_START
,
1053 src_range
->nsrange
, &nsret
);
1054 if(NS_SUCCEEDED(nsres
) && !nsret
) {
1055 nsres
= nsIDOMRange_CompareBoundaryPoints(This
->nsrange
, NS_END_TO_END
,
1056 src_range
->nsrange
, &nsret
);
1057 if(NS_SUCCEEDED(nsres
) && !nsret
)
1058 *IsEqual
= VARIANT_TRUE
;
1061 if(NS_FAILED(nsres
))
1062 ERR("CompareBoundaryPoints failed: %08lx\n", nsres
);
1067 static HRESULT WINAPI
HTMLTxtRange_scrollIntoView(IHTMLTxtRange
*iface
, VARIANT_BOOL fStart
)
1069 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1070 FIXME("(%p)->(%x)\n", This
, fStart
);
1074 static HRESULT WINAPI
HTMLTxtRange_collapse(IHTMLTxtRange
*iface
, VARIANT_BOOL Start
)
1076 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1078 TRACE("(%p)->(%x)\n", This
, Start
);
1080 nsIDOMRange_Collapse(This
->nsrange
, Start
!= VARIANT_FALSE
);
1084 static HRESULT WINAPI
HTMLTxtRange_expand(IHTMLTxtRange
*iface
, BSTR Unit
, VARIANT_BOOL
*Success
)
1086 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1089 TRACE("(%p)->(%s %p)\n", This
, debugstr_w(Unit
), Success
);
1091 unit
= string_to_unit(Unit
);
1092 if(unit
== RU_UNKNOWN
)
1093 return E_INVALIDARG
;
1095 *Success
= VARIANT_FALSE
;
1099 rangepoint_t end
, start
;
1100 cpp_bool is_collapsed
;
1102 get_start_point(This
, &start
);
1103 get_end_point(This
, &end
);
1105 nsIDOMRange_GetCollapsed(This
->nsrange
, &is_collapsed
);
1107 if(find_word_end(&end
, is_collapsed
)) {
1108 set_end_point(This
, &end
);
1109 *Success
= VARIANT_TRUE
;
1112 if(find_prev_space(&start
, TRUE
)) {
1113 set_start_point(This
, &start
);
1114 *Success
= VARIANT_TRUE
;
1117 free_rangepoint(&end
);
1118 free_rangepoint(&start
);
1123 nsIDOMHTMLElement
*nsbody
= NULL
;
1126 if(!This
->doc
->html_document
) {
1127 FIXME("Not implemented for XML document\n");
1131 nsres
= nsIDOMHTMLDocument_GetBody(This
->doc
->html_document
, &nsbody
);
1132 if(NS_FAILED(nsres
) || !nsbody
) {
1133 ERR("Could not get body: %08lx\n", nsres
);
1137 nsres
= nsIDOMRange_SelectNodeContents(This
->nsrange
, (nsIDOMNode
*)nsbody
);
1138 nsIDOMHTMLElement_Release(nsbody
);
1139 if(NS_FAILED(nsres
)) {
1140 ERR("Collapse failed: %08lx\n", nsres
);
1144 *Success
= VARIANT_TRUE
;
1149 FIXME("Unimplemented unit %s\n", debugstr_w(Unit
));
1155 static HRESULT WINAPI
HTMLTxtRange_move(IHTMLTxtRange
*iface
, BSTR Unit
,
1156 LONG Count
, LONG
*ActualCount
)
1158 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1161 TRACE("(%p)->(%s %ld %p)\n", This
, debugstr_w(Unit
), Count
, ActualCount
);
1163 unit
= string_to_unit(Unit
);
1164 if(unit
== RU_UNKNOWN
)
1165 return E_INVALIDARG
;
1169 return IHTMLTxtRange_collapse(&This
->IHTMLTxtRange_iface
, VARIANT_TRUE
);
1176 get_start_point(This
, &start
);
1178 *ActualCount
= move_by_chars(&start
, Count
);
1180 set_start_point(This
, &start
);
1181 IHTMLTxtRange_collapse(&This
->IHTMLTxtRange_iface
, VARIANT_TRUE
);
1182 free_rangepoint(&start
);
1189 get_start_point(This
, &start
);
1191 *ActualCount
= move_by_words(&start
, Count
);
1193 set_start_point(This
, &start
);
1194 IHTMLTxtRange_collapse(&This
->IHTMLTxtRange_iface
, VARIANT_TRUE
);
1195 free_rangepoint(&start
);
1200 FIXME("unimplemented unit %s\n", debugstr_w(Unit
));
1203 TRACE("ret %ld\n", *ActualCount
);
1207 static HRESULT WINAPI
HTMLTxtRange_moveStart(IHTMLTxtRange
*iface
, BSTR Unit
,
1208 LONG Count
, LONG
*ActualCount
)
1210 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1213 TRACE("(%p)->(%s %ld %p)\n", This
, debugstr_w(Unit
), Count
, ActualCount
);
1215 unit
= string_to_unit(Unit
);
1216 if(unit
== RU_UNKNOWN
)
1217 return E_INVALIDARG
;
1228 get_start_point(This
, &start
);
1230 *ActualCount
= move_by_chars(&start
, Count
);
1232 set_start_point(This
, &start
);
1233 free_rangepoint(&start
);
1238 FIXME("unimplemented unit %s\n", debugstr_w(Unit
));
1245 static HRESULT WINAPI
HTMLTxtRange_moveEnd(IHTMLTxtRange
*iface
, BSTR Unit
,
1246 LONG Count
, LONG
*ActualCount
)
1248 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1251 TRACE("(%p)->(%s %ld %p)\n", This
, debugstr_w(Unit
), Count
, ActualCount
);
1253 unit
= string_to_unit(Unit
);
1254 if(unit
== RU_UNKNOWN
)
1255 return E_INVALIDARG
;
1266 get_end_point(This
, &end
);
1268 *ActualCount
= move_by_chars(&end
, Count
);
1270 set_end_point(This
, &end
);
1271 free_rangepoint(&end
);
1276 FIXME("unimplemented unit %s\n", debugstr_w(Unit
));
1282 static HRESULT WINAPI
HTMLTxtRange_select(IHTMLTxtRange
*iface
)
1284 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1285 nsISelection
*nsselection
;
1288 TRACE("(%p)\n", This
);
1290 nsres
= nsIDOMWindow_GetSelection(This
->doc
->outer_window
->nswindow
, &nsselection
);
1291 if(NS_FAILED(nsres
)) {
1292 ERR("GetSelection failed: %08lx\n", nsres
);
1296 nsISelection_RemoveAllRanges(nsselection
);
1297 nsISelection_AddRange(nsselection
, This
->nsrange
);
1298 nsISelection_Release(nsselection
);
1302 static HRESULT WINAPI
HTMLTxtRange_pasteHTML(IHTMLTxtRange
*iface
, BSTR html
)
1304 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1305 nsIDOMDocumentFragment
*doc_frag
;
1309 TRACE("(%p)->(%s)\n", This
, debugstr_w(html
));
1311 nsres
= nsIDOMRange_Collapse(This
->nsrange
, TRUE
);
1312 assert(nsres
== NS_OK
);
1314 nsAString_InitDepend(&nsstr
, html
);
1315 nsres
= nsIDOMRange_CreateContextualFragment(This
->nsrange
, &nsstr
, &doc_frag
);
1316 nsAString_Finish(&nsstr
);
1317 if(NS_FAILED(nsres
)) {
1318 ERR("CreateContextualFragment failed: %08lx\n", nsres
);
1322 nsres
= nsIDOMRange_InsertNode(This
->nsrange
, (nsIDOMNode
*)doc_frag
);
1323 nsIDOMDocumentFragment_Release(doc_frag
);
1324 if(NS_FAILED(nsres
)) {
1325 ERR("InsertNode failed: %08lx\n", nsres
);
1329 nsres
= nsIDOMRange_Collapse(This
->nsrange
, FALSE
);
1330 assert(nsres
== NS_OK
);
1334 static HRESULT WINAPI
HTMLTxtRange_moveToElementText(IHTMLTxtRange
*iface
, IHTMLElement
*element
)
1336 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1340 TRACE("(%p)->(%p)\n", This
, element
);
1342 elem
= unsafe_impl_from_IHTMLElement(element
);
1344 return E_INVALIDARG
;
1346 nsres
= nsIDOMRange_SelectNodeContents(This
->nsrange
, elem
->node
.nsnode
);
1347 if(NS_FAILED(nsres
)) {
1348 ERR("SelectNodeContents failed: %08lx\n", nsres
);
1355 static HRESULT WINAPI
HTMLTxtRange_setEndPoint(IHTMLTxtRange
*iface
, BSTR how
,
1356 IHTMLTxtRange
*SourceRange
)
1358 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1359 HTMLTxtRange
*src_range
;
1360 nsIDOMNode
*ref_node
;
1367 TRACE("(%p)->(%s %p)\n", This
, debugstr_w(how
), SourceRange
);
1369 how_type
= string_to_nscmptype(how
);
1371 return E_INVALIDARG
;
1373 src_range
= get_range_object(This
->doc
, SourceRange
);
1378 case NS_START_TO_START
:
1379 case NS_END_TO_START
:
1380 nsres
= nsIDOMRange_GetStartContainer(src_range
->nsrange
, &ref_node
);
1381 assert(nsres
== NS_OK
);
1383 nsres
= nsIDOMRange_GetStartOffset(src_range
->nsrange
, &ref_offset
);
1384 assert(nsres
== NS_OK
);
1386 set_start
= how_type
== NS_START_TO_START
;
1389 case NS_START_TO_END
:
1390 nsres
= nsIDOMRange_GetEndContainer(src_range
->nsrange
, &ref_node
);
1391 assert(nsres
== NS_OK
);
1393 nsres
= nsIDOMRange_GetEndOffset(src_range
->nsrange
, &ref_offset
);
1394 assert(nsres
== NS_OK
);
1396 set_start
= how_type
== NS_START_TO_END
;
1398 DEFAULT_UNREACHABLE
;
1401 nsres
= nsIDOMRange_ComparePoint(This
->nsrange
, ref_node
, ref_offset
, &cmp
);
1402 assert(nsres
== NS_OK
);
1406 nsres
= nsIDOMRange_SetStart(This
->nsrange
, ref_node
, ref_offset
);
1408 nsres
= nsIDOMRange_Collapse(This
->nsrange
, FALSE
);
1409 assert(nsres
== NS_OK
);
1411 nsres
= nsIDOMRange_SetEnd(This
->nsrange
, ref_node
, ref_offset
);
1415 nsres
= nsIDOMRange_SetEnd(This
->nsrange
, ref_node
, ref_offset
);
1417 nsres
= nsIDOMRange_Collapse(This
->nsrange
, TRUE
);
1418 assert(nsres
== NS_OK
);
1420 nsres
= nsIDOMRange_SetStart(This
->nsrange
, ref_node
, ref_offset
);
1423 assert(nsres
== NS_OK
);
1425 nsIDOMNode_Release(ref_node
);
1429 static HRESULT WINAPI
HTMLTxtRange_compareEndPoints(IHTMLTxtRange
*iface
, BSTR how
,
1430 IHTMLTxtRange
*SourceRange
, LONG
*ret
)
1432 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1433 HTMLTxtRange
*src_range
;
1438 TRACE("(%p)->(%s %p %p)\n", This
, debugstr_w(how
), SourceRange
, ret
);
1440 nscmpt
= string_to_nscmptype(how
);
1442 return E_INVALIDARG
;
1444 src_range
= get_range_object(This
->doc
, SourceRange
);
1448 nsres
= nsIDOMRange_CompareBoundaryPoints(This
->nsrange
, nscmpt
, src_range
->nsrange
, &nsret
);
1449 if(NS_FAILED(nsres
))
1450 ERR("CompareBoundaryPoints failed: %08lx\n", nsres
);
1456 static HRESULT WINAPI
HTMLTxtRange_findText(IHTMLTxtRange
*iface
, BSTR String
,
1457 LONG count
, LONG Flags
, VARIANT_BOOL
*Success
)
1459 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1460 FIXME("(%p)->(%s %ld %08lx %p)\n", This
, debugstr_w(String
), count
, Flags
, Success
);
1464 static HRESULT WINAPI
HTMLTxtRange_moveToPoint(IHTMLTxtRange
*iface
, LONG x
, LONG y
)
1466 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1467 FIXME("(%p)->(%ld %ld)\n", This
, x
, y
);
1471 static HRESULT WINAPI
HTMLTxtRange_getBookmark(IHTMLTxtRange
*iface
, BSTR
*Bookmark
)
1473 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1474 FIXME("(%p)->(%p)\n", This
, Bookmark
);
1478 static HRESULT WINAPI
HTMLTxtRange_moveToBookmark(IHTMLTxtRange
*iface
, BSTR Bookmark
,
1479 VARIANT_BOOL
*Success
)
1481 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1482 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(Bookmark
), Success
);
1486 static HRESULT WINAPI
HTMLTxtRange_queryCommandSupported(IHTMLTxtRange
*iface
, BSTR cmdID
,
1487 VARIANT_BOOL
*pfRet
)
1489 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1490 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
1494 static HRESULT WINAPI
HTMLTxtRange_queryCommandEnabled(IHTMLTxtRange
*iface
, BSTR cmdID
,
1495 VARIANT_BOOL
*pfRet
)
1497 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1498 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
1502 static HRESULT WINAPI
HTMLTxtRange_queryCommandState(IHTMLTxtRange
*iface
, BSTR cmdID
,
1503 VARIANT_BOOL
*pfRet
)
1505 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1506 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
1510 static HRESULT WINAPI
HTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange
*iface
, BSTR cmdID
,
1511 VARIANT_BOOL
*pfRet
)
1513 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1514 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
1518 static HRESULT WINAPI
HTMLTxtRange_queryCommandText(IHTMLTxtRange
*iface
, BSTR cmdID
,
1521 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1522 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pcmdText
);
1526 static HRESULT WINAPI
HTMLTxtRange_queryCommandValue(IHTMLTxtRange
*iface
, BSTR cmdID
,
1529 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1530 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pcmdValue
);
1534 static HRESULT WINAPI
HTMLTxtRange_execCommand(IHTMLTxtRange
*iface
, BSTR cmdID
,
1535 VARIANT_BOOL showUI
, VARIANT value
, VARIANT_BOOL
*pfRet
)
1537 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1538 FIXME("(%p)->(%s %x v %p)\n", This
, debugstr_w(cmdID
), showUI
, pfRet
);
1542 static HRESULT WINAPI
HTMLTxtRange_execCommandShowHelp(IHTMLTxtRange
*iface
, BSTR cmdID
,
1543 VARIANT_BOOL
*pfRet
)
1545 HTMLTxtRange
*This
= impl_from_IHTMLTxtRange(iface
);
1546 FIXME("(%p)->(%s %p)\n", This
, debugstr_w(cmdID
), pfRet
);
1550 static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl
= {
1551 HTMLTxtRange_QueryInterface
,
1552 HTMLTxtRange_AddRef
,
1553 HTMLTxtRange_Release
,
1554 HTMLTxtRange_GetTypeInfoCount
,
1555 HTMLTxtRange_GetTypeInfo
,
1556 HTMLTxtRange_GetIDsOfNames
,
1557 HTMLTxtRange_Invoke
,
1558 HTMLTxtRange_get_htmlText
,
1559 HTMLTxtRange_put_text
,
1560 HTMLTxtRange_get_text
,
1561 HTMLTxtRange_parentElement
,
1562 HTMLTxtRange_duplicate
,
1563 HTMLTxtRange_inRange
,
1564 HTMLTxtRange_isEqual
,
1565 HTMLTxtRange_scrollIntoView
,
1566 HTMLTxtRange_collapse
,
1567 HTMLTxtRange_expand
,
1569 HTMLTxtRange_moveStart
,
1570 HTMLTxtRange_moveEnd
,
1571 HTMLTxtRange_select
,
1572 HTMLTxtRange_pasteHTML
,
1573 HTMLTxtRange_moveToElementText
,
1574 HTMLTxtRange_setEndPoint
,
1575 HTMLTxtRange_compareEndPoints
,
1576 HTMLTxtRange_findText
,
1577 HTMLTxtRange_moveToPoint
,
1578 HTMLTxtRange_getBookmark
,
1579 HTMLTxtRange_moveToBookmark
,
1580 HTMLTxtRange_queryCommandSupported
,
1581 HTMLTxtRange_queryCommandEnabled
,
1582 HTMLTxtRange_queryCommandState
,
1583 HTMLTxtRange_queryCommandIndeterm
,
1584 HTMLTxtRange_queryCommandText
,
1585 HTMLTxtRange_queryCommandValue
,
1586 HTMLTxtRange_execCommand
,
1587 HTMLTxtRange_execCommandShowHelp
1590 static inline HTMLTxtRange
*impl_from_IOleCommandTarget(IOleCommandTarget
*iface
)
1592 return CONTAINING_RECORD(iface
, HTMLTxtRange
, IOleCommandTarget_iface
);
1595 static HRESULT WINAPI
RangeCommandTarget_QueryInterface(IOleCommandTarget
*iface
, REFIID riid
, void **ppv
)
1597 HTMLTxtRange
*This
= impl_from_IOleCommandTarget(iface
);
1598 return IHTMLTxtRange_QueryInterface(&This
->IHTMLTxtRange_iface
, riid
, ppv
);
1601 static ULONG WINAPI
RangeCommandTarget_AddRef(IOleCommandTarget
*iface
)
1603 HTMLTxtRange
*This
= impl_from_IOleCommandTarget(iface
);
1604 return IHTMLTxtRange_AddRef(&This
->IHTMLTxtRange_iface
);
1607 static ULONG WINAPI
RangeCommandTarget_Release(IOleCommandTarget
*iface
)
1609 HTMLTxtRange
*This
= impl_from_IOleCommandTarget(iface
);
1610 return IHTMLTxtRange_Release(&This
->IHTMLTxtRange_iface
);
1613 static HRESULT WINAPI
RangeCommandTarget_QueryStatus(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
1614 ULONG cCmds
, OLECMD prgCmds
[], OLECMDTEXT
*pCmdText
)
1616 HTMLTxtRange
*This
= impl_from_IOleCommandTarget(iface
);
1617 FIXME("(%p)->(%s %ld %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), cCmds
, prgCmds
, pCmdText
);
1621 static HRESULT
exec_indent(HTMLTxtRange
*This
, VARIANT
*in
, VARIANT
*out
)
1623 nsIDOMElement
*blockquote_elem
, *p_elem
;
1624 nsIDOMDocumentFragment
*fragment
;
1627 TRACE("(%p)->(%p %p)\n", This
, in
, out
);
1629 if(!This
->doc
->dom_document
) {
1630 WARN("NULL dom_document\n");
1634 create_nselem(This
->doc
, L
"BLOCKQUOTE", &blockquote_elem
);
1635 create_nselem(This
->doc
, L
"P", &p_elem
);
1637 nsIDOMRange_ExtractContents(This
->nsrange
, &fragment
);
1638 nsIDOMElement_AppendChild(p_elem
, (nsIDOMNode
*)fragment
, &tmp
);
1639 nsIDOMDocumentFragment_Release(fragment
);
1640 nsIDOMNode_Release(tmp
);
1642 nsIDOMElement_AppendChild(blockquote_elem
, (nsIDOMNode
*)p_elem
, &tmp
);
1643 nsIDOMElement_Release(p_elem
);
1644 nsIDOMNode_Release(tmp
);
1646 nsIDOMRange_InsertNode(This
->nsrange
, (nsIDOMNode
*)blockquote_elem
);
1647 nsIDOMElement_Release(blockquote_elem
);
1652 static HRESULT WINAPI
RangeCommandTarget_Exec(IOleCommandTarget
*iface
, const GUID
*pguidCmdGroup
,
1653 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1655 HTMLTxtRange
*This
= impl_from_IOleCommandTarget(iface
);
1657 TRACE("(%p)->(%s %ld %lx %p %p)\n", This
, debugstr_guid(pguidCmdGroup
), nCmdID
,
1658 nCmdexecopt
, pvaIn
, pvaOut
);
1660 if(pguidCmdGroup
&& IsEqualGUID(&CGID_MSHTML
, pguidCmdGroup
)) {
1663 return exec_indent(This
, pvaIn
, pvaOut
);
1665 FIXME("Unsupported cmdid %ld of CGID_MSHTML\n", nCmdID
);
1668 FIXME("Unsupported cmd %ld of group %s\n", nCmdID
, debugstr_guid(pguidCmdGroup
));
1674 static const IOleCommandTargetVtbl OleCommandTargetVtbl
= {
1675 RangeCommandTarget_QueryInterface
,
1676 RangeCommandTarget_AddRef
,
1677 RangeCommandTarget_Release
,
1678 RangeCommandTarget_QueryStatus
,
1679 RangeCommandTarget_Exec
1682 static inline HTMLTxtRange
*HTMLTxtRange_from_DispatchEx(DispatchEx
*iface
)
1684 return CONTAINING_RECORD(iface
, HTMLTxtRange
, dispex
);
1687 static void *HTMLTxtRange_query_interface(DispatchEx
*dispex
, REFIID riid
)
1689 HTMLTxtRange
*This
= HTMLTxtRange_from_DispatchEx(dispex
);
1691 if(IsEqualGUID(&IID_IHTMLTxtRange
, riid
))
1692 return &This
->IHTMLTxtRange_iface
;
1693 if(IsEqualGUID(&IID_IOleCommandTarget
, riid
))
1694 return &This
->IOleCommandTarget_iface
;
1699 static void HTMLTxtRange_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
1701 HTMLTxtRange
*This
= HTMLTxtRange_from_DispatchEx(dispex
);
1703 note_cc_edge((nsISupports
*)This
->nsrange
, "nsrange", cb
);
1706 static void HTMLTxtRange_unlink(DispatchEx
*dispex
)
1708 HTMLTxtRange
*This
= HTMLTxtRange_from_DispatchEx(dispex
);
1709 unlink_ref(&This
->nsrange
);
1712 list_remove(&This
->entry
);
1716 static void HTMLTxtRange_destructor(DispatchEx
*dispex
)
1718 HTMLTxtRange
*This
= HTMLTxtRange_from_DispatchEx(dispex
);
1722 static const dispex_static_data_vtbl_t HTMLTxtRange_dispex_vtbl
= {
1723 .query_interface
= HTMLTxtRange_query_interface
,
1724 .destructor
= HTMLTxtRange_destructor
,
1725 .traverse
= HTMLTxtRange_traverse
,
1726 .unlink
= HTMLTxtRange_unlink
1729 static const tid_t HTMLTxtRange_iface_tids
[] = {
1733 static dispex_static_data_t HTMLTxtRange_dispex
= {
1735 &HTMLTxtRange_dispex_vtbl
,
1737 HTMLTxtRange_iface_tids
1740 HRESULT
HTMLTxtRange_Create(HTMLDocumentNode
*doc
, nsIDOMRange
*nsrange
, IHTMLTxtRange
**p
)
1744 ret
= malloc(sizeof(HTMLTxtRange
));
1746 return E_OUTOFMEMORY
;
1748 init_dispatch(&ret
->dispex
, &HTMLTxtRange_dispex
, dispex_compat_mode(&doc
->node
.event_target
.dispex
));
1750 ret
->IHTMLTxtRange_iface
.lpVtbl
= &HTMLTxtRangeVtbl
;
1751 ret
->IOleCommandTarget_iface
.lpVtbl
= &OleCommandTargetVtbl
;
1754 nsIDOMRange_AddRef(nsrange
);
1755 ret
->nsrange
= nsrange
;
1758 list_add_head(&doc
->range_list
, &ret
->entry
);
1760 *p
= &ret
->IHTMLTxtRange_iface
;
1764 static inline HTMLDOMRange
*impl_from_IHTMLDOMRange(IHTMLDOMRange
*iface
)
1766 return CONTAINING_RECORD(iface
, HTMLDOMRange
, IHTMLDOMRange_iface
);
1769 static HRESULT WINAPI
HTMLDOMRange_QueryInterface(IHTMLDOMRange
*iface
, REFIID riid
, void **ppv
)
1771 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1772 return IDispatchEx_QueryInterface(&This
->dispex
.IDispatchEx_iface
, riid
, ppv
);
1775 static ULONG WINAPI
HTMLDOMRange_AddRef(IHTMLDOMRange
*iface
)
1777 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1778 return IDispatchEx_AddRef(&This
->dispex
.IDispatchEx_iface
);
1781 static ULONG WINAPI
HTMLDOMRange_Release(IHTMLDOMRange
*iface
)
1783 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1784 return IDispatchEx_Release(&This
->dispex
.IDispatchEx_iface
);
1787 static HRESULT WINAPI
HTMLDOMRange_GetTypeInfoCount(IHTMLDOMRange
*iface
, UINT
*pctinfo
)
1789 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1791 return IDispatchEx_GetTypeInfoCount(&This
->dispex
.IDispatchEx_iface
, pctinfo
);
1794 static HRESULT WINAPI
HTMLDOMRange_GetTypeInfo(IHTMLDOMRange
*iface
, UINT iTInfo
,
1795 LCID lcid
, ITypeInfo
**ppTInfo
)
1797 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1799 return IDispatchEx_GetTypeInfo(&This
->dispex
.IDispatchEx_iface
, iTInfo
, lcid
, ppTInfo
);
1802 static HRESULT WINAPI
HTMLDOMRange_GetIDsOfNames(IHTMLDOMRange
*iface
, REFIID riid
,
1803 LPOLESTR
*rgszNames
, UINT cNames
,
1804 LCID lcid
, DISPID
*rgDispId
)
1806 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1808 return IDispatchEx_GetIDsOfNames(&This
->dispex
.IDispatchEx_iface
, riid
, rgszNames
,
1809 cNames
, lcid
, rgDispId
);
1812 static HRESULT WINAPI
HTMLDOMRange_Invoke(IHTMLDOMRange
*iface
, DISPID dispIdMember
,
1813 REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
,
1814 VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1816 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1818 return IDispatchEx_Invoke(&This
->dispex
.IDispatchEx_iface
, dispIdMember
, riid
,
1819 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
1822 static HRESULT WINAPI
HTMLDOMRange_get_startContainer(IHTMLDOMRange
*iface
, IHTMLDOMNode
**p
)
1824 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1825 FIXME("(%p)->(%p)\n", This
, p
);
1829 static HRESULT WINAPI
HTMLDOMRange_get_startOffset(IHTMLDOMRange
*iface
, LONG
*p
)
1831 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1832 FIXME("(%p)->(%p)\n", This
, p
);
1836 static HRESULT WINAPI
HTMLDOMRange_get_endContainer(IHTMLDOMRange
*iface
, IHTMLDOMNode
**p
)
1838 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1839 FIXME("(%p)->(%p)\n", This
, p
);
1843 static HRESULT WINAPI
HTMLDOMRange_get_endOffset(IHTMLDOMRange
*iface
, LONG
*p
)
1845 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1846 FIXME("(%p)->(%p)\n", This
, p
);
1850 static HRESULT WINAPI
HTMLDOMRange_get_collapsed(IHTMLDOMRange
*iface
, VARIANT_BOOL
*p
)
1852 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1853 FIXME("(%p)->(%p)\n", This
, p
);
1857 static HRESULT WINAPI
HTMLDOMRange_get_commonAncestorContainer(IHTMLDOMRange
*iface
, IHTMLDOMNode
**p
)
1859 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1860 FIXME("(%p)->(%p)\n", This
, p
);
1864 static HRESULT WINAPI
HTMLDOMRange_setStart(IHTMLDOMRange
*iface
, IDispatch
*node
, LONG offset
)
1866 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1867 FIXME("(%p)->(%p, %ld)\n", This
, node
, offset
);
1871 static HRESULT WINAPI
HTMLDOMRange_setEnd(IHTMLDOMRange
*iface
, IDispatch
*node
, LONG offset
)
1873 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1874 FIXME("(%p)->(%p, %ld)\n", This
, node
, offset
);
1878 static HRESULT WINAPI
HTMLDOMRange_setStartBefore(IHTMLDOMRange
*iface
, IDispatch
*node
)
1880 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1881 FIXME("(%p)->(%p)\n", This
, node
);
1885 static HRESULT WINAPI
HTMLDOMRange_setStartAfter(IHTMLDOMRange
*iface
, IDispatch
*node
)
1887 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1888 FIXME("(%p)->(%p)\n", This
, node
);
1892 static HRESULT WINAPI
HTMLDOMRange_setEndBefore(IHTMLDOMRange
*iface
, IDispatch
*node
)
1894 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1895 FIXME("(%p)->(%p)\n", This
, node
);
1899 static HRESULT WINAPI
HTMLDOMRange_setEndAfter(IHTMLDOMRange
*iface
, IDispatch
*node
)
1901 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1902 FIXME("(%p)->(%p)\n", This
, node
);
1906 static HRESULT WINAPI
HTMLDOMRange_collapse(IHTMLDOMRange
*iface
, VARIANT_BOOL tostart
)
1908 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1909 FIXME("(%p)->(%x)\n", This
, tostart
);
1913 static HRESULT WINAPI
HTMLDOMRange_selectNode(IHTMLDOMRange
*iface
, IDispatch
*node
)
1915 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1916 FIXME("(%p)->(%p)\n", This
, node
);
1920 static HRESULT WINAPI
HTMLDOMRange_selectNodeContents(IHTMLDOMRange
*iface
, IDispatch
*node
)
1922 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1923 FIXME("(%p)->(%p)\n", This
, node
);
1927 static HRESULT WINAPI
HTMLDOMRange_compareBoundaryPoints(IHTMLDOMRange
*iface
, short how
,
1928 IDispatch
*src_range
, LONG
*result
)
1930 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1931 FIXME("(%p)->(%x, %p, %p)\n", This
, how
, src_range
, result
);
1935 static HRESULT WINAPI
HTMLDOMRange_deleteContents(IHTMLDOMRange
*iface
)
1937 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1938 FIXME("(%p)\n", This
);
1942 static HRESULT WINAPI
HTMLDOMRange_extractContents(IHTMLDOMRange
*iface
, IDispatch
**p
)
1944 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1945 FIXME("(%p)->(%p)\n", This
, p
);
1949 static HRESULT WINAPI
HTMLDOMRange_cloneContents(IHTMLDOMRange
*iface
, IDispatch
**p
)
1951 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1952 FIXME("(%p)->(%p)\n", This
, p
);
1956 static HRESULT WINAPI
HTMLDOMRange_insertNode(IHTMLDOMRange
*iface
, IDispatch
*node
)
1958 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1959 FIXME("(%p)->(%p)\n", This
, node
);
1963 static HRESULT WINAPI
HTMLDOMRange_surroundContents(IHTMLDOMRange
*iface
, IDispatch
*parent
)
1965 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1966 FIXME("(%p)->(%p)\n", This
, parent
);
1970 static HRESULT WINAPI
HTMLDOMRange_cloneRange(IHTMLDOMRange
*iface
, IHTMLDOMRange
**p
)
1972 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1973 FIXME("(%p)->(%p)\n", This
, p
);
1977 static HRESULT WINAPI
HTMLDOMRange_toString(IHTMLDOMRange
*iface
, BSTR
*p
)
1979 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1980 FIXME("(%p)->(%p)\n", This
, p
);
1984 static HRESULT WINAPI
HTMLDOMRange_detach(IHTMLDOMRange
*iface
)
1986 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1987 FIXME("(%p)\n", This
);
1991 static HRESULT WINAPI
HTMLDOMRange_getClientRects(IHTMLDOMRange
*iface
, IHTMLRectCollection
**p
)
1993 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
1994 FIXME("(%p)->(%p)\n", This
, p
);
1998 static HRESULT WINAPI
HTMLDOMRange_getBoundingClientRect(IHTMLDOMRange
*iface
, IHTMLRect
**p
)
2000 HTMLDOMRange
*This
= impl_from_IHTMLDOMRange(iface
);
2001 FIXME("(%p)->(%p)\n", This
, p
);
2005 static const IHTMLDOMRangeVtbl HTMLDOMRangeVtbl
= {
2006 HTMLDOMRange_QueryInterface
,
2007 HTMLDOMRange_AddRef
,
2008 HTMLDOMRange_Release
,
2009 HTMLDOMRange_GetTypeInfoCount
,
2010 HTMLDOMRange_GetTypeInfo
,
2011 HTMLDOMRange_GetIDsOfNames
,
2012 HTMLDOMRange_Invoke
,
2013 HTMLDOMRange_get_startContainer
,
2014 HTMLDOMRange_get_startOffset
,
2015 HTMLDOMRange_get_endContainer
,
2016 HTMLDOMRange_get_endOffset
,
2017 HTMLDOMRange_get_collapsed
,
2018 HTMLDOMRange_get_commonAncestorContainer
,
2019 HTMLDOMRange_setStart
,
2020 HTMLDOMRange_setEnd
,
2021 HTMLDOMRange_setStartBefore
,
2022 HTMLDOMRange_setStartAfter
,
2023 HTMLDOMRange_setEndBefore
,
2024 HTMLDOMRange_setEndAfter
,
2025 HTMLDOMRange_collapse
,
2026 HTMLDOMRange_selectNode
,
2027 HTMLDOMRange_selectNodeContents
,
2028 HTMLDOMRange_compareBoundaryPoints
,
2029 HTMLDOMRange_deleteContents
,
2030 HTMLDOMRange_extractContents
,
2031 HTMLDOMRange_cloneContents
,
2032 HTMLDOMRange_insertNode
,
2033 HTMLDOMRange_surroundContents
,
2034 HTMLDOMRange_cloneRange
,
2035 HTMLDOMRange_toString
,
2036 HTMLDOMRange_detach
,
2037 HTMLDOMRange_getClientRects
,
2038 HTMLDOMRange_getBoundingClientRect
,
2041 static inline HTMLDOMRange
*HTMLDOMRange_from_DispatchEx(DispatchEx
*iface
)
2043 return CONTAINING_RECORD(iface
, HTMLDOMRange
, dispex
);
2046 static void *HTMLDOMRange_query_interface(DispatchEx
*dispex
, REFIID riid
)
2048 HTMLDOMRange
*This
= HTMLDOMRange_from_DispatchEx(dispex
);
2050 if(IsEqualGUID(&IID_IUnknown
, riid
))
2051 return &This
->IHTMLDOMRange_iface
;
2052 if(IsEqualGUID(&IID_IHTMLDOMRange
, riid
))
2053 return &This
->IHTMLDOMRange_iface
;
2058 static void HTMLDOMRange_traverse(DispatchEx
*dispex
, nsCycleCollectionTraversalCallback
*cb
)
2060 HTMLDOMRange
*This
= HTMLDOMRange_from_DispatchEx(dispex
);
2062 note_cc_edge((nsISupports
*)This
->nsrange
, "nsrange", cb
);
2065 static void HTMLDOMRange_unlink(DispatchEx
*dispex
)
2067 HTMLDOMRange
*This
= HTMLDOMRange_from_DispatchEx(dispex
);
2068 unlink_ref(&This
->nsrange
);
2071 static void HTMLDOMRange_destructor(DispatchEx
*dispex
)
2073 HTMLDOMRange
*This
= HTMLDOMRange_from_DispatchEx(dispex
);
2077 static const dispex_static_data_vtbl_t HTMLDOMRange_dispex_vtbl
= {
2078 .query_interface
= HTMLDOMRange_query_interface
,
2079 .destructor
= HTMLDOMRange_destructor
,
2080 .traverse
= HTMLDOMRange_traverse
,
2081 .unlink
= HTMLDOMRange_unlink
2084 static const tid_t HTMLDOMRange_iface_tids
[] = {
2089 static dispex_static_data_t HTMLDOMRange_dispex
= {
2091 &HTMLDOMRange_dispex_vtbl
,
2092 DispHTMLDOMRange_tid
,
2093 HTMLDOMRange_iface_tids
2096 HRESULT
create_dom_range(nsIDOMRange
*nsrange
, compat_mode_t compat_mode
, IHTMLDOMRange
**p
)
2100 ret
= malloc(sizeof(*ret
));
2102 return E_OUTOFMEMORY
;
2104 init_dispatch(&ret
->dispex
, &HTMLDOMRange_dispex
, compat_mode
);
2106 ret
->IHTMLDOMRange_iface
.lpVtbl
= &HTMLDOMRangeVtbl
;
2109 nsIDOMRange_AddRef(nsrange
);
2110 ret
->nsrange
= nsrange
;
2112 *p
= &ret
->IHTMLDOMRange_iface
;
2116 void detach_ranges(HTMLDocumentNode
*This
)
2118 HTMLTxtRange
*iter
, *next
;
2120 LIST_FOR_EACH_ENTRY_SAFE(iter
, next
, &This
->range_list
, HTMLTxtRange
, entry
) {
2122 list_remove(&iter
->entry
);
2127 IMarkupPointer2 IMarkupPointer2_iface
;
2131 static inline MarkupPointer
*impl_from_IMarkupPointer2(IMarkupPointer2
*iface
)
2133 return CONTAINING_RECORD(iface
, MarkupPointer
, IMarkupPointer2_iface
);
2136 static HRESULT WINAPI
MarkupPointer2_QueryInterface(IMarkupPointer2
*iface
, REFIID riid
, void **ppv
)
2138 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2140 TRACE("(%p)->(%s %p)\n", This
, debugstr_mshtml_guid(riid
), ppv
);
2142 if(IsEqualGUID(&IID_IUnknown
, riid
)) {
2143 *ppv
= &This
->IMarkupPointer2_iface
;
2144 }else if(IsEqualGUID(&IID_IMarkupPointer
, riid
)) {
2145 *ppv
= &This
->IMarkupPointer2_iface
;
2146 }else if(IsEqualGUID(&IID_IMarkupPointer2
, riid
)) {
2147 *ppv
= &This
->IMarkupPointer2_iface
;
2150 WARN("(%p)->(%s %p)\n", This
, debugstr_guid(riid
), ppv
);
2151 return E_NOINTERFACE
;
2154 IUnknown_AddRef((IUnknown
*)*ppv
);
2158 static ULONG WINAPI
MarkupPointer2_AddRef(IMarkupPointer2
*iface
)
2160 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2161 LONG ref
= InterlockedIncrement(&This
->ref
);
2163 TRACE("(%p) ref=%ld\n", This
, ref
);
2168 static ULONG WINAPI
MarkupPointer2_Release(IMarkupPointer2
*iface
)
2170 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2171 LONG ref
= InterlockedDecrement(&This
->ref
);
2173 TRACE("(%p) ref=%ld\n", This
, ref
);
2181 static HRESULT WINAPI
MarkupPointer2_OwningDoc(IMarkupPointer2
*iface
, IHTMLDocument2
**p
)
2183 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2184 FIXME("(%p)->(%p)\n", This
, p
);
2188 static HRESULT WINAPI
MarkupPointer2_Gravity(IMarkupPointer2
*iface
, POINTER_GRAVITY
*p
)
2190 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2191 FIXME("(%p)->(%p)\n", This
, p
);
2195 static HRESULT WINAPI
MarkupPointer2_SetGravity(IMarkupPointer2
*iface
, POINTER_GRAVITY gravity
)
2197 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2198 FIXME("(%p)->(%u)\n", This
, gravity
);
2202 static HRESULT WINAPI
MarkupPointer2_Cling(IMarkupPointer2
*iface
, BOOL
*p
)
2204 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2205 FIXME("(%p)->(%p)\n", This
, p
);
2209 static HRESULT WINAPI
MarkupPointer2_SetCling(IMarkupPointer2
*iface
, BOOL cling
)
2211 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2212 FIXME("(%p)->(%x)\n", This
, cling
);
2216 static HRESULT WINAPI
MarkupPointer2_Unposition(IMarkupPointer2
*iface
)
2218 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2219 FIXME("(%p)\n", This
);
2223 static HRESULT WINAPI
MarkupPointer2_IsPositioned(IMarkupPointer2
*iface
, BOOL
*p
)
2225 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2226 FIXME("(%p)->(%p)\n", This
, p
);
2230 static HRESULT WINAPI
MarkupPointer2_GetContainer(IMarkupPointer2
*iface
, IMarkupContainer
**p
)
2232 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2233 FIXME("(%p)->(%p)\n", This
, p
);
2237 static HRESULT WINAPI
MarkupPointer2_MoveAdjacentToElement(IMarkupPointer2
*iface
, IHTMLElement
*element
, ELEMENT_ADJACENCY adj
)
2239 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2240 FIXME("(%p)->(%p %u)\n", This
, element
, adj
);
2244 static HRESULT WINAPI
MarkupPointer2_MoveToPointer(IMarkupPointer2
*iface
, IMarkupPointer
*pointer
)
2246 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2247 FIXME("(%p)->(%p)\n", This
, pointer
);
2251 static HRESULT WINAPI
MarkupPointer2_MoveToContainer(IMarkupPointer2
*iface
, IMarkupContainer
*container
, BOOL at_start
)
2253 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2254 FIXME("(%p)->(%p %x)\n", This
, container
, at_start
);
2258 static HRESULT WINAPI
MarkupPointer2_Left(IMarkupPointer2
*iface
, BOOL move
, MARKUP_CONTEXT_TYPE
*context
,
2259 IHTMLElement
**element
, LONG
*len
, OLECHAR
*text
)
2261 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2262 FIXME("(%p)->(%x %p %p %p %p)\n", This
, move
, context
, element
, len
, text
);
2266 static HRESULT WINAPI
MarkupPointer2_Right(IMarkupPointer2
*iface
, BOOL move
, MARKUP_CONTEXT_TYPE
*context
,
2267 IHTMLElement
**element
, LONG
*len
, OLECHAR
*text
)
2269 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2270 FIXME("(%p)->(%x %p %p %p %p)\n", This
, move
, context
, element
, len
, text
);
2274 static HRESULT WINAPI
MarkupPointer2_CurrentScope(IMarkupPointer2
*iface
, IHTMLElement
**p
)
2276 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2277 FIXME("(%p)->(%p)\n", This
, p
);
2281 static HRESULT WINAPI
MarkupPointer2_IsLeftOf(IMarkupPointer2
*iface
, IMarkupPointer
*that_pointer
, BOOL
*p
)
2283 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2284 FIXME("(%p)->(%p %p)\n", This
, that_pointer
, p
);
2288 static HRESULT WINAPI
MarkupPointer2_IsLeftOfOrEqualTo(IMarkupPointer2
*iface
, IMarkupPointer
*that_pointer
, BOOL
*p
)
2290 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2291 FIXME("(%p)->(%p %p)\n", This
, that_pointer
, p
);
2295 static HRESULT WINAPI
MarkupPointer2_IsRightOf(IMarkupPointer2
*iface
, IMarkupPointer
*that_pointer
, BOOL
*p
)
2297 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2298 FIXME("(%p)->(%p %p)\n", This
, that_pointer
, p
);
2302 static HRESULT WINAPI
MarkupPointer2_IsRightOfOrEqualTo(IMarkupPointer2
*iface
, IMarkupPointer
*that_pointer
, BOOL
*p
)
2304 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2305 FIXME("(%p)->(%p %p)\n", This
, that_pointer
, p
);
2309 static HRESULT WINAPI
MarkupPointer2_IsEqualTo(IMarkupPointer2
*iface
, IMarkupPointer
*that_pointer
, BOOL
*p
)
2311 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2312 FIXME("(%p)->(%p %p)\n", This
, that_pointer
, p
);
2316 static HRESULT WINAPI
MarkupPointer2_MoveUnit(IMarkupPointer2
*iface
, MOVEUNIT_ACTION action
)
2318 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2319 FIXME("(%p)->(%u)\n", This
, action
);
2323 static HRESULT WINAPI
MarkupPointer2_FindText(IMarkupPointer2
*iface
, OLECHAR
*text
, DWORD flags
,
2324 IMarkupPointer
*end_match
, IMarkupPointer
*end_search
)
2326 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2327 FIXME("(%p)->(%s %lx %p %p)\n", This
, debugstr_w(text
), flags
, end_match
, end_search
);
2331 static HRESULT WINAPI
MarkupPointer2_IsAtWordBreak(IMarkupPointer2
*iface
, BOOL
*p
)
2333 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2334 FIXME("(%p)->(%p)\n", This
, p
);
2338 static HRESULT WINAPI
MarkupPointer2_GetMarkupPosition(IMarkupPointer2
*iface
, LONG
*p
)
2340 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2341 FIXME("(%p)->(%p)\n", This
, p
);
2345 static HRESULT WINAPI
MarkupPointer2_MoveToMarkupPosition(IMarkupPointer2
*iface
, IMarkupContainer
*container
, LONG mp
)
2347 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2348 FIXME("(%p)->(%p %ld)\n", This
, container
, mp
);
2352 static HRESULT WINAPI
MarkupPointer2_MoveUnitBounded(IMarkupPointer2
*iface
, MOVEUNIT_ACTION action
, IMarkupPointer
*boundary
)
2354 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2355 FIXME("(%p)->(%u %p)\n", This
, action
, boundary
);
2359 static HRESULT WINAPI
MarkupPointer2_IsInsideURL(IMarkupPointer2
*iface
, IMarkupPointer
*right
, BOOL
*p
)
2361 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2362 FIXME("(%p)->(%p %p)\n", This
, right
, p
);
2366 static HRESULT WINAPI
MarkupPointer2_MoveToContent(IMarkupPointer2
*iface
, IHTMLElement
*element
, BOOL at_start
)
2368 MarkupPointer
*This
= impl_from_IMarkupPointer2(iface
);
2369 FIXME("(%p)->(%p %x)\n", This
, element
, at_start
);
2373 static const IMarkupPointer2Vtbl MarkupPointer2Vtbl
= {
2374 MarkupPointer2_QueryInterface
,
2375 MarkupPointer2_AddRef
,
2376 MarkupPointer2_Release
,
2377 MarkupPointer2_OwningDoc
,
2378 MarkupPointer2_Gravity
,
2379 MarkupPointer2_SetGravity
,
2380 MarkupPointer2_Cling
,
2381 MarkupPointer2_SetCling
,
2382 MarkupPointer2_Unposition
,
2383 MarkupPointer2_IsPositioned
,
2384 MarkupPointer2_GetContainer
,
2385 MarkupPointer2_MoveAdjacentToElement
,
2386 MarkupPointer2_MoveToPointer
,
2387 MarkupPointer2_MoveToContainer
,
2388 MarkupPointer2_Left
,
2389 MarkupPointer2_Right
,
2390 MarkupPointer2_CurrentScope
,
2391 MarkupPointer2_IsLeftOf
,
2392 MarkupPointer2_IsLeftOfOrEqualTo
,
2393 MarkupPointer2_IsRightOf
,
2394 MarkupPointer2_IsRightOfOrEqualTo
,
2395 MarkupPointer2_IsEqualTo
,
2396 MarkupPointer2_MoveUnit
,
2397 MarkupPointer2_FindText
,
2398 MarkupPointer2_IsAtWordBreak
,
2399 MarkupPointer2_GetMarkupPosition
,
2400 MarkupPointer2_MoveToMarkupPosition
,
2401 MarkupPointer2_MoveUnitBounded
,
2402 MarkupPointer2_IsInsideURL
,
2403 MarkupPointer2_MoveToContent
2406 HRESULT
create_markup_pointer(IMarkupPointer
**ret
)
2408 MarkupPointer
*markup_pointer
;
2410 if(!(markup_pointer
= malloc(sizeof(*markup_pointer
))))
2411 return E_OUTOFMEMORY
;
2413 markup_pointer
->IMarkupPointer2_iface
.lpVtbl
= &MarkupPointer2Vtbl
;
2414 markup_pointer
->ref
= 1;
2416 *ret
= (IMarkupPointer
*)&markup_pointer
->IMarkupPointer2_iface
;