SharpDevelop插件开发手册部分内容摘取自:http://www.cnblogs.com/CBuilder的SharpDevelop开发教程
SharpDevelop插件开发手册
第一章 Pad
Pad(面板)就是插件框架中的停靠窗口。有这些特点:Pad不能关闭,但可以隐藏或显示。每种类型的Pad只能打开一个,不能在运行时添加,标题唯一。可以显示图标,由插件框架中的布局管理器负责管理。通常不显示文件内容,而是辅助用户完成任务。
下面进入我们的实战流程,先新建一个类库型的项目,命名为CSPadDemoPlug,把Class1.cs改名为Main.cs,修改为如下内容:
using System; 2
using System.Drawing; 3
using System.Windows.Forms; 4
5
using ICSharpCode.SharpDevelop.Gui; 6
7
namespace 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文件,这是插件配置文件,很重要,内容如下:
<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,修改为如下内容:
using System;2
using ICSharpCode.Core.AddIns;3
using ICSharpCode.Core.AddIns.Codons;4
5
using ICSharpCode.SharpDevelop.Gui;6
7
namespace SDViewDemoPlug8
{9
public class ShowViewCommand : AbstractMenuCommand10
{11
public override void Run()12
{ 13
WorkbenchSingleton.Workbench.ShowView(new SDViewContent());14
}15
}16
}17

添加一个新类,SDViewContent,文件名为SDViewContent.cs,修改内容如下:
using System;2
using System.Drawing;3
using System.Windows.Forms;4
using ICSharpCode.SharpDevelop.Gui;5

6
namespace SDViewDemoPlug7
{8
public class SDViewContent : AbstractViewContent9
{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,内容如下:
<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函数更改为:
foreach (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事件来进行控制,示例如下:
namespace EtsWorkFlow.Designer.ViewContent2
{3
public class WorkFlowEditorView : AbstractViewContent4
{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 IsDirty19
{20
get21
{22
return true;23
}24
} 25
public override bool IsDirty26
{27
get28
{29
return true;30
}31
}32

33
public override IWorkbenchWindow WorkbenchWindow 34
{35
get36
{37
return _workbenchWindow;38
}39
set40
{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

第三章 配置文件
一、菜单配置
<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(&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子节点即可,格式如下:
<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" 由代码购建的菜单,如文件历史列表
三、状态控制
插件框架中生成的工具栏按钮和菜单项都可以通过配置文件来进行控制。
示例如下:
<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 = "保存(&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接口继承的状态控制类形成对应关系
public class ActiveViewContentConditionEvaluator : IConditionEvaluator2
{3
public bool IsValid(object caller, Condition condition)4
{5
return WorkSingleton.ActiveView != null;6
}7
}8

IConditionEvaluator接口非常简单,只有一个IsValid方法。
配置文件中的条件在“IsValid”返回false时执行,执行结果由来action决定。
action共有3种状态:
public enum ConditionFailedAction {2
Nothing,3
Exclude,4
Disable5
}6

Nothing:表示什么都不做
Execlude:表示一笔移除
Disable:表示改变状态为不可用
默认为:Execlude