私はEclipseでカスタマイズされたXMLファイルを編集/作成するために複数ページのフォームエディタを開発しています。Eclipse FormEditorにアンドゥ/リドゥ機能を実装する方法は?
実装クラスは、FormEditorを拡張するMyXMLFormEditorです。
FormEditorの各ページは、FormPageを拡張します(MyXMLFormPageはFormPageを拡張します)。
FormEditorと実際のXMLファイルの間で、私はJDOMモデルを維持しています。
また、ダーティーフラグ処理を実装しました。ユーザがSaveボタンを押すまで、フォームエディタへの入力はJDOMに保存されます。ユーザーが保存ボタンを押すと、JDOMがXMLファイルに書き込まれ、シリアル化されます。
私は次のようにアンドゥ/リドゥ機能を実装したいと考え、上記の機能を持つエディタで
:エディタが汚れている場合は
- は、(ユーザーがフォームエディタに何かを変更し、それが保存されません)操作を元に戻しますフォームエディタとJDOMの変更を元の状態(つまり、エディタがダーティでない状態)に戻す必要があります。また、REDO操作によって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;
}
}
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");
}
}
の.java MyXMLFormPageは、誰もが私のアンドゥ/リドゥの実装方法のポインタ/サンプルを提供することができます機能をFormEditorに追加できますか? Eclipse PDEまたはワークベンチの既存の元に戻す/やり直しのフレームワークを使用するアプローチが良いのではないでしょうか。
あなたの質問を提示したやり方は、宿題のようですが、あなたが行ったコードスニペットを少し提供してください – exexzian