Beispiel #1
0
        /// <summary>IDTExtensibility2 인터페이스의 OnConnection 메서드를 구현합니다. 추가 기능이 로드되고 있다는 알림 메시지를 받습니다.</summary>
        /// <param term='application'>호스트 응용 프로그램의 루트 개체입니다.</param>
        /// <param term='connectMode'>추가 기능이 로드되는 방법을 설명합니다.</param>
        /// <param term='addInInst'>이 추가 기능을 나타내는 개체입니다.</param>
        /// <seealso class='IDTExtensibility2' />
        public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
        {
            AddNewSubCommand("OpenSolutionFolderExplorer", "Open Solution Folder with Explorer", 65);
            AddNewSubCommand("OpenSolutionFolderCmd", "Open Command Prompt on Solution Folder", 65);
            AddNewSubCommand("OpenCorrespondingFile", "Toggle Source/Header", 65);
            AddNewSubCommand("OpenFileInSolution", "Quick Open File In Solution", 65);
            AddNewSubCommand("About", "About ZAssist...", 65);
            //AddNewSubCommand("QuickFindFunction", "Quick Find Function", 65);

            _applicationObject = (DTE2)application;
            _addInInstance     = (AddIn)addInInst;
            if (connectMode == ext_ConnectMode.ext_cm_UISetup ||
                connectMode == ext_ConnectMode.ext_cm_Startup ||
                connectMode == ext_ConnectMode.ext_cm_AfterStartup)
            {
                object[]  contextGUIDS = new object[] { };
                Commands2 commands     = (Commands2)_applicationObject.Commands;
                string    toolsMenuName;

                try
                {
                    //명령을 다른 메뉴로 이동하려면 "Tools"를
                    //  영어 버전의 메뉴로 변경합니다. 이 코드는 culture를 메뉴 이름에 추가한 다음
                    //  해당 메뉴에 명령을 추가합니다. 모든 최상위 메뉴의 목록을 확인하려면
                    //  CommandBar.resx 파일을 참조하십시오.
                    ResourceManager resourceManager = new ResourceManager("ZAssist.CommandBar", Assembly.GetExecutingAssembly());
                    CultureInfo     cultureInfo     = new System.Globalization.CultureInfo(_applicationObject.LocaleID);
                    string          resourceName    = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
                    toolsMenuName = resourceManager.GetString(resourceName);
                }
                catch
                {
                    //지역화된 버전의 'Tools'를 찾으려고 시도했지만 찾지 못했습니다.
                    //  기본값을 현재 culture에서 작동할 수 있는 en-US로 지정합니다.
                    toolsMenuName = "Tools";
                }

                //도구 메뉴에 명령을 배치합니다.
                //주 메뉴 항목이 모두 들어 있는 최상위 명령 모음인 MenuBar 명령 모음 찾기:
                Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

                //MenuBar 명령 모음에서 도구 명령 모음 찾기:
                CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
                CommandBarPopup   toolsPopup   = (CommandBarPopup)toolsControl;

                //추가 기능에서 처리할 명령을 여러 개 추가하면 이 try/catch 블록이 중복될 수 있습니다.
                //  이 경우 QueryStatus/Exec 메서드도 업데이트하여 새 명령 이름을 포함하기만 하면 됩니다.
                try
                {
                    //명령 컬렉션에 명령 추가:
                    CommandBar toolsMenu = ((CommandBars)(_applicationObject.CommandBars))["Tools"];

                    try
                    {
                        /// 아래 문장에서 catch 로 빠진다는 건 ZAssist 가 메뉴에 없다는 말이다.
                        CommandBarPopup k = (CommandBarPopup)(toolsMenu.Controls["ZAssist"]);
                        k.Caption = k.Caption + "";
                    }
                    catch (ArgumentException)
                    {
                        CommandBarPopup commandBarPopup = (CommandBarPopup)toolsMenu.Controls.Add(MsoControlType.msoControlPopup, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, true);

                        subMenu         = commandBarPopup;
                        subMenu.Visible = true;
                        subMenu.Caption = "ZAssist";

                        int iMenuIndex = 1;
                        foreach (NewCommandData newCommData in m_commands)
                        {
                            Command newCommand = null;

                            try
                            {
                                newCommand = commands.Item(_addInInstance.ProgID + "." + newCommData.GetCommandName(), -1);
                            }
                            catch (Exception ex)
                            {
                                System.Diagnostics.Debug.Print("이미 존재하는지 검사하는 곳에서 exception 발생 : ", ex.Message);
                            }

                            if (null == newCommand)
                            {
                                newCommand = commands.AddNamedCommand(_addInInstance, newCommData.GetCommandName(), newCommData.GetShowName(), newCommData.GetShowName(), true, newCommData.GetInconIndex(), ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled);
                            }

                            if (newCommand != null)
                            {
                                newCommand.AddControl(subMenu.CommandBar, iMenuIndex);
                            }

                            ++iMenuIndex;
                        }
                    }
                }
                catch (System.ArgumentException ex)
                {
                    //이 경우, 같은 이름의 명령이 이미 있기 때문에 예외가 발생할 수
                    //  있습니다. 이 경우 명령을 다시 만들 필요가 없으며 예외를 무시해도
                    //  됩니다.
                    System.Diagnostics.Debug.Print(ex.Message);
                }
            }
        }