如何保存已通过 Eclipse 中的主详细信息块修改的文本文件?
How to save text file which has been modified through a Master Details Block in Eclipse?
我创建了一个包含文本编辑器页面和主详细信息块页面的多页面编辑器。在 Master Details 块中,我有一个列表,其中包含从文本文件中解析的条目。
这些文本文件具有以下结构:
myVar = 23423423;
SEARCH(myVar)
block
{
text = test;
}
当我点击其中一个条目时,例如 myVar
,将显示一个包含两种形式的详细信息块,一个用于变量名称的输入字段,一个用于相应值的输入字段。如果我通过此表单更改条目,相应的对象将被修改。但是,它不会将多页面编辑器标记为脏,也不会询问我是否要保存更改。 greg-449 ,我需要手动保存文件,所以我尝试了以下操作:
public class MyParser {
private MyModel model;
private long lastModified;
private IFile file;
public MyParser(FileEditorInput input) {
this.file = input.getFile();
this.lastModified = input.getFile().getModificationStamp();
parse();
}
private void parse() {
try {
InputStream in = file.getContents();
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
StringBuilder out = new StringBuilder();
String line;
List<MyField> variables = new ArrayList<MyField>();
while ((line = reader.readLine()) != null) {
String[] splittedLine = line.split("=");
if (splittedLine.length >= 2)
variables
.add(new MyVariable(splittedLine[0], splittedLine[1]));
// Implement other entry types
}
System.out.println(out.toString()); // Prints the string content
// read from input stream
reader.close();
this.setModel(new MyModel().add(variables, false));
} catch (CoreException | IOException ex) {
}
}
public void saveChanges() {
FileWriter writer = null;
try {
writer = new FileWriter(file.getLocation().toFile());
try {
saveChanges(writer);
} finally {
writer.close();
}
if (file != null) {
try {
file.refreshLocal(IResource.DEPTH_INFINITE,
new NullProgressMonitor());
} catch (CoreException e) {
}
}
} catch (IOException ex) {
}
}
public void saveChanges(Writer writer) {
//TODO
this.getModel().setDirty(false);
}
public long getLastModified() {
return this.lastModified;
}
public MyModel getModel() {
return model;
}
public void setModel(MyModel model) {
this.model = model;
}
如何将修改后的对象保存到原文件中?我需要完全覆盖文件还是可以只更改脏值?此外,文本文件中条目的顺序很重要。我需要记住行号吗,因为在文件中间某处添加新条目时可能会出现问题。
非常感谢任何帮助。
您必须替换文件的全部内容。使用 IFile.setContents
方法设置现有文件的内容。内容的顺序由您决定。
对于 FormEditor
调用 editorDirtyStateChanged()
告诉编辑器 'dirty' 状态已经改变。每个 IFormPage
都应适当地实现 isDirty
(或覆盖 FormEditor
isDirty
方法)。
如果脏状态是正确的,则会在编辑器标题中添加一个“*”。如果编辑器变脏,退出时也会显示 'do you want' 保存对话框。
我创建了一个包含文本编辑器页面和主详细信息块页面的多页面编辑器。在 Master Details 块中,我有一个列表,其中包含从文本文件中解析的条目。
这些文本文件具有以下结构:
myVar = 23423423;
SEARCH(myVar)
block
{
text = test;
}
当我点击其中一个条目时,例如 myVar
,将显示一个包含两种形式的详细信息块,一个用于变量名称的输入字段,一个用于相应值的输入字段。如果我通过此表单更改条目,相应的对象将被修改。但是,它不会将多页面编辑器标记为脏,也不会询问我是否要保存更改。 greg-449
public class MyParser {
private MyModel model;
private long lastModified;
private IFile file;
public MyParser(FileEditorInput input) {
this.file = input.getFile();
this.lastModified = input.getFile().getModificationStamp();
parse();
}
private void parse() {
try {
InputStream in = file.getContents();
BufferedReader reader = new BufferedReader(
new InputStreamReader(in));
StringBuilder out = new StringBuilder();
String line;
List<MyField> variables = new ArrayList<MyField>();
while ((line = reader.readLine()) != null) {
String[] splittedLine = line.split("=");
if (splittedLine.length >= 2)
variables
.add(new MyVariable(splittedLine[0], splittedLine[1]));
// Implement other entry types
}
System.out.println(out.toString()); // Prints the string content
// read from input stream
reader.close();
this.setModel(new MyModel().add(variables, false));
} catch (CoreException | IOException ex) {
}
}
public void saveChanges() {
FileWriter writer = null;
try {
writer = new FileWriter(file.getLocation().toFile());
try {
saveChanges(writer);
} finally {
writer.close();
}
if (file != null) {
try {
file.refreshLocal(IResource.DEPTH_INFINITE,
new NullProgressMonitor());
} catch (CoreException e) {
}
}
} catch (IOException ex) {
}
}
public void saveChanges(Writer writer) {
//TODO
this.getModel().setDirty(false);
}
public long getLastModified() {
return this.lastModified;
}
public MyModel getModel() {
return model;
}
public void setModel(MyModel model) {
this.model = model;
}
如何将修改后的对象保存到原文件中?我需要完全覆盖文件还是可以只更改脏值?此外,文本文件中条目的顺序很重要。我需要记住行号吗,因为在文件中间某处添加新条目时可能会出现问题。
非常感谢任何帮助。
您必须替换文件的全部内容。使用 IFile.setContents
方法设置现有文件的内容。内容的顺序由您决定。
对于 FormEditor
调用 editorDirtyStateChanged()
告诉编辑器 'dirty' 状态已经改变。每个 IFormPage
都应适当地实现 isDirty
(或覆盖 FormEditor
isDirty
方法)。
如果脏状态是正确的,则会在编辑器标题中添加一个“*”。如果编辑器变脏,退出时也会显示 'do you want' 保存对话框。