Jacek Caban : mshtml:
Reimplement editor mode left key using command controller.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jun 11 08:46:39 CDT 2007
Module: wine
Branch: master
Commit: 77be7f7b1c4b8ad07df9ca68a4665a72164ad33a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=77be7f7b1c4b8ad07df9ca68a4665a72164ad33a
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Jun 10 11:52:14 2007 +0200
mshtml: Reimplement editor mode left key using command controller.
---
dlls/mshtml/editor.c | 130 ++++++--------------------------------------------
1 files changed, 15 insertions(+), 115 deletions(-)
diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c
index c47740b..12a43e1 100644
--- a/dlls/mshtml/editor.c
+++ b/dlls/mshtml/editor.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
@@ -40,6 +40,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define NSCMD_ALIGN "cmd_align"
#define NSCMD_BOLD "cmd_bold"
#define NSCMD_CHARNEXT "cmd_charNext"
+#define NSCMD_CHARPREVIOUS "cmd_charPrevious"
#define NSCMD_FONTCOLOR "cmd_fontColor"
#define NSCMD_FONTFACE "cmd_fontFace"
#define NSCMD_INDENT "cmd_indent"
@@ -52,14 +53,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define NSCMD_OL "cmd_ol"
#define NSCMD_OUTDENT "cmd_outdent"
#define NSCMD_SELECTCHARNEXT "cmd_selectCharNext"
+#define NSCMD_SELECTCHARPREVIOUS "cmd_selectCharPrevious"
#define NSCMD_SELECTLINENEXT "cmd_selectLineNext"
#define NSCMD_SELECTLINEPREVIOUS "cmd_selectLinePrevious"
#define NSCMD_SELECTPAGEDOWN "cmd_selectPageDown"
#define NSCMD_SELECTPAGEUP "cmd_selectPageUp"
#define NSCMD_SELECTWORDNEXT "cmd_selectWordNext"
+#define NSCMD_SELECTWORDPREVIOUS "cmd_selectWordPrevious"
#define NSCMD_UL "cmd_ul"
#define NSCMD_UNDERLINE "cmd_underline"
#define NSCMD_WORDNEXT "cmd_wordNext"
+#define NSCMD_WORDPREVIOUS "cmd_wordPrevious"
#define NSSTATE_ATTRIBUTE "state_attribute"
#define NSSTATE_ALL "state_all"
@@ -462,118 +466,6 @@ static nsIDOMNode *get_child_text_node(nsIDOMNode *node, BOOL first)
return NULL;
}
-static nsIDOMNode *get_next_text_node(nsIDOMNode *node, BOOL next)
-{
- nsIDOMNode *iter, *iter2 = NULL, *parent = NULL;
- PRUint16 node_type;
-
- iter = node;
- nsIDOMNode_AddRef(iter);
-
- while(1) {
- if(next)
- nsIDOMNode_GetNextSibling(iter, &iter2);
- else
- nsIDOMNode_GetPreviousSibling(iter, &iter2);
-
- while(!iter2) {
- nsIDOMNode_GetParentNode(iter, &parent);
- nsIDOMNode_Release(iter);
- if(!parent)
- return NULL;
-
- iter = parent;
-
- if(next)
- nsIDOMNode_GetNextSibling(iter, &iter2);
- else
- nsIDOMNode_GetPreviousSibling(iter, &iter2);
- }
-
- nsIDOMNode_Release(iter);
- iter = iter2;
-
- nsIDOMNode_GetNodeType(iter, &node_type);
-
- switch(node_type) {
- case TEXT_NODE:
- if(is_visible_text_node(iter))
- return iter;
- case ELEMENT_NODE:
- iter2 = get_child_text_node(iter, next);
- if(iter2) {
- nsIDOMNode_Release(iter);
- return iter2;
- }
- }
- }
-
- return NULL;
-}
-
-static void collapse_end_node(nsISelection *selection, nsIDOMNode *node)
-{
- nsIDOMCharacterData *char_data;
- PRUint32 len;
-
- nsIDOMNode_QueryInterface(node, &IID_nsIDOMCharacterData, (void**)&char_data);
- nsIDOMCharacterData_GetLength(char_data, &len);
- nsIDOMCharacterData_Release(char_data);
-
- nsISelection_Collapse(selection, node, len);
-}
-
-static void collapse_next_char(HTMLDocument *doc, nsIDOMKeyEvent *event, BOOL next)
-{
- nsISelection *selection = get_ns_selection(doc);
- nsIDOMNode *node;
- PRBool collapsed, b;
- PRUint16 node_type;
- nsIDOMNode *text_node;
-
- nsIDOMKeyEvent_GetCtrlKey(event, &b);
- if(b) return;
-
- nsIDOMKeyEvent_GetShiftKey(event, &b);
- if(b) return;
-
- nsISelection_GetIsCollapsed(selection, &collapsed);
- if(!collapsed)
- nsISelection_CollapseToEnd(selection);
-
- nsISelection_GetFocusNode(selection, &node);
- nsIDOMNode_GetNodeType(node, &node_type);
-
- if(node_type == TEXT_NODE) {
- nsIDOMCharacterData *char_data;
- PRInt32 offset;
- PRUint32 len;
-
- nsISelection_GetFocusOffset(selection, &offset);
-
- nsIDOMNode_QueryInterface(node, &IID_nsIDOMCharacterData, (void**)&char_data);
- nsIDOMCharacterData_GetLength(char_data, &len);
- nsIDOMCharacterData_Release(char_data);
-
- if(next ? offset != len : offset) {
- nsISelection_Collapse(selection, node, offset + (next?1:-1));
- return;
- }
- }
-
- text_node = get_next_text_node(node, next);
- if(text_node) {
- if(next)
- nsISelection_Collapse(selection, text_node, 1);
- else
- collapse_end_node(selection, text_node);
- nsIDOMNode_Release(text_node);
- }
-
- nsIDOMNode_Release(node);
- nsISelection_Release(selection);
-}
-
static void handle_arrow_key(HTMLDocument *This, nsIDOMKeyEvent *event, const char **cmds)
{
int i=0;
@@ -602,10 +494,18 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event)
nsIDOMKeyEvent_GetKeyCode(key_event, &code);
switch(code) {
- case DOM_VK_LEFT:
+ case DOM_VK_LEFT: {
+ static const char *cmds[] = {
+ NSCMD_CHARPREVIOUS,
+ NSCMD_WORDPREVIOUS,
+ NSCMD_SELECTCHARPREVIOUS,
+ NSCMD_SELECTWORDPREVIOUS
+ };
+
TRACE("left\n");
- collapse_next_char(This, key_event, FALSE);
+ handle_arrow_key(This, key_event, cmds);
break;
+ }
case DOM_VK_RIGHT: {
static const char *cmds[] = {
NSCMD_CHARNEXT,
More information about the wine-cvs
mailing list