`
guhanjie
  • 浏览: 298783 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • GEF
阅读更多
一般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
4
分享到:
评论
2 楼 guhanjie 2011-12-19  
你好,整个项目比较大,关于palette的动态导入,以上代码已可以实现,你可以试试看
1 楼 niweiwei 2011-11-25  
楼主,能否共享一下你的源码?谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics