Skip to content

Commit bc849cc

Browse files
Show problem status in editor icon
1 parent e6bfd03 commit bc849cc

File tree

8 files changed

+389
-0
lines changed

8 files changed

+389
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package ts.eclipse.ide.jsdt.internal.ui;
2+
3+
import org.eclipse.jface.resource.ImageDescriptor;
4+
import org.eclipse.jface.resource.JFaceResources;
5+
import org.eclipse.jface.viewers.DecorationOverlayIcon;
6+
import org.eclipse.swt.graphics.Image;
7+
import org.eclipse.ui.ISharedImages;
8+
import org.eclipse.ui.PlatformUI;
9+
import org.eclipse.ui.plugin.AbstractUIPlugin;
10+
import org.osgi.framework.Bundle;
11+
12+
/**
13+
* Image registry for JSDT TypeScript UI plugin.
14+
*/
15+
public enum JSDTTypeScriptUIImages {
16+
17+
TSFILE("icons/full/obj16/ts.png"),
18+
19+
TSFILE_W_ERROR(TSFILE, null, null, getSharedImageDescriptor(ISharedImages.IMG_DEC_FIELD_ERROR), null),
20+
21+
TSFILE_W_WARNING(TSFILE, null, null, getSharedImageDescriptor(ISharedImages.IMG_DEC_FIELD_WARNING), null),
22+
23+
;
24+
25+
private JSDTTypeScriptUIImages(String path) {
26+
Bundle bundle = JSDTTypeScriptUIPlugin.getDefault().getBundle();
27+
ImageDescriptor descr = AbstractUIPlugin.imageDescriptorFromPlugin(bundle.getSymbolicName(), path);
28+
JFaceResources.getImageRegistry().put(key(), descr);
29+
}
30+
31+
private JSDTTypeScriptUIImages(JSDTTypeScriptUIImages base, ImageDescriptor tlOverlay, ImageDescriptor trOverlay,
32+
ImageDescriptor blOverlay, ImageDescriptor brOverlay) {
33+
ImageDescriptor descr = new DecorationOverlayIcon(base.get(),
34+
new ImageDescriptor[] { tlOverlay, trOverlay, blOverlay, brOverlay });
35+
JFaceResources.getImageRegistry().put(key(), descr);
36+
}
37+
38+
private static ImageDescriptor getSharedImageDescriptor(String key) {
39+
return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(key);
40+
}
41+
42+
private String key() {
43+
return JSDTTypeScriptUIImages.class.getName() + "." + name();
44+
}
45+
46+
/**
47+
* Gets the image object associated with this image type.
48+
*
49+
* @return
50+
*/
51+
public Image get() {
52+
return JFaceResources.getImageRegistry().get(key());
53+
}
54+
55+
/**
56+
* Gets the image descriptor object associated with this image type.
57+
*
58+
* @return
59+
*/
60+
public ImageDescriptor getDescriptor() {
61+
return JFaceResources.getImageRegistry().getDescriptor(key());
62+
}
63+
64+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package ts.eclipse.ide.jsdt.internal.ui.editor;
2+
3+
import java.util.Objects;
4+
import java.util.Set;
5+
6+
import org.eclipse.core.resources.IMarker;
7+
import org.eclipse.core.resources.IResource;
8+
import org.eclipse.core.runtime.CoreException;
9+
import org.eclipse.swt.graphics.Image;
10+
import org.eclipse.ui.IEditorInput;
11+
12+
import ts.eclipse.ide.core.TypeScriptCorePlugin;
13+
import ts.eclipse.ide.core.resources.problems.IProblemChangeListener;
14+
import ts.eclipse.ide.jsdt.internal.ui.JSDTTypeScriptUIImages;
15+
import ts.eclipse.ide.jsdt.internal.ui.JSDTTypeScriptUIPlugin;
16+
17+
final class ProblemTickUpdater {
18+
19+
private final TypeScriptEditor editor;
20+
private final IProblemChangeListener problemChangeListener;
21+
22+
ProblemTickUpdater(TypeScriptEditor editor) {
23+
this.editor = Objects.requireNonNull(editor);
24+
this.problemChangeListener = new IProblemChangeListener() {
25+
@Override
26+
public void problemsChanged(Set<IResource> changedResources) {
27+
handleChangedProblems(changedResources);
28+
}
29+
};
30+
TypeScriptCorePlugin.getProblemManager().addProblemChangedListener(problemChangeListener);
31+
}
32+
33+
void dispose() {
34+
TypeScriptCorePlugin.getProblemManager().removeProblemChangedListener(problemChangeListener);
35+
}
36+
37+
public void update() {
38+
updateTitleImageForResource(getEditorInputResource());
39+
}
40+
41+
private void handleChangedProblems(Set<IResource> changedResources) {
42+
IResource inputResource = getEditorInputResource();
43+
if (changedResources.contains(inputResource)) {
44+
updateTitleImageForResource(inputResource);
45+
}
46+
}
47+
48+
private IResource getEditorInputResource() {
49+
IEditorInput input = editor.getEditorInput();
50+
if (input == null) {
51+
return null;
52+
}
53+
return input.getAdapter(IResource.class);
54+
}
55+
56+
private void updateTitleImageForResource(IResource resource) {
57+
if (resource == null || !resource.isAccessible()) {
58+
editor.updateTitleImage(null);
59+
return;
60+
}
61+
62+
// Determine the current maximum problem severity
63+
int severity;
64+
try {
65+
severity = resource.findMaxProblemSeverity(IMarker.PROBLEM, true, 0);
66+
} catch (CoreException e) {
67+
JSDTTypeScriptUIPlugin.log(e);
68+
return;
69+
}
70+
71+
// Prepare the image
72+
Image image;
73+
if (severity == IMarker.SEVERITY_ERROR) {
74+
image = JSDTTypeScriptUIImages.TSFILE_W_ERROR.get();
75+
} else if (severity == IMarker.SEVERITY_WARNING) {
76+
image = JSDTTypeScriptUIImages.TSFILE_W_WARNING.get();
77+
} else {
78+
image = JSDTTypeScriptUIImages.TSFILE.get();
79+
}
80+
81+
editor.updateTitleImage(image);
82+
}
83+
84+
}

eclipse/jsdt/ts.eclipse.ide.jsdt.ui/src/ts/eclipse/ide/jsdt/internal/ui/editor/TypeScriptEditor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.eclipse.jface.viewers.SelectionChangedEvent;
5757
import org.eclipse.swt.SWT;
5858
import org.eclipse.swt.custom.StyledText;
59+
import org.eclipse.swt.graphics.Image;
5960
import org.eclipse.swt.widgets.Composite;
6061
import org.eclipse.ui.IEditorInput;
6162
import org.eclipse.ui.IWindowListener;
@@ -182,6 +183,13 @@ public void selectionChanged(SelectionChangedEvent event) {
182183
*/
183184
private TypeScriptContentOutlinePage contentOutlinePage;
184185

186+
private final ProblemTickUpdater problemTickUpdater;
187+
188+
public TypeScriptEditor() {
189+
super();
190+
this.problemTickUpdater = new ProblemTickUpdater(this);
191+
}
192+
185193
protected ActionGroup getActionGroup() {
186194
return fActionGroups;
187195
}
@@ -291,6 +299,8 @@ public void editorContextMenuAboutToShow(IMenuManager menu) {
291299
public void dispose() {
292300
super.dispose();
293301

302+
problemTickUpdater.dispose();
303+
294304
if (fActionGroups != null) {
295305
fActionGroups.dispose();
296306
fActionGroups = null;
@@ -308,6 +318,10 @@ public void dispose() {
308318
}
309319
}
310320

321+
void updateTitleImage(Image titleImage) {
322+
setTitleImage(titleImage);
323+
}
324+
311325
@Override
312326
protected void initializeEditor() {
313327
super.initializeEditor();
@@ -856,6 +870,7 @@ private Object getLockObject(IAnnotationModel annotationModel) {
856870
@Override
857871
protected void doSetInput(IEditorInput input) throws CoreException {
858872
super.doSetInput(input);
873+
problemTickUpdater.update();
859874
configureToggleCommentAction();
860875
// try {
861876
// //IDocument document = getSourceViewer().getDocument();

eclipse/ts.eclipse.ide.core/META-INF/MANIFEST.MF

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Export-Package: ts.eclipse.ide.core,
3131
ts.eclipse.ide.core.resources,
3232
ts.eclipse.ide.core.resources.buildpath,
3333
ts.eclipse.ide.core.resources.jsconfig,
34+
ts.eclipse.ide.core.resources.problems,
3435
ts.eclipse.ide.core.resources.watcher,
3536
ts.eclipse.ide.core.tslint,
3637
ts.eclipse.ide.core.utils

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/core/TypeScriptCorePlugin.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323
import ts.eclipse.ide.core.nodejs.INodejsInstallManager;
2424
import ts.eclipse.ide.core.repository.IIDETypeScriptRepositoryManager;
2525
import ts.eclipse.ide.core.resources.ITypeScriptElementChangedListener;
26+
import ts.eclipse.ide.core.resources.problems.IProblemManager;
2627
import ts.eclipse.ide.core.resources.watcher.IResourcesWatcher;
2728
import ts.eclipse.ide.internal.core.nodejs.NodejsInstallManager;
2829
import ts.eclipse.ide.internal.core.repository.IDETypeScriptRepositoryManager;
2930
import ts.eclipse.ide.internal.core.resources.IDEResourcesManager;
31+
import ts.eclipse.ide.internal.core.resources.problems.ProblemManager;
3032
import ts.eclipse.ide.internal.core.resources.watcher.ResourcesWatcher;
3133
import ts.resources.ConfigurableTypeScriptResourcesManager;
3234

@@ -126,6 +128,10 @@ public static IResourcesWatcher getResourcesWatcher() {
126128
return ResourcesWatcher.getInstance();
127129
}
128130

131+
public static IProblemManager getProblemManager() {
132+
return ProblemManager.getInstance();
133+
}
134+
129135
public void addTypeScriptElementChangedListener(ITypeScriptElementChangedListener listener) {
130136
IDEResourcesManager.getInstance().addTypeScriptElementChangedListener(listener);
131137
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ts.eclipse.ide.core.resources.problems;
2+
3+
import java.util.Set;
4+
5+
import org.eclipse.core.resources.IResource;
6+
7+
/**
8+
* Listener that is notified after changes occur in the TypeScript problems of
9+
* workspace resources.
10+
*/
11+
public interface IProblemChangeListener {
12+
13+
/**
14+
* Called when problems change.
15+
*
16+
* @param changedResources
17+
* set of resources on which problems have changed. This also
18+
* includes containers where the <i>combined</i> problem status
19+
* may have changed because of changes in the contained files or
20+
* sub-containers.
21+
*/
22+
public void problemsChanged(Set<IResource> changedResources);
23+
24+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ts.eclipse.ide.core.resources.problems;
2+
3+
/**
4+
* Manager for getting updates about the global state of TypeScript problems on
5+
* workspace resources.
6+
*/
7+
public interface IProblemManager {
8+
9+
/**
10+
* Adds a listener to be notified when problems change on workspace
11+
* resources.
12+
*
13+
* @param listener
14+
* listener to notify.
15+
*/
16+
public void addProblemChangedListener(IProblemChangeListener listener);
17+
18+
/**
19+
* Removes a problem change listener previously added via
20+
* {@link #addProblemChangedListener}.
21+
*
22+
* @param listener
23+
* listener to remove.
24+
*/
25+
public void removeProblemChangedListener(IProblemChangeListener listener);
26+
27+
}

0 commit comments

Comments
 (0)