GEF的Palette中实现抽屉和模型工具的动态导入

一般GEF项目的Palette都是在编辑页面启动时静态生成的,页面生成好,Palette即固定不变了。由于项目开发需要,现在要求能够通过一个“import”按钮或者菜单命令指定自己的文件目录,实现动态的将该目录下的模型加入到一个抽屉中,并将抽屉动态地添加至Palette中。
其实现方法具体步骤如下:(我这里实现的是菜单栏的命令)

1. 你需要自己先写一个菜单的导入命令action,如ImportProductAction。在其中的定义一个目录对话框,用于让用户指定目录路径;并在其中的run()方法中写该命令点击后要做的事情。其代码如下:
ImportProductAction.java
package tutogef.actions;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;

import tutogef.MyProductInstallEditor;

public class ImportProductAction extends Action implements ISelectionListener,
IWorkbenchAction {

protected final IWorkbenchWindow window;
public static final String ID = "TutoGEF.myGraphicalEditor.import";

public ImportProductAction(IWorkbenchWindow window){
this.window = window;
setId(ID);
setText("&Import");
window.getSelectionService().addSelectionListener(this);
}

@Override
public void dispose() {
window.getSelectionService().removeSelectionListener(this);
}

@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
// TODO Auto-generated method stub

}

@Override
//这个action的点击事件代码,导入一指定文件目录
public void run(){
String path = openFileDialog();
if(path!=null){
IWorkbenchPage page = window.getActivePage();
((MyProductInstallEditor)page.getActiveEditor()).addPaletteDrawer(path);

}
}

//打开文件对话框
private String openFileDialog(){
DirectoryDialog dialog = new DirectoryDialog(window.getShell(), SWT.OPEN);
dialog.setText("导入产品实体部件");
dialog.setMessage("请选择源文件所在目录");
//dialog.setFilterPath(""); //设置路径
return dialog.open();
}
}


2. 要将这个importAction注册到菜单栏中,具体步骤是在自己的ApplicationActionBarAdvisor中去注册并添加到主菜单栏上去:
ApplicationActionBarAdvisor.java
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction importAction;
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}

@Override
protected void makeActions(IWorkbenchWindow window) {
importAction = new ImportProductAction(window);
register(importAction);
}
//设置最顶上的主菜单栏,将命令按钮加上菜单栏
protected void fillMenuBar(IMenuManager menuBar) {
MenuManager editMenu = new MenuManager("&Edit","Edit");
editMenu.add(importAction);
menuBar.add(editMenu);
}
}

这样一个名为"Edit"的菜单下就生成了一个Import的菜单命令。

3. 这还没有完,因为现在ImportProductAction.java中的run()方法中调用的
addPaletteDrawer()还没有在自己的Editor中定义,现在就在自己的Editor中定义该方法,我的Editor叫:MyProductInstallEditor,其代码如下:
MyProductInstallEditor.java
public class MyProductInstallEditor extends GraphicalEditorWithPalette {
……
private PaletteRoot paletteRoot; //定义该Editor的Palette
……
@Override
protected PaletteRoot getPaletteRoot() {//这里我用的是一个Palette的工厂类来生成Palette部件,这个AppPaletteFactory待会儿给出定义
paletteRoot = AppPaletteFactory.createPalette(this.ID);
return paletteRoot;
}

public void addPaletteDrawer(String path) {//这里用了AppPaletteFactory类的又一静态方法importNewDrawer(),实现具体的动态导入
AppPaletteFactory.importNewDrawer(paletteRoot, path);
getEditDomain().setPaletteRoot(paletteRoot); //这一步很重要,这是更新Editor中的Palette,如不进行,虽然Palette中已导入抽屉,但未显示!
}
……
}


4. 上面的步骤中用到了AppPaletteFactory这个类,这是我自己定义的用来生成Palette部件的工厂类。我们在其中写了静态创建Palette默认部件的一些方法,还需要写一个动态向该Palette中导入模型并添加抽屉的方法,我这里命名为importNewDrawer(),其代码如下:
AppPaletteFactory.java
package tutogef;

import helper.IImageKeys;

import java.io.File;

import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteSeparator;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.requests.SimpleFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;

import tutogef.editpart.NodeCreationFactory;
import tutogef.model.Anchor;
import tutogef.model.ArrowConnection;
import tutogef.model.Frame;
import tutogef.model.LineConnection;
import tutogef.model.Product;

/**
* Utility class that can create a GEF Palette.
* @see #createPalette()
* @author Gu
*/
public final class AppPaletteFactory {

private AppPaletteFactory() {
// Utility class
}

/**
* Creates the PaletteRoot and adds all palette elements.
* Use this factory method to create a new palette for your graphical editor.
* @return a new PaletteRoot
*/
static PaletteRoot createPalette(String id) {
//新建选项板
PaletteRoot palette = new PaletteRoot();
palette.add(createToolsGroup(palette)); return palette;
}

/**
* Create the "Tools" group.
*/
private static PaletteContainer createToolsGroup(PaletteRoot root) {
//设置了一个操作工具组(还可以定制ToolBar,如PaletteToolbar toolbar = new PaletteToolbar("Tools");)
PaletteGroup manipGroup = new PaletteGroup("操作");
// Add a selection tool to the group
SelectionToolEntry selectionToolEntry = new SelectionToolEntry();
manipGroup.add(selectionToolEntry); //选择按钮
root.setDefaultEntry(selectionToolEntry); //设置默认选项
// Add a marquee tool to the group
manipGroup.add(new MarqueeToolEntry()); //多选按钮

return manipGroup;
}

static void importNewDrawer(PaletteRoot root, String path) {//根据用户指定目录将其中所有.prod的文件都导入到一个新添抽屉中,并将该抽屉加至Palette中,这里.prod文件是与本项目中的Product模型相对应的,可以是任意模型
File importFile = new File(path);
PaletteDrawer newDrawer = new PaletteDrawer(path);
if(importFile.isFile() && path.endsWith(".prod")) { //是.prod文件
ImageDescriptor newProductDescriptor =
AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, IImageKeys.PRODUCT);
CombinedTemplateCreationEntry productEntry = new CombinedTemplateCreationEntry("产品", path,
Product.class, new NodeCreationFactory(Product.class),newProductDescriptor,newProductDescriptor);
newDrawer.add(productEntry);
root.add(new PaletteSeparator()); //设置分隔
root.add(newDrawer);
}
else if(importFile.isDirectory()) {
String[] sons = importFile.list();
for(int i=0; i<sons.length; i++) {
File f = new File(path + File.separator + sons[i]);
if(f.isFile() && sons[i].endsWith(".prod")) { //是.prod文件
//创建按钮项
ImageDescriptor newProductDescriptor =
AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, IImageKeys.PRODUCT);
CombinedTemplateCreationEntry productEntry = new CombinedTemplateCreationEntry("产品"+i, sons[i],
Product.class, new NodeCreationFactory(Product.class),newProductDescriptor,newProductDescriptor);
newDrawer.add(productEntry);
}
}
root.add(new PaletteSeparator()); //设置分隔
root.add(newDrawer);
}
}

}


至此,在Palette中动态导入抽屉和模型工具的工作完成!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值