locked
Adding a command for a custom add-in where the command already exists RRS feed

  • Question

  • Hi,

    I thought I'd have a go at writing an addin for VS but it is not working as expected. Here is my code for the OnConnection method:

    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {
    	_applicationObject = (DTE2)application;
    	_addInInstance = (AddIn)addInInst;
    	if(connectMode == ext_ConnectMode.ext_cm_UISetup)
    	{
    		object []contextGUIDS = new object[] { };
    		Commands2 commands = (Commands2)_applicationObject.Commands;
    		CommandBars commandBars = (CommandBars)_applicationObject.CommandBars;
    		string toolsMenuName = "Tools";
    
    		//Find the MenuBar command bar
    		Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];
    
    		//Find the Tools command bar on the MenuBar command bar:
    		CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
    		
    		CommandBarControl _MyAddinMenu;
    		try
    		{
    			// Get the menu bar if it already exists
    			_MyAddinMenu = menuBarCommandBar.Controls["My Custom Addin"];
    		}
    		catch (System.ArgumentException)
    		{
    			// Doesn't exist so create a new one.
    			_MyAddinMenu = menuBarCommandBar.Controls.Add(Type: MsoControlType.msoControlPopup, Id: 9876543210, Before: toolsControl.Index - 1);
    			_MyAddinMenu.Caption = "My Custom Addin";
    		}
    
    		CommandBarPopup toolsPopup = (CommandBarPopup)_MyAddinMenu;
    	  
    
    		try
    		{
    			//Add a command to the Commands collection:
    			Command command = commands.AddNamedCommand2(_addInInstance, "CMD1_MyCustomAddin", "Do Something 1", "Do Something 1 Tooltip", true, 100, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    
    			//Add a control for the command to the tools menu:
    			if((command != null) && (_newPopup != null))
    			{
    				command.AddControl(_newPopup.CommandBar, 1);
    			}
    
    		}
    		catch (System.ArgumentException)
    		{
    		}
    	   
    		try
    		{
    			//Add a command to the Commands collection:
    			Command command = commands.AddNamedCommand2(_addInInstance, "CMD2_MyCustomAddin", "Do Something 2", "Do Something 2 Tooltip", true, 101, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    
    			//Add a control for the command to the tools menu:
    			if ((command != null) && (_newPopup != null))
    			{
    				command.AddControl(_newPopup.CommandBar, 2);
    			}
    
    		}
    		catch (System.ArgumentException)
    		{
    			
    		}
    
    	}
    }

    So, what I have is that I am adding a new menu item before the Tools menu titled 'My Custom Addin', then I want to add two controls to this new menu titled 'Do Something 1' and 'Do Something 2'. 

    When I first built the solution and ran it yesterday (multiple times), the menu appeared as did the two controls. Now for some reason when I build it all I see is a disabled menu 'My Custom Addin' and when I hover over it the tooltip reads: "Adding Child Items to this menu will enable it".

    Now, the reason that the children aren't being added to this menu is because of the following code:

    try
    		{
    			//Add a command to the Commands collection:
    			Command command = commands.AddNamedCommand2(_addInInstance, "CMD1_MyCustomAddin", "Do Something 1", "Do Something 1 Tooltip", true, 100, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    
    			//Add a control for the command to the tools menu:
    			if((command != null) && (_newPopup != null))
    			{
    				command.AddControl(_newPopup.CommandBar, 1);
    			}
    
    		}
    		catch (System.ArgumentException)
    		{
    		}
     

    where it falls over on this line:

    Command command = commands.AddNamedCommand2(_addInInstance, "CMD1_MyCustomAddin", "Do Something 1", "Do Something 1 Tooltip", true, 100, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

    with the exception: "A Command with that name already exists.".

    I did a bit of reading and found this: http://msdn.microsoft.com/en-us/library/envdte80.commands2.addnamedcommand2(v=vs.90).aspx

    which states "Creates a named command that is saved by the environment and made available the next time the environment starts, even if the Add-in is not loaded on environment startup."

    So, if I understand this correctly I need to try and find the command first, delete it if it exists, and then re-add it?

    I tried doing this by looking for the specific name within the commandBars variable and using the delete method, but I was unable to do this. While creating this thread, I came across this : http://social.msdn.microsoft.com/Forums/vstudio/en-US/9a026206-8ef0-4ef2-aa51-d00d8e0efc87/a-command-with-that-name-already-exists-error-?forum=vsx

    which says that using Commands.item(Commands.count) .Name would work however I don't see how using commands.Count would return the correct index if the number of commands changed with another addin.


    Tuesday, April 29, 2014 3:49 AM

Answers

  • This seems to work:

    try
    {
    	//Add a command to the Commands collection:
    	Command command = commands.AddNamedCommand2(_addInInstance, "CMD1_MyCustomAddin", "Do Something 1", "Do Something 1 Tooltip", true, 100, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    
    	//Add a control for the command to the tools menu:
    	if((command != null) && (_newPopup != null))
    	{
    		command.AddControl(_newPopup.CommandBar, 1);
    	}
    
    }
    catch (System.ArgumentException)
    {
    	string CommandName = this._addInInstance.ProgID + "." + "CMD1_MyCustomAddin";
    	Command command = null;
    	try
    	{
    		command = this._applicationObject.Commands.Item(CommandName, -1);
    		if ((command != null) && (_newPopup != null))
    		{
    			command.AddControl(_newPopup.CommandBar, 1);
    		}
    	}
    	catch
    	{
    
    	}
    }

    It would be great if someone could tell me if there is any problem doing it like this.

    Thanks

    • Marked as answer by _Joe_King_ Tuesday, April 29, 2014 5:00 AM
    Tuesday, April 29, 2014 5:00 AM

All replies

  • This seems to work:

    try
    {
    	//Add a command to the Commands collection:
    	Command command = commands.AddNamedCommand2(_addInInstance, "CMD1_MyCustomAddin", "Do Something 1", "Do Something 1 Tooltip", true, 100, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    
    	//Add a control for the command to the tools menu:
    	if((command != null) && (_newPopup != null))
    	{
    		command.AddControl(_newPopup.CommandBar, 1);
    	}
    
    }
    catch (System.ArgumentException)
    {
    	string CommandName = this._addInInstance.ProgID + "." + "CMD1_MyCustomAddin";
    	Command command = null;
    	try
    	{
    		command = this._applicationObject.Commands.Item(CommandName, -1);
    		if ((command != null) && (_newPopup != null))
    		{
    			command.AddControl(_newPopup.CommandBar, 1);
    		}
    	}
    	catch
    	{
    
    	}
    }

    It would be great if someone could tell me if there is any problem doing it like this.

    Thanks

    • Marked as answer by _Joe_King_ Tuesday, April 29, 2014 5:00 AM
    Tuesday, April 29, 2014 5:00 AM
  • Hi,

    Glad to hear that you got it working!

    >>It would be great if someone could tell me if there is any problem doing it like this.

    I haven't found any problem if doing like this. If you have further questions later, you can reopen a new thread.

    Thank you for sharing your solution here, it will be very beneficial for other community members who have similar questions.

    Best regards,

    Sunny

    Wednesday, April 30, 2014 1:41 AM