GMF Q&A(1): 如何让palette支持拖拽(DnD)等10则
1,如何让palette支持拖拽(DnD)
在*PaletteFactory类中,把私有类NodeToolEntry 和LinkToolEntry的基类修改为PaletteToolEntry。并在构造函数中把调用
1 | super(title, description, null, null); |
修改为
1 2 | super(null, title, null); this.setDescription(description); |
最后别忘了把@generated改为@generated NOT
2,如何移除connection handles(就是鼠标hover在node上时,自动出现的连接线提示)
在所有的节点的editpart的createDefaultEditPolicies()方法中,加入removeEditPolicy(EditPolicyRoles.CONNECTION_HANDLES_ROLE); 是的,正是这个policy role添加了这个行为。
另一个办法是使用动态模板(dynamic template)我没有试过。
3,如何移除assistant popups(即鼠标停留在节点或者空白处时出现的小图标调色板)
在所有的节点的editpart和DocumentEditPart的createDefaultEditPolicies()方法中,加入removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE),移除POPUPBAR_ROLE。(在DocumentEditPart中移除POPUPBAR_ROLE,移除的是鼠标停留在空白处时弹出popup的行为)
4,当创建连接线,连接目标节点时,如果把鼠标放在空白处点击,会出现content menu来创建目标结点,如何禁止这种行为.
在DocumentEditPart的createDefaultEditPolicies()方法中,加入removeEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE)
5,如何使*DiagramEditor默认不显示X轴和Y轴滚动条,而是需要时自动显示。
在*DiagramEditor的configureGraphicalViewer()方法加入以下代码
1 2 3 4 5 | Control control = this.getGraphicalViewer().getControl(); if (control instanceof FigureCanvas) { FigureCanvas figureCanvas = (FigureCanvas) control; figureCanvas.setScrollBarVisibility(FigureCanvas.AUTOMATIC); } |
6,如何使连接线上的标签不允许被右键删除
在所有的WrappingLabel*EditPart的createDefaultEditPolicies()方法中,加入removeEditPolicy(EditPolicy.COMPONENT_ROLE)
7,如何为节点添加双击事件。
在对应的editpart中加入重载方法:
1 2 3 4 5 6 7 8 9 | @Override public void performRequest(Request request) { // TODO Auto-generated method stub super.performRequest(request); if (request.getType() == RequestConstants.REQ_OPEN) { System.out.println("requested double-click."); //在这里加入双击处理代码 } } |
8,如何改变palette的默认宽度。
在*DiagramEditor中加入重载方法:
1 2 3 4 | @Override protected int getInitialPaletteSize() { return 160; } |
9,如何改变palette的默认布局为columns,默认使用大图标(Use Large Icons)
在*DiagramEditor中加入重载方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | @Override protected PaletteViewer constructPaletteViewer() { // TODO Auto-generated method stub PaletteViewer paletteViewer = super.constructPaletteViewer(); //from DefaultPaletteViewerPreferences class DefaultPaletteViewerPreferences method IPreferenceStore store = InternalGEFPlugin.getDefault() .getPreferenceStore(); store.setDefault(PaletteViewerPreferences.PREFERENCE_DETAILS_ICON_SIZE, true); store.setDefault(PaletteViewerPreferences.PREFERENCE_COLUMNS_ICON_SIZE, true); store.setDefault(PaletteViewerPreferences.PREFERENCE_ICONS_ICON_SIZE, true); store.setDefault(PaletteViewerPreferences.PREFERENCE_LIST_ICON_SIZE, true); store.setDefault(PaletteViewerPreferences.PREFERENCE_LAYOUT, PaletteViewerPreferences.LAYOUT_COLUMNS); //store.setDefault(PREFERENCE_AUTO_COLLAPSE, COLLAPSE_AS_NEEDED); //store.setDefault(PREFERENCE_FONT, DEFAULT_FONT); return paletteViewer; } |
这种修改PreferenceStore中默认值的方式,要比直接去设置palettle的属性要好。因为如果直接设置属性,那么用户在界面上调整palettle布局后,下次再打开时总是会被重置。
10,如何设置Grid(网格)的属性
在*DiagramEditor中initializeGraphicalViewer方法(或者configureGraphicalViewer方法中加入代码):
1 2 3 4 | DiagramRootEditPart root = (DiagramRootEditPart) this.getDiagramGraphicalViewer().getRootEditPart(); root.setGridStyle(SWT.LINE_SOLID); root.setGridSpacing(0.125); root.setGridColor(FigureUtilities.colorToInteger(new Color(null,192,192,192))); |
参考
以上是我遇到的部分问题和解决办法的总结,部分参考了GMF新闻组的Q&A。英文好的读者可以自行查阅http://wiki.eclipse.org/GMF_Newsgroup_Q_and_A
Binhua Liu原创,写于2013/8/27。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端