Quantcast
Channel: Visual Studio Integrate forum
Viewing all articles
Browse latest Browse all 4410

Trying to change context menu item in Visual studio Add-in

$
0
0

I am trying to modify and extend an open source existing visual studio add-in. When I try to change the context menu name and also the top menu name to say "Modify" intead of "Refactor", I get an error that says: "No item was found matching name "Modify" Parameter name: name"

I know it uses a resource file with multiple languages for the context item and menu item so I would like to change that so it does not use the resource file for those, then it might work I am geussing. Here is the code for connect.cs.

/// Copyright (c) Microsoft Corporation.  All rights reserved.

using System;
using Extensibility;
using EnvDTE;
using EnvDTE80;
using Microsoft.VisualStudio.CommandBars;
using System.Collections;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Diagnostics.CodeAnalysis;
using System.Resources;
using System.Globalization;
using System.Reflection;
using System.Collections.Generic;

namespace Microsoft.VSPowerToys.ResourceRefactor {
    /// <summary>The object for implementing an Add-in.</summary>
    /// <seealso class='IDTExtensibility2' />
    [System.Runtime.InteropServices.ComVisible(true)]
    public class Connect : IDTExtensibility2, IDTCommandTarget {

        #region Private Variables

        private DTE2 applicationObject;

        private AddIn addInInstance;

        /// <summary>
        /// List of available string refactor options.
        /// </summary>
        private Dictionary<string, Common.IStringRefactorOption> availableRefactorOptions = new Dictionary<string, Microsoft.VSPowerToys.ResourceRefactor.Common.IStringRefactorOption>();

        #endregion

        /// <summary>Implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.</summary>
        /// <param term='application'>Root object of the host application.</param>
        /// <param term='connectMode'>Describes how the Add-in is being loaded.</param>
        /// <param term='addInInst'>Object representing this Add-in.</param>
        /// <seealso class='IDTExtensibility2' />
        public void OnConnection(object Application, ext_ConnectMode ConnectMode, object AddInInst, ref Array custom) {
            if (Application == null) {
                throw new ArgumentNullException("Application");
            }
            if (AddInInst == null) {
                throw new ArgumentNullException("AddInInst");
            }
            applicationObject = (DTE2)Application;
            addInInstance = (AddIn)AddInInst;

            // Prepare the list of all available refactoring options
            this.ReadStringRefactorActions();

            if (ConnectMode == ext_ConnectMode.ext_cm_UISetup) {
                this.SetupRefactorActions();
            }

        }

        /// <summary>Implements the OnDisconnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being unloaded.</summary>
        /// <param term='disconnectMode'>Describes how the Add-in is being unloaded.</param>
        /// <param term='custom'>Array of parameters that are host application specific.</param>
        /// <seealso class='IDTExtensibility2' />
        public void OnDisconnection(ext_DisconnectMode RemoveMode, ref Array custom) {
        }

        /// <summary>Implements the OnAddInsUpdate method of the IDTExtensibility2 interface. Receives notification when the collection of Add-ins has changed.</summary>
        /// <param term='custom'>Array of parameters that are host application specific.</param>
        /// <seealso class='IDTExtensibility2' />		
        public void OnAddInsUpdate(ref Array custom) {
        }

        /// <summary>Implements the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification that the host application has completed loading.</summary>
        /// <param term='custom'>Array of parameters that are host application specific.</param>
        /// <seealso class='IDTExtensibility2' />
        public void OnStartupComplete(ref Array custom) {
        }

        /// <summary>Implements the OnBeginShutdown method of the IDTExtensibility2 interface. Receives notification that the host application is being unloaded.</summary>
        /// <param term='custom'>Array of parameters that are host application specific.</param>
        /// <seealso class='IDTExtensibility2' />
        public void OnBeginShutdown(ref Array custom) {
        }

        #region IDTCommandTarget Members

