SharpDevelop插件开发手册部分内容摘取自:http://www.cnblogs.com/CBuilder的SharpDevelop开发教程

SharpDevelop插件开发手册

第一章    Pad

Pad(面板)就是插件框架中的停靠窗口。有这些特点:Pad不能关闭,但可以隐藏或显示。每种类型的Pad只能打开一个,不能在运行时添加,标题唯一。可以显示图标,由插件框架中的布局管理器负责管理。通常不显示文件内容,而是辅助用户完成任务。

下面进入我们的实战流程,先新建一个类库型的项目,命名为CSPadDemoPlug,把Class1.cs改名为Main.cs,修改为如下内容:

 1using System; 
 2using System.Drawing; 
 3using System.Windows.Forms; 
 4 
 5using ICSharpCode.SharpDevelop.Gui; 
 6 
 7namespace PadDemoPlug 
 8
 9    public class Pad : AbstractPadContent 
10    { 
11        PadControl control=new PadControl(); 
12        public Pad(): base("TestPanel") 
13        { 
14        } 
15 
16        public override Control Control  
17        { 
18            get  
19            { 
20                return this.control; 
21            } 
22        }          
23    } 
24
25

记得要在项目中加入插件框架中的ICSharpCode.Core.dll和SharpDevelop.Base.dll引用。这两个文件在插件框架下的Bin目录下。写插件框架的插件需要包含。

在项目中添加新建项à用户控件。改名为CSPadControl。各位可以在CSPadControl上添加一些相关的内容。

在工程中添加一个DemoPlug.addin文件,这是插件配置文件,很重要,内容如下:

 1<AddIn name        = "SharpDevelop Plug Demo" 
 2       author      = "SongYuanWu" 
 3       copyright   = "GPL" 
 4       url         = "http://www.cnblogs.com/CBuilder" 
 5       description = "SharpDevelop " 
 6       version     = "1.0.0"> 
 7     
 8    <Runtime> 
 9        <Import assembly="PadDemo.dll"/> 
10    </Runtime> 
11 
12    <Extension path = "/SharpDevelop/Workbench/Views"> 
13        <Class id    = "PadDemo"  
14              class = "PadDemoPlug.Pad"/> 
15    </Extension> 
16</AddIn>  
17 
18

OK!把编译后的PadDemo.dll和DemoPlug.addin文件拷贝到的/AddIns/目录下,运行插件框架就可以看到我们创建的Pad了(如下图),同时在插件框架的菜单【查看】-【工具】下也出现了TestPanel菜单项。

如果需要指定pad的图标时,可以改更改base("TestPanel")为 base("TestPanel", "IconID")。

InconID为图标的资源号,作为演示你可以用Class的图标“Icons.16x16.Class”来替代。

要点分析:

制作Pad的时候要从AbstractPadContent继承。所以要using ICSharpCode.SharpDevelop.Gui;

第二章    工作区

第一节 创建工区作

View(工作区)是SD的基础部分,View通常包含编辑器,如代码编辑器,资源编辑器。基本上,它是显示于MPI窗口选项卡页面上的面板。

制作View要从AbstractViewContent继承下来。下面就进入我们的实战操作流程,首先新建一个类库行的项目,SDViewDemoPlug,把Class1.cs改名为Main.cs,修改为如下内容:

 1 using System;
 2 using ICSharpCode.Core.AddIns;
 3 using ICSharpCode.Core.AddIns.Codons;
 4 
 5 using ICSharpCode.SharpDevelop.Gui;
 6 
 7 namespace SDViewDemoPlug
 8 {
 9     public class ShowViewCommand : AbstractMenuCommand
10    {
11        public override void Run()
12        {            
13            WorkbenchSingleton.Workbench.ShowView(new SDViewContent());
14        }
15    }
16}
17

