java - Eclipse AbstractTextEditor 不可编辑
问题描述
我正在编写一个 Eclipse 插件,为此我需要一个自定义的 TextEditor。TextEditor 的内容应该是从自定义 xml 结构中提取的文本。我已经完成了所有数据提取,但现在我正在为向我的 TextEditor 提供文本的任务而苦苦挣扎。我实际上可以设置一些要显示的文本并且一切正常,问题是我无法编辑它。到目前为止我的编辑器代码:
Foo编辑器:
package fooeditor.editor;
import org.eclipse.ui.texteditor.AbstractTextEditor;
public class FooEditor extends AbstractTextEditor {
public FooEditor() {
super();
setSourceViewerConfiguration(new FooSourceViewerConfiguration());
setDocumentProvider(new FooDocumentProvider());
}
}
FooSourceViewerConfiguration:包 fooeditor.editor;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
public class FooSourceViewerConfiguration extends SourceViewerConfiguration {
public FooSourceViewerConfiguration() {
}
}
FooDocumentProvider:包 fooeditor.editor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentPartitioner;
import org.eclipse.jface.text.rules.DefaultPartitioner;
import org.eclipse.jface.text.rules.FastPartitioner;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.AbstractDocumentProvider;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.IElementStateListener;
public class FooDocumentProvider extends AbstractDocumentProvider {
IDocumentPartitioner partitioner;
/**
*
*/
public FooDocumentProvider() {
super();
partitioner = new FastPartitioner(new FooPartitionScanner(), null);
}
@Override
protected IDocument createDocument(Object element) throws CoreException {
if (element instanceof FileEditorInput) {
IDocument document = new Document();
document.set("hi");
document.setDocumentPartitioner(partitioner);
return document;
} else {
throw new CoreException(null);
}
}
@Override
protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {
// TODO Auto-generated method stub
return null;
}
@Override
protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite)
throws CoreException {
// TODO Auto-generated method stub
}
@Override
protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {
// TODO Auto-generated method stub
return null;
}
}
FooPartitionScanner:包 fooeditor.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.IPartitionTokenScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
import org.eclipse.jface.text.rules.Token;
public class FooPartitionScanner extends RuleBasedPartitionScanner implements IPartitionTokenScanner {
public FooPartitionScanner() {
super();
List rules = new ArrayList();
IPredicateRule[] result = new IPredicateRule[rules.size()];
rules.toArray(result);
setPredicateRules(result);
}
}
解决方案
AbstractTextEditor
根据isEditable
方法的结果设置文本是否可编辑。这个的默认代码是:
@Override
public boolean isEditable() {
IDocumentProvider provider= getDocumentProvider();
if (provider instanceof IDocumentProviderExtension) {
IDocumentProviderExtension extension= (IDocumentProviderExtension) provider;
return extension.isModifiable(getEditorInput());
}
return false;
}
AbstractDocumentProvider
您正在扩展的确实实现了IDocumentProviderExtension
,但默认实现isModifiable
是:
@Override
public boolean isModifiable(Object element) {
return false;
}
所以你需要覆盖它(或者看看 using StorageDocumentProvider
)。
推荐阅读
- c++ - 初始化结构数组 - C++
- javascript - 使用 javascript 在正文中查找乱码
- javascript - Angular FxFlex Layout MediaOberver - 根据给定的 div 计算活动宽度?
- gradle - 如何在 gradle 任务中从依赖 jar 中引用资源文件?
- aws-lambda - AWS Lambda 函数短暂监听来自 Thing 的 MQTT 消息
- laravel - Eloquent 模型 getRawOriginal() 在“更新”观察者中返回新值
- javascript - 'vue-stars' 星星没有加载到视图中
- sql - 如何在 Postgres 中使用 ON CONFLICT UPDATE 子句插入多条记录?
- html - 电子邮件设计:背景图片上的文字
- javascript - 在 MongoDB 中保持文本格式