# 2004-10-15  SharpDevelop的AddInTree View 插件

自从SharpDevelop 源码分析的系列文章发出来之后，很多朋友给了不错的评价，在这里先感谢各位朋友的鼓励。另外，评论中有位朋友想看看我在文章中提到的AddInTreeView插件，其实这个是个很简单的小东西，因此单独发在这里了。(好像没有找到那里能上传文件，因此直接贴代码了)

## AddinTreeViewCommand.cs

```
/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2004-10-4
 * Time: 4:12
 *
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Windows.Forms;
using System.CodeDom.Compiler; 

using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.Pads;
using ICSharpCode.Core.AddIns;
using ICSharpCode.Core.AddIns.Codons;
using ICSharpCode.SharpDevelop.Services; 

namespace Addins.AddinTreeView
{
    /// <summary>
    /// Description of MyClass.
    /// </summary>
    public class AddinTreeViewCommand: AbstractMenuCommand
    {
        public override void Run()
        {
            using (AddinTreeViewContent viewContent = new AddinTreeViewContent() )
            {
                WorkbenchSingleton.Workbench.ShowView(viewContent);
            }
        }
    } 

    public class AddinTreeViewContent: AbstractViewContent
    {
        AddinTreeViewControl viewControl = new AddinTreeViewControl(); 

        public override Control Control
        {
            get
            {
                return viewControl;
            }
        } 

        public override bool IsDirty
        {
            get
            {
                return false;
            }
            set
            {
            }
        } 

        IWorkbenchWindow workbenchWindow;
        public override IWorkbenchWindow WorkbenchWindow
        {
            get
            {
                return workbenchWindow;
            }
            set
            {
                workbenchWindow = value;
                workbenchWindow.Title = "AddInTreeView";
            }
        } 

        public AddinTreeViewContent()
        {
            TitleName = "AddinTree View";
        } 

        public override bool IsViewOnly
        {
            get
            {
                return true;
            }
        }
        public void SaveFile(){}
        public void Undo(){}
        public void Redo(){}
        public override void Save(){}
        public override void Save(string filename){}
        public override void Load(string filename)
        {
        } 

        public override string TabPageText
        {
            get
            {
                return "AddInTree";
            }
        } 

    }
} 
```

## AddinTreeViewControl.cs \#

```
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms; 

using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.Core.AddIns;
using ICSharpCode.Core.AddIns.Codons; 

namespace Addins.AddinTreeView
{
    /// <summary>
    /// AddinTreeViewControl 的摘要说明。
    /// </summary>
    public class AddinTreeViewControl : System.Windows.Forms.UserControl
    {
        private System.Windows.Forms.ColumnHeader chName;
        private System.Windows.Forms.ListView lvAddin;
        private System.Windows.Forms.ColumnHeader chInfo;
        private System.Windows.Forms.CheckBox cbShowAddinInfo;
        private System.Windows.Forms.Splitter splitter2;
        private System.Windows.Forms.ListView lvDebug;
        private System.Windows.Forms.Splitter splitter1;
        private System.Windows.Forms.TreeView tvAddin;
        private System.Windows.Forms.ColumnHeader chValue;
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.Container components = null; 

        public AddinTreeViewControl()
        {
            // 该调用是 Windows.Forms 窗体设计器所必需的。
            InitializeComponent(); 

            // TODO: 在 InitializeComponent 调用后添加任何初始化
            InitAddinTreeView();
        } 

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        } 

        组件设计器生成的代码 

        void InitAddinTreeView()
        {
            TreeNode pathNode = tvAddin.Nodes.Add("AddinRoot"); 

            tvAddin.BeginUpdate();
            try
            {
                foreach ( AddIn addIn in AddInTreeSingleton.AddInTree.AddIns)
                {
                    foreach ( ICSharpCode.Core.AddIns.AddIn.Extension e in addIn.Extensions)
                    {
                        string [] paths = e.Path.Split('/');
                        pathNode = tvAddin.Nodes[0]; 

                        for ( int i=0; i<paths.Length; i++)
                        {
                            bool foundPath = false; 

                            if ( paths[i] == "" )
                            {
                                pathNode = tvAddin.Nodes[0];
                                continue;
                            }                         

                            for ( int j=0; j<pathNode.Nodes.Count; j++)
                            {
                                if ( pathNode.Nodes[j].Text == paths[i] )
                                {
                                    pathNode = pathNode.Nodes[j];
                                    foundPath = true;
                                    break;
                                }
                            } 

                            if ( !foundPath )
                            {
                                pathNode = pathNode.Nodes.Add( paths[i] );
                                pathNode.Tag = new ArrayList();
                                //lvDebug.Items.Add("Add " + e.Path + " ---- " + paths[i]);
                            }
                        } 

                        (pathNode.Tag as ArrayList).Add(e);
                    }
                }
            }
            finally
            {
                tvAddin.EndUpdate();
            }
        } 

        void AddInfo(string Name, string Value)
        {
            lvAddin.Items.Add(Name).SubItems.Add(Value);
        } 

        private void tvAddin_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            lvAddin.Items.Clear(); 

            if ( e.Node.Tag != null )
            {
                foreach (AddIn.Extension et in (e.Node.Tag as ArrayList))
                {
                    AddInfo("Extension", et.ToString()); 

                    foreach ( ICodon codon in et.CodonCollection)
                    {
                        AddInfo("  ┏ Codon ID", codon.ID);
                        AddInfo("  ┣ Codon Name", codon.Name);
                        AddInfo("  ┗ Codon Class", codon.Class); 

                        if ( cbShowAddinInfo.Checked )
                        {
                            AddInfo("      ┣ Addin Name", codon.AddIn.Name);
                            AddInfo("      ┗ Addin FileName", codon.AddIn.FileName); 

                            foreach ( ICSharpCode.Core.AddIns.AddIn.Extension ex in codon.AddIn.Extensions)
                            {
                                AddInfo("          ┣ Addin Extensions", ex.Path);
                            }
                            AddInfo("          ┗━━━━━━━━━", "");
                        }
                    }
                }
            }
        }
    }
} 
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.log4think.com/sharpdevelop-addintreeview.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
