BSa*_*nke 5 java xml eclipse eclipse-plugin
我正在开发一个多页面编辑器,用于在Eclipse中编辑/创建自定义XML文件.
实现类是MyXMLFormEditor,它扩展了FormEditor.
FormEditor的每一页都扩展了FormPage(即MyXMLFormPage扩展FormPage).
在FormEditor和实际的XML文件之间我维护着JDOM模型.
我也实现了脏标志处理.因此,用户对表单编辑器的输入将保存到JDOM中,直到用户按下"保存"按钮为止.当用户按下保存按钮时,JDOM被写入/序列化为XML文件.
在具有上述功能的编辑器中,我想实现undo/redo功能,如下所示:
以下是我的代码段:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
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");
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供有关如何在FormEditor中实现撤消/重做功能的指针/示例吗?如果该方法使用Eclipse PDE或工作台的现有撤消/重做框架,那将是很好的.
您需要阅读以下资源。这可能看起来像是额外的工作,但相信我,您的工作会容易得多,而且这些文章并不长。
您需要执行的基本步骤是:
1) 在编辑器中添加用于撤消/重做操作的操作处理程序
@Override
public void init(IEditorSite site, IEditorInput editorInput) {
...
UndoRedoActionGroup historyActionGroup = new UndoRedoActionGroup(editorSite, myUndoContext, true);
historyActionGroup.fillActionBars(editorSite.getActionBars());
}
Run Code Online (Sandbox Code Playgroud)
如果您正在思考什么是myUndoContext,您会通过阅读第一篇文章而知道这一点。
2)IUndoableOperation为用户可以对您的数据进行的不同类型的修改创建您自己的实现。如果它仅依赖于诸如 XPath->“新值”或 id->“新值”之类的内容,那么它可能是处理所有修改的单个操作。或者,您可以使用一系列不同的操作来修改每种类型的数据模型。由你决定。
3)仅通过您创建的操作对数据进行每一次修改
MyDataModifyingOperation op = new MyDataModifyingOperation(xpath, newValue, oldValue);
op.addContext(myUndoContext);
IStatus status = OperationHistoryFactory.getOperationHistory().execute(operation, null, null);
Run Code Online (Sandbox Code Playgroud)
一旦你掌握了基本的东西,你将需要查看一些其他高级的东西,比如在数据模型上添加某种更改侦听机制,以便当撤消/重做修改数据时,你可以更新 UI。此外,在大多数情况下,最好在执行操作时记录 UI 选择状态,以便在撤消或后续重做时可以将选择恢复到已修改的元素,以便用户立即识别出 Ctrl+z/Ctrl 时发生的更改+y 被按下。
| 归档时间: |
|
| 查看次数: |
3828 次 |
| 最近记录: |