Java Eclipse AbstractTextEditor不可编辑

Java Eclipse AbstractTextEditor不可编辑,java,eclipse,eclipse-plugin,Java,Eclipse,Eclipse Plugin,我正在写一个Eclipse插件,为此我需要一个自定义文本编辑器。 TextEditor的内容应该是从自定义xml结构中提取的文本。我已经完成了所有的数据提取,但是现在我正在努力为我的文本编辑器提供文本。 实际上,我可以设置一些要显示的文本,并且所有文本都可以工作,问题是我无法编辑它。 到目前为止,我的编辑器代码: 编辑: package fooeditor.editor; import org.eclipse.ui.texteditor.AbstractTextEditor; public

我正在写一个Eclipse插件,为此我需要一个自定义文本编辑器。 TextEditor的内容应该是从自定义xml结构中提取的文本。我已经完成了所有的数据提取,但是现在我正在努力为我的文本编辑器提供文本。 实际上,我可以设置一些要显示的文本,并且所有文本都可以工作,问题是我无法编辑它。 到目前为止,我的编辑器代码:

编辑:

package fooeditor.editor;

import org.eclipse.ui.texteditor.AbstractTextEditor;

public class FooEditor extends AbstractTextEditor {

    public FooEditor() {
    super();
    setSourceViewerConfiguration(new FooSourceViewerConfiguration());
    setDocumentProvider(new FooDocumentProvider());

}

}
FooSourceViewerConfiguration: 包foodeditor.editor

import org.eclipse.jface.text.source.SourceViewerConfiguration;

public class FooSourceViewerConfiguration extends SourceViewerConfiguration     {

    public FooSourceViewerConfiguration() {

}



}
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;
    }

}
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);

    }

}
FooDocumentProvider: 包foodeditor.editor

import org.eclipse.jface.text.source.SourceViewerConfiguration;

public class FooSourceViewerConfiguration extends SourceViewerConfiguration     {

    public FooSourceViewerConfiguration() {

}



}
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;
    }

}
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);

    }

}
FoodPartitionScanner: 包foodeditor.editor

import org.eclipse.jface.text.source.SourceViewerConfiguration;

public class FooSourceViewerConfiguration extends SourceViewerConfiguration     {

    public FooSourceViewerConfiguration() {

}



}
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;
    }

}
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的默认实现是:

因此,您需要覆盖此选项,或者考虑使用StorageDocumentProvider。

通常会扩展org.eclipse.ui.editors.text.TextEditor。。扩展AbstractTextEditor省去了StatusTextEditor、AbstractDecoratedTextEditor和TextEditor中的大量代码。