/******************************************************************************* * Copyright (c) 2008 ARM Limited and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * ARM Limited - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.debug.internal.ui.elements.adapters; import java.math.BigInteger; import org.eclipse.cdt.core.IAddress; import org.eclipse.cdt.debug.core.CDIDebugModel; import org.eclipse.cdt.debug.core.model.ICBreakpointType; import org.eclipse.cdt.debug.core.model.ICDebugTarget; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; import org.eclipse.cdt.debug.core.model.IDisassemblyInstruction; import org.eclipse.cdt.debug.ui.disassembly.IElementToggleBreakpointAdapter; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; /** * org.eclipse.cdt.debug.internal.ui.elements.adapters.DisassemblyToggleBreakpointAdapter: * //TODO Add description. */ public class DisassemblyToggleBreakpointAdapter implements IElementToggleBreakpointAdapter { /* (non-Javadoc) * @see com.arm.eclipse.rvd.ui.disassembly.IElementToggleBreakpointAdapter#canToggleLineBreakpoints(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.Object) */ public boolean canToggleLineBreakpoints( IPresentationContext presentationContext, Object element ) { if ( element instanceof IDisassemblyInstruction ) { return true; } return false; } /* (non-Javadoc) * @see com.arm.eclipse.rvd.ui.disassembly.IElementToggleBreakpointAdapter#toggleLineBreakpoints(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, java.lang.Object) */ public void toggleLineBreakpoints( IPresentationContext presentationContext, Object element ) throws CoreException { if ( element instanceof IDisassemblyInstruction ) { IDisassemblyInstruction instruction = (IDisassemblyInstruction)element; IBreakpoint breakpoint = findBreakpoint( instruction ); if ( breakpoint != null ) { DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint( breakpoint, true ); } else { IAddress address = instruction.getAdress(); CDIDebugModel.createAddressBreakpoint( null, "", //$NON-NLS-1$ ResourcesPlugin.getWorkspace().getRoot(), ICBreakpointType.REGULAR, -1, address, true, 0, "", //$NON-NLS-1$ true ); } } } private IBreakpoint findBreakpoint( IDisassemblyInstruction instruction ) { BigInteger address = instruction.getAdress().getValue(); IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(); for ( IBreakpoint bp : breakpoints ) { if ( bp instanceof ICLineBreakpoint ) { try { IAddress bpAddress = ((ICDebugTarget)instruction.getDebugTarget()).getBreakpointAddress( (ICLineBreakpoint)bp ); if ( bpAddress != null && address.compareTo( bpAddress.getValue() ) == 0 ) return bp; } catch( DebugException e ) { } } } return null; } }