Exemplo n.º 1
0
        private MmcConsoleVerb GetDefaultVerb()
        {
            MmcConsoleVerb verb = MmcConsoleVerb.None;

            GetIConsoleVerb().GetDefaultVerb(ref verb);
            return(verb);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Delegate to the relevent node or handle it directly.
        /// </summary>
        public int Notify(IntPtr lpDataObject, uint notifyEvent, IntPtr arg, IntPtr param)
        {
            int hr = Constants.Win32.HResults.S_FALSE;

            try
            {
                // There are some sneaky values for the IDataObject parameters that make
                // interop with this interface a little trick.  This is why lpDataObject is an IntPtr
                // not an actual IDataObject interface.

                if (lpDataObject == (IntPtr)DataObject.CUSTOMOCX || lpDataObject == (IntPtr)DataObject.CUSTOMWEB)
                {
                    return(hr);
                }

                hr = Constants.Win32.HResults.S_OK;

                IDataObject dataObject = null;
                if (lpDataObject != (IntPtr)0)
                {
                    dataObject = (IDataObject)Marshal.GetObjectForIUnknown(lpDataObject);
                }

                // Get the node.

                SnapinNode node;

                if (dataObject != null)
                {
                    node = ((DataObject)dataObject).Node;
                }
                else
                {
                    // Try to get the node of the selected item.

                    ResultDataItem item = m_snapin.GetSelectedItem((IResultData)m_console);
                    if (item.Index != -1)
                    {
                        node = m_snapin.FindNode(item.Param);
                    }
                    else
                    {
                        node = m_snapin.CurrentScopeNode;
                        if (node == null)
                        {
                            node = m_snapin.RootNode;
                        }
                    }
                }

                Debug.WriteLine("IComponent.Notify: " + ((MmcNotify)notifyEvent) + " " + node.DisplayName);

                // Dispatch the event to the node.

                switch ((MmcNotify)notifyEvent)
                {
                case MmcNotify.Activate:

                    node.OnActivate(arg.ToInt32() != 0);
                    break;

                case MmcNotify.AddImages:

                    // arg actually contains the IImageList interface. We need to
                    // marshall that manually as well.

                    IImageList imageList = (IImageList)Marshal.GetObjectForIUnknown(arg);

                    // Param contains the HScopeItem so use it to get the node it represents.

                    node = m_snapin.FindNodeByHScopeItem(param);
                    if (node != null)
                    {
                        node.OnAddResultPaneImages(imageList);
                    }
                    break;

                case MmcNotify.BtnClick:

                    node.OnBtnClick(param.ToInt32());
                    break;

                case MmcNotify.Click:

                    node.OnClick();
                    break;

                case MmcNotify.ColumnClick:

                    node.OnColumnClick((int)arg, (int)param == 0);
                    break;

                case MmcNotify.CutOrMove:

                    dataObject = (IDataObject)Marshal.GetObjectForIUnknown(arg);
                    if (!node.OnCutOrMove(dataObject))
                    {
                        hr = Constants.Win32.HResults.S_FALSE;
                    }
                    break;

                case MmcNotify.DblClick:

                    // Check if the default verb is enabled. If it is let MMC invoke it, otherwise
                    // say that the action was handled. This prevents it from asking for a property page
                    // when the Properties verb is disabled.

                    IConsoleVerb consoleVerb;
                    Console.QueryConsoleVerb(out consoleVerb);

                    MmcConsoleVerb defaultVerb = MmcConsoleVerb.None;
                    consoleVerb.GetDefaultVerb(ref defaultVerb);

                    int state = 0;
                    consoleVerb.GetVerbState(defaultVerb, MmcButtonState.Enabled, ref state);

                    hr = (state == 0 ? Constants.Win32.HResults.S_OK : Constants.Win32.HResults.S_FALSE);
                    break;

                case MmcNotify.Delete:

                    node.OnDelete();
                    break;

                case MmcNotify.DeselectAll:

                    node.OnDeselectAll();
                    break;

                case MmcNotify.Expand:

                    if (arg == IntPtr.Zero)
                    {
                        node.OnExpand(false);
                    }
                    else
                    {
                        node.OnCollapse();
                    }
                    break;

                case MmcNotify.MenuBtnClick:

                    MenuButtonData data = (MenuButtonData)(Marshal.PtrToStructure(param, typeof(MenuButtonData)));
                    node.OnMenuBtnClick(data.CommandId, data.X, data.Y);
                    break;

                case MmcNotify.Minimized:

                    if (arg.ToInt32() == 0)
                    {
                        node.OnMaximized();
                    }
                    else
                    {
                        node.OnMinimized();
                    }
                    break;

                case MmcNotify.Paste:

                    dataObject = (IDataObject)Marshal.GetObjectForIUnknown(arg);
                    if (node.OnPaste(dataObject))
                    {
                        param = Marshal.GetIUnknownForObject(dataObject);
                    }
                    else
                    {
                        hr = Constants.Win32.HResults.S_FALSE;
                    }
                    break;

                case MmcNotify.PropertyChange:

                    break;

                case MmcNotify.QueryPaste:

                    dataObject = (IDataObject)Marshal.GetObjectForIUnknown(arg);
                    if (!node.OnQueryPaste(dataObject))
                    {
                        hr = Constants.Win32.HResults.S_FALSE;
                    }
                    break;

                case MmcNotify.Refresh:

                    node.OnRefresh();
                    break;

                case MmcNotify.Print:

                    node.OnPrint();
                    break;

                case MmcNotify.Rename:

                    if (arg == IntPtr.Zero)
                    {
                        // Check.

                        if (!node.OnTryRename())
                        {
                            hr = Constants.Win32.HResults.S_FALSE;
                        }
                    }
                    else
                    {
                        if (node.OnRename(Marshal.PtrToStringAuto(param)))
                        {
                            SetStatusText(node.GetStatusText());
                        }
                        else
                        {
                            hr = Constants.Win32.HResults.S_FALSE;
                        }
                    }

                    break;

                case MmcNotify.Select:

                    bool scope  = ((short)arg) != 0;
                    bool select = ((((int)arg) >> 16) & 0xffff) != 0;

                    if (scope)
                    {
                        if (select)
                        {
                            if (m_scopeItemChanging)
                            {
                                m_scopeItemChanging       = false;
                                m_snapin.CurrentScopeNode = node;
                            }

                            // Defect 54593: for some reason when multiple result items are selected and the
                            // user clicks on the scope node MMC does NOT send a "deselect result" notification
                            // (if a single result item is selected then it does). Work around this.

                            if (node.IsResultSelected)
                            {
                                node.OnDeselectResult();
                            }

                            node.OnSelectScopeItem();
                            SetStatusText(node.GetStatusText());
                        }
                        else
                        {
                            node.OnDeselectScopeItem();
                        }
                    }
                    else
                    {
                        if (select)
                        {
                            node.OnSelectResult();
                        }
                        else
                        {
                            node.OnDeselectResult();
                        }
                    }

                    break;

                case MmcNotify.Show:

                    bool selecting = (arg != IntPtr.Zero);
                    if (selecting)
                    {
                        m_scopeItemChanging = true;
                        m_snapin.FindNodeByHScopeItem(param).OnShow();
                    }
                    else
                    {
                        m_snapin.FindNodeByHScopeItem(param).OnHide();
                    }

                    break;

                case MmcNotify.ViewChange:

                    dataObject = null;
                    if (param != (IntPtr)0)
                    {
                        dataObject = (IDataObject)Marshal.GetObjectForIUnknown(param);
                    }
                    SnapinNode nodeChanged = dataObject == null ? m_snapin.RootNode : ((DataObject)dataObject).Node;

                    if (arg != IntPtr.Zero)
                    {
                        node.OnViewChangeScope(nodeChanged);
                    }
                    else
                    {
                        node.OnViewChangeResult(nodeChanged);
                    }
                    break;

                case MmcNotify.SnapinHelp:

                    hr = Constants.Win32.HResults.S_FALSE;
                    break;

                case MmcNotify.ContextHelp:

                    node.OnContextHelp();
                    break;

                case MmcNotify.InitOcx:

                    // param is the IUnknown of the OCX.

                    object ocx = Marshal.GetObjectForIUnknown(param);
                    if (node.OnInitOcx(ocx))
                    {
                        hr = Constants.Win32.HResults.S_OK;
                    }
                    else
                    {
                        hr = Constants.Win32.HResults.S_FALSE;
                    }
                    break;

                case MmcNotify.FilterChange:

                    node.OnFilterChange((MmcFilterChangeCode)arg.ToInt32(), param.ToInt32());
                    hr = Constants.Win32.HResults.S_OK;
                    break;

                case MmcNotify.GetFilterMenu:

                    hr = Constants.Win32.HResults.S_FALSE;
                    break;

                case MmcNotify.FilterOperator:

                    hr = Constants.Win32.HResults.S_FALSE;
                    break;

                case MmcNotify.ColumnsChanged:

                    hr = Constants.Win32.HResults.S_OK;
                    break;

                default:

                    // The notification is not supported.

                    hr = Constants.Win32.HResults.S_FALSE;
                    break;
                }
            }
            catch (Exception e)
            {
                new ExceptionDialog(e, "The following exception has occurred in the snap-in:").ShowDialog(m_snapin);
                hr = Constants.Win32.HResults.S_FALSE;
            }

            return(hr);
        }
Exemplo n.º 3
0
 internal void OnControlbarCommand(IControlbar Controlbar, IToolbar Toolbar, MmcConsoleVerb verb)
 {
 }
Exemplo n.º 4
0
 private void SetDefaultVerb(MmcConsoleVerb verb)
 {
     GetIConsoleVerb().SetDefaultVerb(verb);
 }
Exemplo n.º 5
0
 private void SetVerbState(MmcConsoleVerb cmd, MmcButtonState state, bool show)
 {
     GetIConsoleVerb().SetVerbState(cmd, state, Convert.ToInt32(show));
 }