收藏 分享(赏)

RCP+常见的扩展点指南.doc

上传人:11xg27ws 文档编号:6227809 上传时间:2019-04-03 格式:DOC 页数:35 大小:491.50KB
下载 相关 举报
RCP+常见的扩展点指南.doc_第1页
第1页 / 共35页
RCP+常见的扩展点指南.doc_第2页
第2页 / 共35页
RCP+常见的扩展点指南.doc_第3页
第3页 / 共35页
RCP+常见的扩展点指南.doc_第4页
第4页 / 共35页
RCP+常见的扩展点指南.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

1、 计算机图书网上第一专营店常用插件扩展点在第 17 章对 plugin.xml 作了少量介绍,plugin.xml 是插件和 Eclipse 内核的接口,Eclipse 就像一所大宅子,它的外墙(plugin.xml)有很多的门(扩展点),要熟练进出这座大宅子,先得搞清楚它有哪些门(扩展点)。插件的扩展点非常之多,但很多扩展点都不常用到,只要熟悉一些主要的扩展点即可。本节将面向实际开发需要来介绍这些扩展点,并且本章所有实例都在第 17 章建立的myplugin2 插件项目的基础上创建。18.1 加入透视图(perspectives)开发一个插件,最常用的方式就是新增一个属于本插件专有的透视图,

2、然后在此透视图基础上来展开功能,本书也采用这种方式。18.1.1 准备工作先将以前用到的包括图标的 icons 目录复制一份到 myplugin2 项目中,复制后的路径如图 18.1 所示。图 18.1 图标的路径第 18 章 常用插件扩展点 21718.1.2 修改 plugin.xml 文件,设置透视图的扩展点打开 plugin.xml 文件的编辑框,将如下代码块插入到最后一行的项之前:代码说明: org.eclipse.ui.perspectives 是透视图的扩展点。 name:透视图的名称。 icon:透视图的图标。 class:透视图所对应的类(还没编写,下一步将完成此类)。 id

3、:透视图标识,建议设置成和 class 一样的名称,省得以后扩展点设置得太多,让人糊涂。18.1.3 建立透视图类在 18.1.2 小节的 plugin.xml 中提前设置了透视图对应的类 .chengang.Sample Perspective,这一步就在包 .chengang 中创建此类。透视图类必须实现 Iperspective Factory 接口,此接口只有一种方法 createInitialLayout,先让它空实现。SamplePerspective 类的代码如下:/-文件名:SamplePerspective.java-public class SamplePerspectiv

4、e implements IPerspectiveFactory public void createInitialLayout(IPageLayout layout) 18.1.4 运行插件运行插件,然后在新 Eclipse 环境中选择主菜单“窗口打开透视图其他”选项。在弹出窗口中,可以看到一个名为 myplugin 透视图的项,如图 18.2 所示。选择并打开“myplugin 透视图”选项后,显示如图 18.3 所示的 Eclipse 界面。我们发现该透视图光秃秃的什么也没有。没关系,下面就会向这个透视图中加入两个视图。Eclipse 从入门到精通218图 18.2 选择透视图图 18.

5、3 myplugin 透视图的效果图18.1.5 总结由本节可以看到,在 Eclipse 插件环境中,创建一个菜单、按钮、透视图界面是多么简单,都不用编写实际界面的创建代码,只要设置一些扩展点就行了。18.2 在透视图中加入视图(views)接着 18.1 节的内容,给透视图加入两个视图,实现的步骤如下所述。18.2.1 修改 plugin.xml 文件,设置视图的扩展点打开 plugin.xml 文件的编辑框,将如下代码块插入到最后一行的之前:代码说明: org.eclipse.ui.views 是视图的扩展点。 是视图的分组名及 id 标识,它的效果体现在“显示视图”窗口里,显示视图的打开

6、方法是:在主菜单选择“窗口显示视图其他”选项,图 18.4 中的左图是本例设置的效果。项中的 id 属性要保证它在 Eclipse 的所有插件中惟一。如果和 Ant 插件的 id 相同,原 Ant 组就会被 myplugin2 视图组抹掉了(右图)。如果删除掉不设置,则 Eclipse 会自动新增一个“其他”组,并将两视图加入(中图)。 的 category 是表示本视图属于哪个组,与上面项的 id 值相同。 的 class 是视图所对应的类(还没编写,下一步将完成这两个类)。 的 id 是视图标识,建议设置成和 class 一样的名称。图 18.4 显示视图窗口18.2.2 创建视图类Ecl

