Editor中嵌入Editor,最大的问题就是Action的问题。
我们知道,通过每个Editor都有自己对应的Action组,我们通过提供Editor的Contributor来提供该Editor对应的Actions。但是这在内嵌Editor中就会有问题了。例如,我有一个GEF的Editor:ZillionaireEditor。这个Editor嵌套在另一个Editor中:ZillionaireComboEditor。
假如在我的ZillionaireComboEditor中,需要支持ZillionaireEditor的redo、undo和delete动作。
那么首先,我们在我们的ZillionaireComboEditor对应的Contributor里追加用于支持GEF command的这三个动作:
@Override
protected void buildActions() {
addRetargetAction(new UndoRetargetAction());
addRetargetAction(new RedoRetargetAction());
addRetargetAction(new DeleteRetargetAction());
}
@Override
public void contributeToToolBar(IToolBarManager toolBarManager) {
toolBarManager.add(getAction(ActionFactory.UNDO.getId()));
toolBarManager.add(getAction(ActionFactory.REDO.getId()));
toolBarManager.add(getAction(ActionFactory.DELETE.getId()));
}
这个很简单,不过只是这样,也会有问题,看看error view就知道,会在ActionBarContributor.setActiveEditor(ActionBarContributor.java:142)有一个空指针的异常。
简单的修正方法如下:
@Override
public void setActiveEditor(IEditorPart editor) {
if (editor instanceof ZillionaireComboEditor) {
super.setActiveEditor(((ZillionaireComboEditor) editor)
.getZillionaireEditor());
} else {
super.setActiveEditor(editor);
}
}
重写它的setActiveEditor()方法,代理到ZillionaireEditor上去。
这时redo和undo的支持就实现了。不过delete操作会有问题:没反应。
实际中,我们选择任一editPart,delete操作都应该被更新,以判断是否可以招待该操作。
所以显示,会有一个选择监听来做这件事。看看GraphicalEditor里的selectionChange()方法:
/**
* @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
*/
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
// If not the active editor, ignore selection changed.
if (this.equals(getSite().getPage().getActiveEditor()))
updateActions(selectionActions);
}
因为我们用外层的editor包装了内部的editor,所以此时判断条件:this.equals(getSite().getPage().getActiveEditor()返回值为false,因此updateActions()方法无法被调用。
显然,我们不应该想着通过修改ZillionaireEditor来实现,因为通常被包装的Editor都不能被你所修改。
所以看来,我们只有通过其他的方法来修改了。
例如,我们在ZillionaireComboEditor中也增加一个selectionListener:
getSite().getPage().addSelectionListener(this);
然后实现selectionChange()方法:
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (this.equals(getSite().getPage().getActiveEditor())) {
ZillionaireEditorContributor actionBarContributor = (ZillionaireEditorContributor) getEditorSite()
.getActionBarContributor();
DeleteRetargetAction action = (DeleteRetargetAction) actionBarContributor
.getAction(ActionFactory.DELETE.getId());
if (action.getActionHandler() instanceof UpdateAction)
((UpdateAction) action.getActionHandler()).update();
}
}
然后delete操作就可用了。
后记:
这只是我自己的一个理解,不知是否有其他好的方法去解决这个问题!
分享到:
相关推荐
Unity内嵌浏览器是一种在Unity开发环境中集成Web浏览功能的技术,主要通过特定的插件实现。在Unity游戏或应用中,内嵌浏览器可以让用户无需离开应用就能访问网页内容,提升用户体验。本篇将深入探讨Unity内嵌浏览器...
### 在C++中内嵌汇编代码:深入分析与实践 #### 一、引言 在现代软件开发中,随着高级编程语言如Java和Python的流行,越来越多的开发者倾向于使用这些语言进行快速开发,往往忽略了对性能的追求。然而,对于C/C++...
在C#中,内嵌资源文件是一个非常实用的功能,它允许开发者将各种文件,如图片、文本、配置文件等作为程序的一部分嵌入到编译后的可执行文件或库中。这样,这些资源可以在运行时方便地访问,而无需外部文件。下面我们...
由于GCC(GNU Compiler Collection)编译器的广泛应用,其内嵌汇编语言成为一种在C语言源代码中插入汇编指令的便捷方法。这种技术允许开发者混合使用高级语言的便利性和汇编语言的性能优化。 内嵌汇编语言主要应用...
### gcc内嵌汇编中文使用说明 ...然而,内嵌汇编的编写需要非常仔细地考虑寄存器的使用、变量的存储位置等问题,因此编写过程可能会较为复杂。对于初学者来说,掌握gcc内嵌汇编的基础知识是非常重要的第一步。
2. **设置内嵌属性**:在资源文件中添加的每个资源,其属性面板中有一个“Build Action”选项,确保它设置为“Embedded Resource”。这将确保资源在编译时被内嵌到程序集中。 3. **访问资源**:在代码中,我们可以...
" Arthas定位springboot中内嵌tomcat问题" 本文将讲述如何使用Arthas工具来定位和解决Spring Boot中内嵌Tomcat问题,通过记录一次实际的定位和处理流程,来分享解决问题的经验和方法。 一、问题背景 在Spring ...
QT内嵌IE浏览器是一种在QT应用程序中集成Internet Explorer(IE)控件的技术,这使得开发者能够在QT界面中展示网页内容,实现与Web交互的功能。QT是Qt Company开发的一个跨平台的C++图形用户界面应用程序开发框架,...
在C++编程中,有时我们需要检测一个类型是否定义了内嵌的枚举类型或typedef,以便根据这些类型的存在来进行特定的处理。这个问题在设计泛型库或者模板元编程时尤其重要,因为它允许我们编写更加灵活和自适应的代码。...
内嵌视图的定义和使用都在同一个查询语句中完成,这种设计使得内嵌视图更加灵活,可以针对特定的查询需求进行定义,而不必担心数据库维护的问题。 **2. 内嵌视图的使用** 内嵌视图主要用于复杂查询中的子查询或...
内嵌汇编编程是C语言与底层硬件交互的一种重要方式,允许程序员直接在C程序中嵌入汇编语言代码,利用汇编语言直接操作硬件的灵活性,同时又保留了C语言的高级特性。混合编程具有以下几个知识点: 1. 内嵌汇编的优势...
此外,内嵌汇编还需要考虑指令的对齐问题。x64指令通常要求16字节对齐,否则可能会导致性能下降甚至运行错误。因此,编写汇编代码时要注意指令序列的长度,避免产生未对齐的跳转。 在实际编程中,使用内嵌汇编时需...
这种方式不仅减少了分发过程中的复杂性,还能有效防止资源文件丢失或被篡改的问题。 #### 原理概述 将图片资源嵌入到exe文件中主要依靠的是Windows程序中的资源文件功能。资源文件可以包含多种类型的资源,如图标、...
当我们在Unity中导入FBX模型时,有时希望模型的纹理能够内嵌在FBX文件中,以便于资源管理和减少依赖性。本文将详细介绍如何在Unity3D中实现FBX模型内嵌纹理的操作。 首先,我们需要理解什么是内嵌纹理。内嵌纹理是...
在内嵌汇编中可以直接引用 C 语言中的变量,例如进行加法运算: ```c int a = 100; int b = 200; asm__volatile__( "add r1, %[aa], %[bb]\n\t" : : [aa] "r" (a), [bb] "r" (b) ); ``` #### 3.2 变量赋值 还...
4. **安全与隐私**:由于内嵌浏览器与游戏共享同一运行环境,开发者需要注意安全问题,防止恶意网页代码影响游戏逻辑。Unity可能提供了沙盒模式,限制了浏览器的权限。 5. **性能优化**:内嵌浏览器可能会消耗大量...
然而,在现代开发环境中,为了简化部署流程和提高灵活性,开发者常选择将Tomcat“内嵌”到Java应用中,即"内嵌式Tomcat"。 内嵌式Tomcat的优势在于,它允许开发者直接在Java应用程序内部启动和管理Tomcat服务器,...
【标题】"editor.md-master_java商城_springboot_editor.md-master" 涉及的主要知识点是基于SpringBoot技术栈开发的Java商城系统,并结合了editor.md编辑器,这为我们提供了一个全面理解如何在现代Web开发中整合后端...
内嵌Tomcat指的是在Java应用程序中直接集成Tomcat服务器,而不是作为一个独立的服务运行。这种方式常用于开发、测试或部署轻量级应用,因为不需要单独启动和管理Tomcat进程。本实例代码提供了关于如何在Java项目中...
Unity内嵌网页插件是Unity开发中的一种技术,它允许开发者在Unity游戏中或者应用程序中集成一个Web浏览器组件,用户可以直接在游戏内部浏览网页内容。这种功能对于实现互动教程、在线帮助系统、游戏内置商店或者实时...