【问题标题】:Set compare editor as readonly将比较编辑器设置为只读
【发布时间】:2019-12-06 07:30:30
【问题描述】:

我正在开发一个 Eclipse 插件,我需要应用程序的每个编辑器都是只读的,具体取决于所包含文件的 路径(相对于项目)。

我已经创建了自己的编辑器类,并且能够重写一些方法来获得我想要的:

public class MyTextEditor extends TextEditor {

    /**
     * Overridden to inhibit the replace action in find&replace dialog.
     */
    @Override
    public boolean isEditorInputModifiable() {
        if (!super.isEditorInputModifiable()) {
            return false;
        }

        return Utils.checkEditorInputModifiable(getEditorInput());
    }

    /**
     * Overridden to inhibit any user edit in the editor input.
     */
    @Override
    public boolean isEditable() {
        if (!super.isEditable()) {
            return false;
        }

        return Utils.checkEditorInputModifiable(getEditorInput());
    }

How to make read only editor in Eclipse (Eclipse Plugin Development)

但问题是:如何在比较编辑器上做到这一点?

eclipse 在每个比较对话框中使用的编辑器是不同的编辑器,我可以使用我的内容 ContentMergeViewer 并将 compareConfiguration 设置为只读(在一侧或两侧)但这还不够。每边的 compareInput 应该是只读的!

或者有没有其他更方便的方法来实现我想要的??

谢谢!

【问题讨论】:

  • “不够”怎么办?在 CompareConfiguration 上调用 setLeftEditable(false) 和 setRightEditable(false) 看起来会停止编辑。
  • 这还不够......比较中间的两个小箭头将消失在只读的一侧......所以没关系。但是顶部栏上用于将差异从一侧复制到另一侧的按钮仍然启用!您必须在比较输入对象上实现IEditableContent 接口,即 isEditable() 方法。我在自定义比较对话框上做了,但在这种情况下,Eclipse 使用它自己的对话框并比较基础结构..所以我现在不知道该怎么做..

标签: eclipse eclipse-rcp


【解决方案1】:

我有一个可能的解决方案:您可以扩展 TextMergeViewer 并覆盖一些方法来“即时”检查文件路径:

public abstract class AbstractMergeViewer extends TextMergeViewer {
     /**
     * Overridden to check if the editor input is modifiable.
     * 
     * @see {@link TextMergeViewer#setEditable(ISourceViewer sourceViewer, boolean state)}
     */
    @Override
    protected void setEditable(ISourceViewer sourceViewer, boolean state) {
        if (!Utils.checkEditorInputModifiable(getEditorInput(sourceViewer))) {
            state = false;
        }
        super.setEditable(sourceViewer, state);
    }

    /**
     * Return a custom implementation of a {@link MergeViewerContentProvider},
     * to check if the content is modifiable.
     */
    public IContentProvider getContentProvider() {
        return new MASMergeViewerContentProvider(getCompareConfiguration());
    }
}

contentProvider 也必须扩展:

public class MyMergeViewerContentProvider extends MergeViewerContentProvider {

    /**
     * Check if the left content is modifiable, with
     * {@link Utils#checkResourceModifiable}.
     * 
     * @see org.eclipse.compare.internal.MergeViewerContentProvider#isLeftEditable(java.lang.Object)
     */
    @Override
    public boolean isLeftEditable(Object element) {
        if (element instanceof ICompareInput) {
            Object left = ((ICompareInput) element).getLeft();
            if (left instanceof LocalResourceTypedElement) {
                LocalResourceTypedElement res = (LocalResourceTypedElement) left;
                if (!Utils.checkResourceModifiable(res.getResource())) {
                    return false;
                }
            }
        }
        return super.isLeftEditable(element);
    }

    /**
     * Check if the right content is modifiable, with
     * {@link Utils#checkResourceModifiable}.
     * 
     * @see org.eclipse.compare.internal.MergeViewerContentProvider#isRightEditable(java.lang.Object)
     */
    @Override
    public boolean isRightEditable(Object element) {
        if (element instanceof ICompareInput) {
            Object right = ((ICompareInput) element).getRight();
            if (right instanceof LocalResourceTypedElement) {
                LocalResourceTypedElement res = (LocalResourceTypedElement) right;
                if (!Utils.checkResourceModifiable(res.getResource())) {
                    return false;
                }
            }
        }
        return super.isRightEditable(element);
    }

这样比较对话框中的所有图形元素都具有正确的状态(如果文件是只读的,则禁用)。 MergeViewerContentProvider 是一个内部类,不应该扩展.. 但是我还没有找到其他解决方案。

MergeViewer 可以通过扩展点应用于 contentType org.eclipse.compare.contentMergeViewers

现在我有另一个问题:如果 contentType 不是我定义的,Eclipse 使用它自己的比较编辑器实现,而不是我的。 我应该提出一个新问题吗?

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多