7、ipse 从入门到精通220在 18.2.1 小节的 plugin.xml 中提前设置了视图对应的类:.chengang.View1、View2,本小节就来在包 .chengang 中创建这两个视图类。视图的类必须继承抽象类 ViewPart,此类有两种方法 createPartControl、setFocus。我们要在 createPartControl 方法创建两个视图的界面组件,第一个视图创建一个列表,第二个视图创建一个文本框。而 setFocus 是关于视图焦点的方法,一般都不用写,让它空实现。两类的代码如下:/-文件名:View1.java-public class View1 ex

8、tends ViewPart public void createPartControl(Composite parent) Composite topComp = new Composite(parent, SWT.NONE);topComp.setLayout(new FillLayout();List list = new List(topComp, SWT.BORDER);list.add(“中国“);list.add(“美国“);list.add(“法国“);public void setFocus() /-文件名:View2.java-public class View2 exte

9、nds ViewPart public void createPartControl(Composite parent) Composite topComp = new Composite(parent, SWT.NONE);topComp.setLayout(new FillLayout();Text text = new Text(topComp, SWT.BORDER);text.setText(“我是 text 框 “);public void setFocus() 18.2.3 修改透视图类 SamplePerspective在 18.1 节加入一个透视图时,建立了一个透视图类 Sa

10、mplePerspective,当时有一个继承自接口的方法 createInitialLayout,它还是空实现的。本例将通过修改这种方法,将两个视图加入到透视图中。createInitialLayout 方法的代码如下:/参数 IPageLayout 是用于透视图的布局 public void createInitialLayout(IPageLayout layout) /得本透视图的编辑空间标识String editorArea = layout.getEditorArea();/* 将视图 1 加入到透视图的左部第 18 章 常用插件扩展点 221* “left“ 视图区的 id 标识

11、为“left“* IPageLayout.LEFT 在透视图布局中的位置靠左* 0.2f 占用透视图 20%的宽度* editorArea 使用透视图的编辑空间*/IFolderLayout left = layout.createFolder(“left“, IPageLayout.LEFT, 0.2f, editorArea);left.addView(“.chengang.View1“); /参数为 plugin.xml 中视图 1 的 id 标识/将视图 2 加入到透视图的底部IFolderLayout bottom = layout.createFolder(“bottom“, IP

12、ageLayout.BOTTOM, 0.8f, editorArea);bottom.addView(“.chengang.View2“);/* 将 17.2.2 小节第 4 点所定义的 actionset(主菜单、工具栏按钮)加入到本透视图。这个效果要在* plugin.xml 文件的 action 设置中将 visible=“false“才看得出效果,这时打* 开其他透视图,action 设置的主菜单、工具栏按钮将不会出现在界面上,只有打* 开本透视图才会出现,因为本透视图用下面的语句手工加入了此 action* 参数 myplugin2.actionSet 为 action 在 plug

13、in.xml 文件中设置的 id 标识*/layout.addActionSet(“myplugin2.actionSet“);18.2.4 运行插件运行插件后,打开 myplugin 透视图,效果如图 18.5 所示。如果两个视图还没有显示在透视图上,则需要把透视图先关闭,再打开,以应用新的透视图设置。图 18.5 加入两视图后的透视图18.3 在视图之间实现事件监听两个视图中的组件之间的互动,在开发插件时是经常碰到的问题。例如,在 18.2.4 小节的界面中,单击视图 1 列表中的某项时,视图 2 的文本框也作相应显示。本节将实现此Eclipse 从入门到精通222功能。第 18 章 常用

14、插件扩展点 22318.3.1 修改 View1.java、View2.java首先,要在两视图中互动就必须先解决“如何在视图 1 中取得视图 2 的对象”的问题。Eclipse 通过 plugin.xml 来加载插件和插件中的扩展点(如视图),所以可以由视图的 id 标识来取得视图对象,具体语句如下:IWorkbenchPage wbp = getViewSite().getPage();IViewPart view2 = wbp.findView(“.chengang.View2“);得到了视图 2 的对象后,其他一切就都好办了,先给出修改后 View1 如下:public class V

15、iew1 extends ViewPart public void createPartControl(Composite parent) Composite topComp = new Composite(parent, SWT.NONE);topComp.setLayout(new FillLayout();final List list = new List(topComp, SWT.BORDER);list.add(“中国“);list.add(“美国“);list.add(“法国“);/列表选择事件监听list.addSelectionListener(new SelectionLi

16、stener() public void widgetSelected(SelectionEvent e) /由 IWorkbenchPage 取出 view2IWorkbenchPage wbp = getViewSite().getPage();IViewPart view2 = wbp.findView(“.chengang.View2“);/将当前选择的列表项显示在文本框中Text text = (View2) view2).getText();text.setText(list.getSelection()0);public void widgetDefaultSelected(Se

17、lectionEvent e) );public void setFocus() 然后将 View2 的文本框对象改成类的实例变量,并编写它相应的 set/get 方法,代码 如下:public class View2 extends ViewPart private Text text;public void createPartControl(Composite parent) Composite topComp = new Composite(parent, SWT.NONE);topComp.setLayout(new FillLayout();text = new Text(topC

18、omp, SWT.BORDER);text.setText(“我是 text 框 “);Eclipse 从入门到精通224public void setFocus() /文本框 text 相应的 set/get 方法public Text getText() return text;public void setText(Text text) this.text = text;18.3.2 总结(1)在插件中 IWorkbenchPage 对象比较重要,在这里再给出一种获得此对象的方法。当不是在视图里而是在 Action 里要取 IWorkbenchPage 对象时,就可以用下面的方法:Myp

19、lugin2Plugin.getDefault().getWorkbench().getActiveWorkbenchWindow(). getActivePage();(2)IWorkbenchPage.findView(“.chengang.View2“),中的参数为“视图 2”在plugin.xml 中设置的 id 标识,由此可见 plugin.xml 文件在插件中的地位是极其重要的。IWorkbenchPage 除了 findView 方法之外,还有 findEditor 方法是用来得到编辑器的。像“.chengang.View2”这种标识符在系统开发中会经常用到,最好建立一个常量专用

20、类来集中放置这些字符串常量,然后系统中用的时候只用其常量名就行了,否则把标识符的字串分散在代码中,以后改起来会让你痛不欲生。常量类的示意代码如下:public final class StringConstants public final static String VIEW1 = “.chengang.View1“;public final static String VIEW2 = “.chengang.View2“;要用的时候则这样写:findView(StringConstants.VIEW2);18.4 给视图加下拉菜单和按钮本例将给视图加入下拉菜单和按钮,如图 18.6 所示。同

21、时再为列表添加一个右键菜单,这样读者可以用来和视图的下拉菜单进行比较阅读。图 18.6 效果图第 18 章 常用插件扩展点 22518.4.1 创建 ActionGroup 类加入菜单和按钮的方法与 SWT/JFace 组件的一样。先创建一个 ActionGroup 代码如下:/-文件名:MyActionGroup.java-public class MyActionGroup extends ActionGroup /* 加入按钮*/public void fillActionBars(IActionBars actionBars) if (actionBars = null)return;

22、IToolBarManager toolBar = actionBars.getToolBarManager();toolBar.add(new Action1();toolBar.add(new Action2();/* 加入下拉菜单、右键弹出菜单*/public void fillContextMenu(IMenuManager menu) if (menu = null)return;menu.add(new Action1();menu.add(new Action2();private class Action1 extends Action public Action1() Ima

23、geDescriptor imageDesc=WorkbenchImages.getImageDescriptor(IworkbenchGraphic Constants.IMG_ETOOL_HOME_NAV);setHoverImageDescriptor(imageDesc);setText(“Action1“);public void run() private class Action2 extends Action public Action2() ImageDescriptor imageDesc = WorkbenchImages.getImageDescriptor(Iwork

24、bench GraphicConstants.IMG_ETOOL_IMPORT_WIZ);setHoverImageDescriptor(imageDesc);setText(“Action2“);Eclipse 从入门到精通226public void run() 程序说明: 本程序中含有两个 Action 类:Action1、Action2 ,和以往的 Action 不同之处在于它的图像描述符是直接从 Eclipse 环境中取得。既然插件在 Eclipse 环境内运行,那么 Eclipse 环境本身的图标就可以直接拿来使用。 fillContextMenu 方法比起以前的少了几句。在 18

25、.4.2 小节,可以看到它移出到View1 类中去了,主要原因是为了此方法兼顾添加视图的下拉菜单。18.4.2 修改 View1 类在 View1 中增加了三种方法,分别用来加入视图的导航栏按钮、下拉菜单,以及加入列表 List 的右键菜单。代码如下:public class View1 extends ViewPart private List list; /将 List 写成类的实例变量,以扩大它的可访问范围public void createPartControl(Composite parent) Composite topComp = new Composite(parent, SW

26、T.NONE);topComp.setLayout(new FillLayout();list = new List(topComp, SWT.BORDER);list.add(“中国“);list.add(“美国“);list.add(“法国“);/列表选择事件监听(和以前一样,省略)/* 加入导航栏按钮、下拉菜单、右键菜单*/MyActionGroup actionGroup = new MyActionGroup();fillViewAction(actionGroup);/加入视图的导航栏按钮fillViewMenu(actionGroup);/加入视图的下拉菜单fillListMen

27、u(actionGroup);/ 加入视图的下拉菜单/* 加入视图的导航栏按钮*/private void fillViewAction(MyActionGroup actionGroup) IActionBars bars = getViewSite().getActionBars();actionGroup.fillActionBars(bars);/* 加入视图的下拉菜单第 18 章 常用插件扩展点 227*/private void fillViewMenu(MyActionGroup actionGroup) IMenuManager menu = getViewSite().get

28、ActionBars().getMenuManager();actionGroup.fillContextMenu(menu);/* 加入列表 List 的右键菜单*/private void fillListMenu(MyActionGroup actionGroup) MenuManager menu1 = new MenuManager();Menu m = menu1.createContextMenu(list);list.setMenu(m);actionGroup.fillContextMenu(menu1);public void setFocus() 程序说明: 过去写在 A

29、ctionGroup 中的两句移到了 fillListMenu 方法中。 视图加按钮、菜单的方式和以前 SWT/JFace 的方式是一样的。只不过以前用自己生成 MenuManager 对象等,而现在的插件就只需要使用视图已有的 MenuManager 对象。18.5 加入编辑器(editors)本节将给出如下的实例:双击视图 1 中的列表项,将在透视图中加入相应的编辑器。这种效果就像在 Eclipse 中双击 Java 源文件,就会打开该源文件相对应的编辑器一样。效果如图 18.7 所示。图 18.7 编辑器效果图和以前一样,先来修改 plugin.xml 文件将编辑器的扩展点加入,然后再创

30、建相应的编Eclipse 从入门到精通228辑器类,最后编写列表双击的事件代码。18.5.1 修改 plugin.xml 文件,设置三个编辑器的扩展点代码说明:编辑器的扩展点是 org.eclipse.ui.editors,它各项的含义和视图扩展点基本一样,请参照 18.2.1 小节的视图扩展点的说明。这里强调一点:icon 也是必填项。18.5.2 创建三个编辑器类在 18.5.1 小节的 plugin.xml 中,提前设置了编辑器对应的类.chengang.ChinaEditor 和 UsaEditor、FranceEditor,本小节就来在包 .chengang中创建这三个编辑器类。编辑

31、器必须实现 IEditorPart 接口,但通常是继承抽象类 EditorPart 类(EditorPart 是IEditorPart 的子类)。如果继承 EditorPart 则必须实现该抽象类的七种方法,在此先实现方法 init、 createPartControl。本例只给出了 ChinaEditor 的代码, UsaEditor、FranceEditor 与之完全类似,ChinaEditor 的代码如下:/- 文件名:ChinaEditor.java -public class ChinaEditor extends EditorPart /*第 18 章 常用插件扩展点 229* E

32、ditor 的初始化方法。本方法前两句是固定不变的*/public void init(IEditorSite site, IEditorInput input) throws PartInitException System.out.println(“init“);setSite(site);setInput(input);/设置 Editor 标题栏的显示名称。不要,则名称用 plugin.xml 中的 name 属性/setPartName(input.getName();/设置 Editor 标题栏的图标。不要,则会自动使用一个默认的图标/setTitleImage(input.get

33、ImageDescriptor().createImage();/* 在此方法中创建 Editor 中的界面组件*/public void createPartControl(Composite parent) System.out.println(“createPartControl“);Composite topComp = new Composite(parent, SWT.NONE);topComp.setLayout(new FillLayout();Text text = new Text(topComp, SWT.BORDER);text.setText(“中国之编辑器 “);/

34、此五个抽象类的方法下面将讲解,现在让它空实现public void doSave(IProgressMonitor monitor) public boolean isSaveAsAllowed() return false;public void doSaveAs() public boolean isDirty() return false;public void setFocus() 18.5.3 创建 IEditorInput获取视图对象是用 IWorkbenchPage 的 findView 方法,方法参数是视图在 plugin.xml中的 id 标识。获取编辑器对象是用 findE

35、ditor 方法,但该方法的参数却不是 id 标识的字符串,而是一个 IEditorInput 对象。另外,加载一个编辑器是用 IWorkbenchPage 的openEditor (editorInput, editorID)方法。由 上 可 知 , 编 辑 器 都 会 要 对 应 一 个 IEditorInput 和 一 个 EditorPart, 而 且 在IWorkbenchPage 中是根据 IEditorInput 来取得 EditorPart,如图 18.8 所示。 编 辑 器 IEditorInput EditorPart 图 18.8 编辑器的组成Eclipse 从入门到精通

36、230在本小节将要创建三个 Editor 相对应的 IEditorInput。在这里只给出了 ChinaEditor 对应的 IEditorInput,其他两个与之类似,请读者查阅配书光盘的代码。/- 文件名:ChinaEditorInput.java -public class ChinaEditorInput implements IEditorInput /* 返回 true,则打开该编辑器后它会出现在 Eclipse 主菜单“文件”* 最下部的最近打开的文档栏中。返回 false 则不出现在其中*/public boolean exists() return true;/* 编辑器标题

37、栏的图标,不过它还需要在 ChinaEditor 中用* setTitleImage 方法设置,才能出现在标题栏中*/public ImageDescriptor getImageDescriptor() return WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_ ETOOL_HOME_NAV);/* 编辑器标题栏的显示名称,和上面的 getImageDescriptor* 一样也要在 ChinaEditor 中用 setPartName 方法设置,才能出现在标题栏中*/public String getN

38、ame() return “中国的编辑器“;/* 编辑器标题栏的小黄条提示文字,不需像 getName 那样在 ChinaEditor 中再设置*/public String getToolTipText() return “这是视图 1 列表中的中国项对应的编辑器“;/* 返回一个可以用做保存本编辑输入数据状态的对象,本例让它空实现*/public IPersistableElement getPersistable() return null;/* 得到一个编辑器的适配器,本例让它空实现第 18 章 常用插件扩展点 231* IAdaptable a = new ChinaEditorIn

39、put();* IFoo x = (IFoo)a.getAdapter(IFoo.class);* if (x != null)* 用 x 来做 IFoo 的事情*/public Object getAdapter(Class adapter) return null;18.5.4 打开编辑器有了 EditorPart 和 IEditorInput 后,就可以在 Eclipse 中打开编辑器了。本例是要实现双击视图 1 的列表,则会打开列表项相对应的编辑器,因此在 View1 类的 List 对象添加一个鼠标双击事件监听器。另外还要考虑到,如果已经打开了列表项对应的编辑器,则下次再双击时就不再

40、打开该项的编辑器,而是将其设成当前选择的编辑器。查找编辑器的方法是:IEditorPart editor = IWorkbenchPage.findEditor(IEditorInput);打开编辑器的方法是:IWorkbenchPage.openEditor(IEditorInput, editorID);所有代码如下:list.addMouseListener(new MouseAdapter() ChinaEditorInput chinaEditorInput = new ChinaEditorInput();UsaEditorInput usaEditorInput = new Us

41、aEditorInput();FranceEditorInput franceEditorInput = new FranceEditorInput();public void mouseDoubleClick(MouseEvent e) /* 根据列表不同项得到其相应的 editorInput 和 editorID,其中* editorID 指该编辑器在 plugin.xml 文件中设置 id 标识值*/List list = (List) e.getSource();/由 MouseEvent 得到列表对象String listStr = list.getSelection()0;/得到列

42、表当前项字符IEditorInput editorInput = null;String editorID = null;if (listStr.equals(“中国“) editorInput = chinaEditorInput;editorID = “.chengang.ChinaEditor“; else if (listStr.equals(“美国“) editorInput = usaEditorInput;editorID = “.chengang.UsaEditor“; else if (listStr.equals(“法国“) editorInput = franceEdit

43、orInput;editorID = “.chengang.FranceEditor“;Eclipse 从入门到精通232/如果 editorInput 或 editorID 为空则中断返回if (editorInput = null | editorID = null)return;/取得 IWorkbenchPage,并搜索使用 editorInput 对象对应的编辑器IWorkbenchPage workbenchPage = getViewSite().getPage();IEditorPart editor = workbenchPage.findEditor(editorInput

44、);/* 如果此编辑器已经存在,则将它设为当前的编辑器(最顶端),否则* 重新打开一个编辑器*/if (editor != null) workbenchPage.bringToTop(editor); else try workbenchPage.openEditor(editorInput, editorID); catch (PartInitException e2) e2.printStackTrace(););程序说明:在本程序中为了便于理解,使用了 ifelse 这种简单的方式来判断双击的列表项,这适合列表项较少的情况,如果列表项太多了,则代码就会相当长。解决这个问题,可将各IEd

45、itorInput 对象与列表 List 的项对应起来,并将 eidtorID 写到各 IEditorInput 类中。这样就可以用下面的方式来得到 IEditorInput 和 eidtorID 了。String key = “ + list.getSelectionIndex(); IEditorInput editorInput = (IEditorInput) list.getData(key);String eidtorID = editorInput.getEditorID();18.5.5 总结在实际开发中很多界面都是创建在编辑器上,虽然在这里只讲了最常用的编辑器使用方法,但以足

46、够应付大部分开发的需要。如果你想了解更多关于编辑器的信息,可以查阅编辑器的帮助文档,它在帮助中的位置是“平台插件开发者指南程序员指南编辑器”。18.6 编辑器类(EditorPart )方法使用说明在 18.5 节将 ChinaEditor 类继承 EditorPart 抽象类时,只实现了两种方法:第 18 章 常用插件扩展点 233init、 createPartControl,本节将通过“EditorPart 方法的执行情况”、“各方法的作用及含义”、“一个实例”来逐步讲解其他的五种方法。Eclipse 从入门到精通23418.6.1 EditorPart 方法的执行情况要使用好 Edit

47、orPart,首先得了解其方法在各种情况下的执行流程,我们在类的每一种方法前加上 System.out.println(“ 方法名:*“ ),运行后就可以得到如下的结果。(1)双击列表项打开编辑器时:init isDirtycreatePartControl isDirty isDirtyisDirtyisDirtyisDirty setFocusisDirtyisSaveAsAllowed。(2)关闭编辑器时:setFocusisDirtyisSaveAsAllowedisDirtyisSaveAsAllowedsetFocusisDirty,如果保存编辑器,则最后还会执行 doSave 方

48、法。(3)单击编辑器标题时:setFocus。(4)编辑器失去焦点时:isDirty isSaveAsAllowedisDirtyisSaveAsAllowed。(5)编 辑 器 得 到 焦 点 时 : setFocus isDirty isSaveAsAllowed isDirty isSaveAs Allowed。(6)当编辑器可以保存,并在主菜单“文件保存”选项或按 Ctrl+S 键时:isDirtydoSave 。18.6.2 各方法的作用及含义1boolean isDirty()由此方法获知编辑器是否脏了(所谓“脏”是指编辑器中的值已经发生了改变),true 表示脏。当其返回 true 时,会出现两个效果:编辑器的标题前出现一个“*”号,主菜单“文件”下的“保存”

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报