本例将给视图加入下拉菜单和按钮,同时再为列表添加一个右键菜单.

创建ActionGroup类

加入菜单和按钮的方法与SWT和JFace组件的一样,先创建一个ActionGroup代码如下:

MyActionGroup.java

 public class MyActionGroup extends ActionGroup {
// 加入按钮
public void fillActionBars(IActionBars actionBars) {
if (actionBars == null)
return;
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() {
ImageDescriptor imageDesc = WorkbenchImages
.getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_NEW_PAGE);
//.getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_HOME_NAV);
//这个地放原码是想在在View1上显示一个"小房子"的图标.但是我参看IWorkbenchGraphicConstants的源码
//没有IMG_ETOOL_HOME_NAV这个常量字段.导入Eclipse也报错,我就 换了一个.
setHoverImageDescriptor(imageDesc);
setText("Action1");
} public void run() {
}
} private class Action2 extends Action {
public Action2() {
ImageDescriptor imageDesc = WorkbenchImages
.getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_IMPORT_WIZ);
setHoverImageDescriptor(imageDesc);
setText("Action2");
} public void run() {
new LanguageDialog(null).open();
}
}
}

程序说明:

1.本程序中含有两个Action类:Action1,Action2,和以往的Action不同之处在于它的图像描述符是直接从Eclipse环境中取得.既然插件在Eclipse环境内运行,那么Eclipse本身的图标就可以直接拿来使用,不过Eclipse会给出 一个警告:"建议不要访问:由于对必须的库...jar 具有一定的限制,一次不能访问类型WorkbenchImages",这是因为该类internal包中,也就是说它仅局限于内部使用.

2.fillContextMenu方法比起以前单纯的SWT编程少了几句.在后边的总结在红中可以看到它移动到View1类中去了,主要原因是为了此方法兼顾添加视图的下拉菜单.

修改View1类

在Viwe1中增加了3中方法,分别用来加入视图的导航栏按钮,下拉菜单,以及加入表List的右键菜单.代码如下:

(下面的这个View1.java中也加入了编辑器对应的事件.双击视图1的列表项,则打开对应的编辑器,因此在View1类的List对象添加一个鼠标双击视图1的列表项,则打开对应的编辑器,一次在View1类的List对象添加一个鼠标双击事件监听器.另外还要考虑到,如果已经打开了列表项对应的编辑器,则下次再双击时就不应再打开该项的编辑器,而是将其设成当前编辑器.)

得到编辑器对象:IEditorPart editor = IWorkbenchPage.findEditor(IEditorInput);

打开编辑器对象:IWorkbenchpage.openEditor(IEditorInput.editorID);

View1.java

public class View1 extends ViewPart {
private List list; // 将列表写成类的实例变量,以扩大它的可访问范围
//注意这个List并不是java.util包下的.而是org.eclipse.swt.widgets.List;包下的.
public void createPartControl(Composite parent) {
IWorkbenchHelpSystem help = PlatformUI.getWorkbench().getHelpSystem();
help.setHelp(parent, "cn.com.kxh.myplugin.buttonHelpId");
Composite topComp = new Composite(parent, SWT.NONE);
topComp.setLayout(new FillLayout());
list = new List(topComp, SWT.BORDER);
list.add("中国");
list.add("美国");
list.add("法国");
// 列表选择事件监听
list.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// 由IWorkbenchPage获得view2对象
IWorkbenchPage wbp = getViewSite().getPage();
//在插件中IWorkbenchPage对象比较重要,这里再给出一种获得此对象的通用的方法.
// Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewPart view2 = wbp.findView("cn.com.kxh.myplugin.View2");
//这个地方的参数是"视图2"在plugin.xml中的id标识.由此可见plugin.xml文件在插件中的地位是极其重要的.
// 将当前选择的列表项显示在文本框中
Text text = ((View2) view2).getText();
text.setText(list.getSelection()[0]);
}
});
// 列表选择事件监听
list.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// 由IWorkbenchPage获得view2对象
IWorkbenchPage wbp = getViewSite().getPage();// Activator.getDefault().getWorkbench().getActiveWorkbenchWindow(). getActivePage();
IViewPart view2 = wbp.findView("cn.com.kxh.myplugin.View2");
// 将当前选择的列表项显示在文本框中
Text text = ((View2) view2).getText();
text.setText(list.getSelection()[0]);
}
});
list.addMouseListener(new MouseAdapter() {
private ChinaEditorInput chinaEditorInput = new ChinaEditorInput();
private UsaEditorInput usaEditorInput = new UsaEditorInput();
private 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];// 得到当前列表项的字符
IEditorInput editorInput = null;
String editorID = null;
if (listStr.equals("中国")) {
editorInput = chinaEditorInput;
editorID = "cn.com.kxh.myplugin.ChinaEditor";
} else if (listStr.equals("美国")) {
editorInput = usaEditorInput;
editorID = "cn.com.kxh.myplugin.UsaEditor";
} else if (listStr.equals("法国")) {
editorInput = franceEditorInput;
editorID = "cn.com.kxh.myplugin.FranceEditor";
}
// 如果editorInput或editorID为空则中断返回
if (editorInput == null || editorID == null)
return;
// 取得IWorkbenchPage,并搜索使用editorInput对象对应的编辑器
IWorkbenchPage workbenchPage = getViewSite().getPage();
IEditorPart editor = workbenchPage.findEditor(editorInput);
// 如果此编辑器已经存在,则将它设为当前的编辑器(最顶端),否则
// 重新打开一个编辑器
if (editor != null) {
workbenchPage.bringToTop(editor);
} else {
try {
workbenchPage.openEditor(editorInput, editorID);
} catch (PartInitException e2) {
e2.printStackTrace();
}
}
}
}); // 加入导航栏按钮、下拉菜单、右键菜单
MyActionGroup actionGroup = new MyActionGroup();
fillViewAction(actionGroup);// 加入视图的导航栏按钮
fillViewMenu(actionGroup);// 加入视图的下拉菜单
fillListMenu(actionGroup);// 加入视图的下拉菜单
} // 加入视图的导航栏按钮
private void fillViewAction(MyActionGroup actionGroup) {
IActionBars bars = getViewSite().getActionBars();
actionGroup.fillActionBars(bars);
} // 加入视图的下拉菜单
private void fillViewMenu(MyActionGroup actionGroup) {
IMenuManager manager = getViewSite().getActionBars().getMenuManager();
actionGroup.fillContextMenu(manager);
} // 加入列表List的右键菜单
private void fillListMenu(MyActionGroup actionGroup) {
MenuManager manger = new MenuManager();
Menu menu = manger.createContextMenu(list);
list.setMenu(menu);
actionGroup.fillContextMenu(manger);
} @Override
public void setFocus() {}
}

