gef中添加可折叠调色板原理以及实现 中主要的PaletteRoot的创建:
GEF 3.0还允许用户对调色板里的各种工具进行定制,例如隐藏某个工具,或是修改工具的描述等等,这是通过给PaletteViewer定义一个 PaletteCustomizer实例实现的,但由于时间关系,这里暂时不详细介绍了,如果需要这项功能你可以参考Logic例子中的实现方法。
package com.easyway.plugin.gef.diagram.dev.tools;
import java.util.ArrayList;
import java.util.List;
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.PaletteEntry;
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.palette.ToolEntry;
import org.eclipse.gef.requests.SimpleFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import com.easyway.plugin.gef.diagram.dev.model.Node;
import com.easyway.plugin.gef.diagram.text.Activator;
/**
* 采用单态模式的创建调色板工具栏
* 我们利用自己写的一个工具类PaletteFactory构造一个PaletteRoot对象并返回,我们的调色板里需要有三种工具:
* 选择工具、节点工具和连接工具。在GEF里,调色板里可以有抽屉(PaletteDrawer)把各种工具归类放置,每个
* 工具都是一个ToolEntry,选择工具(SelectionToolEntry)和连接工具
* (ConnectionCreationToolEntry)是预先定义好的几种工具中的两个,所以可以直接使用。
* 调色板工厂的创建的应用
* @author longgangbai
*
*/
publicclass PaletteFactory {
privatefinalstatic String PALETTE_OWNER_PLUGIN=Activator.PLUGIN_ID+".palette.seperator";
privatestatic PaletteRoot paletteRoot;
privatefinalstatic Class clazz=PaletteFactory.class.getClass();
/**
* 获取调色板工具栏
* @return
*/
@SuppressWarnings("unused")
privatestatic PaletteRoot getPaletteRoot(){
if(null==paletteRoot)
{
paletteRoot=createPalette();
}
returnpaletteRoot;
}
/**
* 创建调色板的控件工具组
* @param root
* @return
*/
privatestatic PaletteContainer createControlGroup(PaletteRoot root) {
//创建一组默认控件分组对象
PaletteGroup controlGroup=new PaletteGroup(" Control Group ");
//创建选中工具控件
ToolEntry tool=new SelectionToolEntry();
controlGroup.add(tool);
//设置选中控件为默认的工具
paletteRoot.setDefaultEntry(tool);
//创建选中工具的框
controlGroup.add(new MarqueeToolEntry());
//创建分隔条
PaletteSeparator separator =new PaletteSeparator(PALETTE_OWNER_PLUGIN);
separator.setUserModificationPermission(PaletteEntry.PERMISSION_NO_MODIFICATION);
controlGroup.add(separator);
//创建一个连接控件的工具
controlGroup.add(
new ConnectionCreationToolEntry("Connections","Create connections",
null,
ImageDescriptor.createFromFile(clazz,"icons/connections16.gif"),
ImageDescriptor.createFromFile(clazz,"icons/connections24.gif")
));
return controlGroup;
}
/**
* 创建调色板的组件工具类
* @return
*/
@SuppressWarnings("unchecked")
privatestatic PaletteContainer createComponentsDrawer() {
//创建调色板组件类
PaletteDrawer componetsDrawer = new PaletteDrawer("Components", null);
//容器组件集合
List toolEntrys = new ArrayList();
//创建节点类的(对于节点工具,要使用CombinedTemplateCreationEntry,并把节点类型作为
//参数之一传给它,创建节点工具的代码如下所示)
ToolEntry tool = new CombinedTemplateCreationEntry(
"Node",
"Create a new Node",
Node.class,
new SimpleFactory(Node.class),
null, /* small icon */
null/* large icon */
);
toolEntrys.add(tool);
componetsDrawer.addAll(toolEntrys);
return componetsDrawer;
}
/**
* 获取所有调色板控件中分类列表
* @param root
* @return
*/
@SuppressWarnings("unchecked")
privatestatic List createCategories(PaletteRoot root) {
//创建调色板分类集合
List categories = new ArrayList();
//添加控件组
categories.add(createControlGroup(root));
//添加组件组
categories.add(createComponentsDrawer());
return categories;
}
/**
* 创建调色板工具栏
*/
publicstatic PaletteRoot createPalette() {
//创建调色板工具栏的Root
PaletteRoot paletteRoot = new PaletteRoot();
paletteRoot.addAll(createCategories(paletteRoot));
return paletteRoot;
}
}
在视图编辑器类中重写相关的方法如下:
//