一般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中动态导入抽屉和模型工具的工作完成!
分享到:
相关推荐
在这个场景中,可能是讨论如何在GEF环境中实现图形元素的动态行为或者交互。 在描述中提到了一个博客链接,虽然内容没有给出,但我们可以推测博主可能在文章中详细解释了如何利用GEF进行图形动画或动态更新。在图形...
标题“GEF典型实现例子”指的是使用Graphical Editing Framework (GEF)的示例应用。GEF是Eclipse平台下的一个开源项目,主要用于构建图形化编辑工具,它提供了丰富的图形用户界面(GUI)组件和框架,帮助开发者创建...
开发者可以通过实现GEF提供的接口和类来创建自定义视图。 3. **控制器(Controller)**:控制器负责处理用户输入,例如鼠标点击和键盘操作,并更新模型或视图。GEF提供了一些预定义的控制器类,如CommandStack...
在GEF(Graphical Editing Framework)中,属性视图(Property View)的实现是一个关键功能,它允许用户查看和编辑图形模型的属性。属性视图是数据源与用户界面之间的桥梁,确保图形模型和属性视图之间保持同步更新...
这个模式在 GEF 中应用非常广泛,学习 GEF 的过程中需要深入了解 Command 模式的实现原理和应用。 GEF 的结构决定了 GEF 应用程序的复杂性,即使最简单的 GEF 程序也包含五六个包和十几个类。因此,学习 GEF 需要从...
总的来说,理解和实现GEF中的拷贝粘贴功能需要对GEF框架有深入的理解,包括其命令模型、EditPolicy和模型-视图交互。通过这种方式,开发者可以为自己的图形编辑器提供与操作系统一致的拷贝粘贴体验。
### 基于GEF框架的SVG制作工具设计与实现 #### 摘要与引言 本文聚焦于探讨一种新型SVG(可缩放矢量图形)制作工具的设计与实现,该工具基于Eclipse平台的GEF(Graphic Editor Framework)框架。SVG作为一种基于XML...
总的来说,gef转折线的实现涉及PathFigure和Segment的组合使用,而GEF的API为开发者提供了丰富的工具和接口,使得构建交互式图形编辑器变得简单。通过熟练掌握这些知识,开发者可以轻松创建出具有复杂图形交互功能的...
《Eclipse开发使用GEF和EMF》是IBM红皮书系列中的一部经典著作,主要探讨了如何在Eclipse环境中利用GEF(图形编辑框架)和EMF( Eclipse模型框架)进行图形化应用程序的开发。这两项技术是Eclipse平台上的核心组件,...
在GEF中,通过实现`OutlinePage`和`StructuredSelection`可以将模型数据展示在大纲视图中。 6. **鹰眼(Eyeball)**: 鹰眼功能是一种缩略图视图,让用户能快速查看整个图形区域。在GEF中,可以通过自定义小部件并集成...
GEF的设计目标是将图形编辑器的实现细节抽象化,让开发者能够专注于业务逻辑和模型设计,而不是底层的绘图操作。它提供了一组模型视图控制器(MVC)组件,包括图形模型、图形视图和图形编辑器,使得开发者可以方便地...
它提供了一套全面的API和工具,使得开发者可以方便地创建出复杂的图形用户界面,特别是针对模型驱动工程(MDE)中的图形化建模工具。本教程是针对想要学习和掌握GEF技术的开发者,通过实例教学,深入浅出地介绍GEF的...
在GEF中,模型通常由EMF(Eclipse Modeling Framework)来定义和管理,可以将业务逻辑和视图分离。 2. **视图(View)**:视图是模型的可视化表示,它将模型数据呈现为用户界面。GEF提供了基础框架来实现这一转换,...
通过命令,开发者可以解耦UI和实现,使得功能可以独立于其表示进行定义和扩展。 6. **Property and Selection Services**:属性服务和选择服务允许不同组件之间共享信息和协调行为,如传递当前选中的对象。 **GEF...
本资料集旨在为初学者提供一个全面的入门指南,帮助理解GEF的基础概念和实现方法。 GEF的核心功能是提供了一套强大的组件和API,用于创建可交互的、图形式的用户界面。通过使用GEF,开发者可以轻松地创建出具有拖放...
将现有的XML或UML模型导入到EMF中,然后利用EMF的工具对其进行扩展和维护。 ##### 2.2 EMF编辑器与代码生成 **2.2.1 生成的插件** EMF自动生成的插件包含了编辑器、视图和其他相关组件。 **2.2.2 通过GenModel...
创建GEF编辑器时,通常会在Eclipse中创建一个控制器(EditorPart),设定控制器的输入(IEditorInput),并初始化EditDomain、viewers和palette等核心组件。GEF的这一结构确保了各部分之间的低耦合,提高了系统的可...
Eclipse的GEF(Graphical Editing Framework)插件是一个强大的工具,用于在Eclipse集成开发环境中创建、编辑和展示图形用户界面。它为开发者提供了一种框架,支持创建可定制的、交互式的图形编辑器,使得开发人员...
- 在项目中创建三个包:`gef.tutorial.step.model`、`gef.tutorial.step.parts`和`gef.tutorial.step.ui`。 - `gef.tutorial.step.model`: 存放模型相关的类。 - `gef.tutorial.step.parts`: 存放控制器相关的类...