添加一个新类,SDViewContent,文件名为SDViewContent.cs,修改内容如下:

 1using System;
 2using System.Drawing;
 3using System.Windows.Forms;
 4using ICSharpCode.SharpDevelop.Gui;
 5
 6namespace SDViewDemoPlug
 7{
 8    public class SDViewContent : AbstractViewContent
 9    {
10        SDViewControl p=new SDViewControl();
11        public override Control Control 
12        {
13            get {return p;}
14        }
15        
16        public override bool IsReadOnly 
17        {
18            get {return false;}
19        }
20        
21        public override void Save(string fileName){}
22        public override void Load(string fileName){}
23        public override void RedrawContent(){}
24        
25        public override void Dispose()
26        {        
27            p.Dispose();
28        }
29        
30        public SDViewContent()
31        {
32            TitleName = "TestView";            
33        }        
34        
35    }
36}
37

在项目中添加新建项用户控件。改名为SDViewControl。各位可以在SDViewControl上添加一些相关的内容。最后添加插件配置文件ViewDemoPlug.addin,内容如下:

 1<AddIn name        = "SharpDevelop Plug Demo"
 2       author      = "SongYuanWu"
 3       copyright   = "GPL"
 4       url         = "http://www.cnblogs.com/CBuilder"
 5       description = "SharpDevelop"
 6       version     = "1.0.0">
 7    
 8    <Runtime>
 9        <Import assembly="SDViewDemoPlug.dll"/>
10    </Runtime>
11
12    <Extension path = "/SharpDevelop/Workbench/MainMenu/Tools">
13        <MenuItem id = "SDViewDemo"                 
14                 label = "ShowMyView" 
15                 class = "SDViewDemoPlug.ShowViewCommand"/>
16    </Extension>
17</AddIn>
18

还有不要忘记把ICSharpCode.Core.dll和SharpDevelop.Base.dll引用进项目中来。编译后把ViewDemoPlug.addin和SDViewDemoPlug.dll拷贝到SD的/AddIns/目录下。运行SD,就可以看到在【工具】菜单下出现了【ShowMyView】菜单项。Click【ShowMyView】菜单项后显示如图,再click【ShowMyView】菜单项后就会又显示一个TestView。各位如果问:“需要做象“启动页”一样的View,如果已经有打开的了就会激活打开的View该如何处理呢?”。其实很简单,你可以把ShowViewCommand类中的Run函数更改为:

 1foreach (IViewContent view in WorkbenchSingleton.Workbench.ViewContentCollection) 
 2    {
 3        if (view is SDViewContent) 
 4        {
 5            view.WorkbenchWindow.SelectWindow();                    
 6            return;
 7        }
 8    }            
 9    WorkbenchSingleton.Workbench.ShowView(new SDViewContent());
10

此Demo演示了如何在SD添加一个View,同时也演示了如何在SD中更改菜单项。每添加一个菜单项时都要继承一个AbstractMenuCommand,并且改写Run()函数,当然你的XXXCommand也可以从SD的AbstractCommand继承,但要实现IMenuCommand接口。因为添加菜单项和添加工具条按钮比较简单,在以后的内容中我会一起讲,在此我就不多说了。

第二节 工作区关闭控制

插件框架的工作区(AbstractViewContent)和主窗体(WorkbenchSingleton.MainForm)在是否关闭可能通过窗体的Closing事件来进行控制,和普通窗体关闭事件没有太大区别。

MainForm和常用的窗体没有什么区别,这里就不做特殊说明。

由于工作区本身不是一窗体,所以它没有Closing事件,但是它本身是有父窗体(AbstractViewContent.WorkbenchWindow)的,我们完全可以通过它父窗体的Closing事件来进行控制,示例如下

 1namespace EtsWorkFlow.Designer.ViewContent
 2{
 3    public class WorkFlowEditorView : AbstractViewContent
 4    {
 5        IWorkbenchWindow _workbenchWindow;
 6
 7        public WorkFlowEditorView() : base("工作流设计器")
 8        {}
 9
10        private void Closing(object sender, CancelEventArgs e)
11        {
12             ////控制关闭代码
13        }
14
15        /// <summary>
16        /// 用来控制主窗体关闭时是否触发它的父窗体的Closing事件
17        /// </summary>
18        public override bool IsDirty
19        {
20            get
21            {
22                return true;
23            }
24        }    
25        public override bool IsDirty
26        {
27            get
28            {
29                return true;
30            }
31        }
32
33        public override IWorkbenchWindow WorkbenchWindow 
34        {
35            get
36            {
37                return _workbenchWindow;
38            }
39            set
40            {
41                _workbenchWindow = value;
42                if (_workbenchWindow != null)
43                {
44                    (_workbenchWindow as Form).Closing -= new CancelEventHandler(this.Closing);
45                    (_workbenchWindow as Form).Closing += new CancelEventHandler(this.Closing);
46                }
47            }
48        }
49
50    }
51}
52

