Jacek Caban : mshtml: Added IHTMLTxtRange::move("word") implementation.
Alexandre Julliard
julliard at winehq.org
Thu Sep 13 07:17:24 CDT 2007
Module: wine
Branch: master
Commit: 964479afa91e83a79e5ade7afa3811a424dc2eb5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=964479afa91e83a79e5ade7afa3811a424dc2eb5
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 12 23:36:48 2007 +0200
mshtml: Added IHTMLTxtRange::move("word") implementation.
---
dlls/mshtml/tests/dom.c | 50 ++++++++++++++++++++++++++++++++++++
dlls/mshtml/txtrange.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 114 insertions(+), 1 deletions(-)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 8bcf7b4..2a8a522 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -268,6 +268,56 @@ static void test_txtrange(IHTMLDocument2 *doc)
test_range_moveend(range, characterW, 2, 2);
test_range_text(range, "123\r\ni");
+ hres = IHTMLTxtRange_duplicate(body_range, &range);
+ ok(hres == S_OK, "duplicate failed: %08x\n", hres);
+
+ test_range_move(range, wordW, 1, 1);
+ test_range_moveend(range, characterW, 2, 2);
+ test_range_text(range, "ab");
+
+ test_range_move(range, characterW, -2, -2);
+ test_range_moveend(range, characterW, 2, 2);
+ test_range_text(range, "t ");
+
+ test_range_move(range, wordW, 3, 3);
+ test_range_move(range, wordW, -2, -2);
+ test_range_moveend(range, characterW, 2, 2);
+ test_range_text(range, "ab");
+
+ test_range_move(range, characterW, -6, -5);
+ test_range_moveend(range, characterW, -1, 0);
+ test_range_moveend(range, characterW, -6, 0);
+ test_range_move(range, characterW, 2, 2);
+ test_range_moveend(range, characterW, 2, 2);
+ test_range_text(range, "st");
+ test_range_moveend(range, characterW, -6, -4);
+ test_range_moveend(range, characterW, 2, 2);
+
+ IHTMLTxtRange_Release(range);
+
+ hres = IHTMLTxtRange_duplicate(body_range, &range);
+ ok(hres == S_OK, "duplicate failed: %08x\n", hres);
+
+ test_range_move(range, wordW, 2, 2);
+ test_range_moveend(range, characterW, 2, 2);
+ test_range_text(range, "12");
+
+ test_range_move(range, characterW, 15, 14);
+ test_range_move(range, characterW, -2, -2);
+ test_range_moveend(range, characterW, 3, 2);
+ test_range_text(range, "t");
+ test_range_moveend(range, characterW, -1, -1);
+ test_range_text(range, "t");
+ test_range_expand(range, wordW, VARIANT_TRUE, "text");
+ test_range_move(range, characterW, -2, -2);
+ test_range_moveend(range, characterW, 2, 2);
+ test_range_text(range, "s ");
+ test_range_move(range, characterW, 100, 7);
+ test_range_move(range, wordW, 1, 0);
+ test_range_move(range, characterW, -2, -2);
+ test_range_moveend(range, characterW, 3, 2);
+ test_range_text(range, "t");
+
IHTMLTxtRange_Release(range);
IHTMLTxtRange_Release(body_range);
}
diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c
index 1a06508..bbf7d24 100644
--- a/dlls/mshtml/txtrange.c
+++ b/dlls/mshtml/txtrange.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2006 Jacek Caban for CodeWeavers
+ * Copyright 2006-2007 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -689,6 +689,48 @@ static long find_prev_space(HTMLTxtRange *This, const dompos_t *pos, BOOL first_
return TRUE;
}
+static long move_next_words(long cnt, const dompos_t *pos, dompos_t *new_pos)
+{
+ dompos_t iter, tmp;
+ long ret = 0;
+
+ iter = *pos;
+ dompos_addref(&iter);
+
+ while(ret < cnt) {
+ if(!find_next_space(&iter, FALSE, &tmp))
+ break;
+
+ ret++;
+ dompos_release(&iter);
+ iter = tmp;
+ }
+
+ *new_pos = iter;
+ return ret;
+}
+
+static long move_prev_words(HTMLTxtRange *This, long cnt, const dompos_t *pos, dompos_t *new_pos)
+{
+ dompos_t iter, tmp;
+ long ret = 0;
+
+ iter = *pos;
+ dompos_addref(&iter);
+
+ while(ret < cnt) {
+ if(!find_prev_space(This, &iter, FALSE, &tmp))
+ break;
+
+ dompos_release(&iter);
+ iter = tmp;
+ ret++;
+ }
+
+ *new_pos = iter;
+ return ret;
+}
+
#define HTMLTXTRANGE_THIS(iface) DEFINE_THIS(HTMLTxtRange, HTMLTxtRange, iface)
static HRESULT WINAPI HTMLTxtRange_QueryInterface(IHTMLTxtRange *iface, REFIID riid, void **ppv)
@@ -1075,6 +1117,27 @@ static HRESULT WINAPI HTMLTxtRange_move(IHTMLTxtRange *iface, BSTR Unit,
break;
}
+ case RU_WORD: {
+ dompos_t cur_pos, new_pos;
+
+ get_cur_pos(This, TRUE, &cur_pos);
+
+ if(Count > 0) {
+ *ActualCount = move_next_words(Count, &cur_pos, &new_pos);
+ set_range_pos(This, FALSE, &new_pos);
+ IHTMLTxtRange_collapse(HTMLTXTRANGE(This), FALSE);
+ dompos_release(&new_pos);
+ }else {
+ *ActualCount = -move_prev_words(This, -Count, &cur_pos, &new_pos);
+ set_range_pos(This, TRUE, &new_pos);
+ IHTMLTxtRange_collapse(HTMLTXTRANGE(This), TRUE);
+ dompos_release(&new_pos);
+ }
+
+ dompos_release(&cur_pos);
+ break;
+ }
+
default:
FIXME("unimplemented unit %s\n", debugstr_w(Unit));
}
More information about the wine-cvs
mailing list