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