From 72d411a73b4174ff0e8531d75b1da766abfb068b Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Fri, 28 Sep 2012 14:19:45 -0400 Subject: [PATCH] Bug 360735: Add support for multi-selection in the Debug view for "Show Breakpoints Supported by Selected Target" Change-Id: I1605e080f15e1ce352c33236c4442778cdfdeee3 Reviewed-on: https://git.eclipse.org/r/7974 Reviewed-by: Marc Khouzam IP-Clean: Marc Khouzam Tested-by: Marc Khouzam Reviewed-by: Mikhail Khodjaiants IP-Clean: Mikhail Khodjaiants Tested-by: Mikhail Khodjaiants --- .../breakpoints/GdbBreakpointVMProvider.java | 80 +++++++++++++------ 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java index 16083ce545b..68d8c7b660a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/breakpoints/GdbBreakpointVMProvider.java @@ -8,12 +8,15 @@ * Contributors: * Wind River Systems - initial API and implementation * Mikhail Khodjaiants (Mentor), Marc Khouzam (Ericsson) - * - Optionally use aggressive breakpoint filtering (Bug 360735) + * - Optionally use aggressive breakpoint filtering (Bug 360735) + * Marc Khouzam (Ericsson) - Add support to display proper breakpoints when dealing + * with a multi-selection in the debug view (Bug 360735) *******************************************************************************/ package org.eclipse.cdt.dsf.gdb.internal.ui.viewmodel.breakpoints; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -25,6 +28,7 @@ import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfRunnable; import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants; +import org.eclipse.cdt.dsf.concurrent.ImmediateCountingRequestMonitor; import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.datamodel.DMContexts; @@ -108,30 +112,52 @@ public class GdbBreakpointVMProvider extends BreakpointVMProvider { protected void calcFileteredBreakpoints( final DataRequestMonitor rm ) { if ( Boolean.TRUE.equals( getPresentationContext().getProperty( IBreakpointUIConstants.PROP_BREAKPOINTS_FILTER_SELECTION ) ) ) { if ( fUseAggressiveBpFilter ) { - // Aggressive filtering of breakpoints. Only return bps that are installed on the target. - IBreakpointsTargetDMContext bpContext = null; - IExecutionDMContext execContext = null; - ISelection debugContext = getDebugContext(); - if ( debugContext instanceof IStructuredSelection ) { - Object element = ( (IStructuredSelection)debugContext ).getFirstElement(); - if ( element instanceof IDMVMContext ) { - bpContext = DMContexts.getAncestorOfType( ((IDMVMContext)element).getDMContext(), IBreakpointsTargetDMContext.class ); - execContext = DMContexts.getAncestorOfType( ((IDMVMContext)element).getDMContext(), IExecutionDMContext.class ); - } - } + // Aggressive filtering of breakpoints. Only return bps that are installed on the target. + ISelection debugContext = getDebugContext(); + if ( debugContext instanceof IStructuredSelection ) { + // Use a set to avoid duplicates + final Set bps = new HashSet(); - if ( bpContext == null || !fSession.getId().equals( bpContext.getSessionId() ) ) { - rm.setStatus( new Status( - IStatus.ERROR, - GdbUIPlugin.PLUGIN_ID, - IDsfStatusConstants.INVALID_HANDLE, - "Debug context doesn't contain a breakpoint context", //$NON-NLS-1$ - null ) ); - rm.done(); - return; - } + int count = 0; + final ImmediateCountingRequestMonitor crm = new ImmediateCountingRequestMonitor( rm ) { + @Override + protected void handleSuccess() { + rm.done( bps.toArray( new IBreakpoint[bps.size()] ) ); + } + }; + + for ( Object element : ( (IStructuredSelection)debugContext ).toList() ) { + + IBreakpointsTargetDMContext bpContext = null; + IExecutionDMContext execContext = null; + if ( element instanceof IDMVMContext ) { + bpContext = DMContexts.getAncestorOfType( ((IDMVMContext)element).getDMContext(), IBreakpointsTargetDMContext.class ); + execContext = DMContexts.getAncestorOfType( ((IDMVMContext)element).getDMContext(), IExecutionDMContext.class ); - getInstalledBreakpoints( bpContext, execContext, rm ); + if ( bpContext != null && fSession.getId().equals( bpContext.getSessionId() ) ) { + count++; + getInstalledBreakpoints( bpContext, execContext, new DataRequestMonitor>( getExecutor(), crm ) { + @Override + protected void handleCompleted() { + if ( isSuccess() ) { + bps.addAll( getData() ); + } + crm.done(); + } + } ); + } + } + } + + crm.setDoneCount(count); + } else { + rm.done( new Status( + IStatus.ERROR, + GdbUIPlugin.PLUGIN_ID, + IDsfStatusConstants.INVALID_HANDLE, + "Invalid debug selection", //$NON-NLS-1$ + null ) ); + } } else { // Original behavior of bp filtering. Return all bp of type ICBreakpoint IBreakpoint[] allBreakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(); @@ -225,7 +251,9 @@ public class GdbBreakpointVMProvider extends BreakpointVMProvider { return StructuredSelection.EMPTY; } - private void getInstalledBreakpoints( final IBreakpointsTargetDMContext targetContext, final IExecutionDMContext execContext, final DataRequestMonitor rm ) { + private void getInstalledBreakpoints( final IBreakpointsTargetDMContext targetContext, + final IExecutionDMContext execContext, + final DataRequestMonitor> rm ) { try { fSession.getExecutor().execute( new DsfRunnable() { @@ -262,7 +290,7 @@ public class GdbBreakpointVMProvider extends BreakpointVMProvider { @Override protected void handleSuccess() { - rm.setData( bps.toArray( new IBreakpoint[bps.size()] ) ); + rm.setData( bps ); rm.done(); } }; @@ -301,7 +329,7 @@ public class GdbBreakpointVMProvider extends BreakpointVMProvider { } } else { - rm.setData( new IBreakpoint[0] ); + rm.setData( new HashSet() ); rm.done(); } }