Bug 578696 - adjusts Sleak to show non-disposed widgets in diffs. Change-Id: I77ef5966fa2477ca3558d6248af51fc83e82d8a9 Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.swt/+/191044 Tested-by: Andrey Loskutov <loskutov@gmx.de> Reviewed-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/bundles/org.eclipse.swt.tools.spies/META-INF/MANIFEST.MF b/bundles/org.eclipse.swt.tools.spies/META-INF/MANIFEST.MF index 123f520..08b3d9e 100644 --- a/bundles/org.eclipse.swt.tools.spies/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.swt.tools.spies/META-INF/MANIFEST.MF
@@ -12,7 +12,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="3.4.0", org.eclipse.swt.tools.base;bundle-version="3.106.0", org.eclipse.e4.ui.model.workbench;bundle-version="2.1.400", - org.eclipse.swt;bundle-version="3.110.100", + org.eclipse.swt;bundle-version="3.119.0", org.eclipse.ui;bundle-version="3.113.0", org.eclipse.e4.ui.di;bundle-version="1.2.600" Automatic-Module-Name: org.eclipse.swt.tools.spies
diff --git a/bundles/org.eclipse.swt.tools.spies/src/org/eclipse/swt/tools/internal/Sleak.java b/bundles/org.eclipse.swt.tools.spies/src/org/eclipse/swt/tools/internal/Sleak.java index f64394f..8d9655d 100644 --- a/bundles/org.eclipse.swt.tools.spies/src/org/eclipse/swt/tools/internal/Sleak.java +++ b/bundles/org.eclipse.swt.tools.spies/src/org/eclipse/swt/tools/internal/Sleak.java
@@ -21,6 +21,7 @@ import org.eclipse.swt.*; import org.eclipse.swt.custom.*; import org.eclipse.swt.graphics.*; +import org.eclipse.swt.internal.WidgetSpy.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.widgets.List; @@ -38,7 +39,6 @@ Button enableTracking, diff, stackTrace, saveAs, save; Combo diffType; Text text; - Label label; String filterPath = ""; String fileName = "sleakout"; @@ -50,6 +50,8 @@ java.util.List<ObjectWithError> oldObjects = new ArrayList<> (); java.util.List<ObjectWithError> objects = new ArrayList<> (); + NonDisposedWidgetTracker nonDisposedWidgetTracker = new NonDisposedWidgetTracker(); + public static void main (String [] args) { DeviceData data = new DeviceData(); data.tracking = true; @@ -164,19 +166,17 @@ list = new List (left, SWT.BORDER | SWT.V_SCROLL); list.addListener (SWT.Selection, event -> refreshObject ()); - list.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, true)); - - label = new Label (left, SWT.WRAP); - label.setText ("0 object(s)"); - label.setLayoutData(new GridData(SWT.FILL, SWT.NONE, false, false)); + list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); stackTrace.setSelection (false); + filterNonDisposedWidgetTypes(); } private void toggleEnableTracking() { Display display = enableTracking.getDisplay(); boolean tracking = display.isTracking(); display.setTracking(!tracking); + setWidgetTrackingEnabled(tracking); } void refreshLabel (java.util.List<ObjectWithError> createdObjects, java.util.List<ObjectWithError> deletedObjects) { @@ -193,8 +193,7 @@ deletedAndCreated.distinct().sorted().forEach(type -> addCounts(sb, type, deleted.get(type), created.get(type))); String description = sb.length() > 0 ? sb.toString() : "0 object(s)"; - label.setText (description.strip()); - label.getParent().layout(); + list.setToolTipText(description); } static void addCounts (StringBuilder string, String type, Long deleted, Long created) { @@ -222,23 +221,29 @@ java.util.List<ObjectWithError> disposed = new ArrayList<>(); java.util.List<ObjectWithError> created = new ArrayList<>(); java.util.List<ObjectWithError> same = collectNewObjects(info, old, disposed, created); - + java.util.List<ObjectWithError> nonDisposedWidgets = getNonDisposedWidgets(); + created.addAll(nonDisposedWidgets); + resetNonDisposedWidgets(); if (diffType.getSelectionIndex() > 0) { - Iterator<ObjectWithError> object = created.iterator (); - while (object.hasNext ()) { - StackTraceElement stack = object.next ().getCreator (); - Iterator<ObjectWithError> equal = same.iterator (); - while (equal.hasNext ()) { - if (creatorEquals(stack, equal.next().getCreator ())) { - equal.remove (); - object.remove (); - break; + old.removeAll(same); + if (!old.isEmpty()) { + Iterator<ObjectWithError> createdIter = created.iterator (); + while (createdIter.hasNext ()) { + ObjectWithError createdObj = createdIter.next (); + StackTraceElement stack = createdObj.getCreator (); + Iterator<ObjectWithError> oldIter = old.iterator (); + while (oldIter.hasNext ()) { + ObjectWithError oldObj = oldIter.next(); + if (creatorEquals(stack, oldObj.getCreator ())) { + createdIter.remove (); + break; + } } } } } - + objects.clear(); objects.addAll(created); @@ -483,6 +488,28 @@ ((GridData)control.getLayoutData()).exclude = !visible; } +private void filterNonDisposedWidgetTypes() { + java.util.List<Class<? extends Widget>> trackedTypes = Arrays.asList( +// Composite.class, +// Menu.class + ); + nonDisposedWidgetTracker.setTrackedTypes(trackedTypes); +} + +private void setWidgetTrackingEnabled(boolean tracking) { + nonDisposedWidgetTracker.setTrackingEnabled(tracking); +} + +private java.util.List<ObjectWithError> getNonDisposedWidgets() { + java.util.List<ObjectWithError> nonDisposedWidgets = new ArrayList<>(); + nonDisposedWidgetTracker.getNonDisposedWidgets().forEach((w, e) -> nonDisposedWidgets.add(new ObjectWithError(w, e))); + return nonDisposedWidgets; +} + +private void resetNonDisposedWidgets() { + nonDisposedWidgetTracker.startTracking(); +} + private static final class ObjectWithError { final Object object; final Error error;