SharpDevelop学习笔记—插件开发手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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⽂件,这是插件配置⽂件,很重要,内容如下:
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,内容如下:
还有不要忘记把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
第三章配置⽂件
⼀、菜单配置
2)label:是菜单的标题,它即可以从资源⽂件中读取,也可以直接进⾏设置,如果要设置热键,格式如下:(&字母)
3)icon:表⽰,菜单的图标,该图标在resource格式的⽂件中定义
4)shortcut:设置快捷键
5)link:这⾥就是当前菜单项要链接的⽹址,也可以链接外部⽂件,⽰例如下:link = "home://doc/ReadMe.rtf",表⽰主程序上级的doc⽬录下的ReadMe.rtf⽂件。
6)class:表⽰该菜单对应的命令。
7)insertafter:表⽰插在哪个菜单项之后
如果要建⽴⼦菜单只需要添加MenuItem⼦节点即可,格式如下:
⼆、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="mand.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 = "mand.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:表⽰改变状态为不可⽤。