程序说明:视图加按钮,菜单的方式和以前SWT的方式是一样的,只不过以前自己生成MenuManager等对象,而现在只需要使用插件平台提供的MenuManager对象.

在事件处理方法:本程序中为了便于理解,使用了if...else这种简单的方式来判断被双击的类表项,这适合列表项较少的情况,如果列表项太多,则代码会相当长.解决这个问题,可将IEditorInput中没有用到的getName方法借用一下,把editorID放到此方法里面,这样就可以用下面的方式来得到IEditorInput和editorID了.

String key = ""+list.getSelectionIndex();

IEditorInput editorInput = (IEditorInput)list.getData(key);

String editorID = editorInput.getnName();

在实际开发综合很多界面都是创建在编辑器上,虽然在这里是只讲了最常用的编辑器使用方法,但已经足够应付大部分开发的需要,如果你想了解更多关于编辑器的信息,可以查阅编辑器的帮助文档,它在帮助中的位置是"平台插件开发者指南--->程序员指南----->编辑器".

将在透视图中添加上对应的编辑器类:(这种效果就像在Eclipse张双击Java源文件,打开文件的编辑器一样)

和以前一样,先来修改plugin.xml文件将编辑器的扩展点加入,然后再创建相应的编辑器类.最后编写列表的事件代码.

plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension point="org.eclipse.ui.perspectives">
<perspective
name="myplugin 透视图"
icon="icons/selectall.gif"
class="cn.com.kxh.myplugin.SamplePerspective"
id="cn.com.kxh.myplugin.SamplePerspective">
</perspective>
</extension>
<extension point="org.eclipse.ui.views">
<view
name="视图1"
icon="icons/prev.gif"
category="com.glkxh.myplugin.view"
class="cn.com.kxh.myplugin.View1"
id="cn.com.kxh.myplugin.View1">
</view>
<view
name="视图2"
icon="icons/project.gif"
category="com.glkxh.myplugin.view"
class="cn.com.kxh.myplugin.View2"
id="cn.com.kxh.myplugin.View2">
</view>
</extension>
<extension point="org.eclipse.ui.editors">
<editor
name="中国Editor"
icon="icons/project.gif"
class="cn.com.kxh.myplugin.ChinaEditor"
id="cn.com.kxh.myplugin.ChinaEditor">
</editor>
<editor
name="美国Editor"
icon="icons/prev.gif"
class="cn.com.kxh.myplugin.UsaEditor"
id="cn.com.kxh.myplugin.UsaEditor">
</editor>
<editor
name="法国Editor"
icon="icons/remove.gif"
class="cn.com.kxh.myplugin.FranceEditor"
id="cn.com.kxh.myplugin.FranceEditor">
</editor>
</extension>
</plugin>

