Jacek Caban : mshtml: Use command table for IDM_COPY, IDM_CUT and IDM_PASTE query.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 11 08:46:34 CDT 2007


Module: wine
Branch: master
Commit: 7d336240d47740ee568451adb717a32080af0d27
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7d336240d47740ee568451adb717a32080af0d27

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Jun 10 11:31:50 2007 +0200

mshtml: Use command table for IDM_COPY, IDM_CUT and IDM_PASTE query.

---

 dlls/mshtml/olecmd.c |   59 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/dlls/mshtml/olecmd.c b/dlls/mshtml/olecmd.c
index edb02c5..e78d038 100644
--- a/dlls/mshtml/olecmd.c
+++ b/dlls/mshtml/olecmd.c
@@ -530,6 +530,12 @@ static DWORD query_align_status(HTMLDocument *This, const char *align_str)
     return OLECMDF_SUPPORTED | OLECMDF_ENABLED | (align && !strcmp(align_str, align) ? OLECMDF_LATCHED : 0);
 }
 
+static HRESULT query_mshtml_copy(HTMLDocument *This, OLECMD *cmd)
+{
+    FIXME("(%p)\n", This);
+    cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
+    return S_OK;
+}
 
 static HRESULT exec_mshtml_copy(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
 {
@@ -537,12 +543,26 @@ static HRESULT exec_mshtml_copy(HTMLDocument *This, DWORD cmdexecopt, VARIANT *i
     return E_NOTIMPL;
 }
 
+static HRESULT query_mshtml_cut(HTMLDocument *This, OLECMD *cmd)
+{
+    FIXME("(%p)\n", This);
+    cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
+    return S_OK;
+}
+
 static HRESULT exec_mshtml_cut(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
 {
     FIXME("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
     return E_NOTIMPL;
 }
 
+static HRESULT query_mshtml_paste(HTMLDocument *This, OLECMD *cmd)
+{
+    FIXME("(%p)\n", This);
+    cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
+    return S_OK;
+}
+
 static HRESULT exec_mshtml_paste(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
 {
     FIXME("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
@@ -715,9 +735,9 @@ static const struct {
 };
 
 static const cmdtable_t base_cmds[] = {
-    {IDM_COPY,             NULL,           exec_mshtml_copy},
-    {IDM_PASTE,            NULL,           exec_mshtml_paste},
-    {IDM_CUT,              NULL,           exec_mshtml_cut},
+    {IDM_COPY,             query_mshtml_copy,     exec_mshtml_copy},
+    {IDM_PASTE,            query_mshtml_paste,    exec_mshtml_paste},
+    {IDM_CUT,              query_mshtml_cut,      exec_mshtml_cut},
     {IDM_BROWSEMODE,       NULL,           exec_browsemode},
     {IDM_EDITMODE,         NULL,           exec_editmode},
     {IDM_PRINT,            NULL,           exec_print},
@@ -745,6 +765,21 @@ static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
     return IHTMLDocument_Release(HTMLDOC(This));
 }
 
+static HRESULT query_from_table(HTMLDocument *This, const cmdtable_t *cmdtable, OLECMD *cmd)
+{
+    const cmdtable_t *iter = cmdtable;
+
+    cmd->cmdf = 0;
+
+    while(iter->id && iter->id != cmd->cmdID)
+        iter++;
+
+    if(!iter->id || !iter->query)
+        return OLECMDERR_E_NOTSUPPORTED;
+
+    return iter->query(This, cmd);
+}
+
 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
 {
@@ -795,15 +830,13 @@ static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, con
         ULONG i;
 
         for(i=0; i<cCmds; i++) {
+            HRESULT hres = query_from_table(This, base_cmds, prgCmds+i);
+            if(hres == OLECMDERR_E_NOTSUPPORTED)
+                hres = query_from_table(This, editmode_cmds, prgCmds+i);
+            if(hres != OLECMDERR_E_NOTSUPPORTED)
+                continue;
+
             switch(prgCmds[i].cmdID) {
-            case IDM_COPY:
-                FIXME("CGID_MSHTML: IDM_COPY\n");
-                prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
-                break;
-            case IDM_CUT:
-                FIXME("CGID_MSHTML: IDM_CUT\n");
-                prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
-                break;
             case IDM_FONTNAME:
                 TRACE("CGID_MSHTML: IDM_FONTNAME\n");
                 prgCmds[i].cmdf = query_edit_status(This, NULL);
@@ -816,10 +849,6 @@ static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, con
                 FIXME("CGID_MSHTML: IDM_PRINT\n");
                 prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
                 break;
-            case IDM_PASTE:
-                FIXME("CGID_MSHTML: IDM_PASTE\n");
-                prgCmds[i].cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
-                break;
             case IDM_BOLD:
                 TRACE("CGID_MSHTML: IDM_BOLD\n");
                 prgCmds[i].cmdf = query_edit_status(This, NSCMD_BOLD);




More information about the wine-cvs mailing list