diff --git a/webshell/embed/ActiveX/DHTMLCmdIds.h b/webshell/embed/ActiveX/DHTMLCmdIds.h new file mode 100644 index 000000000000..6f686a1b664b --- /dev/null +++ b/webshell/embed/ActiveX/DHTMLCmdIds.h @@ -0,0 +1,97 @@ +#ifndef DHTMLCMDIDS_H +#define DHTMLCMDIDS_H + +#ifndef __mshtmcid_h__ +#define IDM_UNKNOWN 0 +#define IDM_ALIGNBOTTOM 1 +#define IDM_ALIGNHORIZONTALCENTERS 2 +#define IDM_ALIGNLEFT 3 +#define IDM_ALIGNRIGHT 4 +#define IDM_ALIGNTOGRID 5 +#define IDM_ALIGNTOP 6 +#define IDM_ALIGNVERTICALCENTERS 7 +#define IDM_ARRANGEBOTTOM 8 +#define IDM_ARRANGERIGHT 9 +#define IDM_BRINGFORWARD 10 +#define IDM_BRINGTOFRONT 11 +#define IDM_CENTERHORIZONTALLY 12 +#define IDM_CENTERVERTICALLY 13 +#define IDM_CODE 14 +#define IDM_DELETE 17 +#define IDM_FONTNAME 18 +#define IDM_FONTSIZE 19 +#define IDM_GROUP 20 +#define IDM_HORIZSPACECONCATENATE 21 +#define IDM_HORIZSPACEDECREASE 22 +#define IDM_HORIZSPACEINCREASE 23 +#define IDM_HORIZSPACEMAKEEQUAL 24 +#define IDM_INSERTOBJECT 25 +#define IDM_MULTILEVELREDO 30 +#define IDM_SENDBACKWARD 32 +#define IDM_SENDTOBACK 33 +#define IDM_SHOWTABLE 34 +#define IDM_SIZETOCONTROL 35 +#define IDM_SIZETOCONTROLHEIGHT 36 +#define IDM_SIZETOCONTROLWIDTH 37 +#define IDM_SIZETOFIT 38 +#define IDM_SIZETOGRID 39 +#define IDM_SNAPTOGRID 40 +#define IDM_TABORDER 41 +#define IDM_TOOLBOX 42 +#define IDM_MULTILEVELUNDO 44 +#define IDM_UNGROUP 45 +#define IDM_VERTSPACECONCATENATE 46 +#define IDM_VERTSPACEDECREASE 47 +#define IDM_VERTSPACEINCREASE 48 +#define IDM_VERTSPACEMAKEEQUAL 49 +#define IDM_JUSTIFYFULL 50 +#define IDM_BACKCOLOR 51 +#define IDM_BOLD 52 +#define IDM_BORDERCOLOR 53 +#define IDM_FLAT 54 +#define IDM_FORECOLOR 55 +#define IDM_ITALIC 56 +#define IDM_JUSTIFYCENTER 57 +#define IDM_JUSTIFYGENERAL 58 +#define IDM_JUSTIFYLEFT 59 +#define IDM_JUSTIFYRIGHT 60 +#define IDM_RAISED 61 +#define IDM_SUNKEN 62 +#define IDM_UNDERLINE 63 +#define IDM_CHISELED 64 +#define IDM_ETCHED 65 +#define IDM_SHADOWED 66 +#define IDM_FIND 67 +#define IDM_SHOWGRID 69 +#define IDM_OBJECTVERBLIST0 72 +#define IDM_OBJECTVERBLIST1 73 +#define IDM_OBJECTVERBLIST2 74 +#define IDM_OBJECTVERBLIST3 75 +#define IDM_OBJECTVERBLIST4 76 +#define IDM_OBJECTVERBLIST5 77 +#define IDM_OBJECTVERBLIST6 78 +#define IDM_OBJECTVERBLIST7 79 +#define IDM_OBJECTVERBLIST8 80 +#define IDM_OBJECTVERBLIST9 81 +#define IDM_OBJECTVERBLISTLAST IDM_OBJECTVERBLIST9 +#define IDM_CONVERTOBJECT 82 +#define IDM_CUSTOMCONTROL 83 +#define IDM_CUSTOMIZEITEM 84 +#define IDM_RENAME 85 +#define IDM_IMPORT 86 +#define IDM_NEWPAGE 87 +#define IDM_MOVE 88 +#define IDM_CANCEL 89 +#define IDM_FONT 90 +#define IDM_STRIKETHROUGH 91 +#define IDM_DELETEWORD 92 +#define IDM_EXECPRINT 93 +#define IDM_JUSTIFYNONE 94 + +#define IDM_BROWSEMODE 2126 +#define IDM_EDITMODE 2127 + +#endif + + +#endif \ No newline at end of file diff --git a/webshell/embed/ActiveX/IOleCommandTargetImpl.h b/webshell/embed/ActiveX/IOleCommandTargetImpl.h new file mode 100644 index 000000000000..f68c88a09f06 --- /dev/null +++ b/webshell/embed/ActiveX/IOleCommandTargetImpl.h @@ -0,0 +1,231 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +#ifndef IOLECOMMANDIMPL_H +#define IOLECOMMANDIMPL_H + +typedef HRESULT (_stdcall *OleCommandProc)(IOleCommandTarget *pCmdTarget, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + +struct OleCommandInfo +{ + ULONG nCmdID; + const GUID *pCmdGUID; + ULONG nWindowsCmdID; + OleCommandProc pfnCommandProc; + wchar_t *szVerbText; + wchar_t *szStatusText; +}; + +// Macros to be placed in any class derived from the IOleCommandTargetImpl +// class. These define what commands are exposed from the object. + +#define BEGIN_OLECOMMAND_TABLE() \ + OleCommandInfo *GetCommandTable() \ + { \ + static OleCommandInfo s_aSupportedCommands[] = \ + { + +#define OLECOMMAND_MESSAGE(id, group, cmd, verb, desc) \ + { id, group, cmd, NULL, verb, desc }, + +#define OLECOMMAND_HANDLER(id, group, handler, verb, desc) \ + { id, group, 0, handler, verb, desc }, + +#define END_OLECOMMAND_TABLE() \ + { 0, &GUID_NULL, 0, NULL, NULL, NULL } \ + }; \ + return s_aSupportedCommands; \ + }; + +// Implementation of the IOleCommandTarget interface. The template is +// reasonably generic which is a good thing given how needlessly complicated +// this interface is. Blame Microsoft not me. + +template< class T > +class IOleCommandTargetImpl : public IOleCommandTarget +{ + struct OleExecData + { + const GUID *pguidCmdGroup; + DWORD nCmdID; + DWORD nCmdexecopt; + VARIANT *pvaIn; + VARIANT *pvaOut; + }; + +public: + + // Query the status of the specified commands (test if is it supported etc.) + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID __RPC_FAR *pguidCmdGroup, ULONG cCmds, OLECMD __RPC_FAR prgCmds[], OLECMDTEXT __RPC_FAR *pCmdText) + { + T* pT = static_cast(this); + + if (prgCmds == NULL) + { + return E_INVALIDARG; + } + + OleCommandInfo *pCommands = pT->GetCommandTable(); + NG_ASSERT(pCommands); + + BOOL bCmdGroupFound = FALSE; + BOOL bTextSet = FALSE; + + // Iterate through list of commands and flag them as supported/unsupported + for (ULONG nCmd = 0; nCmd < cCmds; nCmd++) + { + // Unsupported by default + prgCmds[nCmd].cmdf = 0; + + // Search the support command list + for (int nSupported = 0; pCommands[nSupported].pCmdGUID != &GUID_NULL; nSupported++) + { + OleCommandInfo *pCI = &pCommands[nSupported]; + + if (pguidCmdGroup && pCI->pCmdGUID && memcmp(pguidCmdGroup, pCI->pCmdGUID, sizeof(GUID)) == 0) + { + continue; + } + bCmdGroupFound = TRUE; + + if (pCI->nCmdID != prgCmds[nCmd].cmdID) + { + continue; + } + + // Command is supported so flag it and possibly enable it + prgCmds[nCmd].cmdf = OLECMDF_SUPPORTED; + if (pCI->nWindowsCmdID != 0) + { + prgCmds[nCmd].cmdf |= OLECMDF_ENABLED; + } + + // Copy the status/verb text for the first supported command only + if (!bTextSet && pCmdText) + { + // See what text the caller wants + wchar_t *pszTextToCopy = NULL; + if (pCmdText->cmdtextf & OLECMDTEXTF_NAME) + { + pszTextToCopy = pCI->szVerbText; + } + else if (pCmdText->cmdtextf & OLECMDTEXTF_STATUS) + { + pszTextToCopy = pCI->szStatusText; + } + + // Copy the text + pCmdText->cwActual = 0; + memset(pCmdText->rgwz, 0, pCmdText->cwBuf * sizeof(wchar_t)); + if (pszTextToCopy) + { + // Don't exceed the provided buffer size + int nTextLen = wcslen(pszTextToCopy); + if (nTextLen > pCmdText->cwBuf) + { + nTextLen = pCmdText->cwBuf; + } + + wcsncpy(pCmdText->rgwz, pszTextToCopy, nTextLen); + pCmdText->cwActual = nTextLen; + } + + bTextSet = TRUE; + } + break; + } + } + + // Was the command group found? + if (!bCmdGroupFound) + { + OLECMDERR_E_UNKNOWNGROUP; + } + + return S_OK; + } + + + // Execute the specified command + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT __RPC_FAR *pvaIn, VARIANT __RPC_FAR *pvaOut) + { + T* pT = static_cast(this); + BOOL bCmdGroupFound = FALSE; + + OleCommandInfo *pCommands = pT->GetCommandTable(); + NG_ASSERT(pCommands); + + // Search the support command list + for (int nSupported = 0; pCommands[nSupported].pCmdGUID != &GUID_NULL; nSupported++) + { + OleCommandInfo *pCI = &pCommands[nSupported]; + + if (pguidCmdGroup && pCI->pCmdGUID && memcmp(pguidCmdGroup, pCI->pCmdGUID, sizeof(GUID)) == 0) + { + continue; + } + bCmdGroupFound = TRUE; + + if (pCI->nCmdID != nCmdID) + { + continue; + } + + // Command is supported but not implemented + if (pCI->nWindowsCmdID == 0) + { + continue; + } + + // Send ourselves a WM_COMMAND windows message with the associated + // identifier and exec data + OleExecData cData; + cData.pguidCmdGroup = pguidCmdGroup; + cData.nCmdID = nCmdID; + cData.nCmdexecopt = nCmdexecopt; + cData.pvaIn = pvaIn; + cData.pvaOut = pvaOut; + + + if (pCI->pfnCommandProc) + { + pCI->pfnCommandProc(this, pCI->pCmdGUID, pCI->nCmdID, nCmdexecopt, pvaIn, pvaOut); + } + else + { + HWND hwndTarget = pT->GetCommandTargetWindow(); + if (hwndTarget) + { + ::SendMessage(hwndTarget, WM_COMMAND, LOWORD(pCI->nWindowsCmdID), (LPARAM) &cData); + } + } + + return S_OK; + } + + // Was the command group found? + if (!bCmdGroupFound) + { + OLECMDERR_E_UNKNOWNGROUP; + } + + return OLECMDERR_E_NOTSUPPORTED; + } +}; + + +#endif \ No newline at end of file