Skip to content

Commit 8c37275

Browse files
committed
Merge pull request #154 from adangel:issue-153-swt-resource-not-disposed
Dispose rule priority images from general preferences page #154
2 parents 9d3c40c + 1a29e91 commit 8c37275

File tree

5 files changed

+41
-11
lines changed

5 files changed

+41
-11
lines changed

ReleaseNotes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ This is a minor release.
1616
### Fixed Issues
1717

1818
* [#150](https://github.com/pmd/pmd-eclipse-plugin/issues/150): Error executing command ReviewCode: java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index
19+
* [#153](https://github.com/pmd/pmd-eclipse-plugin/issues/153): Not properly disposed SWT resource
1920

2021
### API Changes
2122

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/BasicTableLabelProvider.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
package net.sourceforge.pmd.eclipse.ui;
66

7+
import java.util.ArrayList;
8+
import java.util.List;
9+
710
import org.eclipse.swt.graphics.Image;
811
import org.eclipse.swt.widgets.Table;
912

@@ -15,9 +18,10 @@
1518
*/
1619
public class BasicTableLabelProvider extends AbstractTableLabelProvider {
1720

18-
private final ItemColumnDescriptor[] columns;
21+
private final ItemColumnDescriptor<?, ?>[] columns;
22+
private final List<Image> imagesToBeDisposed = new ArrayList<>();
1923

20-
public BasicTableLabelProvider(ItemColumnDescriptor[] theColumns) {
24+
public BasicTableLabelProvider(ItemColumnDescriptor<?, ?>[] theColumns) {
2125
columns = theColumns;
2226
}
2327

@@ -26,20 +30,32 @@ public boolean isLabelProperty(Object element, String property) {
2630
}
2731

2832
public Image getColumnImage(Object element, int columnIndex) {
29-
30-
return columns[columnIndex].imageFor(element);
33+
ItemColumnDescriptor itemColumnDescriptor = columns[columnIndex];
34+
Image image = itemColumnDescriptor.imageFor(element);
35+
if (image != null && itemColumnDescriptor.shouldImageBeDisposed()) {
36+
imagesToBeDisposed.add(image);
37+
}
38+
return image;
3139
}
3240

3341
public String getColumnText(Object element, int columnIndex) {
34-
35-
Object value = columns[columnIndex].textFor(element);
42+
ItemColumnDescriptor itemColumnDescriptor = columns[columnIndex];
43+
Object value = itemColumnDescriptor.textFor(element);
3644
return value == null ? null : value.toString();
3745
}
3846

3947
public void addColumnsTo(Table table) {
40-
41-
for (ItemColumnDescriptor desc : columns) {
48+
for (ItemColumnDescriptor<?, ?> desc : columns) {
4249
desc.buildTableColumn(table);
4350
}
4451
}
52+
53+
@Override
54+
public void dispose() {
55+
super.dispose();
56+
for (Image image : imagesToBeDisposed) {
57+
image.dispose();
58+
}
59+
imagesToBeDisposed.clear();
60+
}
4561
}

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/ItemColumnDescriptor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ItemColumnDescriptor<T extends Object, V extends Object> extends Ab
2222

2323
private final ItemFieldAccessor<T, V> accessor;
2424
private final ValueFormatter[] formatters;
25+
private boolean shouldImageBeDisposed;
2526

2627
public ItemColumnDescriptor(String theId, String labelKey, int theAlignment, int theWidth, boolean resizableFlag,
2728
ItemFieldAccessor<T, V> theAccessor) {
@@ -36,6 +37,15 @@ public ItemColumnDescriptor(String theId, String labelKey, int theAlignment, int
3637
formatters = theFormatters;
3738
}
3839

40+
public ItemColumnDescriptor<T, V> disposeImage() {
41+
shouldImageBeDisposed = true;
42+
return this;
43+
}
44+
45+
public boolean shouldImageBeDisposed() {
46+
return shouldImageBeDisposed;
47+
}
48+
3949
public T valueFor(V item) {
4050
return accessor.valueFor(item);
4151
}

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/priority/PriorityColumnUI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public Image imageFor(RulePriority priority) {
7676
// PriorityColumnDescriptor size = new PriorityColumnDescriptor("", StringKeys.PRIORITY_COLUMN_SIZE, SWT.RIGHT, 25,
7777
// true, sizeAcc);
7878
ItemColumnDescriptor<Image, RulePriority> IMAGE = new ItemColumnDescriptor<Image, RulePriority>("",
79-
StringKeys.PRIORITY_COLUMN_SYMBOL, SWT.CENTER, 25, true, IMAGE_ACC);
79+
StringKeys.PRIORITY_COLUMN_SYMBOL, SWT.CENTER, 25, true, IMAGE_ACC).disposeImage();
8080
// PriorityColumnDescriptor color = new PriorityColumnDescriptor("", StringKeys.PRIORITY_COLUMN_COLOR, SWT.RIGHT,
8181
// 25, true, colorAcc);
8282
// PriorityColumnDescriptor description = new PriorityColumnDescriptor("", StringKeys.PRIORITY_COLUMN_DESC,

net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/priority/PriorityDescriptor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,9 @@ private Image createImage(final int size) {
224224
}
225225

226226
/**
227-
* Gets the marker image in a specific size. The image is cached and reused.
227+
* Gets the marker image in a specific size. The image is cached and reused while the PMD Plugin is
228+
* active. It is disposed automatically, when the PMD Plugin is disposed.
229+
*
228230
* @param size
229231
* @return
230232
*/
@@ -242,7 +244,8 @@ public Image getImage(int size) {
242244
* the priority descriptor is changed, but not persisted yet. The cached image returned by
243245
* {@link #getAnnotationImage()} would not reflect that change and a preview is not possible.
244246
*
245-
* <p>The image is not cached.
247+
* <p>The image is not cached. The returned image must be disposed manually.
248+
*
246249
* @return
247250
*/
248251
public Image createImage() {

0 commit comments

Comments
 (0)