一、文件创建
File-->Plug-in Project ,写入文件名(文件名这里是test,图中写错了)-->next,勾选Generate和This plug-in,选择yes-->next,选择Hello RCP这个文件夹,finish。
二、文件介绍
项目结构
- Activator.java:插件激活类,用于控制插件的生命周期
- SampleAction.java:操作类,为工作台菜单栏或工具栏相关联的操作提供了生命周期事件
- MANIFEST.MF:提供关于插件要求的额外信息。
- plugin.xml:定义插件如何与系统中的所有插件相关联。
- build.properties:由构建来进行配置。
- Application.java:控制项目的启动和停止
- ApplicationActionBarAdvisor.java:为菜单条添加事件
- ApplicationWorkbenchAdvisor.java:
- ApplicationWorkbenchWindowAdvisor.java:设置窗口的一些配置
- Perspective.java:为plugin.xml中的插件添加事件
三、扩展一个操作
创建一个Action有两种方式,一是在plugin.xml中搜索ActionSet创建一个Action,第二种就是编程(ActionBarAdvisor.java)
这里主要介绍第二种方式
(1)、创建一个自己的Myaction.java类继承Action
public class Myactionextends Action{
private IWorkbenchWindow window;
public Myaction(IWorkbenchWindow window){
this.window=window;
this.setText("&Navigtor@Ctrl+Alt+N");//添加快捷方式及显示内容
setToolTipText("open view");//工具提示框
ImageDescriptor imag=WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_LCL_PIN_VIEW);//添加一张图片
this.setImageDescriptor(imag);
}
public void run(){
MessageDialog.openInformation(window.getShell(), "Message", "Hello");//运行显示
}
}
(2)、在ApplicationActionBarAdvisor.java中添加自定义菜单项和已有菜单项
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private Myactionaction;//自定义的action事件
private IWorkbenchAction exit;//自带的action事件
private IWorkbenchAction about;
private IWorkbenchAction newWin;
private IWorkbenchAction save;
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
action=new Myaction(window);//在窗体下初始化自定义的action
exit=ActionFactory.QUIT.create(window);
register(exit);
about=ActionFactory.ABOUT.create(window);
register(about);
newWin=ActionFactory.OPEN_NEW_WINDOW.create(window);
register(newWin);
save=ActionFactory.SAVE.create(window);
register(save);
}
//为菜单栏添加功能
protected void fillMenuBar(IMenuManager menuBar) {
MenuManager winmenu=new MenuManager("File");
winmenu.add(exit);
winmenu.add(about);
winmenu.add(newWin);
winmenu.add(save);
menuBar.add(winmenu);
MenuManager windowmenu=new MenuManager("Open");
windowmenu.add(action);//将action添加到菜单按钮事件
menuBar.add(windowmenu);//将该按钮添加到菜单条中
}
}
ApplicationWorkbenchWindowAdvisor.java设置窗口配置
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));
configurer.setShowCoolBar(true);
configurer.setShowStatusLine(true);
configurer.setTitle("Hello RCP"); //$NON-NLS-1$
configurer.setShowMenuBar(true);
configurer.setShowFastViewBars(true);
configurer.setShowPerspectiveBar(true);
configurer.setShowFastViewBars(true);
}
点击整个项目右键,选择run as Eclipse Application运行项目,效果如下:
四、添加透视图
在plugin.xml中选择Extensions,选择Add,然后在选项中选择org.eclipse.ui.views,右击“new”,选择“view”,填写id(为该组件的唯一标识),class为view多对应的操作。在该类中添加了一个树形目录,并且可以右击。
view.java
public class view1 extends ViewPart{
private TreeViewer tv;//添加一个树
private DrillDownAdapter drillDownAdapter;
public view1() {
// TODO Auto-generated constructor stub
}
public void createPartControl(Composite parent){
tv=new TreeViewer(parent,SWT.MULTI|SWT.H_SCROLL|SWT.V_SCROLL);
tv.setContentProvider(new TreeViewerContentProvider());//设置内容提供器
tv.setLabelProvider(new TreeViewLabelProvider());//设置标签提供器
tv.setInput(EntityFactory.TreeEntityElement());//读入数据
fillViewToolBarAction();//添加视图工具栏按钮
fillViewToolBarContextMenu();//下拉菜单
fillTreeViewContextMenu();//为查看器添加上下文菜单
}
public void setFocus(){
}
//自定义方法,添加工具栏按钮
private void fillViewToolBarAction(){
IActionBars bars=getViewSite().getActionBars();
//定义工具栏
IToolBarManager toolBar=bars.getToolBarManager();
drillDownAdapter=new DrillDownAdapter(tv);
drillDownAdapter.addNavigationActions(toolBar);
toolBar.add(new Separator());//添加分割符
toolBar.add(new ActionOne());//添加操作
toolBar.add(new ActionTwo());
}
//自定义方法,添加工具栏下拉菜单
private void fillViewToolBarContextMenu(){
IActionBars bars=getViewSite().getActionBars();
IMenuManager toolMenu=bars.getMenuManager();
toolMenu.add(new ActionOne());
toolMenu.add(new ActionTwo());
drillDownAdapter.addNavigationActions(toolMenu);
}
//为树查看器添加上下文菜单
private void fillTreeViewContextMenu(){
MenuManager menuManager=new MenuManager();
Menu menu=menuManager.createContextMenu(tv.getControl());
tv.getControl().setMenu(menu);
menuManager.add(new ActionOne());
menuManager.add(new ActionTwo());
menuManager.add(new Separator());
//为上下文菜单那添加操作
drillDownAdapter.addNavigationActions(menuManager);
}
//操作类
class ActionOne extends Action{
public ActionOne(){
setText("ActionOne");
setToolTipText("ActionOne tooltip");
ImageDescriptor imageDesc=WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_ETOOL_NEW_PAGE);
setHoverImageDescriptor(imageDesc);
}
public void run(){
MessageDialog.openInformation(null, "hello", "this is view action");
}
}
class ActionTwo extends Action{
public ActionTwo(){
setText("ActionTwo");
setToolTipText("ActionTwo tooltip");
ImageDescriptor imageDesc=WorkbenchImages.getImageDescriptor(IWorkbenchGraphicConstants.IMG_OBJ_THEME_CATEGORY);
setHoverImageDescriptor(imageDesc);
}
public void run(){
MessageDialog.openInformation(null, "hello", "this is view action");
}
}
}
Perspestive.java 中设置view的布局
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
String editor=layout.getEditorArea();
IFolderLayout left=layout.createFolder("left", IPageLayout.LEFT, 0.25f, editor);
left.addView("view1");
IFolderLayout buttom=layout.createFolder("buttom", IPageLayout.BOTTOM, 0.25f, editor);
buttom.addView("view2");
}
}
ITreeElement.java这是一个接口,目录树的方法
public interface ITreeElement {
//设置树节点名称
public void setName(String name);
//得到节点名称
public String getName();
//设置与子节点集合
public void setChildren(List children);
//得到子节点集合
public List getChildren();
//是否有子孙
public boolean hasChildren();
//添加子节点
public void addChild(ITreeElement treeElement);
}
EntityElement.java 实现上面的接口
public class EntityElement implements ITreeElement{
private String name;
private List list=new ArrayList();
public EntityElement() {
// TODO Auto-generated constructor stub
}
public EntityElement(String name){
this.name=name;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
// TODO Auto-generated method stub
return name;
}
public void setChildren(List children) {
this.list=children;
}
public List getChildren() {
return list;
}
public boolean hasChildren() {
if(list.size()>0){
return true;
}else{
return false;
}
}
public void addChild(ITreeElement treeElement) {
list.add(treeElement);
}
}
EntityFactory.java 设置目录的结构和名称,返回的内容传递给view1.java中的setInput方法
public class EntityFactory {
//设置集合
public static Object TreeEntityElement() {
//一级目录
EntityElement root1=new EntityElement("员工管理");
EntityElement root2=new EntityElement("产品管理");
//二级目录
EntityElement level1=new EntityElement("员工档案");
EntityElement level2=new EntityElement("员工薪资");
EntityElement level3=new EntityElement("产品分析");
EntityElement level4=new EntityElement("产品报价");
//三级层次
EntityElement leaf1=new EntityElement("短信网址");
EntityElement leaf2=new EntityElement("传统网站");
EntityElement leaf3=new EntityElement("wap网站");
//将二级添加到root1中
root1.addChild(level1);
root1.addChild(level2);
root2.addChild(level3);
root2.addChild(level4);
level4.addChild(leaf1);
level4.addChild(leaf2);
level4.addChild(leaf3);
{//设置在统一集合中返回
ArrayList list=new ArrayList();
list.add(root1);
list.add(root2);
return list;
}
}
}
TreeViewerContentProvider.java内容提供器
public class TreeViewerContentProvider implements ITreeContentProvider{
public TreeViewerContentProvider() {
// TODO Auto-generated constructor stub
}
//返回父节点的子节点
public Object[] getChildren(Object parentElement){
ITreeElement treeElement= (ITreeElement)parentElement;
List list=treeElement.getChildren();
if(list==null||list.isEmpty())
return new Object[0];//返回空数组
else
return list.toArray();
}
public Object getParent(Object element){
return null;
}
//返回给定元素是否有子元素
public boolean hasChildren(Object element){
ITreeElement treeElement= (ITreeElement)element;
List list=treeElement.getChildren();
if(list==null||list.isEmpty())
return false;
else
return true;
}
//当输入为设定的元素时,返回查看器中显示的元素
public Object[] getElements(Object inputElement) {
if(inputElement instanceof List){
List list=(List)inputElement;
return list.toArray();
}else{
return new Object[0];
}
}
public void dispose() {
// TODO Auto-generated method stub
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
}
TreeViewLabelProvider.java 树的标签提供器
public class TreeViewLabelProvider implements ILabelProvider {
public TreeViewLabelProvider() {
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
// TODO Auto-generated method stub
}
public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}
public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
//设置各级的图片
public Image getImage(Object element) {
//系统自带的定义图表
String image1=ISharedImages.IMG_OBJ_FOLDER;
String image2=ISharedImages.IMG_OBJ_FILE;
String image3=ISharedImages.IMG_DEF_VIEW;
//获取每个树的节点名称
String string=((EntityElement)element).getName();
if(string.equals("员工管理")||string.equals("产品管理"))//一级目录设置节点图标
return PlatformUI.getWorkbench().getSharedImages().getImage(image1);
if(string.equals("员工档案")||string.equals("员工薪资")||string.equals("产品分析")||string.equals("产品报价"))//二级目录设置节点图标
return PlatformUI.getWorkbench().getSharedImages().getImage(image2);
if(string.equals("传统网站")||string.equals("短信网址")||string.equals("wap网站"))//三级目录设置节点图标
return PlatformUI.getWorkbench().getSharedImages().getImage(image3);
else
return null;
}
//返回节点的文本
public String getText(Object element) {
ITreeElement treeElement=(ITreeElement)element;
return treeElement.getName();
}
}