上述代码说明:编辑器的扩展点是org.eclipse.ui.editors,它各项的含义和视图扩展点基本一样,可参照视图扩展点的说明,这里强调一点:icon是必填项.

编辑器必须实现IEditorPart接口,但通常是继承抽象类EditorPart类(EditorPart是IEditorPart的子类).继承EditorPart的子类必须实现父类的7个方法,在此先实现方法init,createPartControl,其他方法空实现.

代码说明:编辑器的扩展点是org.eclispse.ui.editor

ChinaEditor.java

 public class ChinaEditor extends EditorPart {
private boolean dirty = true; // 编辑器是否为脏的标识 // Editor的初始化方法。本方法前两句是固定不变的
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.getImageDescriptor().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("中国之编辑器"); text.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
// 如果编辑器不脏(即没有修改),则标志它脏并刷新界面状态
if (!isDirty()) {
setDirty(true);
firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
});
} // 保存的处理代码在这种方法中,当按Ctrl+S键时会执行此方法。
// 最后别忘记标志为非脏及刷新界面状态
public void doSave(IProgressMonitor monitor) {
if (isDirty()) {
// ……保存编辑器事件处理代码(省略)
setDirty(false);
firePropertyChange(IEditorPart.PROP_DIRTY);
}
} // 是否允许“另存为”,false不允许
public boolean isSaveAsAllowed() {
return false;
} // “另存为”的代码写在这里,本例不实现它
public void doSaveAs() {} // dirty标识的set方法,由此方法设置编辑器为脏
public void setDirty(boolean dirty) {
this.dirty = dirty;
} // 编辑器的内容是否脏了。true脏,false不脏
public boolean isDirty() {
return dirty;
} // 当编辑器获得焦点时会执行此方法,本例空实现
public void setFocus() {}
}

获取视图对象是用IWorkbenchPage的findView方法,方法参数是视图在plugin.xml中的id标识,获取编辑器对象是用findEditor方法,但该方法的参数却不是id标识,而是一个IEditorInput对象.另外,加载一个编辑器是用IWorkbenchPage的openEditor(editorInput,editorID)方法.

由上可知,一个编辑器要对应一个IEditorInput和EditorPart,而且在IWorkbenchPage中是根据IEditorInput来取得EditorPart.

附上关系图:

ChinaEditorInput.java

 public class ChinaEditorInput implements IEditorInput {

     // 返回true,则打开该编辑器后它会出现在Eclipse主菜单“文件”
// 最下部的最近打开的文档栏中。返回flase则不出现在其中。
@Override
public boolean exists() {
return true;
} // 编辑器标题栏的图标,不过它还需要在ChinaEditor中用
// setTitleImage方法设置,才能出现在标题栏中。
@Override
public ImageDescriptor getImageDescriptor() {
// return WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_HOME_NAV);
return null;
} // 编辑器标题栏的显示名称,和上面的getImageDescriptor一样也要
// 在ChinaEditor中用setPartName方法设置,才能出现在标题栏中。
@Override
public String getName() {
return "中国的编辑器";
} // 编辑器标题栏的小黄条提示文字,不需象getName那样在ChinaEditor中再设置
@Override
public String getToolTipText() {
return "这是视图1列表中的中国项对应的编辑器";
} // 返回一个可以用做保存本编辑输入数据状态的对象
@Override
public IPersistableElement getPersistable() {
return null;
} // 得到一个编辑器的适配器
// IAdaptable a = new ChinaEditorInput();
// IFoo x = (IFoo)a.getAdapter(IFoo.class);
// if (x != null) [用x来做IFoo的事情....]
@Override
public Object getAdapter(Class adapter) {
return null;
}
}

FranceEditor.java

 public class FranceEditor extends EditorPart {

     public void doSave(IProgressMonitor monitor) {}

     public void doSaveAs() {}

     public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
} public boolean isDirty() {
return false;
} public boolean isSaveAsAllowed() {
return false;
} 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("法国之编辑器");
} public void setFocus() {} }

FranceEditorInput.java

 public class FranceEditorInput implements IEditorInput {

     public boolean exists() {
return false;
} public ImageDescriptor getImageDescriptor() {
return null;
} public String getName() {
return "法国的编辑器";
} public IPersistableElement getPersistable() {
return null;
} public String getToolTipText() {
return "这是视图1列表中的法国项对应的编辑器";
} public Object getAdapter(Class adapter) {
return null;
} }

UsaEditor.java

public class UsaEditor extends EditorPart {

    public void doSave(IProgressMonitor monitor) {}

    public void doSaveAs() {}

    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
} public boolean isDirty() {
return false;
} public boolean isSaveAsAllowed() {
return false;
} 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("美国之编辑器");
} public void setFocus() {} }

