Skip to content

Commit d933d6f

Browse files
committed
Preserve breakpoint check state across filter changes
Preserve breakpoint check state while doing filtering in Export/Import Breakpoints
1 parent 2fa8a80 commit d933d6f

1 file changed

Lines changed: 52 additions & 2 deletions

File tree

debug/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/importexport/breakpoints/EmbeddedBreakpointsViewer.java

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616

1717
import java.util.ArrayList;
1818
import java.util.Collections;
19+
import java.util.HashSet;
1920
import java.util.Map;
21+
import java.util.Set;
2022
import java.util.Vector;
2123

2224
import org.eclipse.core.runtime.Assert;
@@ -66,8 +68,11 @@ public class EmbeddedBreakpointsViewer {
6668
private BreakpointsContentProvider fProvider = null;
6769
private Tree fTree = null;
6870
private BreakpointsViewer fViewer = null;
69-
private final ICheckStateListener fCheckListener = event -> updateCheckedState(event.getElement(),
70-
event.getChecked());
71+
private final Set<IBreakpoint> fCheckedBreakpoints = new HashSet<>();
72+
private final ICheckStateListener fCheckListener = event -> {
73+
updateCheckedState(event.getElement(), event.getChecked());
74+
updateCheckedBreakpointsSet(event.getElement(), event.getChecked());
75+
};
7176
private Text filterText;
7277
private BreakpointPatternFilter fFilter;
7378

@@ -119,6 +124,7 @@ private void createControl(Composite parent, Object input, IStructuredSelection
119124
filterText.addModifyListener(e -> {
120125
fFilter.setPattern(filterText.getText());
121126
fViewer.refresh();
127+
restoreCheckedState();
122128
});
123129
BreakpointsLabelProvider labelprovider = new BreakpointsLabelProvider();
124130
if(view != null) {
@@ -178,6 +184,7 @@ public boolean select(Viewer viewer, Object parentElement, Object element) {
178184
private void initViewerState() {
179185
fViewer.setGrayedElements();
180186
fViewer.setCheckedElements(new Object[] {});
187+
fCheckedBreakpoints.clear();
181188
ArrayList<IBreakpoint> list = new ArrayList<>();
182189
for (Object item : fSelection.toArray()) {
183190
IBreakpoint breakpoint = (IBreakpoint)DebugPlugin.getAdapter(item, IBreakpoint.class);
@@ -190,6 +197,49 @@ else if (item instanceof IBreakpointContainer) {
190197
}
191198
for (IBreakpoint element : list) {
192199
updateCheckedState(element, true);
200+
fCheckedBreakpoints.add(element);
201+
}
202+
}
203+
204+
/**
205+
* Updates the tracked set of checked breakpoints when the user changes check state.
206+
*/
207+
private void updateCheckedBreakpointsSet(Object obj, boolean checked) {
208+
IBreakpoint breakpoint = (IBreakpoint) DebugPlugin.getAdapter(obj, IBreakpoint.class);
209+
if (breakpoint != null) {
210+
if (checked) {
211+
fCheckedBreakpoints.add(breakpoint);
212+
} else {
213+
fCheckedBreakpoints.remove(breakpoint);
214+
}
215+
} else if (obj instanceof IBreakpointContainer container) {
216+
for (IBreakpoint bp : container.getBreakpoints()) {
217+
if (checked) {
218+
fCheckedBreakpoints.add(bp);
219+
} else {
220+
fCheckedBreakpoints.remove(bp);
221+
}
222+
}
223+
}
224+
}
225+
226+
/**
227+
* Restores the checked state from the tracked set after a viewer refresh.
228+
*/
229+
private void restoreCheckedState() {
230+
for (TreeItem root : fTree.getItems()) {
231+
uncheckAll(root);
232+
}
233+
for (IBreakpoint bp : fCheckedBreakpoints) {
234+
updateCheckedState(bp, true);
235+
}
236+
}
237+
238+
private void uncheckAll(TreeItem item) {
239+
item.setChecked(false);
240+
item.setGrayed(false);
241+
for (TreeItem child : item.getItems()) {
242+
uncheckAll(child);
193243
}
194244
}
195245

0 commit comments

Comments
 (0)