0
我正在開發一個多頁面表單編輯器來編輯/創建一個Eclipse中的自定義XML文件。 結構是這樣的:實施撤消重做基於窗體的編輯器
- 實現類是
MyXMLFormEditor
延伸FormEditor。 - FormEditor的每一頁擴展FormPage(即MyXMLFormPage擴展FormPage)。
- 在FormEditor和實際的XML文件之間我維護着JDOM模型。
- 另外我實現了髒標誌處理。因此,用戶輸入到表單編輯器的內容將保存到JDOM中,直到用戶按下Save按鈕。當用戶按下保存按鈕時,JDOM被寫入/序列化成XML文件。
在以上功能的編輯,我想實現撤銷/重做功能如下:
當編輯器髒了(用戶改變的東西到表單編輯器並沒有保存)撤消操作應恢復表單編輯器以及JDOM到其原始狀態(即編輯器非骯髒時的狀態)和重做操作中的更改應該再次將更改帶回到FormEditor中,以及JDOM和編輯器應該變髒。
以下是我的代碼片斷
MyXMLFormEditor.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;
}
}
MyXMLFormPage的.java
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的現有撤銷/重做框架,那將是一件好事。
你可以看看gef的例子 - 它基本上使用命令模式,如果我沒有記錯的話,相關的類名也是CommandStack – Scorpion
,看起來像是http://stackoverflow.com/questions/14120203/how-to -implement-undo-redo-functionality-into-eclipse-formeditor – Scorpion
此處的代碼似乎是@Scorpion突出顯示的重複問題中的內容的確切副本。這個問題的答案是不是令人滿意?你應該回答原來的問題。 –