`

关于多页编辑器中不同Editor之间的Redo&Undo冲突的解决

阅读更多
在我们的插件工具的开发过程中碰到一个问题,就是在编辑xml文件的时候,因为采用了EMF建模,导致在使用Eclipse Forms编辑节点和属性与编辑事件的JavaScript脚本的Editor之间二者的Redo&Undo功能有一定的冲突,EMF的Redo&Undo不可用,当把JavaScript编辑器中TextViewer的UndoManager屏蔽了之后,EMF的Redo&Undo才能正常,开始跟踪调试代码,始终没有找到问题的症结所在,经过几天的摸索,最终找到了答案.
原来跟ContributorActionBar有关,在插件中,对于Editor(这里的Editor是指的多页编辑器外面的那个总的Editor不是里面每一页中的Editor)来说,我们必须为其指定一个ContributorActionBar,在该类的初始化方法:
void org.eclipse.ui.part.EditorActionBarContributor.init(IActionBars bars)
中需要为IActionBars添加各种Action,比如CopyAction, DeleteAction, CutAction这里面就包括RedoAction和UndoAction,例如在
void org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor.init(IActionBars actionBars)中就是这样来做的:
java 代码
  1. deleteAction = new DeleteAction(removeAllReferencesOnDelete());    
  2. deleteAction.setImageDescriptor(sharedImages.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));   
  3. actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);   

上面的代码将系统的Undo&Redo快捷键以及Eclipse菜单项Delete与deleteAction关联起来了.
如果多页编辑器里面使用了一个另外一个TextEditor,那么在这个TextEditor中对Redo&Undo Action会调用org.eclipse.ui.texteditor.AbstractTextEditor.createUndoRedoActions()方法,其中代码如下:

java 代码
  1. IUndoContext undoContext= getUndoContext();   
  2.         if (undoContext != null) {   
  3.             // Use actions provided by global undo/redo   
  4.                
  5.             // Create the undo action   
  6.             OperationHistoryActionHandler undoAction= new UndoActionHandler(getEditorSite(), undoContext);   
  7.             PlatformUI.getWorkbench().getHelpSystem().setHelp(undoAction, IAbstractTextEditorHelpContextIds.UNDO_ACTION);   
  8.             undoAction.setActionDefinitionId(IWorkbenchActionDefinitionIds.UNDO);   
  9.             registerUndoRedoAction(ITextEditorActionConstants.UNDO, undoAction);   
  10.             ... ...   

在registerUndoRedoAction方法中:

java 代码
  1. private void registerUndoRedoAction(String actionId, OperationHistoryActionHandler action) {   
  2.         IAction oldAction= getAction(actionId);   
  3.         if (oldAction instanceof OperationHistoryActionHandler)   
  4.             ((OperationHistoryActionHandler)oldAction).dispose();   
  5.   
  6.         setAction(actionId, action);   
  7.            
  8.         IActionBars actionBars= getEditorSite().getActionBars();   
  9.         if (actionBars != null)   
  10.             actionBars.setGlobalActionHandler(actionId, action);   
  11.     }   

会再一次的将指定的Action与全局ActionId关联起来,这样我们前面制定的Action就会被屏蔽掉,导致使用了TextEditor的UndoManager之后,EMF的模型编辑的Redo&Undo无法使用,找到了问题所在,至于解决办法就好搞定了.

另:

研究Undo&Redo的入口在void org.eclipse.swt.custom.StyledText.modifyContent(Event event, boolean updateCaret)
然后是void org.eclipse.swt.custom.StyledTextContent.replaceTextRange(int start, int replaceLength, String text)
StyledTextContent这个类是用来链接TextViewer和Document之间的适配器,TextViewer默认的实现是DefaultDocumentAdapter,如果需要提供自己的DocumentAdapter的实现需要复写 TextViewer 的 createDocumentAdapter() 方法,所有的操作会转交给当前编辑的Document,对于UndoMananger来说,它会在每个TextViewer上所编辑的Document注册一些监听器,用来监听Document的改变,当Document发生改变的时候,会触发这些监听器,这些监听器,根据Document的改变生成一个一个的Command或者Operation并保存在StackCommand或者是History中,以便Undo的时候从StackCommand和History中取出来执行

分享到:
评论
1 楼 vwpolo 2008-04-21  
菠菜先生,请问我切换一个多页编辑器的时候会触发什么事件?

相关推荐

    jsp KindEditor网页文本编辑器

    放在项目的跟路径即可,下面是初始化代码,编辑器没有实例化显示出来,注意引入的js路径 [removed][removed] [removed][removed] <form action="#"> <textarea id="editor1" name="editor1" ></...

    010Editor(十六进制编辑器)v9.0.1汉化安装版32位

    有一个友好易于使用的界面,无限次的undo和redo操作。另外还可以打印十六进制的字节或者以书签的方式标出某些重要的字节。支持二进制模板(binary template)系统。配置文件保存在当前目录中,虽然不会显示注册用户...

    010Editor十六进制编辑器

    010Editor是一款快速且强大的十六进制编辑器。用来编辑二进制文件。有一个友好易于使用的界面,无限次的undo和redo操作。另外还可以打印十六进制的字节或者以书签的方式标出某些重要的字节。支持二进制模板(binary ...

    JxEditor在线编辑器,基于Jquery的HTML Editor,自制开源

    自制的基于Jquery的在线编辑器插件,仿Office2003界面,欢迎使用和指正。 完全开源,欢迎在此基础上修改完善或是增加新功能,共同完善此插件。 目前版本已经实现的功能包括:"Redo","Undo","Bold","Italic",...

    010 Editor 13.0 强大的十六进制编辑器

    010 Editor是一款快速且强大的十六进制编辑器。用来编辑二进制文件。有一个友好易于使用的界面,无限次的undo和redo操作。另外还可以打印十六进制的字节或者以书签的方式标出某些重要的字节。支持二进制模板(binary ...

    绝地程序编辑器 v1.0.1.4 源代码

    Jedi Program Editor [绝地程序编辑器] V1.0.1.4一款国人造的程序编辑器 - 特别献给Delphi程序员!中国自己的 Open Source 软件,献给delphi迷们的一个小礼物包!:-)(Jedi Program Editor V1.0.0.6) 在编程中,我发现...

    010Editor(最新破解版、mac版)

    010Editor是一款快速且强大的十六进制编辑器。用来编辑二进制文件。有一个友好易于使用的界面,无限次的undo和redo操作。另外还可以打印十六进制的字节或者以书签的方式标出某些重要的字节。支持二进制模板(binary ...

    010 Editor v9.0.1.zip

    010Editor是一款快速且强大的十六进制编辑器。用来编辑二进制文件。有一个友好易于使用的界面,无限次的undo和redo操作。另外还可以打印十六进制的字节或者以书签的方式标出某些重要的字节。支持二进制模板(binary ...

    hexedit-1.2.10.src.gz_HEXEDIT_字符串

    编辑器中能够屏蔽所有非 ASCII 字符和控制字符,只剩下了英文字符显示出来。功能强大的全文查找和全文替换,包括标准字符串和 Unicode 字符串的查找和替换(可以不区分大小写)。功能强大的输入功能,支持十六进制码...

    tinyeditor gbk 汉化版

    在TinyEditor的实际应用中,需要注意的是,在提交编辑器内容之前,一定调用instance.post()函数,以确保编辑区域中最新的可视化内容转化为标记文本。 查看示例:http://sandbox.leigeber.com/tinyeditor/

    HEXEdit.exe

    编辑器中能够屏蔽所有非 ASCII 字符和控制字符,只剩下了英文字符显示出来。功能强大的全文查找和全文替换,包括标准字符串和 Unicode 字符串的查找和替换(可以不区分大小写)。功能强大的输入功能,支持十六进制码...

    QWhale Editor.NET v1.31 特别版

    一个.NET组件,允许你在应用程序中加入高级的代码编辑器,几乎支持Visual Studio .NET中所有的功能,比如自定义语法高亮,代码大纲显示,代码自动完成,无限制的Undo/Redo,书签,自动换行,托拽,查找/替换等。

    python实现简易的图片编辑器

    3. **撤销和重做功能**:`undo`和`redo`方法实现撤销和重做功能,通过维护编辑前后的图像堆栈来实现。 4. **打开和保存图像**:`open_image`方法允许用户打开图像文件并在画布上显示,`save_image`方法允许用户将...

    010editor破解版

    010Editor是一款快速且强大的十六进制编辑器。用来编辑二进制文件。有一个友好易于使用的界面,无限次的undo和redo操作。另外还可以打印十六进制的字节或者以书签的方式标出某些重要的字节。支持二进制模板(binary ...

    Android代码-安卓富文本编辑器

    A rich text editor sample (based on summernote) Features Bold Italic Underline Strike-through Heading 1 Heading 2 Heading 3 Heading 4 Heading 5 Heading 6 Paragraph Quote Ordered List Unordered List ...

    visio教程PDF

    7.3.2 使用标准工具栏中的Redo控制 7.3.3 使用键盘Undo命令 7.4 删除对象 7.4.1 删除对象的方法 7.4.2 删除对象并放入内存的方法 7.4.3 把删除到内存中的对象拷贝到页面中 7.4.4 删除组中对象的...

    Visio 2000 技术大全

    7.3.2 使用标准工具栏中的Redo控制 7.3.3 使用键盘Undo命令 7.4 删除对象 7.4.1 删除对象的方法 7.4.2 删除对象并放入内存的方法 7.4.3 把删除到内存中的对象拷贝到页面中 7.4.4 删除组中...

    cuteEditor6.0

    除了其强大的功能和方便的使用, 这里还有一些顶尖的技术因素是CuteEditor编辑器成为你编辑和发布Web内容的最佳选择: 界面简洁加载速度快 <br/>由于才有了很多优化方法,所以CuteEditor非常简单、小巧、...

    ist的matlab代码-tinymce4:用于REDAXO5的TinyMCE4编辑器

    5的TinyMCE4编辑器 默认配置文件 { selector : ' textarea.tinyMCEEditor ' , file_browser_callback : redaxo5FileBrowser, plugins : ' autoresize lists autolink link visualblocks fullscreen paste code hr ...

Global site tag (gtag.js) - Google Analytics