SharpDevelop自動命令啟動UI部分(看SharpDevelop源碼分析筆記隨想)

來源:互聯網
上載者:User
 

參見:Fbt2008的大作  SharpDevelop源碼分析筆記(一)   

 

來源文件 <http://www.cnblogs.com/fbt2008/archive/2005/08/02/205785.aspx?Pending=true>

 

在Fbt2008的大作中描述了SharpDevelop其Runtime的啟動過程,我把其中GUI啟動補充一下。

 

其中寫到如下系統代碼啟動片斷

 

系統代碼:

 

//這段代碼就是程式啟動時載入前台外掛程式了,/Workspace/Autostart是系統自動運行命令的擴充點路徑,定義在這個路徑下的外掛程式會在系統啟動的時候自動運行。在這裡,通過外掛程式樹初始化建立處於這個路徑下的Command(命令),並逐一執行。BuildChildItems方法的功能是建立這個擴充點下的Command列表
commands = AddInTreeSingleton.AddInTree.GetTreeNode("/Workspace/Autostart").BuildChildItems(null);
for (int i = 0; i < commands.Count - 1; ++i) 
{
    ((ICommand)commands[i]).Run();
    }

這段代碼會載入如下資訊清單檔,並根據此資訊清單檔中的ClassId載入運行

外掛程式清單之一(SharpDevelopCore.addin檔案)

 

片斷

<Extension path = "/Workspace/Autostart">

<Class id = "InitializeWorkbenchCommand"

class = "ICSharpCode.SharpDevelop.Commands.InitializeWorkbenchCommand"/>

<Class id = "StartCodeCompletionWizard"

class = "ICSharpCode.SharpDevelop.Commands.StartCodeCompletionWizard"/>

<Class id = "StartParserServiceThread"

class = "ICSharpCode.SharpDevelop.Commands.StartParserServiceThread"/>

<!-- #assembly preload -->

<Class id = "StartSharpAssemblyPreloadThread"

class = "ICSharpCode.SharpDevelop.Commands.StartSharpAssemblyPreloadThread"/>

<Class id = "StartWorkbenchCommand"

class = "ICSharpCode.SharpDevelop.Commands.StartWorkbenchCommand"/>

</Extension>

 

大家注意了:"/Workspace/Autostart" 就是上面代碼根據此描述將這一段的描述中的Class的執行個體載入,然後執行他們的方法(這些Class都繼承了Icommand)

 

這些類都在檔案AutostartCommands.cs中

 

而GUI的主要啟動過程就在InitializeWorkbenchCommand類上,如下:

 

public class InitializeWorkbenchCommand : AbstractCommand
{
    const string workbenchMemento = "SharpDevelop.Workbench.WorkbenchMemento";
    
    public override void Run()
    {
        //產生一個預設的Workbench
        DefaultWorkbench w = new DefaultWorkbench();
        WorkbenchSingleton.Workbench = w;
        //啟動Workbench
        w.InitializeWorkspace();
        PropertyService propertyService = (PropertyService)ServiceManager.Services.GetService(typeof(PropertyService));
        //將上一次使用的Workbench布局等資訊重新載入
        w.SetMemento((IXmlConvertable)propertyService.GetProperty(workbenchMemento, new WorkbenchMemento()));
        //重新整理Workbench,根據布局資訊,開啟啟動時需要展現的Pad和Editor
        w.UpdatePadContents(null, null);
        WorkbenchSingleton.CreateWorkspace();
        
    }
}

 

DefaultWorkbench 的 InitializeWorkspace代碼如下

public void InitializeWorkspace()
{
    Menu = null;
    //狀態條
    statusBarManager.Control.Dock = DockStyle.Bottom;
    
    ActiveWorkbenchWindowChanged += new EventHandler(UpdateMenu);
    
    MenuComplete += new EventHandler(SetStandardStatusBar);
    SetStandardStatusBar(null, null);
    
    IProjectService projectService = (IProjectService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IProjectService));
    IFileService fileService = (IFileService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IFileService));
    
    projectService.CurrentProjectChanged += new ProjectEventHandler(SetProjectTitle);
    projectService.CombineOpened
        
            += new CombineEventHandler(CombineOpened);

    fileService.FileRemoved += new FileEventHandler(CheckRemovedFile);
    fileService.FileRenamed += new FileEventHandler(CheckRenamedFile);

    fileService.FileRemoved += new FileEventHandler(fileService.RecentOpen.FileRemoved);
    fileService.FileRenamed += new FileEventHandler(fileService.RecentOpen.FileRenamed);

    //

    
    TopMenu.Selected   += new CommandHandler(OnTopMenuSelected);
    //

    
    TopMenu.Deselected += new CommandHandler(OnTopMenuDeselected);

    //建立菜單
    CreateMainMenu();
    //建立工具條
    CreateToolBars();
}

   w.SetMemento(...);
    w.UpdatePadContents(null, null);
    這兩句稍稍複雜些,在這裡就不分析了。

 

注意:有關Workbench,pad和Editor等概念基本可以參照Eclipse文檔。有一些細小差別,例如Pad在Eclipse中叫View,Workench在SharpDevelop僅存在一個WorkbenchWindow.而在SharpDevelop有多個等等。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.