UsaEditorInput.java

 public class UsaEditorInput implements IEditorInput {

     public boolean exists() {
return false;
} public ImageDescriptor getImageDescriptor() {
return null;
} public String getName() {
return "美国的编辑器";
} public IPersistableElement getPersistable() {
return null;
} public String getToolTipText() {
return "这是视图1列表中的美国项对应的编辑器";
} public Object getAdapter(Class adapter) {
return null;
} }

关于Eclipse插件开发(四)-------给视图加下拉菜单和按钮和加入编辑器.的更多相关文章

  1. Bootstrap页面布局15 - BS带下拉菜单的按钮

    带下拉菜单的按钮 <div class='btn-toolbar'> <div class='btn-group'> <a href='javascript:;' cla ...

  2. 第二百四十四节,Bootstrap下拉菜单和滚动监听插件

    Bootstrap下拉菜单和滚动监听插件 学习要点: 1.下拉菜单 2.滚动监听 本节课我们主要学习一下 Bootstrap 中的下拉菜单插件,这个插件在以组件的形式我们 已经学习过,那么现在来看看怎 ...

  3. 8.bootstrap下拉菜单、按钮组、按钮式下拉菜单

    下拉菜单 dropdown 对齐方式: .dropdown-menu-right     .dropdown-menu-left <div class="container" ...

  4. Bootstrap 字体图标、下拉菜单、按钮组

    Bootstrap 字体图标(Glyphicons) 需要引入fonts文件夹中的文件,而且该文件夹必须命名为fonts,然后引进css文件,jQuery文件,以及bootstrap的js文件. 用法 ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:内嵌下拉菜单的按钮组

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. AngularJS进阶(四)ANGULAR.JS实现下拉菜单单选

    ANGULAR.JS: NG-SELECT AND NG-OPTIONS PS:其实看英文文档比看中文文档更容易理解,前提是你的英语基础还可以.英文文档对于知识点讲述简明扼要,通俗易懂,而有些中文文档 ...

  7. Bootstrap3.0学习第十轮(下拉菜单、按钮组、按钮式下拉菜单)

    详情请查看http://aehyok.com/Blog/Detail/16.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  8. Bootstrap框架(基础篇)之按钮,网格,导航栏,下拉菜单

    一,按钮 注意:虽然在Bootstrap框架中使用任何标签元素都可以实现按钮风格,但个人并不建议这样使用,为了避免浏览器兼容性问题,个人强烈建议使用button或a标签来制作按钮. 框架中提供了基础按 ...

  9. Bootstrap 下拉菜单和滚动监听插件

    一.下拉菜单 常规使用中,和组件方法一样,代码如下: //声明式用法 <div class="dropdown"> <button class="btn ...

随机推荐

  1. 仿酷狗音乐播放器开发日志三——修复CEditUI的bug2

    无意中发现了CEditUI控件的另一个bug,当我给播放器的搜索栏获取焦点时,这时再改变窗体大小,原本搜索栏应该对应着也改变大小,却发现CEditUI内嵌的edit控件没有跟着改变(如下图),跟着调试 ...

  2. Msp430概述

    总结一下MSP430给我的印象吧,感觉他就是一个迷你型的arm 1:MSP430采用的是精简指令,他只有27条核心的汇编指令,这一点和arm相同,arm同样是采用精简指令,而80c51采用的是冗余指令 ...

  3. 设计模式_Flyweight_享元模式

    形象例子: 每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了.共享的句子就是Flywe ...

  4. Jquery Ajax 异步设置Table中某列的值

    可根据table中某列中的ID去改变某列的值! 只是参考,实际应用中不能这样做的,如果有很多行,频繁访问服务器,服务器是顶不住的! JS: $(document).ready(function () ...

  5. flappy pig小游戏源码分析(4)——核心pig模块(未完待续)

    热身之后,我们要动点真格的了,游戏叫flappy pig,我们的pig终于要出场了. 老规矩,看看目录结构,读者对着目录结构好好回想我们已经讲解的几个模块: 其中game.js是游戏主程序,optio ...

  6. HW5.33

    import java.util.Calendar; public class Solution { public static void main(String[] args) { long tot ...

  7. Linux 命令、Shell 杂货铺

    我看过一篇博客,是有关随手记录一些常用的命令的.感觉对自己比较有价值,不过其他人读起来就比较费劲了,毕竟没有什么主线.各取所需吧各位~ 1.CentOS 查看和修改系统时间和时区 date #查看系统 ...

  8. Linux下用hostapd架无线AP

    Published by 荒野无灯 on 2011-10-08 00:56:02 under 服务器/MySQL Tags: 路由,无线AP,hostapd 34452 views 本文将介绍在lin ...

  9. android模拟器访问localhost或127.0.0.1报错

    在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正 ...

  10. C/C++中的变量作用域

    #include <iostream> using namespace std; int i = 1;int j = 2; int main(){     int i = 9;  //C/ ...