From 7a0e06b9e297311237ce18ca0df7b1bd756d47ed Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sun, 10 Jun 2007 11:28:52 +0200 Subject: [PATCH] mshtml: Move IDM_FONTSIZE, IDM_FONTNAME and IDM_FORECOLOR to edit state command table. This patch temporary adds code duplication. --- dlls/mshtml/editor.c | 203 +++++++++++++++++++++++++++++++++++ dlls/mshtml/mshtml_private.h | 2 + dlls/mshtml/olecmd.c | 143 +----------------------- 3 files changed, 208 insertions(+), 140 deletions(-) diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c index 0a444bfbeaa..d6bcf2af7c4 100644 --- a/dlls/mshtml/editor.c +++ b/dlls/mshtml/editor.c @@ -28,6 +28,7 @@ #include "winuser.h" #include "winnls.h" #include "ole2.h" +#include "mshtmcid.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -36,6 +37,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +#define NSCMD_FONTCOLOR "cmd_fontColor" +#define NSCMD_FONTFACE "cmd_fontFace" + +#define NSSTATE_ATTRIBUTE "state_attribute" + #define DOM_VK_LEFT VK_LEFT #define DOM_VK_UP VK_UP #define DOM_VK_RIGHT VK_RIGHT @@ -44,6 +50,65 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); static const WCHAR wszFont[] = {'f','o','n','t',0}; static const WCHAR wszSize[] = {'s','i','z','e',0}; +static void do_ns_command(NSContainer *This, const char *cmd, nsICommandParams *nsparam) +{ + nsICommandManager *cmdmgr; + nsIInterfaceRequestor *iface_req; + nsresult nsres; + + TRACE("(%p)\n", This); + + nsres = nsIWebBrowser_QueryInterface(This->webbrowser, + &IID_nsIInterfaceRequestor, (void**)&iface_req); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIInterfaceRequestor: %08x\n", nsres); + return; + } + + nsres = nsIInterfaceRequestor_GetInterface(iface_req, &IID_nsICommandManager, + (void**)&cmdmgr); + nsIInterfaceRequestor_Release(iface_req); + if(NS_FAILED(nsres)) { + ERR("Could not get nsICommandManager: %08x\n", nsres); + return; + } + + nsres = nsICommandManager_DoCommand(cmdmgr, cmd, nsparam, NULL); + if(NS_FAILED(nsres)) + ERR("DoCommand(%s) failed: %08x\n", debugstr_a(cmd), nsres); + + nsICommandManager_Release(cmdmgr); +} + +static nsresult get_ns_command_state(NSContainer *This, const char *cmd, nsICommandParams *nsparam) +{ + nsICommandManager *cmdmgr; + nsIInterfaceRequestor *iface_req; + nsresult nsres; + + nsres = nsIWebBrowser_QueryInterface(This->webbrowser, + &IID_nsIInterfaceRequestor, (void**)&iface_req); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIInterfaceRequestor: %08x\n", nsres); + return nsres; + } + + nsres = nsIInterfaceRequestor_GetInterface(iface_req, &IID_nsICommandManager, + (void**)&cmdmgr); + nsIInterfaceRequestor_Release(iface_req); + if(NS_FAILED(nsres)) { + ERR("Could not get nsICommandManager: %08x\n", nsres); + return nsres; + } + + nsres = nsICommandManager_GetCommandState(cmdmgr, cmd, NULL, nsparam); + if(NS_FAILED(nsres)) + ERR("GetCommandState(%s) failed: %08x\n", debugstr_a(cmd), nsres); + + nsICommandManager_Release(cmdmgr); + return nsres; +} + static nsISelection *get_ns_selection(HTMLDocument *This) { nsIDOMWindow *dom_window; @@ -435,3 +500,141 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event) nsIDOMKeyEvent_Release(key_event); } + +static HRESULT exec_fontname(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out) +{ + TRACE("(%p)->(%p %p)\n", This, in, out); + + if(!This->nscontainer) + return E_FAIL; + + if(in) { + nsICommandParams *nsparam = create_nscommand_params(); + char *stra; + DWORD len; + + if(V_VT(in) != VT_BSTR) { + FIXME("Unsupported vt=%d\n", V_VT(out)); + return E_INVALIDARG; + } + + len = WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, NULL, 0, NULL, NULL); + stra = mshtml_alloc(len); + WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, stra, -1, NULL, NULL); + nsICommandParams_SetCStringValue(nsparam, NSSTATE_ATTRIBUTE, stra); + mshtml_free(stra); + + do_ns_command(This->nscontainer, NSCMD_FONTFACE, nsparam); + + nsICommandParams_Release(nsparam); + } + + if(out) { + nsICommandParams *nsparam; + LPWSTR strw; + char *stra; + DWORD len; + nsresult nsres; + + if(V_VT(out) != VT_BSTR) { + FIXME("Unsupported vt=%d\n", V_VT(out)); + return E_INVALIDARG; + } + + nsparam = create_nscommand_params(); + + nsres = get_ns_command_state(This->nscontainer, NSCMD_FONTFACE, nsparam); + if(NS_FAILED(nsres)) + return S_OK; + + nsICommandParams_GetCStringValue(nsparam, NSSTATE_ATTRIBUTE, &stra); + nsICommandParams_Release(nsparam); + + len = MultiByteToWideChar(CP_ACP, 0, stra, -1, NULL, 0); + strw = mshtml_alloc(len*sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, stra, -1, strw, -1); + nsfree(stra); + + V_BSTR(out) = SysAllocString(strw); + mshtml_free(strw); + } + + return S_OK; +} + +static HRESULT exec_forecolor(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out) +{ + TRACE("(%p)->(%p %p)\n", This, in, out); + + if(in) { + if(V_VT(in) == VT_I4) { + nsICommandParams *nsparam = create_nscommand_params(); + char color_str[10]; + + sprintf(color_str, "#%02x%02x%02x", + V_I4(in)&0xff, (V_I4(in)>>8)&0xff, (V_I4(in)>>16)&0xff); + + nsICommandParams_SetCStringValue(nsparam, NSSTATE_ATTRIBUTE, color_str); + do_ns_command(This->nscontainer, NSCMD_FONTCOLOR, nsparam); + + nsICommandParams_Release(nsparam); + }else { + FIXME("unsupported in vt=%d\n", V_VT(in)); + } + } + + if(out) { + FIXME("unsupported out\n"); + return E_NOTIMPL; + } + + return S_OK; +} + +static HRESULT exec_fontsize(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out) +{ + TRACE("(%p)->(%p %p)\n", This, in, out); + + if(out) { + WCHAR val[10] = {0}; + + switch(V_VT(out)) { + case VT_I4: + get_font_size(This, val); + V_I4(out) = strtolW(val, NULL, 10); + break; + case VT_BSTR: + get_font_size(This, val); + V_BSTR(out) = SysAllocString(val); + break; + default: + FIXME("unsupported vt %d\n", V_VT(out)); + } + } + + if(in) { + switch(V_VT(in)) { + case VT_I4: { + WCHAR size[10]; + static const WCHAR format[] = {'%','d',0}; + wsprintfW(size, format, V_I4(in)); + set_font_size(This, size); + break; + } + case VT_BSTR: + set_font_size(This, V_BSTR(in)); + break; + default: + FIXME("unsupported vt %d\n", V_VT(in)); + } + } + + return S_OK; +} + +const cmdtable_t editmode_cmds[] = { + {IDM_FONTNAME, NULL, exec_fontname}, + {IDM_FONTSIZE, NULL, exec_fontsize}, + {IDM_FORECOLOR, NULL, exec_forecolor}, + {0,NULL,NULL} +}; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 179378ef92c..5c2d68945e7 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -380,6 +380,8 @@ typedef struct { HRESULT (*exec)(HTMLDocument*,DWORD,VARIANT*,VARIANT*); } cmdtable_t; +extern const cmdtable_t editmode_cmds[]; + /* editor */ void handle_edit_event(HTMLDocument*,nsIDOMEvent*); diff --git a/dlls/mshtml/olecmd.c b/dlls/mshtml/olecmd.c index 767540e1abd..9ed66e0fcf8 100644 --- a/dlls/mshtml/olecmd.c +++ b/dlls/mshtml/olecmd.c @@ -44,9 +44,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); #define NSCMD_BOLD "cmd_bold" #define NSCMD_ITALIC "cmd_italic" #define NSCMD_UNDERLINE "cmd_underline" -#define NSCMD_FONTCOLOR "cmd_fontColor" #define NSCMD_ALIGN "cmd_align" -#define NSCMD_FONTFACE "cmd_fontFace" #define NSCMD_INDENT "cmd_indent" #define NSCMD_OUTDENT "cmd_outdent" #define NSCMD_INSERTHR "cmd_insertHR" @@ -595,137 +593,6 @@ static HRESULT exec_mshtml_paste(HTMLDocument *This) return E_NOTIMPL; } -static HRESULT exec_fontname(HTMLDocument *This, VARIANT *in, VARIANT *out) -{ - TRACE("(%p)->(%p %p)\n", This, in, out); - - if(!This->nscontainer) - return E_FAIL; - - if(in) { - nsICommandParams *nsparam = create_nscommand_params(); - char *stra; - DWORD len; - - if(V_VT(in) != VT_BSTR) { - FIXME("Unsupported vt=%d\n", V_VT(out)); - return E_INVALIDARG; - } - - len = WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, NULL, 0, NULL, NULL); - stra = mshtml_alloc(len); - WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, stra, -1, NULL, NULL); - nsICommandParams_SetCStringValue(nsparam, NSSTATE_ATTRIBUTE, stra); - mshtml_free(stra); - - do_ns_command(This->nscontainer, NSCMD_FONTFACE, nsparam); - - nsICommandParams_Release(nsparam); - } - - if(out) { - nsICommandParams *nsparam; - LPWSTR strw; - char *stra; - DWORD len; - nsresult nsres; - - if(V_VT(out) != VT_BSTR) { - FIXME("Unsupported vt=%d\n", V_VT(out)); - return E_INVALIDARG; - } - - nsparam = create_nscommand_params(); - - nsres = get_ns_command_state(This->nscontainer, NSCMD_FONTFACE, nsparam); - if(NS_FAILED(nsres)) - return S_OK; - - nsICommandParams_GetCStringValue(nsparam, NSSTATE_ATTRIBUTE, &stra); - nsICommandParams_Release(nsparam); - - len = MultiByteToWideChar(CP_ACP, 0, stra, -1, NULL, 0); - strw = mshtml_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, stra, -1, strw, -1); - nsfree(stra); - - V_BSTR(out) = SysAllocString(strw); - mshtml_free(strw); - } - - return S_OK; -} - -static HRESULT exec_forecolor(HTMLDocument *This, VARIANT *in, VARIANT *out) -{ - TRACE("(%p)->(%p %p)\n", This, in, out); - - if(in) { - if(V_VT(in) == VT_I4) { - nsICommandParams *nsparam = create_nscommand_params(); - char color_str[10]; - - sprintf(color_str, "#%02x%02x%02x", - V_I4(in)&0xff, (V_I4(in)>>8)&0xff, (V_I4(in)>>16)&0xff); - - nsICommandParams_SetCStringValue(nsparam, NSSTATE_ATTRIBUTE, color_str); - do_ns_command(This->nscontainer, NSCMD_FONTCOLOR, nsparam); - - nsICommandParams_Release(nsparam); - }else { - FIXME("unsupported in vt=%d\n", V_VT(in)); - } - } - - if(out) { - FIXME("unsupported out\n"); - return E_NOTIMPL; - } - - return S_OK; -} - -static HRESULT exec_fontsize(HTMLDocument *This, VARIANT *in, VARIANT *out) -{ - TRACE("(%p)->(%p %p)\n", This, in, out); - - if(out) { - WCHAR val[10] = {0}; - - switch(V_VT(out)) { - case VT_I4: - get_font_size(This, val); - V_I4(out) = strtolW(val, NULL, 10); - break; - case VT_BSTR: - get_font_size(This, val); - V_BSTR(out) = SysAllocString(val); - break; - default: - FIXME("unsupported vt %d\n", V_VT(out)); - } - } - - if(in) { - switch(V_VT(in)) { - case VT_I4: { - WCHAR size[10]; - static const WCHAR format[] = {'%','d',0}; - wsprintfW(size, format, V_I4(in)); - set_font_size(This, size); - break; - } - case VT_BSTR: - set_font_size(This, V_BSTR(in)); - break; - default: - FIXME("unsupported vt %d\n", V_VT(in)); - } - } - - return S_OK; -} - static HRESULT exec_bold(HTMLDocument *This) { TRACE("(%p)\n", This); @@ -1212,7 +1079,9 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID return OLECMDERR_E_NOTSUPPORTED; }else if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) { HRESULT hres = exec_from_table(This, base_cmds, nCmdID, nCmdexecopt, pvaIn, pvaOut); - + if(hres == OLECMDERR_E_NOTSUPPORTED) + hres = exec_from_table(This, editmode_cmds, nCmdID, + nCmdexecopt, pvaIn, pvaOut); if(hres != OLECMDERR_E_NOTSUPPORTED) return hres; @@ -1225,10 +1094,6 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID if(pvaIn || pvaOut) FIXME("unsupported arguments\n"); return exec_mshtml_cut(This); - case IDM_FONTNAME: - return exec_fontname(This, pvaIn, pvaOut); - case IDM_FONTSIZE: - return exec_fontsize(This, pvaIn, pvaOut); case IDM_PASTE: if(pvaIn || pvaOut) FIXME("unsupported arguments\n"); @@ -1239,8 +1104,6 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID if(pvaIn || pvaOut) FIXME("unsupported arguments\n"); return exec_bold(This); - case IDM_FORECOLOR: - return exec_forecolor(This, pvaIn, pvaOut); case IDM_ITALIC: if(pvaIn || pvaOut) FIXME("unsupported arguments\n");