ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

olecmd.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2005-2007 Jacek Caban for CodeWeavers
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 #include <stdarg.h>
00020 
00021 #define COBJMACROS
00022 
00023 #include "windef.h"
00024 #include "winbase.h"
00025 #include "winuser.h"
00026 #include "ole2.h"
00027 #include "shlguid.h"
00028 #include "mshtmdid.h"
00029 #include "idispids.h"
00030 #include "mshtmcid.h"
00031 
00032 #include "wine/debug.h"
00033 #include "wine/unicode.h"
00034 
00035 #include "mshtml_private.h"
00036 #include "resource.h"
00037 
00038 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
00039 
00040 #define NSCMD_COPY "cmd_copy"
00041 
00042 void do_ns_command(HTMLDocument *This, const char *cmd, nsICommandParams *nsparam)
00043 {
00044     nsICommandManager *cmdmgr;
00045     nsresult nsres;
00046 
00047     TRACE("(%p)\n", This);
00048 
00049     if(!This->doc_obj || !This->doc_obj->nscontainer)
00050         return;
00051 
00052     nsres = get_nsinterface((nsISupports*)This->doc_obj->nscontainer->webbrowser, &IID_nsICommandManager, (void**)&cmdmgr);
00053     if(NS_FAILED(nsres)) {
00054         ERR("Could not get nsICommandManager: %08x\n", nsres);
00055         return;
00056     }
00057 
00058     nsres = nsICommandManager_DoCommand(cmdmgr, cmd, nsparam, This->window->nswindow);
00059     if(NS_FAILED(nsres))
00060         ERR("DoCommand(%s) failed: %08x\n", debugstr_a(cmd), nsres);
00061 
00062     nsICommandManager_Release(cmdmgr);
00063 }
00064 
00065 /**********************************************************
00066  * IOleCommandTarget implementation
00067  */
00068 
00069 #define CMDTARGET_THIS(iface) DEFINE_THIS(HTMLDocument, OleCommandTarget, iface)
00070 
00071 static HRESULT exec_open(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00072 {
00073     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00074     return E_NOTIMPL;
00075 }
00076 
00077 static HRESULT exec_new(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00078 {
00079     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00080     return E_NOTIMPL;
00081 }
00082 
00083 static HRESULT exec_save(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00084 {
00085     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00086     return E_NOTIMPL;
00087 }
00088 
00089 static HRESULT exec_save_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00090 {
00091     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00092     return E_NOTIMPL;
00093 }
00094 
00095 static HRESULT exec_save_copy_as(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00096 {
00097     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00098     return E_NOTIMPL;
00099 }
00100 
00101 static nsresult set_head_text(nsIPrintSettings *settings, LPCWSTR template, BOOL head, int pos)
00102 {
00103     if(head) {
00104         switch(pos) {
00105         case 0:
00106             return nsIPrintSettings_SetHeaderStrLeft(settings, template);
00107         case 1:
00108             return nsIPrintSettings_SetHeaderStrRight(settings, template);
00109         case 2:
00110             return nsIPrintSettings_SetHeaderStrCenter(settings, template);
00111         }
00112     }else {
00113         switch(pos) {
00114         case 0:
00115             return nsIPrintSettings_SetFooterStrLeft(settings, template);
00116         case 1:
00117             return nsIPrintSettings_SetFooterStrRight(settings, template);
00118         case 2:
00119             return nsIPrintSettings_SetFooterStrCenter(settings, template);
00120         }
00121     }
00122 
00123     return NS_OK;
00124 }
00125 
00126 static void set_print_template(nsIPrintSettings *settings, LPCWSTR template, BOOL head)
00127 {
00128     PRUnichar nstemplate[200]; /* FIXME: Use dynamic allocation */
00129     PRUnichar *p = nstemplate;
00130     LPCWSTR ptr=template;
00131     int pos=0;
00132 
00133     while(*ptr) {
00134         if(*ptr != '&') {
00135             *p++ = *ptr++;
00136             continue;
00137         }
00138 
00139         switch(*++ptr) {
00140         case '&':
00141             *p++ = '&';
00142             *p++ = '&';
00143             ptr++;
00144             break;
00145         case 'b': /* change align */
00146             ptr++;
00147             *p = 0;
00148             set_head_text(settings, nstemplate, head, pos);
00149             p = nstemplate;
00150             pos++;
00151             break;
00152         case 'd': { /* short date */
00153             SYSTEMTIME systime;
00154             GetLocalTime(&systime);
00155             GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &systime, NULL, p,
00156                     sizeof(nstemplate)-(p-nstemplate)*sizeof(WCHAR));
00157             p += strlenW(p);
00158             ptr++;
00159             break;
00160         }
00161         case 'p': /* page number */
00162             *p++ = '&';
00163             *p++ = 'P';
00164             ptr++;
00165             break;
00166         case 'P': /* page count */
00167             *p++ = '?'; /* FIXME */
00168             ptr++;
00169             break;
00170         case 'u':
00171             *p++ = '&';
00172             *p++ = 'U';
00173             ptr++;
00174             break;
00175         case 'w':
00176             /* FIXME: set window title */
00177             ptr++;
00178             break;
00179         default:
00180             *p++ = '&';
00181             *p++ = *ptr++;
00182         }
00183     }
00184 
00185     *p = 0;
00186     set_head_text(settings, nstemplate, head, pos);
00187 
00188     while(++pos < 3)
00189         set_head_text(settings, p, head, pos);
00190 }
00191 
00192 static void set_default_templates(nsIPrintSettings *settings)
00193 {
00194     WCHAR buf[64];
00195 
00196     static const PRUnichar empty[] = {0};
00197 
00198     nsIPrintSettings_SetHeaderStrLeft(settings, empty);
00199     nsIPrintSettings_SetHeaderStrRight(settings, empty);
00200     nsIPrintSettings_SetHeaderStrCenter(settings, empty);
00201     nsIPrintSettings_SetFooterStrLeft(settings, empty);
00202     nsIPrintSettings_SetFooterStrRight(settings, empty);
00203     nsIPrintSettings_SetFooterStrCenter(settings, empty);
00204 
00205     if(LoadStringW(get_shdoclc(), IDS_PRINT_HEADER_TEMPLATE, buf,
00206                    sizeof(buf)/sizeof(WCHAR)))
00207         set_print_template(settings, buf, TRUE);
00208 
00209 
00210     if(LoadStringW(get_shdoclc(), IDS_PRINT_FOOTER_TEMPLATE, buf,
00211                    sizeof(buf)/sizeof(WCHAR)))
00212         set_print_template(settings, buf, FALSE);
00213 
00214 }
00215 
00216 static HRESULT exec_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00217 {
00218     nsIWebBrowserPrint *nsprint;
00219     nsIPrintSettings *settings;
00220     nsresult nsres;
00221 
00222     TRACE("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00223 
00224     if(pvaOut)
00225         FIXME("unsupported pvaOut\n");
00226 
00227     if(!This->doc_obj->nscontainer)
00228         return S_OK;
00229 
00230     nsres = get_nsinterface((nsISupports*)This->doc_obj->nscontainer->webbrowser, &IID_nsIWebBrowserPrint,
00231             (void**)&nsprint);
00232     if(NS_FAILED(nsres)) {
00233         ERR("Could not get nsIWebBrowserPrint: %08x\n", nsres);
00234         return S_OK;
00235     }
00236 
00237     nsres = nsIWebBrowserPrint_GetGlobalPrintSettings(nsprint, &settings);
00238     if(NS_FAILED(nsres))
00239         ERR("GetCurrentPrintSettings failed: %08x\n", nsres);
00240 
00241     set_default_templates(settings);
00242 
00243     if(pvaIn) {
00244         switch(V_VT(pvaIn)) {
00245         case VT_BYREF|VT_ARRAY: {
00246             VARIANT *opts;
00247             DWORD opts_cnt;
00248 
00249             if(V_ARRAY(pvaIn)->cDims != 1)
00250                 WARN("cDims = %d\n", V_ARRAY(pvaIn)->cDims);
00251 
00252             SafeArrayAccessData(V_ARRAY(pvaIn), (void**)&opts);
00253             opts_cnt = V_ARRAY(pvaIn)->rgsabound[0].cElements;
00254 
00255             if(opts_cnt >= 1) {
00256                 switch(V_VT(opts)) {
00257                 case VT_BSTR:
00258                     TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts)));
00259                     set_print_template(settings, V_BSTR(opts), TRUE);
00260                     break;
00261                 case VT_NULL:
00262                     break;
00263                 default:
00264                     WARN("V_VT(opts) = %d\n", V_VT(opts));
00265                 }
00266             }
00267 
00268             if(opts_cnt >= 2) {
00269                 switch(V_VT(opts+1)) {
00270                 case VT_BSTR:
00271                     TRACE("setting footer %s\n", debugstr_w(V_BSTR(opts+1)));
00272                     set_print_template(settings, V_BSTR(opts+1), FALSE);
00273                     break;
00274                 case VT_NULL:
00275                     break;
00276                 default:
00277                     WARN("V_VT(opts) = %d\n", V_VT(opts+1));
00278                 }
00279             }
00280 
00281             if(opts_cnt >= 3)
00282                 FIXME("Unsupported opts_cnt %d\n", opts_cnt);
00283 
00284             SafeArrayUnaccessData(V_ARRAY(pvaIn));
00285             break;
00286         }
00287         default:
00288             FIXME("unsupported vt %x\n", V_VT(pvaIn));
00289         }
00290     }
00291 
00292     nsres = nsIWebBrowserPrint_Print(nsprint, settings, NULL);
00293     if(NS_FAILED(nsres))
00294         ERR("Print failed: %08x\n", nsres);
00295 
00296     nsIWebBrowserPrint_Release(nsprint);
00297 
00298     return S_OK;
00299 }
00300 
00301 static HRESULT exec_print_preview(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00302 {
00303     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00304     return E_NOTIMPL;
00305 }
00306 
00307 static HRESULT exec_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00308 {
00309     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00310     return E_NOTIMPL;
00311 }
00312 
00313 static HRESULT exec_spell(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00314 {
00315     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00316     return E_NOTIMPL;
00317 }
00318 
00319 static HRESULT exec_properties(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00320 {
00321     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00322     return E_NOTIMPL;
00323 }
00324 
00325 static HRESULT exec_cut(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00326 {
00327     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00328     return E_NOTIMPL;
00329 }
00330 
00331 static HRESULT exec_copy(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00332 {
00333     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00334     return E_NOTIMPL;
00335 }
00336 
00337 static HRESULT exec_paste(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00338 {
00339     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00340     return E_NOTIMPL;
00341 }
00342 
00343 static HRESULT exec_paste_special(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00344 {
00345     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00346     return E_NOTIMPL;
00347 }
00348 
00349 static HRESULT exec_undo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00350 {
00351     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00352     return E_NOTIMPL;
00353 }
00354 
00355 static HRESULT exec_rendo(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00356 {
00357     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00358     return E_NOTIMPL;
00359 }
00360 
00361 static HRESULT exec_select_all(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00362 {
00363     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00364     return E_NOTIMPL;
00365 }
00366 
00367 static HRESULT exec_clear_selection(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00368 {
00369     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00370     return E_NOTIMPL;
00371 }
00372 
00373 static HRESULT exec_zoom(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00374 {
00375     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00376     return E_NOTIMPL;
00377 }
00378 
00379 static HRESULT exec_get_zoom_range(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00380 {
00381     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00382     return E_NOTIMPL;
00383 }
00384 
00385 static HRESULT exec_refresh(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00386 {
00387     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00388     return E_NOTIMPL;
00389 }
00390 
00391 static HRESULT exec_stop(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00392 {
00393     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00394     return E_NOTIMPL;
00395 }
00396 
00397 static HRESULT exec_stop_download(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00398 {
00399     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00400     return E_NOTIMPL;
00401 }
00402 
00403 static HRESULT exec_find(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00404 {
00405     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00406     return E_NOTIMPL;
00407 }
00408 
00409 static HRESULT exec_delete(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00410 {
00411     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00412     return E_NOTIMPL;
00413 }
00414 
00415 static HRESULT exec_enable_interaction(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00416 {
00417     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00418     return E_NOTIMPL;
00419 }
00420 
00421 static HRESULT exec_on_unload(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00422 {
00423     TRACE("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00424 
00425     /* Tests show that we have nothing more to do here */
00426 
00427     if(pvaOut) {
00428         V_VT(pvaOut) = VT_BOOL;
00429         V_BOOL(pvaOut) = VARIANT_TRUE;
00430     }
00431 
00432     return S_OK;
00433 }
00434 
00435 static HRESULT exec_show_page_setup(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00436 {
00437     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00438     return E_NOTIMPL;
00439 }
00440 
00441 static HRESULT exec_show_print(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00442 {
00443     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00444     return E_NOTIMPL;
00445 }
00446 
00447 static HRESULT exec_close(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00448 {
00449     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00450     return E_NOTIMPL;
00451 }
00452 
00453 static HRESULT exec_set_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00454 {
00455     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00456     return E_NOTIMPL;
00457 }
00458 
00459 static HRESULT exec_get_print_template(HTMLDocument *This, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00460 {
00461     FIXME("(%p)->(%d %p %p)\n", This, nCmdexecopt, pvaIn, pvaOut);
00462     return E_NOTIMPL;
00463 }
00464 
00465 static HRESULT query_mshtml_copy(HTMLDocument *This, OLECMD *cmd)
00466 {
00467     FIXME("(%p)\n", This);
00468     cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
00469     return S_OK;
00470 }
00471 
00472 static HRESULT exec_mshtml_copy(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00473 {
00474     TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00475 
00476     if(This->doc_obj->usermode == EDITMODE)
00477         return editor_exec_copy(This, cmdexecopt, in, out);
00478 
00479     do_ns_command(This, NSCMD_COPY, NULL);
00480     return S_OK;
00481 }
00482 
00483 static HRESULT query_mshtml_cut(HTMLDocument *This, OLECMD *cmd)
00484 {
00485     FIXME("(%p)\n", This);
00486     cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
00487     return S_OK;
00488 }
00489 
00490 static HRESULT exec_mshtml_cut(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00491 {
00492     TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00493 
00494     if(This->doc_obj->usermode == EDITMODE)
00495         return editor_exec_cut(This, cmdexecopt, in, out);
00496 
00497     FIXME("Unimplemented in browse mode\n");
00498     return E_NOTIMPL;
00499 }
00500 
00501 static HRESULT query_mshtml_paste(HTMLDocument *This, OLECMD *cmd)
00502 {
00503     FIXME("(%p)\n", This);
00504     cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
00505     return S_OK;
00506 }
00507 
00508 static HRESULT exec_mshtml_paste(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00509 {
00510     TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00511 
00512     if(This->doc_obj->usermode == EDITMODE)
00513         return editor_exec_paste(This, cmdexecopt, in, out);
00514 
00515     FIXME("Unimplemented in browse mode\n");
00516     return E_NOTIMPL;
00517 }
00518 
00519 static HRESULT exec_browsemode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00520 {
00521     WARN("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00522 
00523     if(in || out)
00524         FIXME("unsupported args\n");
00525 
00526     This->doc_obj->usermode = BROWSEMODE;
00527 
00528     return S_OK;
00529 }
00530 
00531 static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00532 {
00533     IMoniker *mon;
00534     HRESULT hres;
00535 
00536     TRACE("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00537 
00538     if(in || out)
00539         FIXME("unsupported args\n");
00540 
00541     if(This->doc_obj->usermode == EDITMODE)
00542         return S_OK;
00543 
00544     This->doc_obj->usermode = EDITMODE;
00545 
00546     if(This->window->mon) {
00547         CLSID clsid = IID_NULL;
00548         hres = IMoniker_GetClassID(This->window->mon, &clsid);
00549         if(SUCCEEDED(hres)) {
00550             /* We should use IMoniker::Save here */
00551             FIXME("Use CLSID %s\n", debugstr_guid(&clsid));
00552         }
00553     }
00554 
00555     if(This->doc_obj->frame)
00556         IOleInPlaceFrame_SetStatusText(This->doc_obj->frame, NULL);
00557 
00558     This->window->readystate = READYSTATE_UNINITIALIZED;
00559 
00560     if(This->doc_obj->client) {
00561         IOleCommandTarget *cmdtrg;
00562 
00563         hres = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget,
00564                 (void**)&cmdtrg);
00565         if(SUCCEEDED(hres)) {
00566             VARIANT var;
00567 
00568             V_VT(&var) = VT_I4;
00569             V_I4(&var) = 0;
00570             IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
00571 
00572             IOleCommandTarget_Release(cmdtrg);
00573         }
00574     }
00575 
00576     if(This->doc_obj->hostui) {
00577         DOCHOSTUIINFO hostinfo;
00578 
00579         memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
00580         hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
00581         hres = IDocHostUIHandler_GetHostInfo(This->doc_obj->hostui, &hostinfo);
00582         if(SUCCEEDED(hres))
00583             /* FIXME: use hostinfo */
00584             TRACE("hostinfo = {%u %08x %08x %s %s}\n",
00585                     hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
00586                     debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
00587     }
00588 
00589     update_doc(This, UPDATE_UI);
00590 
00591     if(This->window->mon) {
00592         /* FIXME: We should find nicer way to do this */
00593         remove_target_tasks(This->task_magic);
00594 
00595         mon = This->window->mon;
00596         IMoniker_AddRef(mon);
00597     }else {
00598         static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
00599 
00600         hres = CreateURLMoniker(NULL, about_blankW, &mon);
00601         if(FAILED(hres)) {
00602             FIXME("CreateURLMoniker failed: %08x\n", hres);
00603             return hres;
00604         }
00605     }
00606 
00607     hres = IPersistMoniker_Load(PERSISTMON(This), TRUE, mon, NULL, 0);
00608     IMoniker_Release(mon);
00609     if(FAILED(hres))
00610         return hres;
00611 
00612     if(This->doc_obj->ui_active) {
00613         if(This->doc_obj->ip_window)
00614             call_set_active_object(This->doc_obj->ip_window, NULL);
00615         if(This->doc_obj->hostui)
00616             IDocHostUIHandler_HideUI(This->doc_obj->hostui);
00617     }
00618 
00619     if(This->doc_obj->ui_active) {
00620         RECT rcBorderWidths;
00621 
00622         if(This->doc_obj->hostui)
00623             IDocHostUIHandler_ShowUI(This->doc_obj->hostui, DOCHOSTUITYPE_AUTHOR, ACTOBJ(This), CMDTARGET(This),
00624                 This->doc_obj->frame, This->doc_obj->ip_window);
00625 
00626         if(This->doc_obj->ip_window)
00627             call_set_active_object(This->doc_obj->ip_window, ACTOBJ(This));
00628 
00629         memset(&rcBorderWidths, 0, sizeof(rcBorderWidths));
00630         if(This->doc_obj->frame)
00631             IOleInPlaceFrame_SetBorderSpace(This->doc_obj->frame, &rcBorderWidths);
00632     }
00633 
00634     return S_OK;
00635 }
00636 
00637 static HRESULT exec_htmleditmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00638 {
00639     FIXME("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00640     return S_OK;
00641 }
00642 
00643 static HRESULT exec_baselinefont3(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00644 {
00645     FIXME("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00646     return S_OK;
00647 }
00648 
00649 static HRESULT exec_respectvisibility_indesign(HTMLDocument *This, DWORD cmdexecopt,
00650         VARIANT *in, VARIANT *out)
00651 {
00652     FIXME("(%p)->(%08x %p %p)\n", This, cmdexecopt, in, out);
00653     return E_NOTIMPL;
00654 }
00655 
00656 static HRESULT query_enabled_stub(HTMLDocument *This, OLECMD *cmd)
00657 {
00658     switch(cmd->cmdID) {
00659     case IDM_PRINT:
00660         FIXME("CGID_MSHTML: IDM_PRINT\n");
00661         cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
00662         break;
00663     case IDM_BLOCKDIRLTR:
00664         FIXME("CGID_MSHTML: IDM_BLOCKDIRLTR\n");
00665         cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
00666         break;
00667     case IDM_BLOCKDIRRTL:
00668         FIXME("CGID_MSHTML: IDM_BLOCKDIRRTL\n");
00669         cmd->cmdf = OLECMDF_SUPPORTED|OLECMDF_ENABLED;
00670         break;
00671     }
00672 
00673     return S_OK;
00674 }
00675 
00676 static const struct {
00677     OLECMDF cmdf;
00678     HRESULT (*func)(HTMLDocument*,DWORD,VARIANT*,VARIANT*);
00679 } exec_table[OLECMDID_GETPRINTTEMPLATE+1] = {
00680     {0},
00681     { OLECMDF_SUPPORTED,                  exec_open                 }, /* OLECMDID_OPEN */
00682     { OLECMDF_SUPPORTED,                  exec_new                  }, /* OLECMDID_NEW */
00683     { OLECMDF_SUPPORTED,                  exec_save                 }, /* OLECMDID_SAVE */
00684     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_save_as              }, /* OLECMDID_SAVEAS */
00685     { OLECMDF_SUPPORTED,                  exec_save_copy_as         }, /* OLECMDID_SAVECOPYAS */
00686     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_print                }, /* OLECMDID_PRINT */
00687     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_print_preview        }, /* OLECMDID_PRINTPREVIEW */
00688     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_page_setup           }, /* OLECMDID_PAGESETUP */
00689     { OLECMDF_SUPPORTED,                  exec_spell                }, /* OLECMDID_SPELL */
00690     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_properties           }, /* OLECMDID_PROPERTIES */
00691     { OLECMDF_SUPPORTED,                  exec_cut                  }, /* OLECMDID_CUT */
00692     { OLECMDF_SUPPORTED,                  exec_copy                 }, /* OLECMDID_COPY */
00693     { OLECMDF_SUPPORTED,                  exec_paste                }, /* OLECMDID_PASTE */
00694     { OLECMDF_SUPPORTED,                  exec_paste_special        }, /* OLECMDID_PASTESPECIAL */
00695     { OLECMDF_SUPPORTED,                  exec_undo                 }, /* OLECMDID_UNDO */
00696     { OLECMDF_SUPPORTED,                  exec_rendo                }, /* OLECMDID_REDO */
00697     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_select_all           }, /* OLECMDID_SELECTALL */
00698     { OLECMDF_SUPPORTED,                  exec_clear_selection      }, /* OLECMDID_CLEARSELECTION */
00699     { OLECMDF_SUPPORTED,                  exec_zoom                 }, /* OLECMDID_ZOOM */
00700     { OLECMDF_SUPPORTED,                  exec_get_zoom_range       }, /* OLECMDID_GETZOOMRANGE */
00701     {0},
00702     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_refresh              }, /* OLECMDID_REFRESH */
00703     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_stop                 }, /* OLECMDID_STOP */
00704     {0},{0},{0},{0},{0},{0},
00705     { OLECMDF_SUPPORTED,                  exec_stop_download        }, /* OLECMDID_STOPDOWNLOAD */
00706     {0},
00707     { OLECMDF_SUPPORTED|OLECMDF_ENABLED,  exec_find                 }, /* OLECMDID_FIND */
00708     { OLECMDF_SUPPORTED,                  exec_delete               }, /* OLECMDID_DELETE */
00709     {0},{0},
00710     { OLECMDF_SUPPORTED,                  exec_enable_interaction   }, /* OLECMDID_ENABLE_INTERACTION */
00711     { OLECMDF_SUPPORTED,                  exec_on_unload            }, /* OLECMDID_ONUNLOAD */
00712     {0},{0},{0},{0},{0},
00713     { OLECMDF_SUPPORTED,                  exec_show_page_setup      }, /* OLECMDID_SHOWPAGESETUP */
00714     { OLECMDF_SUPPORTED,                  exec_show_print           }, /* OLECMDID_SHOWPRINT */
00715     {0},{0},
00716     { OLECMDF_SUPPORTED,                  exec_close                }, /* OLECMDID_CLOSE */
00717     {0},{0},{0},
00718     { OLECMDF_SUPPORTED,                  exec_set_print_template   }, /* OLECMDID_SETPRINTTEMPLATE */
00719     { OLECMDF_SUPPORTED,                  exec_get_print_template   }  /* OLECMDID_GETPRINTTEMPLATE */
00720 };
00721 
00722 static const cmdtable_t base_cmds[] = {
00723     {IDM_COPY,             query_mshtml_copy,     exec_mshtml_copy},
00724     {IDM_PASTE,            query_mshtml_paste,    exec_mshtml_paste},
00725     {IDM_CUT,              query_mshtml_cut,      exec_mshtml_cut},
00726     {IDM_BROWSEMODE,       NULL,                  exec_browsemode},
00727     {IDM_EDITMODE,         NULL,                  exec_editmode},
00728     {IDM_PRINT,            query_enabled_stub,    exec_print},
00729     {IDM_HTMLEDITMODE,     NULL,                  exec_htmleditmode},
00730     {IDM_BASELINEFONT3,    NULL,                  exec_baselinefont3},
00731     {IDM_BLOCKDIRLTR,      query_enabled_stub,    NULL},
00732     {IDM_BLOCKDIRRTL,      query_enabled_stub,    NULL},
00733     {IDM_RESPECTVISIBILITY_INDESIGN, NULL,        exec_respectvisibility_indesign},
00734     {0,NULL,NULL}
00735 };
00736 
00737 static HRESULT WINAPI OleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppv)
00738 {
00739     HTMLDocument *This = CMDTARGET_THIS(iface);
00740     return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppv);
00741 }
00742 
00743 static ULONG WINAPI OleCommandTarget_AddRef(IOleCommandTarget *iface)
00744 {
00745     HTMLDocument *This = CMDTARGET_THIS(iface);
00746     return IHTMLDocument2_AddRef(HTMLDOC(This));
00747 }
00748 
00749 static ULONG WINAPI OleCommandTarget_Release(IOleCommandTarget *iface)
00750 {
00751     HTMLDocument *This = CMDTARGET_THIS(iface);
00752     return IHTMLDocument_Release(HTMLDOC(This));
00753 }
00754 
00755 static HRESULT query_from_table(HTMLDocument *This, const cmdtable_t *cmdtable, OLECMD *cmd)
00756 {
00757     const cmdtable_t *iter = cmdtable;
00758 
00759     cmd->cmdf = 0;
00760 
00761     while(iter->id && iter->id != cmd->cmdID)
00762         iter++;
00763 
00764     if(!iter->id || !iter->query)
00765         return OLECMDERR_E_NOTSUPPORTED;
00766 
00767     return iter->query(This, cmd);
00768 }
00769 
00770 static HRESULT WINAPI OleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
00771         ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText)
00772 {
00773     HTMLDocument *This = CMDTARGET_THIS(iface);
00774     HRESULT hres = S_OK, hr;
00775 
00776     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_guid(pguidCmdGroup), cCmds, prgCmds, pCmdText);
00777 
00778     if(!pguidCmdGroup) {
00779         ULONG i;
00780 
00781         for(i=0; i<cCmds; i++) {
00782             if(prgCmds[i].cmdID<OLECMDID_OPEN || prgCmds[i].cmdID>OLECMDID_GETPRINTTEMPLATE) {
00783                 WARN("Unsupported cmdID = %d\n", prgCmds[i].cmdID);
00784                 prgCmds[i].cmdf = 0;
00785                 hres = OLECMDERR_E_NOTSUPPORTED;
00786             }else {
00787                 if(prgCmds[i].cmdID == OLECMDID_OPEN || prgCmds[i].cmdID == OLECMDID_NEW) {
00788                     IOleCommandTarget *cmdtrg = NULL;
00789                     OLECMD olecmd;
00790 
00791                     prgCmds[i].cmdf = OLECMDF_SUPPORTED;
00792                     if(This->doc_obj->client) {
00793                         hr = IOleClientSite_QueryInterface(This->doc_obj->client, &IID_IOleCommandTarget,
00794                                 (void**)&cmdtrg);
00795                         if(SUCCEEDED(hr)) {
00796                             olecmd.cmdID = prgCmds[i].cmdID;
00797                             olecmd.cmdf = 0;
00798 
00799                             hr = IOleCommandTarget_QueryStatus(cmdtrg, NULL, 1, &olecmd, NULL);
00800                             if(SUCCEEDED(hr) && olecmd.cmdf)
00801                                 prgCmds[i].cmdf = olecmd.cmdf;
00802                         }
00803                     }else {
00804                         ERR("This->client == NULL, native would crash\n");
00805                     }
00806                 }else {
00807                     prgCmds[i].cmdf = exec_table[prgCmds[i].cmdID].cmdf;
00808                     TRACE("cmdID = %d  returning %x\n", prgCmds[i].cmdID, prgCmds[i].cmdf);
00809                 }
00810                 hres = S_OK;
00811             }
00812         }
00813 
00814         if(pCmdText)
00815             FIXME("Set pCmdText\n");
00816     }else if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
00817         ULONG i;
00818 
00819         for(i=0; i<cCmds; i++) {
00820             HRESULT hres = query_from_table(This, base_cmds, prgCmds+i);
00821             if(hres == OLECMDERR_E_NOTSUPPORTED)
00822                 hres = query_from_table(This, editmode_cmds, prgCmds+i);
00823             if(hres == OLECMDERR_E_NOTSUPPORTED)
00824                 FIXME("CGID_MSHTML: unsupported cmdID %d\n", prgCmds[i].cmdID);
00825         }
00826 
00827         hres = prgCmds[i-1].cmdf ? S_OK : OLECMDERR_E_NOTSUPPORTED;
00828 
00829         if(pCmdText)
00830             FIXME("Set pCmdText\n");
00831     }else {
00832         FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
00833         hres = OLECMDERR_E_UNKNOWNGROUP;
00834     }
00835 
00836     return hres;
00837 }
00838 
00839 static HRESULT exec_from_table(HTMLDocument *This, const cmdtable_t *cmdtable, DWORD cmdid,
00840                                DWORD cmdexecopt, VARIANT *in, VARIANT *out)
00841 {
00842     const cmdtable_t *iter = cmdtable;
00843 
00844     while(iter->id && iter->id != cmdid)
00845         iter++;
00846 
00847     if(!iter->id || !iter->exec)
00848         return OLECMDERR_E_NOTSUPPORTED;
00849 
00850     return iter->exec(This, cmdexecopt, in, out);
00851 }
00852 
00853 static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup,
00854         DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
00855 {
00856     HTMLDocument *This = CMDTARGET_THIS(iface);
00857 
00858     if(!pguidCmdGroup) {
00859         if(nCmdID<OLECMDID_OPEN || nCmdID>OLECMDID_GETPRINTTEMPLATE || !exec_table[nCmdID].func) {
00860             WARN("Unsupported cmdID = %d\n", nCmdID);
00861             return OLECMDERR_E_NOTSUPPORTED;
00862         }
00863 
00864         return exec_table[nCmdID].func(This, nCmdexecopt, pvaIn, pvaOut);
00865     }else if(IsEqualGUID(&CGID_Explorer, pguidCmdGroup)) {
00866         FIXME("unsupported nCmdID %d of CGID_Explorer group\n", nCmdID);
00867         TRACE("%p %p\n", pvaIn, pvaOut);
00868         return OLECMDERR_E_NOTSUPPORTED;
00869     }else if(IsEqualGUID(&CGID_ShellDocView, pguidCmdGroup)) {
00870         FIXME("unsupported nCmdID %d of CGID_ShellDocView group\n", nCmdID);
00871         return OLECMDERR_E_NOTSUPPORTED;
00872     }else if(IsEqualGUID(&CGID_MSHTML, pguidCmdGroup)) {
00873         HRESULT hres = exec_from_table(This, base_cmds, nCmdID, nCmdexecopt, pvaIn, pvaOut);
00874         if(hres == OLECMDERR_E_NOTSUPPORTED)
00875             hres = exec_from_table(This, editmode_cmds, nCmdID,
00876                                    nCmdexecopt, pvaIn, pvaOut);
00877         if(hres == OLECMDERR_E_NOTSUPPORTED)
00878             FIXME("unsupported nCmdID %d of CGID_MSHTML group\n", nCmdID);
00879 
00880         return hres;
00881     }
00882 
00883     FIXME("Unsupported pguidCmdGroup %s\n", debugstr_guid(pguidCmdGroup));
00884     return OLECMDERR_E_UNKNOWNGROUP;
00885 }
00886 
00887 #undef CMDTARGET_THIS
00888 
00889 static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
00890     OleCommandTarget_QueryInterface,
00891     OleCommandTarget_AddRef,
00892     OleCommandTarget_Release,
00893     OleCommandTarget_QueryStatus,
00894     OleCommandTarget_Exec
00895 };
00896 
00897 void show_context_menu(HTMLDocumentObj *This, DWORD dwID, POINT *ppt, IDispatch *elem)
00898 {
00899     HMENU menu_res, menu;
00900     DWORD cmdid;
00901 
00902     if(This->hostui && S_OK == IDocHostUIHandler_ShowContextMenu(This->hostui,
00903             dwID, ppt, (IUnknown*)CMDTARGET(&This->basedoc), elem))
00904         return;
00905 
00906     menu_res = LoadMenuW(get_shdoclc(), MAKEINTRESOURCEW(IDR_BROWSE_CONTEXT_MENU));
00907     menu = GetSubMenu(menu_res, dwID);
00908 
00909     cmdid = TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
00910             ppt->x, ppt->y, 0, This->hwnd, NULL);
00911     DestroyMenu(menu_res);
00912 
00913     if(cmdid)
00914         IOleCommandTarget_Exec(CMDTARGET(&This->basedoc), &CGID_MSHTML, cmdid, 0, NULL, NULL);
00915 }
00916 
00917 void HTMLDocument_OleCmd_Init(HTMLDocument *This)
00918 {
00919     This->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
00920 }

Generated on Sun May 27 2012 04:25:06 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.