コード例 #1
0
        /// <summary>
        /// Provides a first chance to tell the shell that this window is capable of handling certain commands. Implements IOleCommandTarget.QueryStatus
        /// </summary>
        protected int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, MSOLE.OLECMD[] prgCmds, IntPtr pCmdText)
        {
            int  hr      = VSConstants.S_OK;
            bool handled = true;

            // Only handle commands from the Office 97 Command Set (aka VSStandardCommandSet97).
            if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
            {
                // There typically is only one command passed in to this array - in any case, we only care
                // about the first command.
                MSOLE.OLECMD cmd = prgCmds[0];
                switch ((VSConstants.VSStd97CmdID)cmd.cmdID)
                {
                case VSConstants.VSStd97CmdID.Delete:
                    // Always support this command, disabling it if necessary per the control.
                    cmd.cmdf   = (uint)(MSOLE.OLECMDF.OLECMDF_SUPPORTED | (myEditor.CanDelete ? MSOLE.OLECMDF.OLECMDF_ENABLED : 0));
                    prgCmds[0] = cmd;
                    break;

                case VSConstants.VSStd97CmdID.EditLabel:
                    // Support this command regardless of the current state of the inline editor.
                    // If we do not do this, then an F2 keypress with an editor already open will
                    // report the command as disabled and we would need to use IVsUIShell.UpdateCommandUI
                    // whenever an editor closed to reenable the command.
                    cmd.cmdf   = (int)(MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED);
                    prgCmds[0] = cmd;
                    break;

                default:
                    // Inform the shell that we don't support any other commands.
                    handled = false;
                    hr      = (int)MSOLE.Constants.OLECMDERR_E_NOTSUPPORTED;
                    break;
                }
            }
            else
            {
                // Inform the shell that we don't recognize this command group.
                handled = false;
                hr      = (int)MSOLE.Constants.OLECMDERR_E_UNKNOWNGROUP;
            }
            if (!handled)
            {
                Debug.Assert(ErrorHandler.Failed(hr));
                ModelingDocData docData = CurrentDocument;
                Microsoft.VisualStudio.Modeling.Shell.UndoManager undoManager;
                MSOLE.IOleCommandTarget forwardTo;
                if ((docData != null &&
                     null != (undoManager = docData.UndoManager) &&
                     null != (forwardTo = undoManager.VSUndoManager as MSOLE.IOleCommandTarget)) ||
                    null != (forwardTo = GetService(typeof(MSOLE.IOleCommandTarget)) as MSOLE.IOleCommandTarget))
                {
                    // If the command wasn't handled already, forward it to the undo manager.
                    hr = forwardTo.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
                }
            }
            return(hr);
        }
コード例 #2
0
        /// <summary>
        /// Provides a first chance to tell the shell that this window is capable of handling certain commands. Implements IOleCommandTarget.QueryStatus
        /// </summary>
        protected int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, MSOLE.OLECMD[] prgCmds, IntPtr pCmdText)
        {
            int  hr      = VSConstants.S_OK;
            bool handled = true;

            // Only handle commands from the Office 97 Command Set (aka VSStandardCommandSet97).
            if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
            {
                // There typically is only one command passed in to this array - in any case, we only care
                // about the first command.
                MSOLE.OLECMD       cmd   = prgCmds[0];
                MSOLE.OLECMDF      flags = 0;
                ReadingRichTextBox activeRichTextEditor = myActiveInlineEditor as ReadingRichTextBox;
                switch ((VSConstants.VSStd97CmdID)cmd.cmdID)
                {
                case VSConstants.VSStd97CmdID.Cut:
                    if (activeRichTextEditor != null)
                    {
                        flags = (myRichTextSelected && !myRichTextProtected) ? MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED : MSOLE.OLECMDF.OLECMDF_SUPPORTED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.Copy:
                    if (activeRichTextEditor != null)
                    {
                        flags = myRichTextSelected ? MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED : MSOLE.OLECMDF.OLECMDF_SUPPORTED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.Paste:
                    if (activeRichTextEditor != null)
                    {
                        flags = (!myRichTextProtected && (Clipboard.ContainsText(TextDataFormat.Text) || Clipboard.ContainsText(TextDataFormat.UnicodeText))) ? MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED : MSOLE.OLECMDF.OLECMDF_SUPPORTED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.SelectAll:
                    if (activeRichTextEditor != null)
                    {
                        flags = MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.Redo:
                case VSConstants.VSStd97CmdID.MultiLevelRedo:
                case VSConstants.VSStd97CmdID.MultiLevelUndo:
                    if (activeRichTextEditor != null)
                    {
                        flags = MSOLE.OLECMDF.OLECMDF_SUPPORTED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.Undo:
                    if (activeRichTextEditor != null)
                    {
                        flags = activeRichTextEditor.CanUndo ? MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED : MSOLE.OLECMDF.OLECMDF_SUPPORTED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.Delete:
                    // Inform the shell that we should have a chance to handle the delete command.
                    if (!this.myForm.ReadingEditor.EditingFactType.IsEmpty)
                    {
                        flags = MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED;
                    }
                    break;

                case VSConstants.VSStd97CmdID.EditLabel:
                    // Support this command regardless of the current state of the inline editor.
                    // If we do not do this, then an F2 keypress with an editor already open will
                    // report the command as disabled and we would need to use IVsUIShell.UpdateCommandUI
                    // whenever an editor closed to reenable the command.
                    flags = MSOLE.OLECMDF.OLECMDF_SUPPORTED | MSOLE.OLECMDF.OLECMDF_ENABLED;
                    break;
                }
                if (flags == 0)
                {
                    // Inform the shell that we don't support the command.
                    handled = false;
                    hr      = (int)MSOLE.Constants.OLECMDERR_E_NOTSUPPORTED;
                }
                else
                {
                    cmd.cmdf   = (uint)flags;
                    prgCmds[0] = cmd;
                }
            }
            else
            {
                // Inform the shell that we don't recognize this command group.
                handled = false;
                hr      = (int)MSOLE.Constants.OLECMDERR_E_UNKNOWNGROUP;
            }
            if (!handled)
            {
                Debug.Assert(ErrorHandler.Failed(hr));
                ModelingDocData docData = CurrentDocument;
                Microsoft.VisualStudio.Modeling.Shell.UndoManager undoManager;
                MSOLE.IOleCommandTarget forwardTo;
                if ((docData != null &&
                     null != (undoManager = docData.UndoManager) &&
                     null != (forwardTo = undoManager.VSUndoManager as MSOLE.IOleCommandTarget)) ||
                    null != (forwardTo = GetService(typeof(MSOLE.IOleCommandTarget)) as MSOLE.IOleCommandTarget))
                {
                    // If the command wasn't handled already, forward it to the undo manager.
                    hr = forwardTo.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
                }
            }
            return(hr);
        }