当前位置: 首页 > article >正文

SharpDevelop源码分析笔记(一)

SharpDevelop自动命令启动UI部分(看SharpDevelop源码分析笔记随想)

 

参见:Fbt2008的大作  SharpDevelop源码分析笔记(一)   

 

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

 

Fbt2008的大作中描述了SharpDevelopRuntime的启动过程,我把其中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(nullnull);
        WorkbenchSingleton.CreateWorkspace();
        
    }

}



 

DefaultWorkbench 的 InitializeWorkspace代码如下

 

public   void  InitializeWorkspace()
{
    Menu 
= null;
    
//状态条
    statusBarManager.Control.Dock = DockStyle.Bottom;
    
    ActiveWorkbenchWindowChanged 
+= new EventHandler(UpdateMenu);
    
    MenuComplete 
+= new EventHandler(SetStandardStatusBar);
    SetStandardStatusBar(
nullnull);
    
    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);
    这两句稍稍复杂些,在这里就不分析了。


 

注意:有关WorkbenchpadEditor等概念基本可以参照Eclipse文档。有一些细小差别,例如PadEclipse中叫View,WorkenchSharpDevelop仅存在一个WorkbenchWindow.而在SharpDevelop有多个等等。



 

般若菩提
关注 - 0
粉丝 - 0
关注博主
0
0
(请您对文章做出评价)
« 上一篇: 强烈推荐两本经典OO书籍以及对用例编写的启发
http://www.lryc.cn/news/2419643.html

相关文章:

  • readonly和disabled的作用?区别?别翻了,这有精细汇总齐的秘籍!
  • 交互设计的视觉设计:如何创造吸引人的视觉效果
  • sdcard-dma
  • python爬虫最简单入门
  • 条件编译指令的用法总结
  • 手把手教你如何在Linux上安装Deb软件包 (linux 安装 deb)
  • MessageBox.Show 用法介绍
  • GeoGebra
  • 计算机网络中的NET与应用中的.NET
  • TOMCAT的配置(整理)
  • C语言小游戏--贪吃蛇(完整代码)
  • html入门:网页字体的设置
  • 【Bilibili直播源】浏览器抓取真实直播源地址(纯前端JS PHP解析源码)
  • 通过socketpair()函数实现同一进程内部的进程间通信(IPC)
  • 被盗14亿账号信息?腾讯紧急宣布!
  • Linux下 mtrace工具排查内存泄露问题
  • 解决xftp6 要继续使用此程序,您必须应用最新的更新或使用新版本
  • 经典java视频教程,个人无私分享
  • 开源 java CMS - FreeCMS1.9公布。
  • 针对搜索引擎的高级搜索方法(Baidu,Google,Bing....)
  • settimer()函数和alarm()函数
  • MTA邮件传送代理--sendmail完全配置
  • java response.sendredirect_「response.sendredirect」HttpServeltResponse接口中sendRedirect方法详解 - seo实验室...
  • 数据治理——主数据项目实施
  • C++ 获取鼠标点击位置
  • 开源评论系统 Isso 全攻略
  • (SDL2)SDL在ubuntu下的测试代码(雷霄骅)
  • 负数求补码
  • short 下 32768的二进制
  • winRAR 破解注册码