Java 在基于表单的编辑器中实现撤消重做
我正在开发一个多页表单编辑器,以便在Eclipse中编辑/创建定制的XML文件。 结构如下所示:Java 在基于表单的编辑器中实现撤消重做,java,xml,eclipse-plugin,undo-redo,Java,Xml,Eclipse Plugin,Undo Redo,我正在开发一个多页表单编辑器,以便在Eclipse中编辑/创建定制的XML文件。 结构如下所示: 实现类是MyXMLFormEditor,它扩展了FormEditor FormEditor的每一页都扩展了FormPage(即MyXMLFormPage扩展了FormPage) 在FormEditor和实际XML文件之间,我维护JDOM模型 我还实现了脏标志处理。所以用户对表单编辑器的输入会保存到JDOM中,直到用户按下保存按钮。当用户按下保存按钮时,JDOM被写入/序列化到XML文件中 在具有
- 实现类是
,它扩展了FormEditorMyXMLFormEditor
- FormEditor的每一页都扩展了FormPage(即MyXMLFormPage扩展了FormPage)
- 在FormEditor和实际XML文件之间,我维护JDOM模型
- 我还实现了脏标志处理。所以用户对表单编辑器的输入会保存到JDOM中,直到用户按下保存按钮。当用户按下保存按钮时,JDOM被写入/序列化到XML文件中李>
public class MyXMLFormEditor extends FormEditor {
MyXMLFormEditor(){
super();
}
@Override
protected FormToolkit createToolkit(Display display) {
// Create a toolkit that shares colors between editors.
return new FormToolkit(Activator.getDefault().getFormColors(display));
}
@Override
public void init(IEditorSite site, IEditorInput editorInput) {
setSite(site);
mSite = site;
setInput(editorInput);
try {
super.init(site, editorInput);
} catch (PartInitException e1) {
e1.printStackTrace();
}
if (!(editorInput instanceof IFileEditorInput))
try {
throw new PartInitException("Invalid Input: Must be IFileEditorInput");
} catch (PartInitException e) {
e.printStackTrace();
}
setPartName(fileName);
}
public void setUpProgFile(IEditorSite site, IEditorInput editorInput){
IFileEditorInput fileInput = ((IFileEditorInput) editorInput);
//create document builder and prepare JDom model for xml file.
}
@Override
protected void addPages() {
try {
//add 'Main' page
objMyXMLFormPage = new MyXMLFormPage (this, "FirstPage","Main");
//set rootNode of MyXMLFormPage
objMyXMLFormPage.rootNode = getRootNode();
objMyXMLFormPage.filePath = filePath;
objMyXMLFormPage.document = document;
addPage(objMyXMLFormPage);
} catch (PartInitException e) {
e.printStackTrace();
}
}
@Override
public void doSave(IProgressMonitor monitor) {
System.out.println("MyXMLFormEditor: doSave");
//logic to write jdom contents into xml file.
objMyXMLFormPage.setDirty(false);
}
@Override
public void doSaveAs() {
System.out.println("MyXMLFormEditor: doSaveAs");
}
@Override
public boolean isSaveAsAllowed() {
System.out.println("MyXMLFormEditor: isSaveAsAllowed");
return true;
}
}
public class MyXMLFormPage extends FormPage{
//private members declaration.
public MyXMLFormPage (MyXMLFormEditor editor,String title, String id) {
// initialize the editor and set its title and name.
super(editor,title,id );
}
@Override
public void createFormContent(IManagedForm managedForm) {
// Set page title
super.createFormContent(managedForm);
FormToolkit mMyXMLFormPage Toolkit = managedForm.getToolkit();
//Logic to creat UI and populating its contents from JDom
}
private void makeEditorDirty() {
updateJdom = true;
setDirty(true);
}
private void updateJDom() {
if(updateJdom){
System.out.println("*** Jdom updated ***");
updateJdom = false;
}
}
@Override
public boolean isDirty() {
return isDirtyFlag;
}
protected void setDirty(boolean value) {
isDirtyFlag = value;
dirtyStateChanged();
}
public void dirtyStateChanged() {
getEditor().editorDirtyStateChanged();
}
@Override
public boolean isSaveAsAllowed() {
System.out.println("MyXMLFormPage .isSaveAsAllowed");
return false;
}
@Override
public void doSave(IProgressMonitor monitor) {
System.out.println("MyXMLFormPage .doSave");
}
}
MyXMLFormPage.java
public class MyXMLFormEditor extends FormEditor {
MyXMLFormEditor(){
super();
}
@Override
protected FormToolkit createToolkit(Display display) {
// Create a toolkit that shares colors between editors.
return new FormToolkit(Activator.getDefault().getFormColors(display));
}
@Override
public void init(IEditorSite site, IEditorInput editorInput) {
setSite(site);
mSite = site;
setInput(editorInput);
try {
super.init(site, editorInput);
} catch (PartInitException e1) {
e1.printStackTrace();
}
if (!(editorInput instanceof IFileEditorInput))
try {
throw new PartInitException("Invalid Input: Must be IFileEditorInput");
} catch (PartInitException e) {
e.printStackTrace();
}
setPartName(fileName);
}
public void setUpProgFile(IEditorSite site, IEditorInput editorInput){
IFileEditorInput fileInput = ((IFileEditorInput) editorInput);
//create document builder and prepare JDom model for xml file.
}
@Override
protected void addPages() {
try {
//add 'Main' page
objMyXMLFormPage = new MyXMLFormPage (this, "FirstPage","Main");
//set rootNode of MyXMLFormPage
objMyXMLFormPage.rootNode = getRootNode();
objMyXMLFormPage.filePath = filePath;
objMyXMLFormPage.document = document;
addPage(objMyXMLFormPage);
} catch (PartInitException e) {
e.printStackTrace();
}
}
@Override
public void doSave(IProgressMonitor monitor) {
System.out.println("MyXMLFormEditor: doSave");
//logic to write jdom contents into xml file.
objMyXMLFormPage.setDirty(false);
}
@Override
public void doSaveAs() {
System.out.println("MyXMLFormEditor: doSaveAs");
}
@Override
public boolean isSaveAsAllowed() {
System.out.println("MyXMLFormEditor: isSaveAsAllowed");
return true;
}
}
public class MyXMLFormPage extends FormPage{
//private members declaration.
public MyXMLFormPage (MyXMLFormEditor editor,String title, String id) {
// initialize the editor and set its title and name.
super(editor,title,id );
}
@Override
public void createFormContent(IManagedForm managedForm) {
// Set page title
super.createFormContent(managedForm);
FormToolkit mMyXMLFormPage Toolkit = managedForm.getToolkit();
//Logic to creat UI and populating its contents from JDom
}
private void makeEditorDirty() {
updateJdom = true;
setDirty(true);
}
private void updateJDom() {
if(updateJdom){
System.out.println("*** Jdom updated ***");
updateJdom = false;
}
}
@Override
public boolean isDirty() {
return isDirtyFlag;
}
protected void setDirty(boolean value) {
isDirtyFlag = value;
dirtyStateChanged();
}
public void dirtyStateChanged() {
getEditor().editorDirtyStateChanged();
}
@Override
public boolean isSaveAsAllowed() {
System.out.println("MyXMLFormPage .isSaveAsAllowed");
return false;
}
@Override
public void doSave(IProgressMonitor monitor) {
System.out.println("MyXMLFormPage .doSave");
}
}
有人能给我提供如何在FormEditor中实现撤销/重做功能的指针/示例吗?如果该方法利用Eclipse PDE或workbench的现有撤消/重做框架,那就更好了。关于Eclipse中多页编辑器实现所使用的模式,有几个要点需要说明。可能还有其他方法,但Eclipse中的编辑器似乎坚持以下几点:
- 在编辑器中维护页面共享的数据模型(您正在这样做)
- 仅在即将显示页面时使用模型数据刷新页面。不要试图使未显示的页面与模型保持同步
- 执行撤消或重做时,对模型进行适当的更改(根据@Scorpion的注释),然后刷新当前页面
- 每个页面都应该有一个its ok to leave this page方法(我不记得名称),该方法被调用以确保显示的数据没有错误,足以允许更改页面(您不希望非显示数据出现错误)李>
- 页面有一个即将离开此页面的方法,该方法被调用以在切换页面之前保存对模型的任何更改。大多数页面在这里不做任何事情,因为有时模型会被每次击键修改,但是源页面会使用此方法完全用文本编辑器内容上的解析结果替换模型
表单需要监听撤销/重做键事件,并通过命令模式将其传递给模型。您可以查看gef示例-它基本上使用命令模式,如果我没记错的话,相关类名也是commandstack,看起来这里的代码是重复的,似乎与@Scorpion突出显示的重复问题中的内容完全相同。这个问题的答案是否不令人满意?你应该回答原来的问题。