第三章   配置文件

一、菜单配置

1<MenuItem id = "TipOfTheDay"
2          label = "${res:XML.MainMenu.HelpMenu.Tips}"
3          icon = "Icons.16x16.TipOfTheDay"
4      shortcut = "Shift|Control|F1"
5          insertafter = "Separator2"
6          class = "ICSharpCode.SharpDevelop.Commands.ViewTipOfTheDay" />
7<MenuItem id = "Downloads" label = "Downloads(&amp;D)" icon = "Icons.16x16.WebSearchIcon" link = "http://www.sharpdevelop.net/OpenSource/SD/Download/" />
8

1)id:代表唯一标识

2)label:是菜单的标题,它即可以从资源文件中读取,也可以直接进行设置,如果要设置热键,格式如下:(&字母)

3)icon:表示,菜单的图标,该图标在resource格式的文件中定义

4)shortcut:设置快捷键

5)link:这里就是当前菜单项要链接的网址,也可以链接外部文件,示例如下:link = "home://doc/ReadMe.rtf",表示主程序上级的doc目录下的ReadMe.rtf文件。

6)class:表示该菜单对应的命令。

7)insertafter:表示插在哪个菜单项之后

如果要建立子菜单只需要添加MenuItem子节点即可,格式如下:

1   <MenuItem id = "Help" label = "${res:XML.MainMenu.HelpMenu}" type="Menu">
2      <MenuItem id = "Separator2" type = "Separator" />
3      <MenuItem id = "delphidoc"  label = "公司主页" icon = "Icons.16x16.WebSearchIcon" link = "http://www.cnblogs.com/delphidoc" />
4    </MenuItem>
5

二、MenuItem类型

MenuItem共有四种类型

1) type = "Menu"         普通父菜单

2) type = "Separator"      分隔符

3) type = "Item"      菜单项

4) type = "Builder"        由代码购建的菜单,如文件历史列表

三、状态控制

插件框架中生成的工具栏按钮和菜单项都可以通过配置文件来进行控制。

示例如下:

 1  <Runtime>
 2      <Import assembly="EtsWorkFlow.Designer.dll">
 3        <ConditionEvaluator name="ActiveViewContent" class="EtsWorkFlow.Designer.Command.ActiveViewContentConditionEvaluator"/>
 4      </Import>
 5    </Runtime>
 6
 7    <Condition name = "ActiveViewContent" action="Disable">
 8      <MenuItem id = "SaveFlowFile"
 9                 label = "保存(&amp;S)" 
10                 icon  = "Icons.16x16.SaveIcon"
11                 shortcut = "Control|S"
12                 class = "EtsWorkFlow.Designer.Command.SaveCommand"/>
13    </Condition>
14

配置的关键字为:Condition ,它含两个属性(name 和action),name 的名称对应 runtime中定义的ConditionEvaluator的name,它和程序中从IConditionEvaluator接口继承的状态控制类形成对应关系

1    public class ActiveViewContentConditionEvaluator : IConditionEvaluator
2    {
3        public bool IsValid(object caller, Condition condition)
4        {
5            return WorkSingleton.ActiveView != null;
6        }
7    }
8

IConditionEvaluator接口非常简单,只有一个IsValid方法。

配置文件中的条件在“IsValid”返回false时执行,执行结果由来action决定。

action共有3种状态:

1    public enum ConditionFailedAction {
2        Nothing,
3        Exclude,
4        Disable
5    }
6

Nothing:表示什么都不做

Execlude:表示一笔移除

Disable:表示改变状态为不可用

默认为:Execlude

