Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenolecmd.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
1.7.6.1
|