        /// <summary>
        /// Handles the command execution. First method checks if user has selected a part of string literal in the code, if so 
        /// method invokes RefactorStringDialog.
        /// </summary>
        /// <param name="CmdName"></param>
        /// <param name="ExecuteOption"></param>
        /// <param name="VariantIn"></param>
        /// <param name="VariantOut"></param>
        /// <param name="Handled"></param>
        /// <remarks>Globalization message is suppressed because add-in is only designed for En-US at this point.</remarks>
        [SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")]
        public void Exec(string CmdName, vsCommandExecOption ExecuteOption, ref object VariantIn, ref object VariantOut, ref bool Handled) {
            if (CmdName == null) {
                throw new ArgumentNullException("CmdName");
            }
            if (this.availableRefactorOptions.ContainsKey(CmdName)) {
                TextSelection selection = (TextSelection)(applicationObject.ActiveDocument.Selection);
                if (applicationObject.ActiveDocument.ProjectItem.Object != null) {
                    Common.BaseHardCodedString stringInstance = null;
                    /// Create the hard coded string instance
                    switch (applicationObject.ActiveDocument.Language) {
                        case "CSharp":
                            stringInstance = new Common.CSharpHardCodedString();
                            break;
                        case "Basic":
                            stringInstance = new Common.VBHardCodedString();
                            break;
                        case "XAML":
                            stringInstance = new Common.XamlHardCodedString();
                            break;
                        default:
                            MessageBox.Show(
                                Strings.UnsupportedFile + " (" + applicationObject.ActiveDocument.Language + ")",
                                Strings.WarningTitle,
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                            return;
                    }
                    Common.MatchResult scanResult = stringInstance.CheckForHardCodedString(
                       selection.Parent,
                       selection.AnchorPoint.AbsoluteCharOffset - 1,
                       selection.BottomPoint.AbsoluteCharOffset - 1);
                    if (scanResult.Result) {
                        stringInstance = stringInstance.CreateInstance(applicationObject.ActiveDocument.ProjectItem, scanResult.StartIndex, scanResult.EndIndex);
                        if (stringInstance != null && stringInstance.Parent != null) {
                            Common.IStringRefactorOption option = this.availableRefactorOptions[CmdName];
                            if (option.QuerySupportForString(stringInstance)) {
                                option.PerformAction(stringInstance);
                            } else {
                                MessageBox.Show(
                               Strings.UnsupportedFile,
                               Strings.WarningTitle,
                               MessageBoxButtons.OK,
                               MessageBoxIcon.Error);
                            }
                        }
                    } else {
                        MessageBox.Show(
                                Strings.NotStringLiteral,
                                Strings.WarningTitle,
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                    }
                }
            }
        }

        public void QueryStatus(string CmdName, vsCommandStatusTextWanted NeededText, ref vsCommandStatus StatusOption, ref object CommandText) {
            if (CmdName == null) {
                throw new ArgumentNullException("CmdName");
            }
            if (NeededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone) {
                if (this.availableRefactorOptions.ContainsKey(CmdName)) {
                    this.availableRefactorOptions[CmdName].QueryStatus(CmdName, NeededText, ref StatusOption, ref CommandText, applicationObject);
                }
            }
        }

        #endregion

        /// <summary>
        /// Finds the localized menu name from English menu name
        /// </summary>
        /// <param name="name">Name of the menu</param>
        /// <returns>Localized name</returns>
        /// <remarks>We have to catch all exceptions since GetString method can throw a very extensive
        /// list of exceptions</remarks>
        [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
        private string FindLocalizedMenuName(string name) {
            string menuName;
            ResourceManager resourceManager = new ResourceManager("Microsoft.VSPowerToys.ResourceRefactor.CommandBar", Assembly.GetExecutingAssembly());
            CultureInfo cultureInfo = new System.Globalization.CultureInfo(this.applicationObject.LocaleID);
            string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, name);
            try {
                menuName = resourceManager.GetString(resourceName);
            } catch {
                //We tried to find a localized version of the word, but one was not found.
                //Default to the en-US word, which may work for the current culture.
                menuName = name;
            }
            return menuName;
        }

        /// <summary>
        /// Inspects the current assembly for implementation of <see cref="Common.IStringRefactorActio"/>n and
        /// adds them to the menu entries
        /// </summary>
        private void ReadStringRefactorActions() {
            try {

                Type[] availableTypes = Assembly.GetExecutingAssembly().GetTypes();
                foreach (Type type in availableTypes) {
                    if (!type.IsAbstract && (typeof(Common.IStringRefactorOption)).IsAssignableFrom(type)) {
                        try {
                            Common.IStringRefactorOption option = System.Activator.CreateInstance(type) as Common.IStringRefactorOption;
                            if (option == null) continue;
                            if (this.availableRefactorOptions.ContainsKey(addInInstance.ProgID + "." + option.CommandName)) continue;
                            this.availableRefactorOptions.Add(addInInstance.ProgID + "." + option.CommandName, option);
                        } catch (TargetInvocationException e) {
                            System.Diagnostics.Trace.TraceError(e.ToString());
                        } catch (ArgumentException e) {
                            System.Diagnostics.Trace.TraceError(e.ToString());
                        } catch (MissingMethodException e) {
                            System.Diagnostics.Trace.TraceError(e.ToString());
                        }
                    }
                }
            } catch (Exception e) {
                System.Diagnostics.Trace.TraceError(e.ToString());
                throw;
            }
        }

        private void SetupRefactorActions() {
            object[] contextGUIDS = new object[] { };
            Commands2 commands = (Commands2)applicationObject.Commands;
            Command refactorCommand = null;
            CommandBar refactorContextMenu;
            CommandBar refactorToolbarMenu;
            try {
                CommandBar menuBarCommandBar = ((CommandBars)applicationObject.CommandBars)["MenuBar"];
                refactorToolbarMenu = ((CommandBarPopup)(menuBarCommandBar.Controls[FindLocalizedMenuName("Refactor")])).CommandBar;
                refactorContextMenu = ((CommandBars)(applicationObject.CommandBars))["Refactor"];

                //Editor Context Menus | XAML Editor
                CommandBar xamlEditorContextMenu = ((CommandBars)(applicationObject.CommandBars))["XAML Editor"];

                foreach (Common.IStringRefactorOption option in this.availableRefactorOptions.Values) {
                    while (true) {
                        try {
                            CommandBarControl ctl = (CommandBarControl)(refactorContextMenu.Controls[option.MenuText]);
                            ctl.Delete(false);
                        } catch (ArgumentException) {
                            break;
                        }
                    }

                    while (true) {
                        try {
                            CommandBarControl ctl = (CommandBarControl)(refactorToolbarMenu.Controls[option.MenuText]);
                            ctl.Delete(false);
                        } catch (ArgumentException) {
                            break;
                        }
                    }

                    while (true) {
                        try {
                            CommandBarControl ctl = (CommandBarControl)(xamlEditorContextMenu.Controls[option.MenuText]);
                            ctl.Delete(false);
                        } catch (ArgumentException) {
                            break;
                        }
                    }
                    // Create refactor command if necessary
                    try {
                        refactorCommand = commands.AddNamedCommand2(addInInstance,
                            option.CommandName,
                            option.MenuText,
                            option.Description,
                            true, 69, ref contextGUIDS, (int)(vsCommandStatus.vsCommandStatusEnabled | vsCommandStatus.vsCommandStatusSupported), (int)vsCommandStyle.vsCommandStyleText, vsCommandControlType.vsCommandControlTypeButton);
                        if (!String.IsNullOrEmpty(option.Hotkey)) {
                            refactorCommand.Bindings = new object[] { option.Hotkey };
                        }
                    } catch (ArgumentException) {
                        refactorCommand = commands.Item(addInInstance.ProgID + "." + option.CommandName, -1);
                    }
                    refactorCommand.AddControl(refactorContextMenu, refactorContextMenu.Controls.Count + 1);
                    refactorCommand.AddControl(refactorToolbarMenu, refactorToolbarMenu.Controls.Count + 1);
                    refactorCommand.AddControl(xamlEditorContextMenu, xamlEditorContextMenu.Controls.Count + 1);
                }
            } catch (Exception e)
            {
                System.Diagnostics.Trace.TraceError(e.ToString());
                throw;
            }
        }
    }
}


Viewing all articles
Browse latest Browse all 4410

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>