SharpDevelop插件开发手册的更多相关文章

  1. Discuz! X 插件开发手册

      文件命名规范 Discuz! 按照如下的规范对程序和模板进行命名,请在设计插件时尽量遵循此命名规范: 可以直接通过浏览器访问的普通程序文件,以 .php 后缀命名. 被普通程序文件引用的程序文件, ...

  2. 【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍

    第3章. 基础概念介绍 本章将介绍GStreamer的基本概念. 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念. 3.1. 元件(Elements) 元件 ...

  3. Dynamics CRM 开发模板使用手册(插件开发)

    CRM开发手册 本手册介绍在Visual Studio 2015 + Dynamics CRM Developer Extensions模板开发环境下,插件和JS脚本的开发.部署与调试过程. 手册中提 ...

  4. Sonar Java 规则插件开发 (基于阿里开发手册)

    引言 最近在做Sonar静态代码扫描管理,以此顺手接了Sonar的插件开发,基于阿里开发手册进行开发,在整体开发过程中,其中还是遇到不少坑位,也以此给大家做相应借鉴官网Demo演示插件开发地址:htt ...

  5. sublime text 插件开发

    前言:术语和参考资料 sublime text 2的扩展模式相当的丰富.有多种方法可以修改语法高亮模式以及所有的菜单等.它还可以创建一个新的build系统,自动补全,语言定义,代码片段,宏定义,快捷键 ...

  6. sublime插件开发手记

    原:http://blog.hickwu.com/sublime插件开发手记   标题: sublime插件开发手记 时间: 2014-01-05 14:58:02 正文: 插件基本结构 基本插件实现 ...

  7. MyBean 框架入门手册<感谢[青铜]整理的如此细致和系统>

    MyBean 框架入门手册 2014/9/15 by lighttop 目 录 MyBean 框架学习笔记............................................... ...

  8. MyBatis实现与插件开发

    分析源码之前也需要源码下载并安装到本地仓库和开发工具中,方便给代码添加注释:安装过程和mybatis源码的安装过程是一样的,这里就不再重复描述了:下载地址:https://github.com/myb ...

  9. 方案设计:基于IDEA插件开发和字节码插桩技术,实现研发交付质量自动分析

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 如何保证代码质量? 业务提需求,产品定方案,研发做实现,测试验流程.四种角色的相互配 ...

随机推荐

  1. Angular报错记录

    一 找不到Controller 出现这种错误,一般都是没有找到需要的Controller,需要仔细检查是否所需的Controller已经正确引入

  2. Echarts Jqplot嵌extjs4 windows 装配方法

    js组件绘图终于是画在一个指定id的div或dom元素中. 在项目中有可能须要画在 Extjs容器中,研究了一下,能够通过下面的思路实现,方法跟大家共享下: 1.首先做一个容器,把此内容加入到wind ...

  3. hdu Jungle Roads(最小生成树)

    Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of for ...

  4. cer证书签名验证

    一个cer还需要一个签名的证书本身,这是为了防止cer证书被篡改. 有两种类型的证书: 1. 根证书 2. 由根证书颁发子证书. 特根证书.它是自签名. 而其它子证书的签名公钥都保存在它的上级证书里面 ...

  5. MVC基本概念和流程

    MVC基本概念和流程 MVC的概念 Model(模型):包含数据和行为.不过现在一般都分离开来:Value Object(数据) 和 服务层(行为). View(视图):负责进行模型的展示,一般就是展 ...

  6. hdu What Are You Talking About(map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075 map简单应用 代码: #include <stdio.h> #include &l ...

  7. MVC4

    MVC4 本地正常运行,发布到IIS7->403 - 禁止访问: 访问被拒绝. 摘要: 上周五代码编写完成,计划发布一个版本测试,没想到发布到IIS7 竟然报错“403-禁止访问”.还真第一次遇 ...

  8. .net中用Action等委托向外传递参数

    原文:.net中用Action等委托向外传递参数      一般我们可以使用ref,out达到向外传递参数目的. Action<T>是一个特殊的委托,除了常规应用.我们还可以用它来实现简单 ...

  9. JavaScript实现简单日历

    页面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. Kafka集群在空载情况下Cpu消耗比较高的问题

    线上kafka与storm的空载情况下负载都比较高, kafka达到122%, storm平均负载达到, 20%,  当前是通过Ambari下管理kafka的, a. 先停止s5的kafka进程.b. ...