0

Eclipse 用の JDT およびその他のプラグインは、エディタのタイトル イメージを問題のステータス (コンパイル エラーなど) で装飾します。私のプラグインでは、その動作を模倣したいと考えています。

ただし、ソースを見ると、JDT は装飾を行うために多くの余分な処理を行っているようです。

Decorators、特に軽量の同上は、アイコンの装飾を行う便利な方法ですが、エディターのタイトル画像に対してプログラムで有効にする方法が見つかりません。(そして、プラグインにすべての JDT UI を取り込みたくはありません...)

そのような方法はありますか、それとも独自の ILabelProvider を実装する必要がありますか?

public void updatedTitleImage(Image image) {
    setTitleImage(image);
}

JavaEditor のように?

4

2 に答える 2

1

エディターのタイトル画像でデコレーターを使用する方法はないようです (少なくとも 3.7 以降)。

最終的に、IResourceChangeListener インターフェイス (マーカーがいつ変更されたかを調べるため) を実装する EditorLabelUpdator を作成しました。基本的にはresourceChanged()メソッドです。次に、OverlayImageIcon のパターンから構築された単純なデコレータ タイプのクラスを使用します (Google で多くの例を見つけることができます)。

コンストラクターはエディターの初期化から呼び出され、リソースとそのタイトル アイコンを取得するために保存されるパラメーターとしてエディターを送信します。

また、エディターは、タイトル アイコンの更新をトリガーするコールバック メソッド ( updatedTitleImage(Image image) ) で修正する必要がありました。

これは私が得たコードの核心です:

public void resourceChanged(IResourceChangeEvent event) {
    if (isMarkerChangeForResource(event, editor)) {
        /* Changes in markers on this resource, so re-decorate title image */
        decorate();
    }
}

private boolean isMarkerChangeForResource(IResourceChangeEvent event, AlanEditor editor) {
    boolean isMarkerChangeForThisResource;
    final IResource resource = ResourceUtil.getResource(editor.getEditorInput());
    final IPath path = resource.getFullPath();
    IResourceDelta delta = event.getDelta().findMember(path);
    isMarkerChangeForThisResource = (delta != null) && ((delta.getFlags() & IResourceDelta.MARKERS) != 0);
    return isMarkerChangeForThisResource;
}

public void decorate() {
    Shell shell = editor.getEditorSite().getShell();
    if (shell != null && !shell.isDisposed()) {
        shell.getDisplay().syncExec(new Runnable() {
            public void run() {
                Image decoratedImage = decorateImage(editor.getTitleImage(), getSeverity());
                editor.updatedTitleImage(decoratedImage);
            }
        });
    }
}

private Image decorateImage(Image titleImage, int severity) {
    final ImageRegistry registry = AlanIDEPlugin.getDefault().getImageRegistry();
    String key = createKey(severity);
    ImageDescriptor descriptor = AlanIDEPlugin.getImageDescriptor(key);
    if (descriptor != null)
        return descriptor.createImage();

    OverlayImageDescriptor overlayImageDescriptor = buildDecoratedImage(severity, key);
    registry.put(key, overlayImageDescriptor);
    return overlayImageDescriptor.createImage();
}

private String createKey(int severity) {
    String key;
    switch (severity) {
    case IMarker.SEVERITY_ERROR: key = EDITOR_TITLE_ICON + ".error"; break;
    case IMarker.SEVERITY_WARNING: key = EDITOR_TITLE_ICON + ".warning"; break;
    default: key = EDITOR_TITLE_ICON; break;
    }
    return key;
}

private OverlayImageDescriptor buildDecoratedImage(int severity, String key) {
    ImageDescriptor overlay = null;
    if (severity >= IMarker.SEVERITY_ERROR)
        overlay = AlanIDEPlugin.getImageDescriptor("ovr16.error_ovr");
    else if (severity == IMarker.SEVERITY_WARNING)
        overlay = AlanIDEPlugin.getImageDescriptor("ovr16.warning_ovr");
    ImageDescriptor baseImage = AlanIDEPlugin.getImageDescriptor(EDITOR_TITLE_ICON);
    OverlayImageDescriptor overlayIcon = new OverlayImageDescriptor(baseImage);

    if (overlay != null)
        overlayIcon.addOverlay(overlay, IDecoration.BOTTOM_LEFT);
    return overlayIcon;
}

private int getSeverity() {
    int severity = 0;
    try {
        final IResource resource = ResourceUtil.getResource(editor.getEditorInput());
        severity = resource.findMaxProblemSeverity(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
    } catch (CoreException e) {
        // Might be a project that is not open
    }
    return severity;
}

これは私が思いついた最も簡単な解決策でした。

于 2012-07-30T09:21:53.777 に答える
0

はい、それを実現するために使用できる拡張ポイントがあります。以下のコードを参照してください。

 <!--define the decorator -->
<extension point="org.eclipse.ui.decorators">
    <decorator
    adaptable="true"
    class="org.example.PackageExplorerDecorator"
    id="org.example.PackageExplorerDecorator"
    label="File Decorator"
    lightweight="true"
    state="true">
 <enablement>
    <or>
       <objectClass
             name="org.eclipse.jdt.core.IMethod">
       </objectClass>
       <objectClass
             name="org.eclipse.core.resources.IResource">
       </objectClass>
    </or>
 </enablement>

PackageExplorerDecorator の場合:extends LabelProvider implements ILightweightLabelDecorator

于 2012-07-20T14:42:23.817 に答える