我目前正在开发一个Eclipse插件,该插件可以为代码行以及花括号等着色。

我让一切动态地进行工作,即如果代码被更改,则线条颜色也会相应地更新。

但是,一旦线条着色,经过一秒钟的回合,它就会“重置”并去除所有颜色。

这是事件侦听器,用于检查用户的源代码是否已被修改。

    private void textModifiedListener() {
    for (IEditorPart editorPart : getCurrentEditorParts()) {
        editorText = editorPart.getAdapter(Control.class);
        if (editorText instanceof StyledText) {
            styledText = (StyledText) editorText;
            styledText.addModifyListener(new ModifyListener() {
                @Override
                public void modifyText(ModifyEvent event) {
                    //Source Code Modified.
                    Colour();
                }
            });
        }
    }
}


然后我像这样给单个字符上色:

    public void ColourCharacter(ColourObject colourOject, int characterIndex) {
    /* Given the colour and the character index, colour the given brace. */
    if (isColouringEnabled) {
        System.out.println("[ColourCode]:\tColourCharacter.");
        style = new StyleRange();
        style.start = characterIndex;
        style.length = 1;
        style.background = new Color(Display.getCurrent(), colourOject.getRed(), colourOject.getGreen(), colourOject.getBlue());
        if (editorText instanceof StyledText) {
            styledText.setStyleRange(style);
        }
    }
}


这些方法用于获取IEditorParts。

    /* Obtain the current workbench window. */
public synchronized static IWorkbenchWindow getActiveWorkbenchWindow() {
    return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
}

/* Obtain the current editor reference. */
public synchronized static IEditorReference[] getCurrentEditorReferences() {
    return getActiveWorkbenchWindow().getActivePage().getEditorReferences();
}

/* Obtain the current editor parts. */
public synchronized List<IEditorPart> getCurrentEditorParts() {
    List<IEditorPart> editorParts = new ArrayList<IEditorPart>();
    for (IEditorReference editorReference : getCurrentEditorReferences()) {
        IEditorPart editor = editorReference.getEditor(true);
        if (editor != null) {
            editorParts.add(editor);
        }
    }
    return editorParts;
}


我已经整天呆在这个问题上了。任何帮助将不胜感激。

最佳答案

现有的大多数编辑器都有自己的样式来管理他们要管理的文本。这通常使用JFace SourceViewerConfigurationReconcilerPresentationReconcilerIPresentationDamagerIPresentationRepairer类。

您不能只是尝试覆盖这样的样式。编辑器完全控制文本的样式,将忽略您所做的任何更改。例如,Reconciler在后台运行,每半秒更新一次。

您必须查看特定的编辑器,并查看它提供了哪些功能来添加到其样式系统中。

如果您只想标记错误和警告,则可以使用IMarker界面。

08-18 04:02