一般GEF项目的Palette都是在编辑页面启动时静态生成的,页面生成好,Palette即固定不变了。由于项目开发需要,现在要求能够通过一个“import”按钮或者菜单命令指定自己的文件目录,实现动态的将该目录下的模型加入到一个抽屉中,并将抽屉动态地添加至Palette中。
其实现方法具体步骤如下:(我这里实现的是菜单栏的命令)
1. 你需要自己先写一个菜单的导入命令action,如ImportProductAction。在其中的定义一个目录对话框,用于让用户指定目录路径;并在其中的run()方法中写该命令点击后要做的事情。其代码如下:
ImportProductAction.java
2. 要将这个importAction注册到菜单栏中,具体步骤是在自己的ApplicationActionBarAdvisor中去注册并添加到主菜单栏上去:
ApplicationActionBarAdvisor.java
这样一个名为"Edit"的菜单下就生成了一个Import的菜单命令。
3. 这还没有完,因为现在ImportProductAction.java中的run()方法中调用的
addPaletteDrawer()还没有在自己的Editor中定义,现在就在自己的Editor中定义该方法,我的Editor叫:MyProductInstallEditor,其代码如下:
MyProductInstallEditor.java
4. 上面的步骤中用到了AppPaletteFactory这个类,这是我自己定义的用来生成Palette部件的工厂类。我们在其中写了静态创建Palette默认部件的一些方法,还需要写一个动态向该Palette中导入模型并添加抽屉的方法,我这里命名为importNewDrawer(),其代码如下:
AppPaletteFactory.java
至此,在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中动态导入抽屉和模型工具的工作完成!